summaryrefslogtreecommitdiffstats
path: root/common/entitystorage.h
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2015-10-15 13:56:45 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2015-10-15 13:56:45 +0200
commit35b28af1f449edb1bac0b0bda606c3c06b2fe102 (patch)
tree6237f0421afc8dc7adeb37dc823f7b34c30846a1 /common/entitystorage.h
parent2eb3810b66de3130f3e650627380c28a96acded7 (diff)
downloadsink-35b28af1f449edb1bac0b0bda606c3c06b2fe102.tar.gz
sink-35b28af1f449edb1bac0b0bda606c3c06b2fe102.zip
Moved more entitystorage functionality back to facade.
To avoid unnecessary abstraction layers that don't solve a problem, and to allow facades to customize how entities are loaded.
Diffstat (limited to 'common/entitystorage.h')
-rw-r--r--common/entitystorage.h63
1 files changed, 28 insertions, 35 deletions
diff --git a/common/entitystorage.h b/common/entitystorage.h
index 6b09cad..8e73083 100644
--- a/common/entitystorage.h
+++ b/common/entitystorage.h
@@ -32,41 +32,44 @@
32/** 32/**
33 * Wraps storage, entity adaptor factory and indexes into one. 33 * Wraps storage, entity adaptor factory and indexes into one.
34 * 34 *
35 * TODO: customize with readEntity instead of adaptor factory
36 */ 35 */
37class EntityStorageBase 36class EntityStorageBase
38{ 37{
38public:
39 typedef std::function<ResultSet (const Akonadi2::Query &query, Akonadi2::Storage::Transaction &transaction, QSet<QByteArray> &remainingFilters)> InitialResultLoader;
40 typedef std::function<ResultSet (qint64 baseRevision, const Akonadi2::Query &query, Akonadi2::Storage::Transaction &transaction, QSet<QByteArray> &remainingFilters)> IncrementalResultLoader;
41 typedef std::function<void(const Akonadi2::Storage::Transaction &transaction, const QByteArray &key, const std::function<void(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &, Akonadi2::Operation)> &resultCallback)> EntityReader;
42
43 /**
44 * Returns the initial result set that still needs to be filtered.
45 *
46 * To make this efficient indexes should be chosen that are as selective as possible.
47 */
48 InitialResultLoader loadInitialResultSet;
49 /**
50 * Returns the incremental result set that still needs to be filtered.
51 */
52 IncrementalResultLoader loadIncrementalResultSet;
53
54 /**
55 * Loads a single entity by uid from storage.
56 */
57 EntityReader readEntity;
58
39protected: 59protected:
40 EntityStorageBase(const QByteArray &instanceIdentifier, const DomainTypeAdaptorFactoryInterface::Ptr &adaptorFactory) 60 EntityStorageBase(const QByteArray &instanceIdentifier)
41 : mResourceInstanceIdentifier(instanceIdentifier), 61 : mResourceInstanceIdentifier(instanceIdentifier)
42 mDomainTypeAdaptorFactory(adaptorFactory)
43 { 62 {
44 63
45 } 64 }
46 65
47 virtual Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr create(const QByteArray &key, qint64 revision, const QSharedPointer<Akonadi2::ApplicationDomain::BufferAdaptor> &adaptor) = 0;
48 virtual Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr copy(const Akonadi2::ApplicationDomain::ApplicationDomainType &) = 0; 66 virtual Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr copy(const Akonadi2::ApplicationDomain::ApplicationDomainType &) = 0;
49 virtual ResultSet queryIndexes(const Akonadi2::Query &query, const QByteArray &resourceInstanceIdentifier, QSet<QByteArray> &appliedFilters, Akonadi2::Storage::Transaction &transaction) = 0;
50 67
51 /**
52 * Loads a single entity by uid from storage.
53 *
54 * TODO: Resources should be able to customize this for cases where an entity is not the same as a single buffer.
55 */
56 void readEntity(const Akonadi2::Storage::Transaction &transaction, const QByteArray &key, const std::function<void(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &, Akonadi2::Operation)> &resultCallback);
57 ResultSet getResultSet(const Akonadi2::Query &query, Akonadi2::Storage::Transaction &transaction, qint64 baseRevision); 68 ResultSet getResultSet(const Akonadi2::Query &query, Akonadi2::Storage::Transaction &transaction, qint64 baseRevision);
58 69
59protected:
60 QByteArray mResourceInstanceIdentifier; 70 QByteArray mResourceInstanceIdentifier;
61 QByteArray mBufferType; 71
62 DomainTypeAdaptorFactoryInterface::Ptr mDomainTypeAdaptorFactory;
63private: 72private:
64 /**
65 * Returns the initial result set that still needs to be filtered.
66 *
67 * To make this efficient indexes should be chosen that are as selective as possible.
68 */
69 ResultSet loadInitialResultSet(const Akonadi2::Query &query, Akonadi2::Storage::Transaction &transaction, QSet<QByteArray> &remainingFilters);
70 ResultSet filteredSet(const ResultSet &resultSet, const std::function<bool(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &domainObject)> &filter, const Akonadi2::Storage::Transaction &transaction, bool isInitialQuery); 73 ResultSet filteredSet(const ResultSet &resultSet, const std::function<bool(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &domainObject)> &filter, const Akonadi2::Storage::Transaction &transaction, bool isInitialQuery);
71}; 74};
72 75
@@ -75,28 +78,18 @@ class EntityStorage : public EntityStorageBase
75{ 78{
76 79
77public: 80public:
78 EntityStorage(const QByteArray &instanceIdentifier, const DomainTypeAdaptorFactoryInterface::Ptr &adaptorFactory, const QByteArray &bufferType)
79 : EntityStorageBase(instanceIdentifier, adaptorFactory)
80 {
81 mBufferType = bufferType;
82 }
83 81
84protected: 82 EntityStorage(const QByteArray &instanceIdentifier)
85 Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr create(const QByteArray &key, qint64 revision, const QSharedPointer<Akonadi2::ApplicationDomain::BufferAdaptor> &adaptor) Q_DECL_OVERRIDE 83 : EntityStorageBase(instanceIdentifier)
86 { 84 {
87 return DomainType::Ptr::create(mResourceInstanceIdentifier, key, revision, adaptor);
88 } 85 }
89 86
87protected:
90 Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr copy(const Akonadi2::ApplicationDomain::ApplicationDomainType &object) Q_DECL_OVERRIDE 88 Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr copy(const Akonadi2::ApplicationDomain::ApplicationDomainType &object) Q_DECL_OVERRIDE
91 { 89 {
92 return Akonadi2::ApplicationDomain::ApplicationDomainType::getInMemoryRepresentation<DomainType>(object); 90 return Akonadi2::ApplicationDomain::ApplicationDomainType::getInMemoryRepresentation<DomainType>(object);
93 } 91 }
94 92
95 ResultSet queryIndexes(const Akonadi2::Query &query, const QByteArray &resourceInstanceIdentifier, QSet<QByteArray> &appliedFilters, Akonadi2::Storage::Transaction &transaction) Q_DECL_OVERRIDE
96 {
97 return Akonadi2::ApplicationDomain::TypeImplementation<DomainType>::queryIndexes(query, resourceInstanceIdentifier, appliedFilters, transaction);
98 }
99
100public: 93public:
101 94
102 virtual qint64 read(const Akonadi2::Query &query, qint64 baseRevision, const QSharedPointer<Akonadi2::ResultProvider<typename DomainType::Ptr> > &resultProvider) 95 virtual qint64 read(const Akonadi2::Query &query, qint64 baseRevision, const QSharedPointer<Akonadi2::ResultProvider<typename DomainType::Ptr> > &resultProvider)
@@ -108,7 +101,7 @@ public:
108 101
109 auto transaction = storage.createTransaction(Akonadi2::Storage::ReadOnly); 102 auto transaction = storage.createTransaction(Akonadi2::Storage::ReadOnly);
110 103
111 Log() << "Querying" << baseRevision; 104 Log() << "Querying" << baseRevision << Akonadi2::Storage::maxRevision(transaction);
112 auto resultSet = getResultSet(query, transaction, baseRevision); 105 auto resultSet = getResultSet(query, transaction, baseRevision);
113 while(resultSet.next([this, resultProvider](const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &value, Akonadi2::Operation operation) -> bool { 106 while(resultSet.next([this, resultProvider](const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &value, Akonadi2::Operation operation) -> bool {
114 switch (operation) { 107 switch (operation) {