summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/datastorequery.cpp14
-rw-r--r--common/query.h89
-rw-r--r--common/resourcefacade.cpp2
-rw-r--r--common/store.cpp11
-rw-r--r--sinksh/syntax_modules/sink_show.cpp4
-rw-r--r--tests/querytest.cpp4
6 files changed, 76 insertions, 48 deletions
diff --git a/common/datastorequery.cpp b/common/datastorequery.cpp
index dac171c..0cc30e5 100644
--- a/common/datastorequery.cpp
+++ b/common/datastorequery.cpp
@@ -407,23 +407,25 @@ QByteArrayList DataStoreQuery::executeSubquery(const Query &subquery)
407 407
408void DataStoreQuery::setupQuery() 408void DataStoreQuery::setupQuery()
409{ 409{
410 for (const auto &k : mQuery.propertyFilter.keys()) { 410 auto baseFilters = mQuery.getBaseFilters();
411 for (const auto &k : baseFilters.keys()) {
411 if (k == ApplicationDomain::Entity::Resource::name) { 412 if (k == ApplicationDomain::Entity::Resource::name) {
412 continue; 413 continue;
413 } 414 }
414 const auto comparator = mQuery.propertyFilter.value(k); 415 const auto comparator = baseFilters.value(k);
415 if (comparator.value.canConvert<Query>()) { 416 if (comparator.value.canConvert<Query>()) {
416 SinkTrace() << "Executing subquery for property: " << k; 417 SinkTrace() << "Executing subquery for property: " << k;
417 const auto result = executeSubquery(comparator.value.value<Query>()); 418 const auto result = executeSubquery(comparator.value.value<Query>());
418 mQuery.propertyFilter.insert(k, Query::Comparator(QVariant::fromValue(result), Query::Comparator::In)); 419 baseFilters.insert(k, Query::Comparator(QVariant::fromValue(result), Query::Comparator::In));
419 } 420 }
420 } 421 }
422 mQuery.setBaseFilters(baseFilters);
421 423
422 FilterBase::Ptr baseSet; 424 FilterBase::Ptr baseSet;
423 QSet<QByteArray> remainingFilters = mQuery.getBaseFilters().keys().toSet(); 425 QSet<QByteArray> remainingFilters = mQuery.getBaseFilters().keys().toSet();
424 QByteArray appliedSorting; 426 QByteArray appliedSorting;
425 if (!mQuery.ids.isEmpty()) { 427 if (!mQuery.ids().isEmpty()) {
426 mSource = Source::Ptr::create(mQuery.ids.toVector(), this); 428 mSource = Source::Ptr::create(mQuery.ids().toVector(), this);
427 baseSet = mSource; 429 baseSet = mSource;
428 } else { 430 } else {
429 QSet<QByteArray> appliedFilters; 431 QSet<QByteArray> appliedFilters;
@@ -457,7 +459,7 @@ void DataStoreQuery::setupQuery()
457 /* } */ 459 /* } */
458 460
459 //Setup the rest of the filter stages on top of the base set 461 //Setup the rest of the filter stages on top of the base set
460 for (const auto &stage : mQuery.filterStages) { 462 for (const auto &stage : mQuery.filterStages.mid(1)) {
461 if (auto filter = stage.dynamicCast<Query::Filter>()) { 463 if (auto filter = stage.dynamicCast<Query::Filter>()) {
462 auto f = Filter::Ptr::create(baseSet, this); 464 auto f = Filter::Ptr::create(baseSet, this);
463 f->propertyFilter = filter->propertyFilter; 465 f->propertyFilter = filter->propertyFilter;
diff --git a/common/query.h b/common/query.h
index 403c5b5..82b04f7 100644
--- a/common/query.h
+++ b/common/query.h
@@ -82,14 +82,14 @@ public:
82 { 82 {
83 Q_ASSERT(!identifier.isEmpty()); 83 Q_ASSERT(!identifier.isEmpty());
84 Query query; 84 Query query;
85 query.ids << identifier; 85 query.filter(identifier);
86 return query; 86 return query;
87 } 87 }
88 88
89 static Query IdentityFilter(const QByteArrayList &identifier) 89 static Query IdentityFilter(const QByteArrayList &identifier)
90 { 90 {
91 Query query; 91 Query query;
92 query.ids = identifier; 92 query.filter(identifier);
93 return query; 93 return query;
94 } 94 }
95 95
@@ -123,39 +123,17 @@ public:
123 123
124 Query(const ApplicationDomain::Entity &value) : limit(0), liveQuery(false), synchronousQuery(false) 124 Query(const ApplicationDomain::Entity &value) : limit(0), liveQuery(false), synchronousQuery(false)
125 { 125 {
126 ids << value.identifier(); 126 filter(value.identifier());
127 resources << value.resourceInstanceIdentifier(); 127 filter(ApplicationDomain::SinkResource(value.resourceInstanceIdentifier()));
128 } 128 }
129 129
130 Query(Flags flags = Flags()) : limit(0), liveQuery(false), synchronousQuery(false)
131 {
132 }
133
134 Query &operator+=(const Query &rhs)
135 {
136 resources += rhs.resources;
137 accounts += rhs.accounts;
138 ids += rhs.ids;
139 for (auto it = rhs.propertyFilter.constBegin(); it != rhs.propertyFilter.constEnd(); it++) {
140 propertyFilter.insert(it.key(), it.value());
141 }
142 requestedProperties += rhs.requestedProperties;
143 parentProperty = rhs.parentProperty;
144 sortProperty = rhs.sortProperty;
145 limit = rhs.limit;
146 return *this;
147 }
148 130
149 friend Query operator+(Query lhs, const Query &rhs) 131 Query(Flags flags = Flags()) : limit(0), liveQuery(false), synchronousQuery(false)
150 { 132 {
151 lhs += rhs;
152 return lhs;
153 } 133 }
154 134
155 QByteArrayList resources; 135 QByteArrayList resources;
156 QByteArrayList accounts; 136 QByteArrayList accounts;
157 QByteArrayList ids;
158 QHash<QByteArray, Comparator> propertyFilter;
159 QByteArrayList requestedProperties; 137 QByteArrayList requestedProperties;
160 QByteArray parentProperty; 138 QByteArray parentProperty;
161 QByteArray sortProperty; 139 QByteArray sortProperty;
@@ -176,6 +154,7 @@ public:
176 */ 154 */
177 class Filter : public FilterStage { 155 class Filter : public FilterStage {
178 public: 156 public:
157 QByteArrayList ids;
179 QHash<QByteArray, Comparator> propertyFilter; 158 QHash<QByteArray, Comparator> propertyFilter;
180 }; 159 };
181 160
@@ -197,25 +176,71 @@ public:
197 return filter(T::name, comparator); 176 return filter(T::name, comparator);
198 } 177 }
199 178
179 Query &filter(const QByteArray &id)
180 {
181 if (filterStages.isEmpty()) {
182 filterStages << QSharedPointer<Filter>::create();
183 }
184 filterStages.first().staticCast<Filter>()->ids << id;
185 return *this;
186 }
187
188 Query &filter(const QByteArrayList &ids)
189 {
190 if (filterStages.isEmpty()) {
191 filterStages << QSharedPointer<Filter>::create();
192 }
193 filterStages.first().staticCast<Filter>()->ids << ids;
194 return *this;
195 }
196
200 Query &filter(const QByteArray &property, const Comparator &comparator) 197 Query &filter(const QByteArray &property, const Comparator &comparator)
201 { 198 {
202 propertyFilter.insert(property, comparator); 199 if (filterStages.isEmpty()) {
200 filterStages << QSharedPointer<Filter>::create();
201 }
202 filterStages.first().staticCast<Filter>()->propertyFilter.insert(property, comparator);
203 return *this; 203 return *this;
204 } 204 }
205 205
206 Comparator getFilter(const QByteArray &property) const 206 Comparator getFilter(const QByteArray &property) const
207 { 207 {
208 return propertyFilter.value(property); 208 if (filterStages.isEmpty()) {
209 return Comparator();
210 }
211 return filterStages.first().staticCast<Filter>()->propertyFilter.value(property);
209 } 212 }
210 213
211 bool hasFilter(const QByteArray &property) const 214 bool hasFilter(const QByteArray &property) const
212 { 215 {
213 return propertyFilter.contains(property); 216 if (filterStages.isEmpty()) {
217 return false;
218 }
219 return filterStages.first().staticCast<Filter>()->propertyFilter.contains(property);
220 }
221
222 void setBaseFilters(const QHash<QByteArray, Comparator> &filter)
223 {
224 if (filterStages.isEmpty()) {
225 filterStages << QSharedPointer<Filter>::create();
226 }
227 filterStages.first().staticCast<Filter>()->propertyFilter = filter;
214 } 228 }
215 229
216 QHash<QByteArray, Comparator> getBaseFilters() const 230 QHash<QByteArray, Comparator> getBaseFilters() const
217 { 231 {
218 return propertyFilter; 232 if (filterStages.isEmpty()) {
233 return QHash<QByteArray, Comparator>();
234 }
235 return filterStages.first().staticCast<Filter>()->propertyFilter;
236 }
237
238 QByteArrayList ids() const
239 {
240 if (filterStages.isEmpty()) {
241 return QByteArrayList();
242 }
243 return filterStages.first().staticCast<Filter>()->ids;
219 } 244 }
220 245
221 template <typename T> 246 template <typename T>
@@ -334,7 +359,7 @@ public:
334 if (!mail.resourceInstanceIdentifier().isEmpty()) { 359 if (!mail.resourceInstanceIdentifier().isEmpty()) {
335 query.filter(ApplicationDomain::SinkResource(mail.resourceInstanceIdentifier())); 360 query.filter(ApplicationDomain::SinkResource(mail.resourceInstanceIdentifier()));
336 } 361 }
337 query.ids << mail.identifier(); 362 query.filter(mail.identifier());
338 query.sort<ApplicationDomain::Mail::Date>(); 363 query.sort<ApplicationDomain::Mail::Date>();
339 query.bloom<ApplicationDomain::Mail::ThreadId>(); 364 query.bloom<ApplicationDomain::Mail::ThreadId>();
340 return query; 365 return query;
diff --git a/common/resourcefacade.cpp b/common/resourcefacade.cpp
index 6747938..09323a0 100644
--- a/common/resourcefacade.cpp
+++ b/common/resourcefacade.cpp
@@ -72,7 +72,7 @@ LocalStorageQueryRunner<DomainType>::LocalStorageQueryRunner(const Query &query,
72 SinkTrace() << "Skipping due to type."; 72 SinkTrace() << "Skipping due to type.";
73 continue; 73 continue;
74 } 74 }
75 if (!query.ids.isEmpty() && !query.ids.contains(res)) { 75 if (!query.ids().isEmpty() && !query.ids().contains(res)) {
76 continue; 76 continue;
77 } 77 }
78 const auto configurationValues = mConfigStore.get(res); 78 const auto configurationValues = mConfigStore.get(res);
diff --git a/common/store.cpp b/common/store.cpp
index efe1179..c015ef6 100644
--- a/common/store.cpp
+++ b/common/store.cpp
@@ -71,9 +71,10 @@ static QMap<QByteArray, QByteArray> getResources(const Sink::Query &query, const
71 } 71 }
72 //Subquery for the resource 72 //Subquery for the resource
73 if (resourceComparator.value.canConvert<Query>()) { 73 if (resourceComparator.value.canConvert<Query>()) {
74 auto subquery = resourceComparator.value.value<Query>(); 74 const auto subquery = resourceComparator.value.value<Query>();
75 for (const auto &filterProperty : subquery.propertyFilter.keys()) { 75 const auto baseFilters = subquery.getBaseFilters();
76 const auto filter = subquery.propertyFilter.value(filterProperty); 76 for (const auto &filterProperty : baseFilters.keys()) {
77 const auto filter = baseFilters.value(filterProperty);
77 if (!filter.matches(configuration.value(filterProperty))) { 78 if (!filter.matches(configuration.value(filterProperty))) {
78 return true; 79 return true;
79 } 80 }
@@ -140,9 +141,9 @@ QSharedPointer<QAbstractItemModel> Store::loadModel(Query query)
140{ 141{
141 SinkTrace() << "Query: " << ApplicationDomain::getTypeName<DomainType>(); 142 SinkTrace() << "Query: " << ApplicationDomain::getTypeName<DomainType>();
142 SinkTrace() << " Requested: " << query.requestedProperties; 143 SinkTrace() << " Requested: " << query.requestedProperties;
143 SinkTrace() << " Filter: " << query.propertyFilter; 144 SinkTrace() << " Filter: " << query.getBaseFilters();
144 SinkTrace() << " Parent: " << query.parentProperty; 145 SinkTrace() << " Parent: " << query.parentProperty;
145 SinkTrace() << " Ids: " << query.ids; 146 SinkTrace() << " Ids: " << query.ids();
146 SinkTrace() << " IsLive: " << query.liveQuery; 147 SinkTrace() << " IsLive: " << query.liveQuery;
147 SinkTrace() << " Sorting: " << query.sortProperty; 148 SinkTrace() << " Sorting: " << query.sortProperty;
148 auto model = QSharedPointer<ModelResult<DomainType, typename DomainType::Ptr>>::create(query, query.requestedProperties); 149 auto model = QSharedPointer<ModelResult<DomainType, typename DomainType::Ptr>>::create(query, query.requestedProperties);
diff --git a/sinksh/syntax_modules/sink_show.cpp b/sinksh/syntax_modules/sink_show.cpp
index 100b921..5197e77 100644
--- a/sinksh/syntax_modules/sink_show.cpp
+++ b/sinksh/syntax_modules/sink_show.cpp
@@ -58,9 +58,9 @@ bool show(const QStringList &args, State &state)
58 58
59 Sink::Query query; 59 Sink::Query query;
60 if (queryForResourceOrAgent) { 60 if (queryForResourceOrAgent) {
61 query.ids << resource.toLatin1(); 61 query.filter(resource.toLatin1());
62 } else { 62 } else {
63 query.resources << resource.toLatin1(); 63 query.filter(Sink::ApplicationDomain::SinkResource(resource.toLatin1()));
64 } 64 }
65 query.liveQuery = false; 65 query.liveQuery = false;
66 66
diff --git a/tests/querytest.cpp b/tests/querytest.cpp
index 6348316..db17026 100644
--- a/tests/querytest.cpp
+++ b/tests/querytest.cpp
@@ -164,8 +164,8 @@ private slots:
164 164
165 // Test 165 // Test
166 Sink::Query query; 166 Sink::Query query;
167 query.resources << "sink.dummy.instance1"; 167 query.filter(SinkResource("sink.dummy.instance1"));
168 query.ids << id; 168 query.filter(id);
169 auto model = Sink::Store::loadModel<Mail>(query); 169 auto model = Sink::Store::loadModel<Mail>(query);
170 QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); 170 QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool());
171 QCOMPARE(model->rowCount(), 1); 171 QCOMPARE(model->rowCount(), 1);