kDB: Knowledge DataBase
Loading...
Searching...
No Matches
BuildAccumulatedDiff_p.h
1#include <knowCore/Messages.h>
2#include <knowCore/ValueHash.h>
3
4#include <knowRDF/Object.h>
5#include <knowRDF/Subject.h>
6
7#include <kDB/SPARQL/Algebra/NodeVisitor.h>
8#include <kDB/SPARQL/Algebra/Utils.h>
9#include <kDB/SPARQL/Query.h>
10
11#include "QueryCache_p.h"
12
13namespace kDB::Repository::VersionControl
14{
15 enum class TripleDeltaStatus
16 {
17 Skip,
18 Removed,
19 Added,
20 Unknown
21 };
22
23 using TriplesToStatus = QHash<knowRDF::Triple, TripleDeltaStatus>;
24
26 {
27 TriplesToStatus diff;
28
29 TripleDeltaStatus& valueRef(const knowRDF::Triple& _triple, TripleDeltaStatus _status)
30 {
31 TriplesToStatus::iterator it = diff.find(_triple);
32 if(it == diff.end())
33 {
34 TripleDeltaStatus& s = diff[_triple];
35 s = _status;
36 return s;
37 }
38 else
39 {
40 return it.value();
41 }
42 }
43 bool execute(const QByteArray& _query)
44 {
45 if(_query.isEmpty())
46 return true;
47 DeltaParser::Parser::Result r = QueryCache::get(_query);
48 if(r.deleted.isEmpty() and r.inserted.isEmpty())
49 {
50 clog_error("Error in default merge strategy query {} is invalid!",
51 QString::fromUtf8(_query));
52 return false;
53 }
54 for(const knowRDF::Triple& t : r.inserted)
55 {
56 TripleDeltaStatus& status = valueRef(t, TripleDeltaStatus::Skip);
57 switch(status)
58 {
59 case TripleDeltaStatus::Skip:
60 status = TripleDeltaStatus::Added;
61 break;
62 case TripleDeltaStatus::Removed:
63 status = TripleDeltaStatus::Skip;
64 break;
65 case TripleDeltaStatus::Added:
66 clog_warning("Triple added twice: {}", t);
67 break;
68 case TripleDeltaStatus::Unknown:
69 clog_fatal("Internal error!");
70 }
71 }
72 for(const knowRDF::Triple& t : r.deleted)
73 {
74 TripleDeltaStatus& status = valueRef(t, TripleDeltaStatus::Skip);
75 switch(status)
76 {
77 case TripleDeltaStatus::Skip:
78 status = TripleDeltaStatus::Removed;
79 break;
80 case TripleDeltaStatus::Removed:
81 clog_warning("Triple removed twice: {}", t);
82 break;
83 case TripleDeltaStatus::Added:
84 status = TripleDeltaStatus::Skip;
85 break;
86 case TripleDeltaStatus::Unknown:
87 clog_fatal("Internal error!");
88 }
89 }
90 return true;
91 }
92 };
93
94} // namespace kDB::Repository::VersionControl
95
96#include <knowCore/Formatter.h>
97
98clog_format_declare_enum_formatter(kDB::Repository::VersionControl::TripleDeltaStatus, Skip,
99 Removed, Added, Unknown);
Definition Forward.h:10
Definition Triple.h:19
Definition BuildAccumulatedDiff_p.h:26