kDB: Knowledge DataBase
Loading...
Searching...
No Matches
TripleStore.h
1#pragma once
2
3#include <functional>
4
5#include <QList>
6#include <QSharedPointer>
7
8#include <clog_qt>
9#include <cres_qt>
10
11#include "RDFDataset.h"
12#include "Transaction.h"
13
14class TestTripleStore;
15
16namespace kDB::Repository
17{
18 class TripleStore : public RDFDataset
19 {
20 friend class ::TestTripleStore;
21 friend class GraphsManager;
22 friend class VersionControl::Manager;
23 friend class VersionControl::Transaction;
26 public:
27 enum class Option : quint32
28 {
29 None = 0x0,
30 Versioning = 0x1,
31 Notifications = 0x2
32 };
33 Q_DECLARE_FLAGS(Options, Option)
34 private:
35 struct Definition;
37 QSharedPointer<Definition> _definition);
38 public:
40 TripleStore(const TripleStore& _rhs);
41 TripleStore& operator=(const TripleStore& _rhs);
47 TripleStore detach() const;
48 QString tablename() const;
49 Options options() const;
50 template<typename _ObjectType_>
51 cres_qresult<void> insert(const knowRDF::Subject& _subject, const knowCore::Uri& _predicateBase,
52 const QString& _predicateSuffix, const _ObjectType_& _object,
53 const Transaction& _transaction = Transaction())
54 {
55 return insert(_subject, knowCore::Uri(_predicateBase, _predicateSuffix), _object,
56 _transaction);
57 }
58 template<typename _TUri_>
60 cres_qresult<void> insert(const knowRDF::Subject& _subject, const knowCore::Uri& _predicate,
61 const _TUri_& _value,
62 const Transaction& _transaction = Transaction());
63 cres_qresult<void> insert(const knowRDF::Subject& _subject, const knowCore::Uri& _predicate,
64 const knowCore::Uri& _value,
65 const Transaction& _transaction = Transaction());
66 cres_qresult<void> insert(const knowRDF::Subject& _subject, const knowCore::Uri& _predicate,
67 const knowRDF::Object& _object,
68 const Transaction& _transaction = Transaction());
69 cres_qresult<void> insert(const knowRDF::Subject& _subject, const knowCore::Uri& _predicate,
70 const knowCore::Uri& _type, const knowCore::Value& _value,
71 const QString& _lang = QString(),
72 const Transaction& _transaction = Transaction());
73 cres_qresult<void> insert(const knowRDF::Subject& _subject, const knowCore::Uri& _predicate,
74 const knowRDF::BlankNode& _value,
75 const Transaction& _transaction = Transaction());
76 template<typename _TPredicate_0_, typename _TObject_0_, typename... _TPredicteObjects_>
77 cres_qresult<void>
78 insert(const knowRDF::Subject& _subject, const knowCore::Uri& _predicate,
79 const std::tuple<_TPredicate_0_, _TObject_0_, _TPredicteObjects_...>& _objects,
80 const Transaction& _transaction);
81 cres_qresult<void> insert(const knowRDF::Triple& _triple,
82 const Transaction& _transaction = Transaction());
83 cres_qresult<void> insert(const QList<knowRDF::Triple>& _triple,
84 const Transaction& _transaction = Transaction());
85
86 template<typename _TObject_, typename... _TArgs_>
87 cres_qresult<void> insert(const Transaction& _transaction, const knowRDF::Subject& _subject,
88 const knowCore::Uri& _predicate, const _TObject_& _object,
89 const _TArgs_&...);
90 template<typename _TObject_, typename... _TArgs_>
91 inline cres_qresult<void> insert(const knowRDF::Subject& _subject,
92 const knowCore::Uri& _predicate, const _TObject_& _object,
93 const knowCore::Uri& _predicate_next, const _TArgs_&... _args);
94 private:
95 // Thiss functions is only used as part of the end recursion for the variadic insert above
96 cres_qresult<void> insert(const Transaction&, const knowRDF::Subject&);
97 public:
98 cres_qresult<bool> hasTriple(const knowRDF::Triple& _triple,
99 const Transaction& _transaction = Transaction());
100
101 cres_qresult<void> remove(const knowRDF::Subject& _subject, const knowCore::Uri& _predicate,
102 const knowCore::Uri& _value,
103 const Transaction& _transaction = Transaction());
104 cres_qresult<void> remove(const knowRDF::Subject& _subject, const knowCore::Uri& _predicate,
105 const knowRDF::Object& _object,
106 const Transaction& _transaction = Transaction());
107 cres_qresult<void> remove(const knowRDF::Subject& _subject, const knowCore::Uri& _predicate,
108 const knowCore::Uri& _type, const knowCore::Value& _value,
109 const QString& _lang = QString(),
110 const Transaction& _transaction = Transaction());
111 cres_qresult<void> remove(const knowRDF::Subject& _subject, const knowCore::Uri& _predicate,
112 const knowRDF::BlankNode& _value,
113 const Transaction& _transaction = Transaction());
114 cres_qresult<void> remove(const knowRDF::Triple& _triple,
115 const Transaction& _transaction = Transaction());
116 cres_qresult<void> remove(const QList<knowRDF::Triple>& _triple,
117 const Transaction& _transaction = Transaction());
118
123 cres_qresult<QList<knowRDF::Triple>> triples() const;
124
128 knowRDF::Triple triple(std::size_t _r) const;
129
133 std::size_t triplesCount() const;
137 QString generateInsertDataQuery(bool _blankNodeAsUri = false) const;
138
142 cres_qresult<void> clear(const Transaction& _transaction = Transaction());
143
144 cres_qresult<void> enableVersioning();
145 cres_qresult<void> disableVersioning();
146
147 cres_qresult<void> enableNotifications();
148 cres_qresult<void> disableNotifications();
149
150 QMetaObject::Connection listen(const QObject* receiver, const char* member,
151 Qt::ConnectionType _type = Qt::AutoConnection);
152 QMetaObject::Connection listen(const std::function<void(const QByteArray&)>& _receiver);
153
154 QMetaObject::Connection listenOptionsChanged(const QObject* receiver, const char* member,
155 Qt::ConnectionType _type = Qt::AutoConnection);
156 QMetaObject::Connection listenOptionsChanged(const std::function<void()>& _receiver);
157
158 QMetaObject::Connection listenMetaChanged(const QObject* receiver, const char* member,
159 Qt::ConnectionType _type = Qt::AutoConnection);
160 QMetaObject::Connection listenMetaChanged(const std::function<void()>& _receiver);
161
162 bool unlisten(QMetaObject::Connection _connection);
163
170
174 QByteArray contentHash(const Transaction& _transaction = Transaction()) const;
175 private:
177 KNOWCORE_D_DECL();
178 };
179 inline cres_qresult<void> TripleStore::insert(const Transaction&, const knowRDF::Subject&)
180 {
181 return cres_success();
182 }
183 template<typename _TUri_>
185 inline cres_qresult<void>
186 TripleStore::insert(const knowRDF::Subject& _subject, const knowCore::Uri& _predicate,
187 const _TUri_& _value, const Transaction& _transaction)
188 {
189 return insert(_subject, _predicate, knowCore::Uri(_value), _transaction);
190 }
191
192 template<typename _TObject_, typename... _TArgs_>
193 inline cres_qresult<void> TripleStore::insert(const Transaction& _transaction,
194 const knowRDF::Subject& _subject,
195 const knowCore::Uri& _predicate,
196 const _TObject_& _object, const _TArgs_&... _args)
197 {
198 cres_try(cres_ignore, insert(_subject, _predicate, _object, _transaction));
199 return insert(_transaction, _subject, _args...);
200 }
201 template<typename _TObject_, typename... _TArgs_>
202 inline cres_qresult<void>
203 TripleStore::insert(const knowRDF::Subject& _subject, const knowCore::Uri& _predicate,
204 const _TObject_& _object, const knowCore::Uri& _predicate_next,
205 const _TArgs_&... _args)
206 {
207 Transaction t(connection());
208 cres_try(cres_ignore,
209 insert(t, _subject, knowCore::Uri(_predicate), _object, _predicate_next, _args...));
210 return t.commit();
211 }
212 template<typename _TPredicate_0_, typename _TObject_0_, typename... _TPredicteObjects_>
213 cres_qresult<void> TripleStore::insert(
214 const knowRDF::Subject& _subject, const knowCore::Uri& _predicate,
215 const std::tuple<_TPredicate_0_, _TObject_0_, _TPredicteObjects_...>& _objects,
216 const Transaction& _transaction)
217 {
219 cres_try(cres_ignore, insert(_subject, _predicate, bn, _transaction));
220 using IFT = cres_qresult<void> (TripleStore::*)(const Transaction&, const knowRDF::Subject&,
221 const knowCore::Uri&, const _TObject_0_&,
222 const _TPredicteObjects_&...);
223 return std::apply(static_cast<IFT>(&TripleStore::insert<_TObject_0_, _TPredicteObjects_...>),
224 std::tuple_cat(std::make_tuple(this, _transaction, bn), _objects));
225 }
226
227} // namespace kDB::Repository
228
229Q_DECLARE_OPERATORS_FOR_FLAGS(kDB::Repository::TripleStore::Options)
Definition Revision.h:9
Definition Forward.h:6
Definition TestTripleStore.h:4
Definition Connection.h:26
Definition GraphsManager.h:10
Definition RDFDataset.h:13
Definition Transaction.h:19
Definition TripleStore.h:19
VersionControl::Manager * versionControlManager()
Definition TripleStore.cpp:452
std::size_t triplesCount() const
Definition TripleStore.cpp:349
QString generateInsertDataQuery(bool _blankNodeAsUri=false) const
Definition TripleStore.cpp:374
cres_qresult< void > clear(const Transaction &_transaction=Transaction())
Definition TripleStore.cpp:385
TripleStore detach() const
Definition TripleStore.cpp:154
cres_qresult< QList< knowRDF::Triple > > triples() const
Definition TripleStore.cpp:325
knowRDF::Triple triple(std::size_t _r) const
Definition TripleStore.cpp:357
QByteArray contentHash(const Transaction &_transaction=Transaction()) const
Definition TripleStore.cpp:463
Definition Uri.h:15
Definition Value.h:21
Definition BlankNode.h:25
Definition Object.h:11
Definition Subject.h:21
Definition Triple.h:19
Definition TripleStore_p.h:23