kDB: Knowledge DataBase
Loading...
Searching...
No Matches
CompareSPARQLResults.h
1#include <QDebug>
2
3#include <clog_print>
4#include <clog_qt>
5
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>
12
13namespace
14{
15 namespace details
16 {
17 bool comparable_special(const knowCore::Value& _v1, const knowCore::Value& _v2)
18 {
19 auto const& [s, v, m] = _v1.compare(_v2, knowCore::ComparisonOperator::AlmostEqual);
20 return s and v.value();
21 }
22 } // namespace details
23 void printFields(const knowDBC::Result& r)
24 {
25 clog_print<clog_print_flag::bold>("Fields: ");
26 for(int j = 0; j < r.fields(); ++j)
27 {
28 clog_print("{}", r.fieldName(j));
29 }
30 }
31 void printResults(const knowDBC::Result& r)
32 {
33 for(int j = 0; j < r.tuples(); ++j)
34 {
35 clog_print<clog_print_flag::bold | clog_print_flag::nonewline>("{}th: ", j);
36 for(int k = 0; k < r.fields(); ++k)
37 {
38 clog_print<clog_print_flag::nonewline>("{} ", r.value(j, k));
39 }
40 clog_print("");
41 }
42 }
43 void printAll(const knowDBC::Result& r1, const knowDBC::Result& r2)
44 {
45 clog_print<clog_print_flag::blue>("Possible reference values were");
46 printFields(r2);
47 printResults(r2);
48 clog_print<clog_print_flag::red>("Tested values were");
49 printFields(r1);
50 printResults(r1);
51 }
52 inline bool compare_tuples(const knowDBC::Result& r1, const knowDBC::Result& r2)
53 {
54 QVector<bool> indexes(r2.tuples(), false);
55 for(int i = 0; i < r1.tuples(); ++i)
56 {
57 bool found_one = false;
58 for(int j = 0; j < r2.tuples(); ++j)
59 {
60 if(not indexes[j])
61 {
62 bool equal_tuple = true;
63 for(int k = 0; k < r1.fields(); ++k)
64 {
65 knowCore::Value val1 = r1.value(i, k);
66 knowCore::Value val2 = r2.value(j, r2.fieldIndex(r1.fieldName(k)));
67 if(val1 != val2
70 and not details::comparable_special(val1, val2))
71 {
72 equal_tuple = false;
73 break;
74 }
75 }
76 if(equal_tuple)
77 {
78 found_one = true;
79 indexes[j] = true;
80 break;
81 }
82 }
83 }
84 if(not found_one)
85 {
86 {
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)
90 {
91 clog_print<clog_print_flag::red | clog_print_flag::nonewline>("{} ", r1.value(i, k));
92 }
93 clog_print("");
94 }
95 printAll(r1, r2);
96 return false;
97 }
98 }
99 return true;
100 }
101 namespace details
102 {
103 inline void print_one(const knowRDF::Node* node)
104 {
105 switch(node->type())
106 {
107 case knowRDF::Node::Type::Undefined:
108 clog_print<clog_print_flag::nonewline>("undefined");
109 break;
110 case knowRDF::Node::Type::Uri:
111 clog_print<clog_print_flag::nonewline>("{}", node->uri());
112 break;
113 case knowRDF::Node::Type::BlankNode:
114 clog_print<clog_print_flag::nonewline>("{}", node->blankNode());
115 break;
116 case knowRDF::Node::Type::Literal:
117 clog_print<clog_print_flag::nonewline>("{}", node->literal());
118 break;
119 case knowRDF::Node::Type::Variable:
120 clog_print<clog_print_flag::nonewline>("{}", node->variable());
121 break;
122 }
123 }
124 inline void print(const knowRDF::Node* node)
125 {
126 QMultiHash<knowCore::Uri, const knowRDF::Node*> children = node->children();
127 clog_print<clog_print_flag::nonewline>("{{");
128 print_one(node);
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)
132 {
133 clog_print<clog_print_flag::nonewline>("({})", it.key());
134 print_one(it.value());
135 clog_print<clog_print_flag::nonewline>(")");
136 }
137 clog_print("}}");
138 }
139 inline bool similar(const knowRDF::Node* node1, const knowRDF::Node* node2)
140 {
141 if(node1->type() == node2->type())
142 {
143 switch(node1->type())
144 {
145 case knowRDF::Node::Type::Undefined:
146 return true;
147 case knowRDF::Node::Type::Uri:
148 return node1->uri() == node2->uri();
149 case knowRDF::Node::Type::BlankNode:
150 return true;
151 case knowRDF::Node::Type::Literal:
152 return node1->literal() == node2->literal();
153 case knowRDF::Node::Type::Variable:
154 clog_fatal("Impossible");
155 }
156 }
157 return false;
158 }
160 toPairList(const QMultiHash<knowCore::Uri, const knowRDF::Node*>& _hash)
161 {
163 for(QMultiHash<knowCore::Uri, const knowRDF::Node*>::const_iterator it = _hash.begin();
164 it != _hash.end(); ++it)
165 {
166 r.append(QPair<knowCore::Uri, const knowRDF::Node*>(it.key(), it.value()));
167 }
168 return r;
169 }
170 } // namespace details
171 inline bool compare_graphs(const knowRDF::Graph* _graph_1, const knowRDF::Graph* _graph_2)
172 {
173 QList<const knowRDF::Node*> nodes_1 = _graph_1->nodes();
174 QList<const knowRDF::Node*> nodes_2 = _graph_2->nodes();
175
176 QVector<bool> indexes(nodes_2.size(), false);
177
178 for(int i = 0; i < nodes_1.size(); ++i)
179 {
180 bool found_one = false;
181 const knowRDF::Node* node1 = nodes_1[i];
182 for(int j = 0; j < nodes_2.size(); ++j)
183 {
184 const knowRDF::Node* node2 = nodes_2[j];
185 if(not indexes[j])
186 {
187 if(details::similar(node1, node2)
188 and node1->children().size() == node2->children().size())
189 {
191 = details::toPairList(node1->children());
193 = details::toPairList(node2->children());
194 QVector<bool> indexes_children(children2.size(), false);
195
196 bool all_children_found = true;
197
198 for(int k = 0; k < children1.size(); ++k)
199 {
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)
203 {
204 if(not indexes_children[l])
205 {
206 QPair<knowCore::Uri, const knowRDF::Node*> c2 = children2[l];
207 if(c1.first == c2.first and details::similar(c1.second, c2.second))
208 {
209 found_one_child = true;
210 indexes_children[l] = true;
211 break;
212 }
213 }
214 }
215 if(not found_one_child)
216 {
217 all_children_found = false;
218 }
219 }
220
221 if(all_children_found)
222 {
223 found_one = true;
224 break;
225 }
226 }
227 }
228 }
229 if(not found_one)
230 {
231 {
232 clog_print<clog_print_flag::red | clog_print_flag::nonewline>(
233 "Error: No match for {}th node: ", i);
234 details::print(node1);
235 clog_print("");
236 }
237 clog_print<clog_print_flag::blue>("Possible reference values were");
238 for(int j = 0; j < nodes_2.size(); ++j)
239 {
240 clog_print<clog_print_flag::bold>("{}th: ", j);
241 details::print(nodes_2[j]);
242 clog_print("");
243 }
244 clog_print<clog_print_flag::red>("Tested values were");
245 for(int j = 0; j < nodes_1.size(); ++j)
246 {
247 clog_print<clog_print_flag::bold>("{}th: ", j);
248 details::print(nodes_1[j]);
249 clog_print("");
250 }
251 while(true)
252 {
253 }
254 return false;
255 }
256 }
257
258 if(nodes_1.size() != nodes_2.size())
259 {
260 clog_print<clog_print_flag::red>("Different test results got: {} expecting: ", nodes_1.size(),
261 nodes_2.size());
262 return false;
263 }
264
265 return true;
266 }
267} // namespace
Definition Revision.h:9
Definition Value.h:445
Definition Value.h:21
cres_qresult< bool > compare(const Value &_value, ComparisonOperators _operators) const
Definition Value.cpp:316
Definition Result.h:23
int fieldIndex(const QString &_name) const
Definition Result.cpp:59
QString fieldName(int _index) const
Definition Result.h:65
Definition Graph.h:10
Definition Node.h:17
knowCore::Uri uri() const
Definition Node.cpp:121
QString variable() const
Definition Node.cpp:119
Literal literal() const
Definition Node.cpp:123
QMultiHash< knowCore::Uri, const Node * > children() const
Definition Node.cpp:157
BlankNode blankNode() const
Definition Node.cpp:117
Type type() const
Definition Node.cpp:9