From d2d8a85aa6c56195368f7ec563a98afb6861acd9 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 21 Feb 2018 15:47:50 +0100 Subject: Remember aggregated ids --- common/datastorequery.cpp | 41 ++++++++++++++++++--------------- common/domain/applicationdomaintype.cpp | 16 +++++++++++++ common/domain/applicationdomaintype.h | 6 +++++ common/queryrunner.cpp | 2 +- common/resultset.h | 3 ++- 5 files changed, 48 insertions(+), 20 deletions(-) diff --git a/common/datastorequery.cpp b/common/datastorequery.cpp index 50158c7..218796f 100644 --- a/common/datastorequery.cpp +++ b/common/datastorequery.cpp @@ -252,11 +252,18 @@ public: return false; } - QByteArray reduceOnValue(const QVariant &reductionValue, QMap &aggregateValues) + struct ReductionResult { + QByteArray selection; + QVector aggregateIds; + QMap aggregateValues; + }; + + ReductionResult reduceOnValue(const QVariant &reductionValue) { + QMap aggregateValues; QVariant selectionResultValue; QByteArray selectionResult; - auto results = indexLookup(mReductionProperty, reductionValue); + const auto results = indexLookup(mReductionProperty, reductionValue); for (auto &aggregator : mAggregators) { aggregator.reset(); } @@ -287,7 +294,7 @@ public: for (auto &aggregator : mAggregators) { aggregateValues.insert(aggregator.resultProperty, aggregator.result()); } - return selectionResult; + return {selectionResult, results, aggregateValues}; } bool next(const std::function &callback) Q_DECL_OVERRIDE { @@ -302,12 +309,11 @@ public: if (!mReducedValues.contains(reductionValueBa)) { //Only reduce every value once. mReducedValues.insert(reductionValueBa); - QMap aggregateValues; - auto selectionResult = reduceOnValue(reductionValue, aggregateValues); + auto reductionResult = reduceOnValue(reductionValue); - mSelectedValues.insert(reductionValueBa, selectionResult); - readEntity(selectionResult, [&](const Sink::ApplicationDomain::ApplicationDomainType &entity, Sink::Operation operation) { - callback({entity, operation, aggregateValues}); + mSelectedValues.insert(reductionValueBa, reductionResult.selection); + readEntity(reductionResult.selection, [&](const Sink::ApplicationDomain::ApplicationDomainType &entity, Sink::Operation operation) { + callback({entity, operation, reductionResult.aggregateValues, reductionResult.aggregateIds}); foundValue = true; }); } else { @@ -317,15 +323,14 @@ public: if (mIncremental && !mIncrementallyReducedValues.contains(reductionValueBa)) { mIncrementallyReducedValues.insert(reductionValueBa); //Redo the reduction to find new aggregated values - QMap aggregateValues; - auto selectionResult = reduceOnValue(reductionValue, aggregateValues); + auto selectionResult = reduceOnValue(reductionValue); //TODO if old and new are the same a modification would be enough auto oldSelectionResult = mSelectedValues.take(reductionValueBa); - if (oldSelectionResult == selectionResult) { - mSelectedValues.insert(reductionValueBa, selectionResult); - readEntity(selectionResult, [&](const Sink::ApplicationDomain::ApplicationDomainType &entity, Sink::Operation) { - callback({entity, Sink::Operation_Modification, aggregateValues}); + if (oldSelectionResult == selectionResult.selection) { + mSelectedValues.insert(reductionValueBa, selectionResult.selection); + readEntity(selectionResult.selection, [&](const Sink::ApplicationDomain::ApplicationDomainType &entity, Sink::Operation) { + callback({entity, Sink::Operation_Modification, selectionResult.aggregateValues, selectionResult.aggregateIds}); }); } else { //remove old result @@ -334,9 +339,9 @@ public: }); //add new result - mSelectedValues.insert(reductionValueBa, selectionResult); - readEntity(selectionResult, [&](const Sink::ApplicationDomain::ApplicationDomainType &entity, Sink::Operation) { - callback({entity, Sink::Operation_Creation, aggregateValues}); + mSelectedValues.insert(reductionValueBa, selectionResult.selection); + readEntity(selectionResult.selection, [&](const Sink::ApplicationDomain::ApplicationDomainType &entity, Sink::Operation) { + callback({entity, Sink::Operation_Creation, selectionResult.aggregateValues, selectionResult.aggregateIds}); }); } } @@ -648,7 +653,7 @@ ResultSet DataStoreQuery::execute() if (mCollector->next([this, callback](const ResultSet::Result &result) { if (result.operation != Sink::Operation_Removal) { SinkTraceCtx(mLogCtx) << "Got initial result: " << result.entity.identifier() << result.operation; - callback(ResultSet::Result{result.entity, Sink::Operation_Creation, result.aggregateValues}); + callback(ResultSet::Result{result.entity, Sink::Operation_Creation, result.aggregateValues, result.aggregateIds}); } })) { diff --git a/common/domain/applicationdomaintype.cpp b/common/domain/applicationdomaintype.cpp index 8bb74e3..c315e33 100644 --- a/common/domain/applicationdomaintype.cpp +++ b/common/domain/applicationdomaintype.cpp @@ -184,6 +184,7 @@ ApplicationDomainType& ApplicationDomainType::operator=(const ApplicationDomainT mResourceInstanceIdentifier = other.mResourceInstanceIdentifier; mIdentifier = other.mIdentifier; mRevision = other.mRevision; + mAggreatedIds = other.mAggreatedIds; return *this; } @@ -262,6 +263,21 @@ QByteArray ApplicationDomainType::identifier() const return mIdentifier; } +bool ApplicationDomainType::isAggregate() const +{ + return !mAggreatedIds.isEmpty(); +} + +QVector ApplicationDomainType::aggregatedIds() const +{ + return mAggreatedIds; +} + +QVector &ApplicationDomainType::aggregatedIds() +{ + return mAggreatedIds; +} + SinkResource::SinkResource(const QByteArray &identifier) : ApplicationDomainType("", identifier, 0, QSharedPointer(new MemoryBufferAdaptor())) { diff --git a/common/domain/applicationdomaintype.h b/common/domain/applicationdomaintype.h index b4db54e..dcd401c 100644 --- a/common/domain/applicationdomaintype.h +++ b/common/domain/applicationdomaintype.h @@ -268,6 +268,10 @@ public: void setResource(const QByteArray &identifier); QByteArray identifier() const; + bool isAggregate() const; + QVector aggregatedIds() const; + QVector &aggregatedIds(); + private: friend QDebug operator<<(QDebug, const ApplicationDomainType &); QSharedPointer mAdaptor; @@ -278,6 +282,8 @@ private: QByteArray mResourceInstanceIdentifier; QByteArray mIdentifier; qint64 mRevision; + + QVector mAggreatedIds; }; /* diff --git a/common/queryrunner.cpp b/common/queryrunner.cpp index 0ed4cb5..2062828 100644 --- a/common/queryrunner.cpp +++ b/common/queryrunner.cpp @@ -45,7 +45,6 @@ struct ReplayResult { template class QueryWorker : public QObject { - typedef std::function &aggregateValues)> ResultCallback; public: QueryWorker(const Sink::Query &query, const ResourceContext &context, const QByteArray &bufferType, const QueryRunnerBase::ResultTransformation &transformation, const Sink::Log::Context &logCtx); virtual ~QueryWorker(); @@ -210,6 +209,7 @@ void QueryWorker::resultProviderCallback(const Sink::Query &query, S for (auto it = result.aggregateValues.constBegin(); it != result.aggregateValues.constEnd(); it++) { valueCopy->setProperty(it.key(), it.value()); } + valueCopy->aggregatedIds() = result.aggregateIds; if (mResultTransformation) { mResultTransformation(*valueCopy); } diff --git a/common/resultset.h b/common/resultset.h index 707bc7e..5587c54 100644 --- a/common/resultset.h +++ b/common/resultset.h @@ -35,10 +35,11 @@ class ResultSet { public: struct Result { - Result(const Sink::ApplicationDomain::ApplicationDomainType &e, Sink::Operation op, const QMap &v = QMap{}) : entity(e), operation(op), aggregateValues(v) {} + Result(const Sink::ApplicationDomain::ApplicationDomainType &e, Sink::Operation op, const QMap &v = {}, const QVector &a = {}) : entity(e), operation(op), aggregateValues(v), aggregateIds(a) {} Sink::ApplicationDomain::ApplicationDomainType entity; Sink::Operation operation; QMap aggregateValues; + QVector aggregateIds; }; typedef std::function Callback; typedef std::function ValueGenerator; -- cgit v1.2.3