1#include <knowCore/ConstrainedValue.h>
2#include <knowCore/QuantityValue.h>
3#include <knowCore/TypeDefinitions.h>
5#include <kDB/SPARQL/Algebra/Builders.h>
7#include <knowCore/Uris/askcore_datatype.h>
8#include <knowCore/Uris/askcore_db.h>
9#include <knowCore/Uris/qudt.h>
11#include <knowGIS/Uris/geo.h>
12#include <knowGIS/Uris/geof.h>
14#include "FocusNodeDeclarationsRegistry.h"
19 cres_qresult<QList<kDB::SPARQL::Algebra::NodeCSP>> focus_node_filter_constructor(
20 const QList<QPair<knowCore::Uri, knowCore::ConstrainedValue>>& _constraints,
25 namespace SA = kDB::SPARQL::Algebra;
26 namespace SB = kDB::SPARQL::Algebra::Builders;
27 using askcore_datatype = knowCore::Uris::askcore_datatype;
28 using qudt = knowCore::Uris::qudt;
29 using askcore_sparql_functions_extra = knowCore::Uris::askcore_sparql_functions_extra;
33 for(
int i = 0; i < _constraints.size(); ++i)
37 SA::NodeCSP lhs_node_value;
38 SA::NodeCSP lhs_node_unit;
40 if((*path2node).contains(path))
43 lhs_node_value = nodes[0];
46 lhs_node_unit = nodes[1];
52 for(
int i = 0; i < datatypes.size(); ++i)
55 kDB::Repository::RDF::FocusNodeDeclarationsRegistry::declaration(datatypes[i]));
57 declaration.
field(path),
58 message(
"In accessing property {} for type {}: {}", path, datatypes[i]));
63 else if(field != field_i)
65 return cres_failure(
"Property {} has incompatible field in type {} and type {}", path,
66 datatypes[0], datatypes[i]);
70 if(field.datatype() == askcore_datatype::quantityDecimal)
72 SB::Variable value_variable_value_i(clog_qt::qformat(
"?{}_value", i));
73 SB::Variable value_variable_unit_i(clog_qt::qformat(
"?{}_unit", i));
75 SB::BlankNode object_node;
77 triples_pattern->append((*uri_variable), field.path(), object_node);
78 triples_pattern->append(object_node, qudt::value, value_variable_value_i);
79 triples_pattern->append(object_node, qudt::unit, value_variable_unit_i);
81 lhs_node_value = value_variable_value_i;
82 lhs_node_unit = value_variable_unit_i;
83 (*path2node)[path] = {lhs_node_value, lhs_node_unit};
87 SB::Variable value_variable_i(clog_qt::qformat(
"?{}", i));
88 triples_pattern->append((*uri_variable), field.path(), value_variable_i);
89 lhs_node_value = value_variable_i;
90 (*path2node)[path] = {lhs_node_value};
106 .name(askcore_sparql_functions_extra::convertQuantityValue)
107 .parameters(lhs_node_value, lhs_node_unit, SB::Term().term(qn->unit().uri()));
108 rhs_node = SB::Value().value(knowRDF::Literal::fromValue(qn->value()));
112 return cres_failure(
"Constraint for property '{}' should be a quantity number", path);
117 lhs_node = lhs_node_value;
120 rhs_node = SB::Term().term(constraint.value.value<
knowCore::Uri>().expect_success());
124 rhs_node = SB::Value().value(constraint.value);
127 switch(constraint.type)
129 case knowCore::ConstrainedValue::Type::Equal:
130 filters.append(SB::RelationalEqual().left(lhs_node).right(rhs_node));
132 case knowCore::ConstrainedValue::Type::Different:
133 filters.append(SB::RelationalDifferent().left(lhs_node).right(rhs_node));
136 filters.append(SB::RelationalInferiorEqual().left(lhs_node).right(rhs_node));
139 filters.append(SB::RelationalInferior().left(lhs_node).right(rhs_node));
142 filters.append(SB::RelationalSuperiorEqual().left(lhs_node).right(rhs_node));
145 filters.append(SB::RelationalSuperior().left(lhs_node).right(rhs_node));
148 filters.append(SB::FunctionCall()
149 .name(knowGIS::Uris::geof::sfOverlaps)
150 .parameters(lhs_node, rhs_node));
153 if(_intersectsPrecision > 0.0)
157 .name(knowGIS::Uris::geof::sfIntersects)
158 .parameters(lhs_node, rhs_node, knowRDF::Literal::fromValue(_intersectsPrecision)));
162 filters.append(SB::FunctionCall()
163 .name(knowGIS::Uris::geof::sfIntersects)
164 .parameters(lhs_node, rhs_node));
169 SB::FunctionCall().name(knowGIS::Uris::geof::sfWithin).parameters(lhs_node, rhs_node));
173 SB::FunctionCall().name(knowGIS::Uris::geof::sfWithin).parameters(lhs_node, rhs_node));
177 SB::FunctionCall().name(knowGIS::Uris::geof::sfTouches).parameters(lhs_node, rhs_node));
180 filters.append(SB::FunctionCall()
181 .name(knowGIS::Uris::geof::sfDisjoint)
182 .parameters(lhs_node, rhs_node));
188 return cres_failure(
"In operator not supported.");
193 return cres_success(filters);
Definition FocusNodeDeclaration.h:22
Definition FocusNodeDeclaration.h:17
cres_qresult< Property > field(const knowCore::Uri &_uri)
Definition FocusNodeDeclaration.cpp:84
Definition Builders.h:178
@ Superior
such as constraint.value < value
@ GeoWithin
such as value is within the constraint.value
@ NotContains
such as list does not contains a value
@ GeoDisjoint
such as value disjoint with constraint.value,
@ InferiorEqual
such as value <= constraint.value
@ GeoTouches
such as value touches with constraint.value,
@ Contains
such as list contains a value
@ Inferior
such as value < constraint.value
@ NotIn
such as one value is not part of a list
@ SuperiorEqual
such as constraint.value <= value
@ GeoIntersects
such as value intersects with constraint.value,
@ GeoContains
such as constraint.value is within the value
@ In
such as one value is part of a list
Definition ConstrainedValue.h:38