summaryrefslogtreecommitdiffstats
path: root/common/query.h
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2016-10-05 00:09:30 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2016-10-05 00:09:30 +0200
commite470f65cad943f8a3065c6f5f6287adcc704627e (patch)
tree3bc3531b0f32b67d09cdc281f5f53bdf1d819bd7 /common/query.h
parent3ae3ef9676bd7fdcb45064f9a1b397c90478b4b7 (diff)
downloadsink-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.h89
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;