ddc
QueryCompiler.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 #if !defined(__DDC_QUERY_COMPILER_H_)
21 #define __DDC_QUERY_COMPILER_H_
22 
23 #include <list>
24 
25 #include "QueryNode.h" // v1.x query-node API
26 #include "QueryFilter.h" // v2.x query-filter API
27 #include "Query.h" // v2.x query-node API (wrapper)
28 #include "QCount.h" // v2.0.23+ count-query API
29 
30 #include "yyQParser.h"
31 //#include "yyQLexer.h" //-- included from yyQParser.h (2017-03-01)
32 
33 #undef yyFlexLexer
34 #define yyFlexLexer yyqLexer
35 #include "FlexLexer.h"
36 
37 
38 //-- moo: re-working parse-tree API
39 #define PARSER_USE_OLD_API
40 #undef PARSER_USE_OLD_API
41 
50 class CQueryCompiler : public ddcObject, virtual public yyqLexer
51 {
52 public:
53  //--------------------------------------------------------------
54  // constants
55 
57  static const size_t m_MaxContextSentencesCount = 5;
58 
59 public:
60  //--------------------------------------------------------------
61  // top-level query properties
62 
65 
68 
71 
73  size_t m_Limit;
74 
77 
78  //--------------------------------------------------------------
79  // temporaries
80 
83 
86 
88  size_t m_qCountLimit;
89 
92 
94  string m_qCountLo;
95 
97  string m_qCountHi;
98 
100  vector<string> m_IndexTuple;
101 
103  set<string> m_WordSet;
104 
106  vector<string> m_Expanders;
107 
109  vector<string> m_MorphItems;
110 
113 
115  string m_FilterLB;
116 
118  string m_FilterUB;
119 
122 
125 
128 
131 
134 
135  //--------------------------------------------------------------
136  // administrivia
137 
140 
142  vector<CQuery*> m_Queries;
143 
145  list<string> m_Labels;
146 
149 
150 public:
152  CQueryCompiler(const CConcHolder* pHolder=NULL);
153 
155  virtual ~CQueryCompiler();
156 
159  void CleanParser();
160 
162  int yyqlex (void* valp);
163 
165  string* newString(const string &s=string(""));
166 
169  string* newRegex(const string &pattern, const string &modifiers=string(""), bool isMatch=true);
170 
172  inline const char* yytext() const { return YYText(); };
173 
175  inline int yyleng() const { return YYLeng(); };
176 
178  inline string yystring() const { return string(YYText(),YYLeng()); };
179 
181  void yybegin(int new_state);
182 
184  void DeleteTree();
185 
189  bool ParseQuery(const string &QueryStr);
190 
193  bool CompileFilters();
194 
201  bool CheckSatisfiable(CQuery* query);
202 
207  bool Compile(CQuery *query);
208 
211  bool Evaluate(CQuery *query);
212 
215  inline bool CheckSatisfiable()
216  { return CheckSatisfiable(m_pQuery); };
217 
220  inline bool Compile()
221  { return Compile(m_pQuery); };
222 
224  inline bool Evaluate()
225  { return Evaluate(m_pQuery); };
226 
228  int GetNewNodeIndex();
229 
231  size_t GetNodeIndicesCount() const;
232 
235  CQuery* SetQuery(CQuery* qp);
236 
239  inline CQuery* PushQuery(CQuery* qp) { m_Queries.push_back(qp); return qp; };
240 
243  CQCount* PushCountQuery(CQuery *qConditions);
244 
247  CQKeys* PushKeysQuery(CQCount *qCount);
248 
251  CQFPrune* newPruneFilter(HitSortEnum ftype, const string& limitStr="-1");
252 
254  void SetFilterBounds(const string& lb="", const string& ub="");
255 
257  void SetFilterKey(const string &field="", BYTE matchid=0, int offset=INT_MIN);
258 
260  string QueryToString(void);
261 
263  string QueryToJson(void);
264 
266  void barf(const std::string &msg) const; //throw(CExpc)
267 
269  void barf(const char *fmt, ...) const; //throw(CExpc)
270 
273  void yybarf(const char *yymsg) const; //throw(CExpc)
274 
275  //-- ddcObject API
276  virtual ddcObjectList Children() const;
277  virtual void DisownChildren();
278  virtual string jsonClass() { return "CQueryCompiler"; };
279  virtual string jsonData() { return string("\"Query\":" + jsonStr(m_pQuery)); };
280 };
281 
282 #endif
283 
284 /*--- emacs style variables ---
285  * Local Variables:
286  * mode: C++
287  * c-file-style: "ellemtel"
288  * c-basic-offset: 4
289  * tab-width: 8
290  * indent-tabs-mode: nil
291  * End:
292  */
CQCount * PushCountQuery(CQuery *qConditions)
Definition: QueryCompiler.cpp:347
void DeleteTree()
delete parse tree (m_pQuery) if non-NULL; actually wipes all queries in m_Queries and m_qCountKeys ...
Definition: QueryCompiler.cpp:224
vector< string > m_Expanders
temporary for "% X1 % X2 ..." expansion queries
Definition: QueryCompiler.h:106
vector< CQuery * > m_Queries
set of all query nodes allocated during current parse
Definition: QueryCompiler.h:142
HitSortEnum m_qCountSort
count()-query sort order
Definition: QueryCompiler.h:91
Definition: QueryFilter.h:461
void yybarf(const char *yymsg) const
Definition: QueryCompiler.cpp:426
CQKeys * PushKeysQuery(CQCount *qCount)
Definition: QueryCompiler.cpp:367
string m_FilterField
temporary for filter field (#less_by_xyz, #greater_by_xyz)
Definition: QueryCompiler.h:112
CQuery * PushQuery(CQuery *qp)
Definition: QueryCompiler.h:239
size_t m_qCountLimit
count()-query result-set size (for keys()-queries)
Definition: QueryCompiler.h:88
bool CompileFilters()
Definition: QueryCompiler.cpp:91
virtual void DisownChildren()
Definition: QueryCompiler.cpp:438
int yyleng() const
flex convenience wrapper
Definition: QueryCompiler.h:175
bool ParseQuery(const string &QueryStr)
Definition: QueryCompiler.cpp:140
size_t GetNodeIndicesCount() const
return m_CurrentNodeIndex
Definition: QueryCompiler.cpp:86
string * newString(const string &s=string(""))
wrapper to push a new string pointer onto the m_Labels stack (to be freed on CleanParser()) ...
Definition: QueryCompiler.cpp:307
void CleanParser()
Definition: QueryCompiler.cpp:192
count query
Definition: QCount.h:320
void SetFilterBounds(const string &lb="", const string &ub="")
set string bounds for current filter (called by bison parser)
Definition: QueryCompiler.cpp:376
vector< string > m_IndexTuple
keys()-query tuple
Definition: QueryCompiler.h:100
bool CheckSatisfiable()
Definition: QueryCompiler.h:215
virtual ~CQueryCompiler()
default destructor
Definition: QueryCompiler.cpp:76
string QueryToString(void)
debug: return a string form for the current query; wraps m_pQuery->toString() + m_pQuery->optionsToSt...
Definition: QueryCompiler.cpp:392
void yybegin(int new_state)
wrapper for protected yyFlexLexer::yy_begin()
Definition: QueryCompiler.cpp:184
int yyqlex(void *valp)
wrapper for yylex() as called from bison parser (valp is a YYSTYPE*)
Definition: QueryCompiler.cpp:243
string jsonStr(ddcObject *o)
json strinfication wrapper
Definition: ddcObject.h:208
virtual string jsonClass()
Definition: QueryCompiler.h:278
BYTE m_FilterMatchId
temporary for filter reference match-id (#left, #right, #mid; default=0:any)
Definition: QueryCompiler.h:121
string m_RegexModifiers
temporary for regex modifiers
Definition: QueryCompiler.h:133
void SetFilterKey(const string &field="", BYTE matchid=0, int offset=INT_MIN)
set context-filter key
Definition: QueryCompiler.cpp:383
int GetNewNodeIndex()
return current node index to set CQueryTokenNode::m_NodeIndex
Definition: QueryCompiler.cpp:81
class for global query filters aka "query operators"
Definition: ddcObject.h:45
const CConcHolder * m_pHolder
a reference to the holder, for which this query is parsed
Definition: QueryCompiler.h:64
CQuery * m_pQuery
root of the abstract parse tree
Definition: QueryCompiler.h:67
string m_qCountLo
count()-query lower bound
Definition: QueryCompiler.h:94
class for a single (thread-local) DDC query session; formerly CConcHolder An instance of CConcSessio...
Definition: ConcSession.h:54
CQCountKeyExprList m_qCountKeys
count()-query keys
Definition: QueryCompiler.h:82
const char * yytext() const
flex convenience wrapper
Definition: QueryCompiler.h:172
list< ddcObject * > ddcObjectList
Definition: ddcObject.h:28
list< string > m_Labels
a special slot for YACC (which contains all string leaves of the parse tree)
Definition: QueryCompiler.h:145
bool m_KeepLexerComments
enable collection of lexer comments in m_pQuery->m_Options->m_LexerComments (default=false) ...
Definition: QueryCompiler.h:148
root-level query options (filters and flags)
Definition: QueryOptions.h:39
bool m_bSatisfiable
is query satisfiable? (default is true, may be set to false by CheckSatisfiable()) ...
Definition: QueryCompiler.h:76
Definition: QCount.h:270
string m_RegexReplacement
temporary for regex replacement strings (used by count-keys)
Definition: QueryCompiler.h:130
string * newRegex(const string &pattern, const string &modifiers=string(""), bool isMatch=true)
Definition: QueryCompiler.cpp:313
int m_FilterOffset
temporary for filter offsets (#left, #right, #mid; default=0:any)
Definition: QueryCompiler.h:124
CQuery * SetQuery(CQuery *qp)
Definition: QueryCompiler.cpp:337
string QueryToJson(void)
return a json string form for the current query; wraps m_pQuery->toJson() + m_pQuery->optionsToJson()...
Definition: QueryCompiler.cpp:399
Definition: QueryCompiler.h:50
CQueryCompiler(const CConcHolder *pHolder=NULL)
default constructor
Definition: QueryCompiler.cpp:64
vector< string > m_MorphItems
temporary for [m1,m2,...,mN] morph-pattern queries
Definition: QueryCompiler.h:109
unsigned char BYTE
Definition: utilit.h:94
int m_CurrentNodeIndex
current node index to set CQueryTokenNode::m_NodeIndex
Definition: QueryCompiler.h:139
size_t m_qCountSample
count()-query sample size (overrides count-query m_dtr->m_Options->m_Limit if set) ...
Definition: QueryCompiler.h:85
bool Compile()
Definition: QueryCompiler.h:220
void barf(const std::string &msg) const
error reporting: throws a errParseError exception
Definition: QueryCompiler.cpp:409
CQueryOptions m_qOptions
query options (adopted into top-level m_pQuery on SetQuery())
Definition: QueryCompiler.h:70
CQFPrune * newPruneFilter(HitSortEnum ftype, const string &limitStr="-1")
Definition: QueryCompiler.cpp:359
string yystring() const
flex convenience wrapper
Definition: QueryCompiler.h:178
virtual ddcObjectList Children() const
Definition: QueryCompiler.cpp:431
bool Evaluate()
evaluate parse tree bottom-up; wrapper for Evaluate(m_pQuery)
Definition: QueryCompiler.h:224
string m_FilterLB
temporary for filter lower bound (#less_by_xyz, #greater_by_xyz)
Definition: QueryCompiler.h:115
string m_RegexPattern
temporary for regex patterns
Definition: QueryCompiler.h:127
static const size_t m_MaxContextSentencesCount
maximum context size for #cntxt operator
Definition: QueryCompiler.h:57
virtual string jsonData()
Definition: QueryCompiler.h:279
utility struct for iterating over hit occurrences
Definition: QCount.h:436
HitSortEnum
Definition: ConcCommon.h:119
string m_FilterUB
temporary for filter upper bound (#less_by_xyz, #greater_by_xyz)
Definition: QueryCompiler.h:118
Truly abstract (index-independent) representation of a parsed query Should eventually replace old ad...
Definition: Query.h:36
string m_qCountHi
count()-query upper bound
Definition: QueryCompiler.h:97
set< string > m_WordSet
temporary for $i={w1,w2,...,wN} word-set queries
Definition: QueryCompiler.h:103
size_t m_Limit
query limit (anything but 0 (default) overrides CConcHolder arguments)
Definition: QueryCompiler.h:73