diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2016-10-05 00:09:30 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2016-10-05 00:09:30 +0200 |
commit | e470f65cad943f8a3065c6f5f6287adcc704627e (patch) | |
tree | 3bc3531b0f32b67d09cdc281f5f53bdf1d819bd7 /common/query.h | |
parent | 3ae3ef9676bd7fdcb45064f9a1b397c90478b4b7 (diff) | |
download | sink-e470f65cad943f8a3065c6f5f6287adcc704627e.tar.gz sink-e470f65cad943f8a3065c6f5f6287adcc704627e.zip |
Specify base set as part of the filter stages in the query.
Diffstat (limited to 'common/query.h')
-rw-r--r-- | common/query.h | 89 |
1 files changed, 57 insertions, 32 deletions
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; |