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