diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2016-10-05 20:07:53 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2016-10-05 20:07:53 +0200 |
commit | 94829f17066dcbbeb9f641a4870dd88aa916ba24 (patch) | |
tree | cef0fef888e999cc840bbe90a9c155eae1b0890c /common/store.cpp | |
parent | e470f65cad943f8a3065c6f5f6287adcc704627e (diff) | |
download | sink-94829f17066dcbbeb9f641a4870dd88aa916ba24.tar.gz sink-94829f17066dcbbeb9f641a4870dd88aa916ba24.zip |
A better resource filter api
Diffstat (limited to 'common/store.cpp')
-rw-r--r-- | common/store.cpp | 24 |
1 files changed, 7 insertions, 17 deletions
diff --git a/common/store.cpp b/common/store.cpp index c015ef6..0ecdcd2 100644 --- a/common/store.cpp +++ b/common/store.cpp | |||
@@ -59,25 +59,15 @@ QString Store::getTemporaryFilePath() | |||
59 | */ | 59 | */ |
60 | static QMap<QByteArray, QByteArray> getResources(const Sink::Query &query, const QByteArray &type = QByteArray()) | 60 | static QMap<QByteArray, QByteArray> getResources(const Sink::Query &query, const QByteArray &type = QByteArray()) |
61 | { | 61 | { |
62 | const QList<QByteArray> resourceFilter = query.resources; | 62 | const QList<QByteArray> resourceFilter = query.getResourceFilter().ids; |
63 | const QList<QByteArray> accountFilter = query.accounts; | ||
64 | 63 | ||
65 | auto resourceComparator = query.getFilter(Sink::ApplicationDomain::Entity::Resource::name); | ||
66 | 64 | ||
67 | const auto filterResource = [&](const QByteArray &res) { | 65 | const auto filterResource = [&](const QByteArray &res) { |
68 | const auto configuration = ResourceConfig::getConfiguration(res); | 66 | const auto configuration = ResourceConfig::getConfiguration(res); |
69 | if (!accountFilter.isEmpty() && !accountFilter.contains(configuration.value(ApplicationDomain::SinkResource::Account::name).toByteArray())) { | 67 | for (const auto &filterProperty : query.getResourceFilter().propertyFilter.keys()) { |
70 | return true; | 68 | const auto filter = query.getResourceFilter().propertyFilter.value(filterProperty); |
71 | } | 69 | if (!filter.matches(configuration.value(filterProperty))) { |
72 | //Subquery for the resource | 70 | return true; |
73 | if (resourceComparator.value.canConvert<Query>()) { | ||
74 | const auto subquery = resourceComparator.value.value<Query>(); | ||
75 | const auto baseFilters = subquery.getBaseFilters(); | ||
76 | for (const auto &filterProperty : baseFilters.keys()) { | ||
77 | const auto filter = baseFilters.value(filterProperty); | ||
78 | if (!filter.matches(configuration.value(filterProperty))) { | ||
79 | return true; | ||
80 | } | ||
81 | } | 71 | } |
82 | } | 72 | } |
83 | return false; | 73 | return false; |
@@ -159,7 +149,7 @@ QSharedPointer<QAbstractItemModel> Store::loadModel(Query query) | |||
159 | auto aggregatingEmitter = AggregatingResultEmitter<typename DomainType::Ptr>::Ptr::create(); | 149 | auto aggregatingEmitter = AggregatingResultEmitter<typename DomainType::Ptr>::Ptr::create(); |
160 | model->setEmitter(aggregatingEmitter); | 150 | model->setEmitter(aggregatingEmitter); |
161 | 151 | ||
162 | if (query.liveQuery && query.resources.isEmpty() && !ApplicationDomain::isGlobalType(ApplicationDomain::getTypeName<DomainType>())) { | 152 | if (query.liveQuery && query.getResourceFilter().ids.isEmpty() && !ApplicationDomain::isGlobalType(ApplicationDomain::getTypeName<DomainType>())) { |
163 | SinkTrace() << "Listening for new resources"; | 153 | SinkTrace() << "Listening for new resources"; |
164 | auto facade = FacadeFactory::instance().getFacade<ApplicationDomain::SinkResource>("", ""); | 154 | auto facade = FacadeFactory::instance().getFacade<ApplicationDomain::SinkResource>("", ""); |
165 | Q_ASSERT(facade); | 155 | Q_ASSERT(facade); |
@@ -267,8 +257,8 @@ KAsync::Job<void> Store::removeDataFromDisk(const QByteArray &identifier) | |||
267 | 257 | ||
268 | KAsync::Job<void> Store::synchronize(const Sink::Query &query) | 258 | KAsync::Job<void> Store::synchronize(const Sink::Query &query) |
269 | { | 259 | { |
270 | SinkTrace() << "synchronize" << query.resources; | ||
271 | auto resources = getResources(query).keys(); | 260 | auto resources = getResources(query).keys(); |
261 | SinkTrace() << "synchronize" << resources; | ||
272 | //FIXME only necessary because each doesn't propagate errors | 262 | //FIXME only necessary because each doesn't propagate errors |
273 | auto errorFlag = new bool; | 263 | auto errorFlag = new bool; |
274 | return KAsync::value(resources) | 264 | return KAsync::value(resources) |