ddc
QueryFilter.h
Go to the documentation of this file.
1 //-*- Mode: C++ -*-
2 // DDC originally by Alexey Sokirko
3 // Changes and modifications 2011-2020 by Bryan Jurish
4 //
5 // This file is part of DDC.
6 //
7 // DDC is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU Lesser General Public License as published by
9 // the Free Software Foundation, either version 3 of the License, or
10 // (at your option) any later version.
11 //
12 // DDC is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU Lesser General Public License for more details.
16 //
17 // You should have received a copy of the GNU Lesser General Public License
18 // along with DDC. If not, see <http://www.gnu.org/licenses/>.
19 //
20 
21 #ifndef DDC_QFILTER_H
22 #define DDC_QFILTER_H
23 
24 #include "ConcHolder.h"
25 
26 class CQueryCompiler; //-- forward decl
27 class CQueryOptions; //-- forward decl
28 class CQCountKeyExprList; //-- forward decl, for CQFPrune
29 class CQCount; //-- forward decl, for CQFPrune
30 
31 //======================================================================
32 // CQFilter
33 
35 class CQFilter : public ddcObject {
36 public:
37  //------------------------------------------------------------
39 
40  CQFilter()
42  {};
43 
45  virtual ~CQFilter() {};
46 
48  virtual bool CheckSatisfiable(CQueryCompiler *compiler, CQueryOptions *options);
49 
51  virtual bool Compile(CQueryCompiler *compiler, CQueryOptions *options);
52 
54  virtual CQFilter* Clone()
55  { return new CQFilter(*this); };
56 
58  virtual HitSortEnum FilterType() const
59  { return NoSort; };
61 
62  //------------------------------------------------------------
64 
65  virtual string toString(void) { return string("#FILTER[?]"); };
67  virtual string jsonClass(void) { return "CQFilter"; };
69 };
70 
71 //======================================================================
72 // CQFSort
73 
76 class CQFSort : public CQFilter {
77 public:
80 
82  std::string m_arg0;
83 
85  std::string m_arg1;
86 
88  std::string m_arg2;
89 
90 public:
92  const string &arg0=string(""),
93  const string &arg1=string(""),
94  const string &arg2=string("")
95  );
96 
97  CQFSort(HitSortEnum ftype,
98  const string &arg0,
99  int arg1i,
100  int arg2i
101  );
102 
103  virtual ~CQFSort() {};
104 
105  virtual CQFilter* Clone()
106  { return (CQFilter*)new CQFSort(*this); };
107 
108  virtual HitSortEnum FilterType() const
109  { return m_Filter.m_FilterType; };
110 
112  void SortBounds(void);
113 
115  virtual bool Compile(CQueryCompiler *compiler, CQueryOptions *options);
116 
121  string ResolveAttributeName(CQueryCompiler *compiler, const string& attrName, bool allowBiblExpander=false);
122 
124  CFreeBiblIndex *GetBiblConstant(CQueryCompiler *compiler, const string &attrName, bool allowBiblExpander=true);
125 
126  //-- ddcObject API & utilities
128  string argString(const string &arg) const;
129  virtual string toString(void);
130  virtual string jsonClass(void) { return "CQFSort"; };
131  virtual string jsonMinMax(void);
132  virtual string jsonType(void);
133  virtual string jsonData(void) { return (this->jsonType()+","+this->jsonMinMax()); };
134 };
135 
136 //======================================================================
137 // CQFRankSort
138 
139 class CQFRankSort : public CQFSort {
140 public:
142  : CQFSort(ftype)
143  {};
144  virtual ~CQFRankSort() {};
145 
146  virtual CQFilter* Clone()
147  { return (CQFilter*)new CQFRankSort(*this); };
148 
149  virtual string jsonClass(void) { return "CQFRankSort"; };
150  virtual string jsonData(void) { return this->jsonType(); };
151 };
152 
153 //======================================================================
154 // CQFDateSort
155 
156 class CQFDateSort : public CQFSort {
157 public:
158  CQFDateSort(HitSortEnum ftype=LessByDate, const string &lb=string(""), const string &ub=string(""))
159  : CQFSort(ftype,string(""),lb,ub)
160  {};
161  virtual ~CQFDateSort() {};
162 
163  virtual CQFilter* Clone()
164  { return (CQFilter*)new CQFDateSort(*this); };
165 
166  static int Str2Date(const std::string &datestr, int onEmpty=0);
167 
168  virtual bool Compile(CQueryCompiler *compiler, CQueryOptions *options);
169  virtual string jsonClass(void) { return "CQFDateSort"; };
170 };
171 
172 //======================================================================
173 // CQFSizeSort
174 
175 class CQFSizeSort : public CQFSort {
176 public:
177  CQFSizeSort(HitSortEnum ftype=LessBySize, const string &lb=string(""), const string &ub=string(""))
178  : CQFSort(ftype,string(""),lb,ub)
179  {};
180 
181  CQFSizeSort(HitSortEnum ftype=LessBySize, int lb=INT_MIN, int ub=INT_MAX);
182 
183  virtual ~CQFSizeSort() {};
184 
185  virtual CQFilter* Clone()
186  { return (CQFilter*)new CQFSizeSort(*this); };
187 
188  virtual bool Compile(CQueryCompiler *compiler, CQueryOptions *options);
189  virtual string jsonClass(void) { return "CQFSizeSort"; };
190 };
191 
192 //======================================================================
193 // CQFRandomSort
194 
195 class CQFRandomSort : public CQFSort {
196 public:
197  CQFRandomSort(const string &seed0=string(""))
198  : CQFSort(RandomSort,string(""),seed0)
199  {};
200 
201  CQFRandomSort(int seed0);
202 
203  virtual ~CQFRandomSort() {};
204 
205  virtual CQFilter* Clone()
206  { return (CQFilter*)new CQFRandomSort(*this); };
207 
208  virtual bool Compile(CQueryCompiler *compiler, CQueryOptions *options);
209  virtual string jsonClass(void) { return "CQFRandomSort"; };
210  virtual string jsonData(void) { return (this->jsonType()+",\"Seed\":"+jsonStr(m_arg1)); };
211 };
212 
213 //======================================================================
214 // CQFBiblSort
215 
217 class CQFBiblSort : public CQFSort {
218 public:
220  const string &field=string(""),
221  const string &lb=string(""),
222  const string &ub=string(""))
223  : CQFSort(ftype,field,lb,ub)
224  {};
225 
226  virtual ~CQFBiblSort() {};
227 
228  virtual CQFilter* Clone()
229  { return (CQFilter*)new CQFBiblSort(*this); };
230 
232  virtual bool Compile(CQueryCompiler *compiler, CQueryOptions *options);
233 
234  virtual string toString(void);
235  virtual string jsonClass(void) { return "CQFBiblSort"; };
236  virtual string jsonData(void);
237  virtual string jsonMinMax(void);
238 };
239 
240 //======================================================================
241 // CQFContextSort (formerly CQFBigramSort)
242 
244 class CQFContextSort : public CQFSort {
245 public:
247  const string &field=string(""),
248  int matchid=0,
249  int offset=0,
250  const string &lb=string(""),
251  const string &ub=string(""))
252  : CQFSort(ftype,field,lb,ub)
253  {
254  m_Filter.m_ContextMatchId = matchid;
255  m_Filter.m_ContextOffset = offset;
256  };
257 
258  virtual ~CQFContextSort() {};
259 
260  virtual CQFilter* Clone()
261  { return (CQFilter*)new CQFContextSort(*this); };
262 
264  virtual bool Compile(CQueryCompiler *compiler, CQueryOptions *options);
265 
266  virtual string toString(void);
267  virtual string jsonClass(void) { return "CQFContextSort"; };
268  virtual string jsonData(void);
269 };
270 
271 //======================================================================
272 // CQFHasField (abstract)
273 
274 class CQFHasField : public CQFSort {
275 public:
277  bool m_Negated;
278 
279 public:
280  CQFHasField(const std::string &field, const std::string &val=string(""), bool isNegated=false)
281  : CQFSort(NoSort, field, val, string("")), m_Negated(isNegated)
282  {};
283 
284  virtual ~CQFHasField() {};
285 
286  virtual CQFilter* Clone()
287  { return (CQFilter*)new CQFHasField(*this); };
288 
290  virtual void Negate(void);
291 
294  virtual bool Compile(CQueryCompiler *compiler, CQueryOptions *options);
295 
297  virtual string valueString(void);
298 
300  virtual string toString(void);
301 
302  virtual string jsonClass(void) { return "CQFHasField"; };
303  virtual string jsonFieldValue(void) { return jsonStr(m_arg1); };
304  virtual string jsonMinMax(void);
305 };
306 
307 
308 //======================================================================
309 // CQFHasFieldValue
310 
312 public:
313  CQFHasFieldValue(const std::string &field, const std::string &val=string(""), bool isNegated=false)
314  : CQFHasField(field, val, isNegated)
315  {};
316 
317  virtual ~CQFHasFieldValue() {};
318 
319  virtual CQFilter* Clone()
320  { return (CQFilter*)new CQFHasFieldValue(*this); };
321 
323  virtual bool CheckSatisfiable(CQueryCompiler *compiler, CQueryOptions *options);
324 
326  virtual bool Compile(CQueryCompiler *compiler, CQueryOptions *options);
327  virtual string jsonClass(void) { return "CQFHasFieldValue"; };
328 };
329 
330 //======================================================================
331 // CQFHasFieldRegex
332 
334 public:
336  std::string m_Regex;
337 
338 public:
339  CQFHasFieldRegex(const std::string &field, const std::string &val=string(""), bool isNegated=false)
340  : CQFHasField(field, val, isNegated), m_Regex(val)
341  {};
342 
343  virtual ~CQFHasFieldRegex() {};
344 
345  virtual CQFilter* Clone()
346  { return (CQFilter*)new CQFHasFieldRegex(*this); };
347 
349  virtual bool CheckSatisfiable(CQueryCompiler *compiler, CQueryOptions *options);
350 
352  virtual bool Compile(CQueryCompiler *compiler, CQueryOptions *options);
353 
354  virtual string valueString(void);
355  virtual string jsonClass(void) { return "CQFHasFieldRegex"; };
356 };
357 
358 //======================================================================
359 // CQFHasFieldPrefix
360 
362 public:
363  CQFHasFieldPrefix(const std::string &field, const std::string &val=string(""), bool isNegated=false)
364  : CQFHasFieldRegex(field, val, isNegated)
365  {
366  m_Regex = std::string("^") + escapeRegex(val);
367  };
368 
369  virtual ~CQFHasFieldPrefix() {};
370 
371  virtual CQFilter* Clone()
372  { return (CQFilter*)new CQFHasFieldPrefix(*this); };
373 
374  virtual string valueString(void);
375  virtual string jsonClass(void) { return "CQFHasFieldPrefix"; };
376 };
377 
378 //======================================================================
379 // CQFHasFieldSuffix
380 
382 public:
383  CQFHasFieldSuffix(const std::string &field, const std::string &val=string(""), bool isNegated=false)
384  : CQFHasFieldRegex(field, val, isNegated)
385  {
386  m_Regex = escapeRegex(val) + "$";
387  };
388 
389  virtual ~CQFHasFieldSuffix() {};
390 
391  virtual CQFilter* Clone()
392  { return (CQFilter*)new CQFHasFieldSuffix(*this); };
393 
394  virtual string valueString(void);
395  virtual string jsonClass(void) { return "CQFHasFieldSuffix"; };
396 };
397 
398 //======================================================================
399 // CQFHasFieldInfix
400 
402 public:
403  CQFHasFieldInfix(const std::string &field, const std::string &val=string(""), bool isNegated=false)
404  : CQFHasFieldRegex(field, val, isNegated)
405  {
406  m_Regex = escapeRegex(val);
407  };
408 
409  virtual ~CQFHasFieldInfix() {};
410 
411  virtual CQFilter* Clone()
412  { return (CQFilter*)new CQFHasFieldInfix(*this); };
413 
414  virtual string valueString(void);
415  virtual string jsonClass(void) { return "CQFHasFieldInfix"; };
416 };
417 
418 //======================================================================
419 // CQFHasFieldSet
420 
421 class CQFHasFieldSet : public CQFHasField {
422 public:
424  std::set<std::string> m_Values;
425 
426 public:
427  CQFHasFieldSet(const std::string &field, const set<string>& vals=set<string>(), bool isNegated=false)
428  : CQFHasField(field, string("{}"), isNegated), m_Values(vals)
429  {};
430 
431  virtual ~CQFHasFieldSet() {};
432 
433  virtual CQFilter* Clone()
434  { return (CQFilter*)new CQFHasFieldSet(*this); };
435 
437  virtual bool CheckSatisfiable(CQueryCompiler *compiler, CQueryOptions *options);
438 
440  virtual bool Compile(CQueryCompiler *compiler, CQueryOptions *options);
441 
443  string SetValueString(const set<string> &values);
444 
446  inline string SetValueString(void)
447  { return SetValueString(m_Values); };
448 
450  virtual string valueString(void);
451 
452  virtual string jsonClass(void) { return "CQFHasFieldSet"; };
453  virtual string jsonFieldValue(void);
454 };
455 
456 //======================================================================
457 // CQFPrune
458 
461 class CQFPrune : public CQFSort {
462 public:
464  size_t m_limit;
465 
468 
471 
472 public:
473  //------------------------------------------------------------
475 
476  CQFPrune(HitSortEnum ftype=LessByPruneKey, size_t Limit=0, CQCountKeyExprList* Keys=NULL);
477 
479  virtual ~CQFPrune();
480 
482  virtual CQFilter* Clone();
483 
485  virtual bool Compile(CQueryCompiler *compiler, CQueryOptions *options);
487 
488  //------------------------------------------------------------
490 
491  virtual string toString(void);
493 
494  virtual string jsonClass(void) { return "CQFPrune"; };
495  virtual string jsonData(void);
496 
497  virtual ddcObjectList Children() const;
498  virtual void DisownChildren();
500 
501  //------------------------------------------------------------
503 
504  void PruneHitsIndex(const CQuery *qRoot, vector<size_t>& PeriodHitsIndex);
508 };
509 
510 #endif /* DDC_QFILTER_H */
511 
512 /*--- emacs style variables ---
513  * Local Variables:
514  * mode: C++
515  * c-file-style: "ellemtel"
516  * c-basic-offset: 4
517  * tab-width: 8
518  * indent-tabs-mode: nil
519  * End:
520  */
CQFHasField(const std::string &field, const std::string &val=string(""), bool isNegated=false)
Definition: QueryFilter.h:280
CQFRandomSort(const string &seed0=string(""))
Definition: QueryFilter.h:197
std::string m_arg1
1st argument (e.g. lower bound)
Definition: QueryFilter.h:85
virtual CQFilter * Clone()
clone this filter
Definition: QueryFilter.h:371
virtual string jsonClass(void)
Definition: QueryFilter.h:209
Definition: QueryFilter.h:195
Definition: FreeBiblIndex.h:33
Definition: QueryFilter.h:461
sort by the issue date (ascending)
Definition: ConcCommon.h:123
virtual string jsonClass(void)
Definition: QueryFilter.h:375
std::string m_arg2
2nd argument (e.g. upper bound)
Definition: QueryFilter.h:88
CQFHasFieldSuffix(const std::string &field, const std::string &val=string(""), bool isNegated=false)
Definition: QueryFilter.h:383
virtual string jsonClass(void)
Definition: QueryFilter.h:235
virtual CQFilter * Clone()
clone this filter
Definition: QueryFilter.h:391
sort by central context (ascending)
Definition: ConcCommon.h:139
virtual ~CQFHasFieldSuffix()
Definition: QueryFilter.h:389
Definition: QueryFilter.h:76
virtual string jsonFieldValue(void)
Definition: QueryFilter.h:303
virtual CQFilter * Clone()
clone this filter
Definition: QueryFilter.h:228
virtual CQFilter * Clone()
clone this filter
Definition: QueryFilter.h:433
class for global query filters aka "query operators"
Definition: QueryFilter.h:35
CDDCFilterWithBounds m_Filter
underlying DDC Filter struct
Definition: QueryFilter.h:79
virtual string jsonData()
Definition: ddcObject.h:202
Definition: QueryFilter.h:401
count query
Definition: QCount.h:320
virtual ~CQFRankSort()
Definition: QueryFilter.h:144
Definition: QueryFilter.h:311
bool m_Negated
is this a negated filter?
Definition: QueryFilter.h:277
CQFDateSort(HitSortEnum ftype=LessByDate, const string &lb=string(""), const string &ub=string(""))
Definition: QueryFilter.h:158
virtual HitSortEnum FilterType() const
sort-type for this filter (if any)
Definition: QueryFilter.h:58
virtual CQFilter * Clone()
clone this filter
Definition: QueryFilter.h:319
int m_ContextMatchId
match-id of reference token for context-sort operators (default=0:any)
Definition: ConcCommon.h:336
size_t m_limit
maximum number of hits per count-key
Definition: QueryFilter.h:464
virtual ~CQFHasField()
Definition: QueryFilter.h:284
virtual string toString(void)
convert filter to a canonical string
Definition: QueryFilter.h:66
Definition: QueryFilter.h:175
virtual HitSortEnum FilterType() const
sort-type for this filter (if any)
Definition: QueryFilter.h:108
string jsonStr(ddcObject *o)
json strinfication wrapper
Definition: ddcObject.h:208
virtual ddcObjectList Children() const
Definition: ddcObject.h:74
virtual ~CQFContextSort()
Definition: QueryFilter.h:258
virtual ~CQFHasFieldValue()
Definition: QueryFilter.h:317
CQFHasFieldPrefix(const std::string &field, const std::string &val=string(""), bool isNegated=false)
Definition: QueryFilter.h:363
HitSortEnum m_FilterType
the type of the filter
Definition: ConcCommon.h:321
CQFBiblSort(HitSortEnum ftype=LessByFreeBiblField, const string &field=string(""), const string &lb=string(""), const string &ub=string(""))
Definition: QueryFilter.h:219
virtual bool Compile(CQueryCompiler *compiler, CQueryOptions *options)
apply the filter to the given compiler
Definition: QueryFilter.cpp:77
virtual string jsonData(void)
Definition: QueryFilter.h:133
CQFRankSort(HitSortEnum ftype=GreaterByRank)
Definition: QueryFilter.h:141
class for global query filters aka "query operators"
Definition: ddcObject.h:45
CQCountKeyExprList * m_keys
list count-keys (externally allocated, freed here)
Definition: QueryFilter.h:467
virtual ~CQFBiblSort()
Definition: QueryFilter.h:226
CQFHasFieldInfix(const std::string &field, const std::string &val=string(""), bool isNegated=false)
Definition: QueryFilter.h:403
virtual CQFilter * Clone()
clone this filter
Definition: QueryFilter.h:163
virtual string jsonClass(void)
Definition: QueryFilter.h:302
CQFHasFieldValue(const std::string &field, const std::string &val=string(""), bool isNegated=false)
Definition: QueryFilter.h:313
virtual ~CQFSizeSort()
Definition: QueryFilter.h:183
CCountMap m_Counts
underlying counts
Definition: QueryFilter.h:470
list< ddcObject * > ddcObjectList
Definition: ddcObject.h:28
virtual CQFilter * Clone()
clone this filter
Definition: QueryFilter.h:411
std::string m_arg0
0th argument (e.g. field name)
Definition: QueryFilter.h:82
sort by document rank (descending)
Definition: ConcCommon.h:137
virtual string jsonClass(void)
Definition: QueryFilter.h:355
virtual string jsonClass(void)
Definition: QueryFilter.h:189
virtual string jsonClass(void)
Definition: QueryFilter.h:452
Definition: QueryFilter.h:139
virtual string jsonClass(void)
Definition: QueryFilter.h:149
root-level query options (filters and flags)
Definition: QueryOptions.h:39
virtual string jsonClass(void)
Definition: QueryFilter.h:130
CQFHasFieldRegex(const std::string &field, const std::string &val=string(""), bool isNegated=false)
Definition: QueryFilter.h:339
Definition: QueryFilter.h:381
virtual CQFilter * Clone()
clone this filter
Definition: QueryFilter.h:146
Definition: QCount.h:270
sort by a free bibliographical field (ascending)
Definition: ConcCommon.h:131
virtual bool CheckSatisfiable(CQueryCompiler *compiler, CQueryOptions *options)
Run fast (un)satisfiability checks for filter before Compile() is called. Default just returns true...
Definition: QueryFilter.cpp:70
virtual string jsonClass(void)
Definition: QueryFilter.h:395
virtual void DisownChildren()
Definition: ddcObject.h:79
m_arg0: field name, m_arg1: lower_bound, m_arg2: upper_bound
Definition: QueryFilter.h:217
CQFilter()
Default constructor.
Definition: QueryFilter.h:41
virtual ~CQFRandomSort()
Definition: QueryFilter.h:203
virtual string jsonClass(void)
Definition: QueryFilter.h:327
virtual string jsonClass(void)
Definition: QueryFilter.h:67
Definition: QueryFilter.h:421
std::string m_Regex
target regex (same as m_arg1 for direct regex filters; auto-generated for prefix-, suffix-, and infix-filters)
Definition: QueryFilter.h:336
sort by #prune[]-key (ascending)
Definition: ConcCommon.h:161
CQFSizeSort(HitSortEnum ftype=LessBySize, const string &lb=string(""), const string &ub=string(""))
Definition: QueryFilter.h:177
virtual CQFilter * Clone()
clone this filter
Definition: QueryFilter.h:205
virtual CQFilter * Clone()
clone this filter
Definition: QueryFilter.h:54
virtual CQFilter * Clone()
clone this filter
Definition: QueryFilter.h:345
virtual string jsonData(void)
Definition: QueryFilter.h:150
Definition: QueryCompiler.h:50
CQFHasFieldSet(const std::string &field, const set< string > &vals=set< string >(), bool isNegated=false)
Definition: QueryFilter.h:427
virtual string jsonData(void)
Definition: QueryFilter.h:210
virtual string jsonClass(void)
Definition: QueryFilter.h:415
virtual CQFilter * Clone()
clone this filter
Definition: QueryFilter.h:185
Definition: QueryFilter.h:156
sort by the size of the hit in tokens (ascending)
Definition: ConcCommon.h:127
map< string, size_t > CCountMap
type for count-query maps
Definition: QueryResult.h:30
virtual ~CQFHasFieldInfix()
Definition: QueryFilter.h:409
Definition: ConcCommon.h:318
virtual ~CQFSort()
Definition: QueryFilter.h:103
virtual CQFilter * Clone()
clone this filter
Definition: QueryFilter.h:105
virtual string jsonClass(void)
Definition: QueryFilter.h:169
virtual ~CQFilter()
Default destructor (empty)
Definition: QueryFilter.h:45
virtual string jsonClass(void)
Definition: QueryFilter.h:267
string escapeRegex(const std::string &re)
Definition: ddcString.cpp:384
virtual CQFilter * Clone()
clone this filter
Definition: QueryFilter.h:260
virtual ~CQFHasFieldPrefix()
Definition: QueryFilter.h:369
virtual ~CQFHasFieldRegex()
Definition: QueryFilter.h:343
CQFContextSort(HitSortEnum ftype=LessByMiddleContext, const string &field=string(""), int matchid=0, int offset=0, const string &lb=string(""), const string &ub=string(""))
Definition: QueryFilter.h:246
virtual ~CQFDateSort()
Definition: QueryFilter.h:161
Definition: QueryFilter.h:361
virtual string jsonClass(void)
Definition: QueryFilter.h:494
Definition: QueryFilter.h:333
string SetValueString(void)
wrapper for SetValueString(m_Values)
Definition: QueryFilter.h:446
int m_ContextOffset
offset from matched token for context-sort operators
Definition: ConcCommon.h:339
HitSortEnum
Definition: ConcCommon.h:119
virtual CQFilter * Clone()
clone this filter
Definition: QueryFilter.h:286
sort by random key
Definition: ConcCommon.h:151
m_arg0: field name, m_arg1: lower_bound, m_arg2: upper_bound
Definition: QueryFilter.h:244
Truly abstract (index-independent) representation of a parsed query Should eventually replace old ad...
Definition: Query.h:36
Definition: QueryFilter.h:274
std::set< std::string > m_Values
original target strings string
Definition: QueryFilter.h:424
no sort operators, only filtering (used by #has_field[])
Definition: ConcCommon.h:121
virtual ~CQFHasFieldSet()
Definition: QueryFilter.h:431