diff options
Diffstat (limited to 'common/queryrunner.cpp')
-rw-r--r-- | common/queryrunner.cpp | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/common/queryrunner.cpp b/common/queryrunner.cpp index a62c64c..4d05721 100644 --- a/common/queryrunner.cpp +++ b/common/queryrunner.cpp | |||
@@ -41,14 +41,14 @@ template<typename DomainType> | |||
41 | class QueryWorker : public QObject | 41 | class QueryWorker : public QObject |
42 | { | 42 | { |
43 | public: | 43 | public: |
44 | QueryWorker(const Sink::Query &query, const QByteArray &instanceIdentifier, const DomainTypeAdaptorFactoryInterface::Ptr &, const QByteArray &bufferType); | 44 | QueryWorker(const Sink::Query &query, const QByteArray &instanceIdentifier, const DomainTypeAdaptorFactoryInterface::Ptr &, const QByteArray &bufferType, const QueryRunnerBase::ResultTransformation &transformation); |
45 | virtual ~QueryWorker(); | 45 | virtual ~QueryWorker(); |
46 | 46 | ||
47 | qint64 executeIncrementalQuery(const Sink::Query &query, Sink::ResultProviderInterface<typename DomainType::Ptr> &resultProvider); | 47 | qint64 executeIncrementalQuery(const Sink::Query &query, Sink::ResultProviderInterface<typename DomainType::Ptr> &resultProvider); |
48 | qint64 executeInitialQuery(const Sink::Query &query, const typename DomainType::Ptr &parent, Sink::ResultProviderInterface<typename DomainType::Ptr> &resultProvider); | 48 | qint64 executeInitialQuery(const Sink::Query &query, const typename DomainType::Ptr &parent, Sink::ResultProviderInterface<typename DomainType::Ptr> &resultProvider); |
49 | 49 | ||
50 | private: | 50 | private: |
51 | static void replaySet(ResultSet &resultSet, Sink::ResultProviderInterface<typename DomainType::Ptr> &resultProvider, const QList<QByteArray> &properties); | 51 | void replaySet(ResultSet &resultSet, Sink::ResultProviderInterface<typename DomainType::Ptr> &resultProvider, const QList<QByteArray> &properties); |
52 | 52 | ||
53 | void readEntity(const Sink::Storage::NamedDatabase &db, const QByteArray &key, const std::function<void(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &, Sink::Operation)> &resultCallback); | 53 | void readEntity(const Sink::Storage::NamedDatabase &db, const QByteArray &key, const std::function<void(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &, Sink::Operation)> &resultCallback); |
54 | 54 | ||
@@ -60,6 +60,7 @@ private: | |||
60 | qint64 load(const Sink::Query &query, const std::function<ResultSet(Sink::Storage::Transaction &, QSet<QByteArray> &)> &baseSetRetriever, Sink::ResultProviderInterface<typename DomainType::Ptr> &resultProvider, bool initialQuery); | 60 | qint64 load(const Sink::Query &query, const std::function<ResultSet(Sink::Storage::Transaction &, QSet<QByteArray> &)> &baseSetRetriever, Sink::ResultProviderInterface<typename DomainType::Ptr> &resultProvider, bool initialQuery); |
61 | 61 | ||
62 | private: | 62 | private: |
63 | QueryRunnerBase::ResultTransformation mResultTransformation; | ||
63 | DomainTypeAdaptorFactoryInterface::Ptr mDomainTypeAdaptorFactory; | 64 | DomainTypeAdaptorFactoryInterface::Ptr mDomainTypeAdaptorFactory; |
64 | QByteArray mResourceInstanceIdentifier; | 65 | QByteArray mResourceInstanceIdentifier; |
65 | QByteArray mBufferType; | 66 | QByteArray mBufferType; |
@@ -78,8 +79,8 @@ QueryRunner<DomainType>::QueryRunner(const Sink::Query &query, const Sink::Resou | |||
78 | mResultProvider->setFetcher([=](const typename DomainType::Ptr &parent) { | 79 | mResultProvider->setFetcher([=](const typename DomainType::Ptr &parent) { |
79 | Trace() << "Running fetcher"; | 80 | Trace() << "Running fetcher"; |
80 | auto resultProvider = mResultProvider; | 81 | auto resultProvider = mResultProvider; |
81 | async::run<qint64>([query, instanceIdentifier, factory, bufferType, parent, resultProvider]() -> qint64 { | 82 | async::run<qint64>([=]() -> qint64 { |
82 | QueryWorker<DomainType> worker(query, instanceIdentifier, factory, bufferType); | 83 | QueryWorker<DomainType> worker(query, instanceIdentifier, factory, bufferType, mResultTransformation); |
83 | const qint64 newRevision = worker.executeInitialQuery(query, parent, *resultProvider); | 84 | const qint64 newRevision = worker.executeInitialQuery(query, parent, *resultProvider); |
84 | return newRevision; | 85 | return newRevision; |
85 | }) | 86 | }) |
@@ -96,8 +97,8 @@ QueryRunner<DomainType>::QueryRunner(const Sink::Query &query, const Sink::Resou | |||
96 | //Incremental updates are always loaded directly, leaving it up to the result to discard the changes if they are not interesting | 97 | //Incremental updates are always loaded directly, leaving it up to the result to discard the changes if they are not interesting |
97 | setQuery([=] () -> KAsync::Job<void> { | 98 | setQuery([=] () -> KAsync::Job<void> { |
98 | auto resultProvider = mResultProvider; | 99 | auto resultProvider = mResultProvider; |
99 | QueryWorker<DomainType> worker(query, instanceIdentifier, factory, bufferType); | ||
100 | return async::run<qint64>([=]() -> qint64 { | 100 | return async::run<qint64>([=]() -> qint64 { |
101 | QueryWorker<DomainType> worker(query, instanceIdentifier, factory, bufferType, mResultTransformation); | ||
101 | const qint64 newRevision = worker.executeIncrementalQuery(query, *resultProvider); | 102 | const qint64 newRevision = worker.executeIncrementalQuery(query, *resultProvider); |
102 | return newRevision; | 103 | return newRevision; |
103 | }) | 104 | }) |
@@ -121,6 +122,12 @@ QueryRunner<DomainType>::~QueryRunner() | |||
121 | } | 122 | } |
122 | 123 | ||
123 | template<class DomainType> | 124 | template<class DomainType> |
125 | void QueryRunner<DomainType>::setResultTransformation(const ResultTransformation &transformation) | ||
126 | { | ||
127 | mResultTransformation = transformation; | ||
128 | } | ||
129 | |||
130 | template<class DomainType> | ||
124 | typename Sink::ResultEmitter<typename DomainType::Ptr>::Ptr QueryRunner<DomainType>::emitter() | 131 | typename Sink::ResultEmitter<typename DomainType::Ptr>::Ptr QueryRunner<DomainType>::emitter() |
125 | { | 132 | { |
126 | return mResultProvider->emitter(); | 133 | return mResultProvider->emitter(); |
@@ -150,8 +157,9 @@ static inline ResultSet fullScan(const Sink::Storage::Transaction &transaction, | |||
150 | 157 | ||
151 | 158 | ||
152 | template<class DomainType> | 159 | template<class DomainType> |
153 | QueryWorker<DomainType>::QueryWorker(const Sink::Query &query, const QByteArray &instanceIdentifier, const DomainTypeAdaptorFactoryInterface::Ptr &factory, const QByteArray &bufferType) | 160 | QueryWorker<DomainType>::QueryWorker(const Sink::Query &query, const QByteArray &instanceIdentifier, const DomainTypeAdaptorFactoryInterface::Ptr &factory, const QByteArray &bufferType, const QueryRunnerBase::ResultTransformation &transformation) |
154 | : QObject(), | 161 | : QObject(), |
162 | mResultTransformation(transformation), | ||
155 | mDomainTypeAdaptorFactory(factory), | 163 | mDomainTypeAdaptorFactory(factory), |
156 | mResourceInstanceIdentifier(instanceIdentifier), | 164 | mResourceInstanceIdentifier(instanceIdentifier), |
157 | mBufferType(bufferType), | 165 | mBufferType(bufferType), |
@@ -170,20 +178,25 @@ template<class DomainType> | |||
170 | void QueryWorker<DomainType>::replaySet(ResultSet &resultSet, Sink::ResultProviderInterface<typename DomainType::Ptr> &resultProvider, const QList<QByteArray> &properties) | 178 | void QueryWorker<DomainType>::replaySet(ResultSet &resultSet, Sink::ResultProviderInterface<typename DomainType::Ptr> &resultProvider, const QList<QByteArray> &properties) |
171 | { | 179 | { |
172 | int counter = 0; | 180 | int counter = 0; |
173 | while (resultSet.next([&resultProvider, &counter, &properties](const Sink::ApplicationDomain::ApplicationDomainType::Ptr &value, Sink::Operation operation) -> bool { | 181 | while (resultSet.next([this, &resultProvider, &counter, &properties](const Sink::ApplicationDomain::ApplicationDomainType::Ptr &value, Sink::Operation operation) -> bool { |
182 | //FIXME allow maildir resource to set the mimeMessage property | ||
183 | auto valueCopy = Sink::ApplicationDomain::ApplicationDomainType::getInMemoryRepresentation<DomainType>(*value, properties).template staticCast<DomainType>(); | ||
184 | if (mResultTransformation) { | ||
185 | mResultTransformation(*valueCopy); | ||
186 | } | ||
174 | counter++; | 187 | counter++; |
175 | switch (operation) { | 188 | switch (operation) { |
176 | case Sink::Operation_Creation: | 189 | case Sink::Operation_Creation: |
177 | // Trace() << "Got creation"; | 190 | // Trace() << "Got creation"; |
178 | resultProvider.add(Sink::ApplicationDomain::ApplicationDomainType::getInMemoryRepresentation<DomainType>(*value, properties).template staticCast<DomainType>()); | 191 | resultProvider.add(valueCopy); |
179 | break; | 192 | break; |
180 | case Sink::Operation_Modification: | 193 | case Sink::Operation_Modification: |
181 | // Trace() << "Got modification"; | 194 | // Trace() << "Got modification"; |
182 | resultProvider.modify(Sink::ApplicationDomain::ApplicationDomainType::getInMemoryRepresentation<DomainType>(*value, properties).template staticCast<DomainType>()); | 195 | resultProvider.modify(valueCopy); |
183 | break; | 196 | break; |
184 | case Sink::Operation_Removal: | 197 | case Sink::Operation_Removal: |
185 | // Trace() << "Got removal"; | 198 | // Trace() << "Got removal"; |
186 | resultProvider.remove(Sink::ApplicationDomain::ApplicationDomainType::getInMemoryRepresentation<DomainType>(*value, properties).template staticCast<DomainType>()); | 199 | resultProvider.remove(valueCopy); |
187 | break; | 200 | break; |
188 | } | 201 | } |
189 | return true; | 202 | return true; |