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/query.h | |
parent | e470f65cad943f8a3065c6f5f6287adcc704627e (diff) | |
download | sink-94829f17066dcbbeb9f641a4870dd88aa916ba24.tar.gz sink-94829f17066dcbbeb9f641a4870dd88aa916ba24.zip |
A better resource filter api
Diffstat (limited to 'common/query.h')
-rw-r--r-- | common/query.h | 135 |
1 files changed, 49 insertions, 86 deletions
diff --git a/common/query.h b/common/query.h index 82b04f7..ae307a2 100644 --- a/common/query.h +++ b/common/query.h | |||
@@ -59,46 +59,6 @@ public: | |||
59 | Comparators comparator; | 59 | Comparators comparator; |
60 | }; | 60 | }; |
61 | 61 | ||
62 | static Query ResourceFilter(const QByteArray &identifier) | ||
63 | { | ||
64 | Query query; | ||
65 | query.resources.append(identifier); | ||
66 | return query; | ||
67 | } | ||
68 | |||
69 | static Query ResourceFilter(const QByteArrayList &identifier) | ||
70 | { | ||
71 | Query query; | ||
72 | query.resources = identifier; | ||
73 | return query; | ||
74 | } | ||
75 | |||
76 | static Query ResourceFilter(const ApplicationDomain::SinkResource &entity) | ||
77 | { | ||
78 | return ResourceFilter(entity.identifier()); | ||
79 | } | ||
80 | |||
81 | static Query IdentityFilter(const QByteArray &identifier) | ||
82 | { | ||
83 | Q_ASSERT(!identifier.isEmpty()); | ||
84 | Query query; | ||
85 | query.filter(identifier); | ||
86 | return query; | ||
87 | } | ||
88 | |||
89 | static Query IdentityFilter(const QByteArrayList &identifier) | ||
90 | { | ||
91 | Query query; | ||
92 | query.filter(identifier); | ||
93 | return query; | ||
94 | } | ||
95 | |||
96 | static Query IdentityFilter(const ApplicationDomain::Entity &entity) | ||
97 | { | ||
98 | auto query = IdentityFilter(entity.identifier()); | ||
99 | query.resources << entity.resourceInstanceIdentifier(); | ||
100 | return query; | ||
101 | } | ||
102 | 62 | ||
103 | template <typename T> | 63 | template <typename T> |
104 | Query &request() | 64 | Query &request() |
@@ -124,16 +84,13 @@ public: | |||
124 | Query(const ApplicationDomain::Entity &value) : limit(0), liveQuery(false), synchronousQuery(false) | 84 | Query(const ApplicationDomain::Entity &value) : limit(0), liveQuery(false), synchronousQuery(false) |
125 | { | 85 | { |
126 | filter(value.identifier()); | 86 | filter(value.identifier()); |
127 | filter(ApplicationDomain::SinkResource(value.resourceInstanceIdentifier())); | 87 | resourceFilter(value.resourceInstanceIdentifier()); |
128 | } | 88 | } |
129 | 89 | ||
130 | |||
131 | Query(Flags flags = Flags()) : limit(0), liveQuery(false), synchronousQuery(false) | 90 | Query(Flags flags = Flags()) : limit(0), liveQuery(false), synchronousQuery(false) |
132 | { | 91 | { |
133 | } | 92 | } |
134 | 93 | ||
135 | QByteArrayList resources; | ||
136 | QByteArrayList accounts; | ||
137 | QByteArrayList requestedProperties; | 94 | QByteArrayList requestedProperties; |
138 | QByteArray parentProperty; | 95 | QByteArray parentProperty; |
139 | QByteArray sortProperty; | 96 | QByteArray sortProperty; |
@@ -147,7 +104,10 @@ public: | |||
147 | virtual ~FilterStage(){}; | 104 | virtual ~FilterStage(){}; |
148 | }; | 105 | }; |
149 | 106 | ||
150 | QList<QSharedPointer<FilterStage>> filterStages; | 107 | QList<QSharedPointer<FilterStage>> getFilterStages() |
108 | { | ||
109 | return mFilterStages; | ||
110 | } | ||
151 | 111 | ||
152 | /* | 112 | /* |
153 | * Filters | 113 | * Filters |
@@ -178,69 +138,45 @@ public: | |||
178 | 138 | ||
179 | Query &filter(const QByteArray &id) | 139 | Query &filter(const QByteArray &id) |
180 | { | 140 | { |
181 | if (filterStages.isEmpty()) { | 141 | mBaseFilterStage.ids << id; |
182 | filterStages << QSharedPointer<Filter>::create(); | ||
183 | } | ||
184 | filterStages.first().staticCast<Filter>()->ids << id; | ||
185 | return *this; | 142 | return *this; |
186 | } | 143 | } |
187 | 144 | ||
188 | Query &filter(const QByteArrayList &ids) | 145 | Query &filter(const QByteArrayList &ids) |
189 | { | 146 | { |
190 | if (filterStages.isEmpty()) { | 147 | mBaseFilterStage.ids << ids; |
191 | filterStages << QSharedPointer<Filter>::create(); | ||
192 | } | ||
193 | filterStages.first().staticCast<Filter>()->ids << ids; | ||
194 | return *this; | 148 | return *this; |
195 | } | 149 | } |
196 | 150 | ||
197 | Query &filter(const QByteArray &property, const Comparator &comparator) | 151 | Query &filter(const QByteArray &property, const Comparator &comparator) |
198 | { | 152 | { |
199 | if (filterStages.isEmpty()) { | 153 | mBaseFilterStage.propertyFilter.insert(property, comparator); |
200 | filterStages << QSharedPointer<Filter>::create(); | ||
201 | } | ||
202 | filterStages.first().staticCast<Filter>()->propertyFilter.insert(property, comparator); | ||
203 | return *this; | 154 | return *this; |
204 | } | 155 | } |
205 | 156 | ||
206 | Comparator getFilter(const QByteArray &property) const | 157 | Comparator getFilter(const QByteArray &property) const |
207 | { | 158 | { |
208 | if (filterStages.isEmpty()) { | 159 | return mBaseFilterStage.propertyFilter.value(property); |
209 | return Comparator(); | ||
210 | } | ||
211 | return filterStages.first().staticCast<Filter>()->propertyFilter.value(property); | ||
212 | } | 160 | } |
213 | 161 | ||
214 | bool hasFilter(const QByteArray &property) const | 162 | bool hasFilter(const QByteArray &property) const |
215 | { | 163 | { |
216 | if (filterStages.isEmpty()) { | 164 | return mBaseFilterStage.propertyFilter.contains(property); |
217 | return false; | ||
218 | } | ||
219 | return filterStages.first().staticCast<Filter>()->propertyFilter.contains(property); | ||
220 | } | 165 | } |
221 | 166 | ||
222 | void setBaseFilters(const QHash<QByteArray, Comparator> &filter) | 167 | void setBaseFilters(const QHash<QByteArray, Comparator> &filter) |
223 | { | 168 | { |
224 | if (filterStages.isEmpty()) { | 169 | mBaseFilterStage.propertyFilter = filter; |
225 | filterStages << QSharedPointer<Filter>::create(); | ||
226 | } | ||
227 | filterStages.first().staticCast<Filter>()->propertyFilter = filter; | ||
228 | } | 170 | } |
229 | 171 | ||
230 | QHash<QByteArray, Comparator> getBaseFilters() const | 172 | QHash<QByteArray, Comparator> getBaseFilters() const |
231 | { | 173 | { |
232 | if (filterStages.isEmpty()) { | 174 | return mBaseFilterStage.propertyFilter; |
233 | return QHash<QByteArray, Comparator>(); | ||
234 | } | ||
235 | return filterStages.first().staticCast<Filter>()->propertyFilter; | ||
236 | } | 175 | } |
237 | 176 | ||
238 | QByteArrayList ids() const | 177 | QByteArrayList ids() const |
239 | { | 178 | { |
240 | if (filterStages.isEmpty()) { | 179 | return mBaseFilterStage.ids; |
241 | return QByteArrayList(); | ||
242 | } | ||
243 | return filterStages.first().staticCast<Filter>()->ids; | ||
244 | } | 180 | } |
245 | 181 | ||
246 | template <typename T> | 182 | template <typename T> |
@@ -257,18 +193,42 @@ public: | |||
257 | return filter(T::name, QVariant::fromValue(q)); | 193 | return filter(T::name, QVariant::fromValue(q)); |
258 | } | 194 | } |
259 | 195 | ||
260 | Query &filter(const ApplicationDomain::SinkResource &resource) | 196 | Filter getResourceFilter() const |
197 | { | ||
198 | return mResourceFilter; | ||
199 | } | ||
200 | |||
201 | Query &resourceFilter(const QByteArray &id) | ||
261 | { | 202 | { |
262 | resources << resource.identifier(); | 203 | mResourceFilter.ids << id; |
263 | return *this; | 204 | return *this; |
264 | } | 205 | } |
265 | 206 | ||
266 | Query &filter(const ApplicationDomain::SinkAccount &account) | 207 | template <typename T> |
208 | Query &resourceFilter(const ApplicationDomain::ApplicationDomainType &entity) | ||
267 | { | 209 | { |
268 | accounts << account.identifier(); | 210 | mResourceFilter.propertyFilter.insert(T::name, Comparator(entity.identifier())); |
269 | return *this; | 211 | return *this; |
270 | } | 212 | } |
271 | 213 | ||
214 | Query &resourceFilter(const QByteArray &name, const Comparator &comparator) | ||
215 | { | ||
216 | mResourceFilter.propertyFilter.insert(name, comparator); | ||
217 | return *this; | ||
218 | } | ||
219 | |||
220 | template <typename T> | ||
221 | Query &resourceContainsFilter(const QVariant &value) | ||
222 | { | ||
223 | return resourceFilter(T::name, Comparator(value, Comparator::Contains)); | ||
224 | } | ||
225 | |||
226 | template <typename T> | ||
227 | Query &resourceFilter(const QVariant &value) | ||
228 | { | ||
229 | return resourceFilter(T::name, value); | ||
230 | } | ||
231 | |||
272 | class Reduce : public FilterStage { | 232 | class Reduce : public FilterStage { |
273 | public: | 233 | public: |
274 | 234 | ||
@@ -318,7 +278,7 @@ public: | |||
318 | Reduce &reduce(const Reduce::Selector &s) | 278 | Reduce &reduce(const Reduce::Selector &s) |
319 | { | 279 | { |
320 | auto reduction = QSharedPointer<Reduce>::create(T::name, s); | 280 | auto reduction = QSharedPointer<Reduce>::create(T::name, s); |
321 | filterStages << reduction; | 281 | mFilterStages << reduction; |
322 | return *reduction; | 282 | return *reduction; |
323 | } | 283 | } |
324 | 284 | ||
@@ -345,7 +305,7 @@ public: | |||
345 | void bloom() | 305 | void bloom() |
346 | { | 306 | { |
347 | auto bloom = QSharedPointer<Bloom>::create(T::name); | 307 | auto bloom = QSharedPointer<Bloom>::create(T::name); |
348 | filterStages << bloom; | 308 | mFilterStages << bloom; |
349 | } | 309 | } |
350 | 310 | ||
351 | //Query fixtures | 311 | //Query fixtures |
@@ -357,7 +317,7 @@ public: | |||
357 | { | 317 | { |
358 | Sink::Query query; | 318 | Sink::Query query; |
359 | if (!mail.resourceInstanceIdentifier().isEmpty()) { | 319 | if (!mail.resourceInstanceIdentifier().isEmpty()) { |
360 | query.filter(ApplicationDomain::SinkResource(mail.resourceInstanceIdentifier())); | 320 | query.resourceFilter(mail.resourceInstanceIdentifier()); |
361 | } | 321 | } |
362 | query.filter(mail.identifier()); | 322 | query.filter(mail.identifier()); |
363 | query.sort<ApplicationDomain::Mail::Date>(); | 323 | query.sort<ApplicationDomain::Mail::Date>(); |
@@ -372,7 +332,7 @@ public: | |||
372 | { | 332 | { |
373 | Sink::Query query; | 333 | Sink::Query query; |
374 | if (!folder.resourceInstanceIdentifier().isEmpty()) { | 334 | if (!folder.resourceInstanceIdentifier().isEmpty()) { |
375 | query.filter(ApplicationDomain::SinkResource(folder.resourceInstanceIdentifier())); | 335 | query.resourceFilter(folder.resourceInstanceIdentifier()); |
376 | } | 336 | } |
377 | query.filter<ApplicationDomain::Mail::Folder>(folder); | 337 | query.filter<ApplicationDomain::Mail::Folder>(folder); |
378 | query.sort<ApplicationDomain::Mail::Date>(); | 338 | query.sort<ApplicationDomain::Mail::Date>(); |
@@ -380,7 +340,10 @@ public: | |||
380 | return query; | 340 | return query; |
381 | } | 341 | } |
382 | 342 | ||
383 | 343 | private: | |
344 | Filter mResourceFilter; | ||
345 | Filter mBaseFilterStage; | ||
346 | QList<QSharedPointer<FilterStage>> mFilterStages; | ||
384 | }; | 347 | }; |
385 | 348 | ||
386 | } | 349 | } |