diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-10-15 13:56:45 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-10-15 13:56:45 +0200 |
commit | 35b28af1f449edb1bac0b0bda606c3c06b2fe102 (patch) | |
tree | 6237f0421afc8dc7adeb37dc823f7b34c30846a1 /common/entitystorage.h | |
parent | 2eb3810b66de3130f3e650627380c28a96acded7 (diff) | |
download | sink-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.h | 63 |
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 | */ |
37 | class EntityStorageBase | 36 | class EntityStorageBase |
38 | { | 37 | { |
38 | public: | ||
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 | |||
39 | protected: | 59 | protected: |
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 | ||
59 | protected: | ||
60 | QByteArray mResourceInstanceIdentifier; | 70 | QByteArray mResourceInstanceIdentifier; |
61 | QByteArray mBufferType; | 71 | |
62 | DomainTypeAdaptorFactoryInterface::Ptr mDomainTypeAdaptorFactory; | ||
63 | private: | 72 | private: |
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 | ||
77 | public: | 80 | public: |
78 | EntityStorage(const QByteArray &instanceIdentifier, const DomainTypeAdaptorFactoryInterface::Ptr &adaptorFactory, const QByteArray &bufferType) | ||
79 | : EntityStorageBase(instanceIdentifier, adaptorFactory) | ||
80 | { | ||
81 | mBufferType = bufferType; | ||
82 | } | ||
83 | 81 | ||
84 | protected: | 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 | ||
87 | protected: | ||
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 | |||
100 | public: | 93 | public: |
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) { |