kexi

expression.h
1/* This file is part of the KDE project
2 Copyright (C) 2003-2007 Jaroslaw Staniek <js@iidea.pl>
3
4 Design based on nexp.h : Parser module of Python-like language
5 (C) 2001 Jaroslaw Staniek, MIMUW (www.mimuw.edu.pl)
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public
9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version.
11
12 This library 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 GNU
15 Library General Public License for more details.
16
17 You should have received a copy of the GNU Library General Public License
18 along with this library; see the file COPYING.LIB. If not, write to
19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 * Boston, MA 02110-1301, USA.
21*/
22
23#ifndef KEXIDB_EXPRESSION_H
24#define KEXIDB_EXPRESSION_H
25
26#include "field.h"
27#include "queryschema.h"
28
29#include <kdebug.h>
30#include "global.h"
31
32namespace KexiDB {
33
35#define KexiDBExpr_Unknown 0
36#define KexiDBExpr_Unary 1
37#define KexiDBExpr_Arithm 2
38#define KexiDBExpr_Logical 3
39#define KexiDBExpr_Relational 4
40#define KexiDBExpr_SpecialBinary 5
41#define KexiDBExpr_Const 6
42#define KexiDBExpr_Variable 7
43#define KexiDBExpr_Function 8
44#define KexiDBExpr_Aggregation 9
45#define KexiDBExpr_TableList 10
46#define KexiDBExpr_QueryParameter 11
47
49//#define KEXIDB_CUSTOM_TOKEN 0x1000
50
52KEXI_DB_EXPORT TQString exprClassName(int c);
53
54class ParseInfo;
55class NArgExpr;
56class UnaryExpr;
57class BinaryExpr;
58class ConstExpr;
59class VariableExpr;
60class FunctionExpr;
61class QueryParameterExpr;
62class QuerySchemaParameterValueListIterator;
63//class QuerySchemaParameterList;
64
66class KEXI_DB_EXPORT BaseExpr
67{
68public:
69 typedef TQPtrList<BaseExpr> List;
70 typedef TQPtrListIterator<BaseExpr> ListIterator;
71
72 BaseExpr(int token);
73 virtual ~BaseExpr();
74
77 virtual BaseExpr* copy() const = 0;
78
79 int token() const { return m_token; }
80
81 virtual Field::Type type();
82
83 BaseExpr* parent() const { return m_par; }
84
85 virtual void setParent(BaseExpr *p) { m_par = p; }
86
87 virtual bool validate(ParseInfo& parseInfo);
88
92 virtual TQString toString(QuerySchemaParameterValueListIterator* params = 0) = 0;
93
96 virtual void getQueryParameters(QuerySchemaParameterList& params) = 0;
97
98 inline void debug() { KexiDBDbg << debugString() << endl; }
99
100 virtual TQString debugString();
101
104 inline TQString tokenToDebugString() { return tokenToDebugString(m_token); }
105
106 static TQString tokenToDebugString(int token);
107
109 virtual TQString tokenToString();
110
111 int exprClass() const { return m_cl; }
112
114 NArgExpr* toNArg();
115 UnaryExpr* toUnary();
116 BinaryExpr* toBinary();
117 ConstExpr* toConst();
118 VariableExpr* toVariable();
119 FunctionExpr* toFunction();
120 QueryParameterExpr* toQueryParameter();
121
122protected:
123 int m_cl;
125 int m_token;
126};
127
129class KEXI_DB_EXPORT NArgExpr : public BaseExpr
130{
131public:
132 NArgExpr(int aClass, int token);
133 NArgExpr(const NArgExpr& expr);
134 virtual ~NArgExpr();
136 virtual NArgExpr* copy() const;
137 void add(BaseExpr *expr);
138 void prepend(BaseExpr *expr);
139 BaseExpr *arg(int n);
140 int args();
141 virtual TQString debugString();
142 virtual TQString toString(QuerySchemaParameterValueListIterator* params = 0);
143 virtual void getQueryParameters(QuerySchemaParameterList& params);
144 virtual bool validate(ParseInfo& parseInfo);
145 BaseExpr::List list;
146};
147
149class KEXI_DB_EXPORT UnaryExpr : public BaseExpr
150{
151public:
152 UnaryExpr(int token, BaseExpr *arg);
153 UnaryExpr(const UnaryExpr& expr);
154 virtual ~UnaryExpr();
156 virtual UnaryExpr* copy() const;
157 virtual Field::Type type();
158 virtual TQString debugString();
159 virtual TQString toString(QuerySchemaParameterValueListIterator* params = 0);
160 virtual void getQueryParameters(QuerySchemaParameterList& params);
161 BaseExpr *arg() const { return m_arg; }
162 virtual bool validate(ParseInfo& parseInfo);
163
164 BaseExpr *m_arg;
165};
166
175class KEXI_DB_EXPORT BinaryExpr : public BaseExpr
176{
177public:
178 BinaryExpr(int aClass, BaseExpr *left_expr, int token, BaseExpr *right_expr);
179 BinaryExpr(const BinaryExpr& expr);
180 virtual ~BinaryExpr();
182 virtual BinaryExpr* copy() const;
183 virtual Field::Type type();
184 virtual TQString debugString();
185 virtual TQString toString(QuerySchemaParameterValueListIterator* params = 0);
186 virtual void getQueryParameters(QuerySchemaParameterList& params);
187 BaseExpr *left() const { return m_larg; }
188 BaseExpr *right() const { return m_rarg; }
189 virtual bool validate(ParseInfo& parseInfo);
190 virtual TQString tokenToString();
191
192 BaseExpr *m_larg;
193 BaseExpr *m_rarg;
194};
195
199class KEXI_DB_EXPORT ConstExpr : public BaseExpr
200{
201public:
202 ConstExpr(int token, const TQVariant& val);
203 ConstExpr(const ConstExpr& expr);
204 virtual ~ConstExpr();
206 virtual ConstExpr* copy() const;
207 virtual Field::Type type();
208 virtual TQString debugString();
209 virtual TQString toString(QuerySchemaParameterValueListIterator* params = 0);
210 virtual void getQueryParameters(QuerySchemaParameterList& params);
211 virtual bool validate(ParseInfo& parseInfo);
212 TQVariant value;
213};
214
217class KEXI_DB_EXPORT QueryParameterExpr : public ConstExpr
218{
219public:
220 QueryParameterExpr(const TQString& message);
222 virtual ~QueryParameterExpr();
224 virtual QueryParameterExpr* copy() const;
225 virtual Field::Type type();
234 void setType(Field::Type type);
235 virtual TQString debugString();
236 virtual TQString toString(QuerySchemaParameterValueListIterator* params = 0);
237 virtual void getQueryParameters(QuerySchemaParameterList& params);
238 virtual bool validate(ParseInfo& parseInfo);
239protected:
240 Field::Type m_type;
241};
242
244class KEXI_DB_EXPORT VariableExpr : public BaseExpr
245{
246public:
247 VariableExpr(const TQString& _name);
248 VariableExpr(const VariableExpr& expr);
249 virtual ~VariableExpr();
251 virtual VariableExpr* copy() const;
252 virtual Field::Type type();
253 virtual TQString debugString();
254 virtual TQString toString(QuerySchemaParameterValueListIterator* params = 0);
255 virtual void getQueryParameters(QuerySchemaParameterList& params);
256
260 virtual bool validate(ParseInfo& parseInfo);
261
263 TQString name;
264
265 /* NULL by default. After successful validate() it will point to a field,
266 if the variable is of a form "tablename.fieldname" or "fieldname",
267 otherwise (eg. for asterisks) -still NULL.
268 Only meaningful for column expressions within a query. */
269 Field *field;
270
271 /* -1 by default. After successful validate() it will contain a position of a table
272 within query that needs to be bound to the field.
273 This value can be either be -1 if no binding is needed.
274 This value is used in the Parser to call
275 QuerySchema::addField(Field* field, int bindToTable);
276 Only meaningful for column expressions within a query. */
277 int tablePositionForField;
278
283};
284
288class KEXI_DB_EXPORT FunctionExpr : public BaseExpr
289{
290public:
291 FunctionExpr(const TQString& _name, NArgExpr* args_ = 0);
292 FunctionExpr(const FunctionExpr& expr);
293 virtual ~FunctionExpr();
295 virtual FunctionExpr* copy() const;
296 virtual Field::Type type();
297 virtual TQString debugString();
298 virtual TQString toString(QuerySchemaParameterValueListIterator* params = 0);
299 virtual void getQueryParameters(QuerySchemaParameterList& params);
300 virtual bool validate(ParseInfo& parseInfo);
301
302 static TQValueList<TQCString> builtInAggregates();
303 static bool isBuiltInAggregate(const TQCString& fname);
304
305 TQString name;
306 NArgExpr* args;
307};
308
309} //namespace KexiDB
310
311#endif
A base class for all expressions.
Definition expression.h:67
virtual TQString toString(QuerySchemaParameterValueListIterator *params=0)=0
virtual void getQueryParameters(QuerySchemaParameterList &params)=0
virtual BaseExpr * copy() const =0
TQString tokenToDebugString()
Definition expression.h:104
BaseExpr * m_par
parent expression
Definition expression.h:124
Meta-data for a field.
Definition field.h:73
A base class N-argument operation.
Definition expression.h:130
Query parameter used to getting user input of constant values.
Definition expression.h:218
An iteratof for a list of values of query schema parameters providing Allows to iterate over paramete...
An unary argument operation: + - NOT (or !) ~ "IS NULL" "IS NOT NULL".
Definition expression.h:150
Variables like fieldname or tablename.fieldname
Definition expression.h:245
TableSchema * tableForQueryAsterisk
Definition expression.h:282
High-level database connectivity library with database backend drivers.
KEXI_DB_EXPORT TQString exprClassName(int c)
Custom tokens are not used in parser but used as extension in expression classes.
KEXI_DB_EXPORT void debug(const QuerySchemaParameterList &list)
Shows debug information for list.