diff options
-rw-r--r-- | common/datastorequery.cpp | 14 | ||||
-rw-r--r-- | common/query.h | 89 | ||||
-rw-r--r-- | common/resourcefacade.cpp | 2 | ||||
-rw-r--r-- | common/store.cpp | 11 | ||||
-rw-r--r-- | sinksh/syntax_modules/sink_show.cpp | 4 | ||||
-rw-r--r-- | tests/querytest.cpp | 4 |
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 | ||
408 | void DataStoreQuery::setupQuery() | 408 | void 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); |