6#include <knowCore/Uris/xsd.h>
7#include <knowDBC/Result.h>
8#include <knowRDF/BlankNode.h>
9#include <knowRDF/Graph.h>
10#include <knowRDF/Literal.h>
11#include <knowRDF/Node.h>
17 bool comparable_special(
const knowCore::Value& _v1,
const knowCore::Value& _v2)
19 auto const& [s, v, m] = _v1.compare(_v2, knowCore::ComparisonOperator::AlmostEqual);
20 return s and v.value();
23 void printFields(
const knowDBC::Result& r)
25 clog_print<clog_print_flag::bold>(
"Fields: ");
26 for(
int j = 0; j < r.fields(); ++j)
28 clog_print(
"{}", r.fieldName(j));
31 void printResults(
const knowDBC::Result& r)
33 for(
int j = 0; j < r.tuples(); ++j)
35 clog_print<clog_print_flag::bold | clog_print_flag::nonewline>(
"{}th: ", j);
36 for(
int k = 0; k < r.fields(); ++k)
38 clog_print<clog_print_flag::nonewline>(
"{} ", r.value(j, k));
43 void printAll(
const knowDBC::Result& r1,
const knowDBC::Result& r2)
45 clog_print<clog_print_flag::blue>(
"Possible reference values were");
48 clog_print<clog_print_flag::red>(
"Tested values were");
52 inline bool compare_tuples(
const knowDBC::Result& r1,
const knowDBC::Result& r2)
54 QVector<bool> indexes(r2.tuples(),
false);
55 for(
int i = 0; i < r1.tuples(); ++i)
57 bool found_one =
false;
58 for(
int j = 0; j < r2.tuples(); ++j)
62 bool equal_tuple =
true;
63 for(
int k = 0; k < r1.fields(); ++k)
65 knowCore::Value val1 = r1.value(i, k);
66 knowCore::Value val2 = r2.value(j, r2.fieldIndex(r1.fieldName(k)));
68 and (not knowCore::ValueIs<knowRDF::BlankNode>(val1)
69 or not knowCore::ValueIs<knowRDF::BlankNode>(val2))
70 and not details::comparable_special(val1, val2))
87 clog_print<clog_print_flag::red | clog_print_flag::nonewline>(
88 "Error: No match for {}th tuple: ", i);
89 for(
int k = 0; k < r1.fields(); ++k)
91 clog_print<clog_print_flag::red | clog_print_flag::nonewline>(
"{} ", r1.value(i, k));
103 inline void print_one(
const knowRDF::Node* node)
107 case knowRDF::Node::Type::Undefined:
108 clog_print<clog_print_flag::nonewline>(
"undefined");
110 case knowRDF::Node::Type::Uri:
111 clog_print<clog_print_flag::nonewline>(
"{}", node->uri());
113 case knowRDF::Node::Type::BlankNode:
114 clog_print<clog_print_flag::nonewline>(
"{}", node->blankNode());
116 case knowRDF::Node::Type::Literal:
117 clog_print<clog_print_flag::nonewline>(
"{}", node->literal());
119 case knowRDF::Node::Type::Variable:
120 clog_print<clog_print_flag::nonewline>(
"{}", node->variable());
124 inline void print(
const knowRDF::Node* node)
126 QMultiHash<knowCore::Uri, const knowRDF::Node*> children = node->children();
127 clog_print<clog_print_flag::nonewline>(
"{{");
129 clog_print<clog_print_flag::nonewline>(
" -> ");
130 for(QMultiHash<knowCore::Uri, const knowRDF::Node*>::const_iterator it = children.begin();
131 it != children.end(); ++it)
133 clog_print<clog_print_flag::nonewline>(
"({})", it.key());
134 print_one(it.value());
135 clog_print<clog_print_flag::nonewline>(
")");
139 inline bool similar(
const knowRDF::Node* node1,
const knowRDF::Node* node2)
141 if(node1->type() == node2->type())
143 switch(node1->type())
145 case knowRDF::Node::Type::Undefined:
147 case knowRDF::Node::Type::Uri:
148 return node1->uri() == node2->uri();
149 case knowRDF::Node::Type::BlankNode:
151 case knowRDF::Node::Type::Literal:
152 return node1->literal() == node2->literal();
153 case knowRDF::Node::Type::Variable:
154 clog_fatal(
"Impossible");
160 toPairList(
const QMultiHash<knowCore::Uri, const knowRDF::Node*>& _hash)
163 for(QMultiHash<knowCore::Uri, const knowRDF::Node*>::const_iterator it = _hash.begin();
164 it != _hash.end(); ++it)
166 r.append(QPair<knowCore::Uri, const knowRDF::Node*>(it.key(), it.value()));
171 inline bool compare_graphs(
const knowRDF::Graph* _graph_1,
const knowRDF::Graph* _graph_2)
176 QVector<bool> indexes(nodes_2.size(),
false);
178 for(
int i = 0; i < nodes_1.size(); ++i)
180 bool found_one =
false;
181 const knowRDF::Node* node1 = nodes_1[i];
182 for(
int j = 0; j < nodes_2.size(); ++j)
184 const knowRDF::Node* node2 = nodes_2[j];
187 if(details::similar(node1, node2)
188 and node1->children().size() == node2->children().size())
191 = details::toPairList(node1->children());
193 = details::toPairList(node2->children());
194 QVector<bool> indexes_children(children2.size(),
false);
196 bool all_children_found =
true;
198 for(
int k = 0; k < children1.size(); ++k)
200 bool found_one_child =
false;
201 QPair<knowCore::Uri, const knowRDF::Node*> c1 = children1[k];
202 for(
int l = 0; l < children2.size(); ++l)
204 if(not indexes_children[l])
206 QPair<knowCore::Uri, const knowRDF::Node*> c2 = children2[l];
207 if(c1.first == c2.first and details::similar(c1.second, c2.second))
209 found_one_child =
true;
210 indexes_children[l] =
true;
215 if(not found_one_child)
217 all_children_found =
false;
221 if(all_children_found)
232 clog_print<clog_print_flag::red | clog_print_flag::nonewline>(
233 "Error: No match for {}th node: ", i);
234 details::print(node1);
237 clog_print<clog_print_flag::blue>(
"Possible reference values were");
238 for(
int j = 0; j < nodes_2.size(); ++j)
240 clog_print<clog_print_flag::bold>(
"{}th: ", j);
241 details::print(nodes_2[j]);
244 clog_print<clog_print_flag::red>(
"Tested values were");
245 for(
int j = 0; j < nodes_1.size(); ++j)
247 clog_print<clog_print_flag::bold>(
"{}th: ", j);
248 details::print(nodes_1[j]);
258 if(nodes_1.size() != nodes_2.size())
260 clog_print<clog_print_flag::red>(
"Different test results got: {} expecting: ", nodes_1.size(),