summaryrefslogtreecommitdiffstats
path: root/common/store.cpp
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2016-10-05 20:07:53 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2016-10-05 20:07:53 +0200
commit94829f17066dcbbeb9f641a4870dd88aa916ba24 (patch)
treecef0fef888e999cc840bbe90a9c155eae1b0890c /common/store.cpp
parente470f65cad943f8a3065c6f5f6287adcc704627e (diff)
downloadsink-94829f17066dcbbeb9f641a4870dd88aa916ba24.tar.gz
sink-94829f17066dcbbeb9f641a4870dd88aa916ba24.zip
A better resource filter api
Diffstat (limited to 'common/store.cpp')
-rw-r--r--common/store.cpp24
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 */
60static QMap<QByteArray, QByteArray> getResources(const Sink::Query &query, const QByteArray &type = QByteArray()) 60static 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
268KAsync::Job<void> Store::synchronize(const Sink::Query &query) 258KAsync::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)