kexi

expression.h

00001 /* This file is part of the KDE project
00002    Copyright (C) 2003-2006 Jaroslaw Staniek <js@iidea.pl>
00003 
00004    Design based on nexp.h : Parser module of Python-like language
00005    (C) 2001 Jaroslaw Staniek, MIMUW (www.mimuw.edu.pl)
00006 
00007    This library is free software; you can redistribute it and/or
00008    modify it under the terms of the GNU Library General Public
00009    License as published by the Free Software Foundation; either
00010    version 2 of the License, or (at your option) any later version.
00011 
00012    This library is distributed in the hope that it will be useful,
00013    but WITHOUT ANY WARRANTY; without even the implied warranty of
00014    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015    Library General Public License for more details.
00016 
00017    You should have received a copy of the GNU Library General Public License
00018    along with this library; see the file COPYING.LIB.  If not, write to
00019    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00020  * Boston, MA 02110-1301, USA.
00021 */
00022 
00023 #ifndef KEXIDB_EXPRESSION_H
00024 #define KEXIDB_EXPRESSION_H
00025 
00026 #include "field.h"
00027 #include "queryschema.h"
00028 
00029 #include <kdebug.h>
00030 #include "global.h"
00031 
00032 namespace KexiDB {
00033 
00035 #define KexiDBExpr_Unknown 0
00036 #define KexiDBExpr_Unary 1
00037 #define KexiDBExpr_Arithm 2
00038 #define KexiDBExpr_Logical 3
00039 #define KexiDBExpr_Relational 4
00040 #define KexiDBExpr_SpecialBinary 5
00041 #define KexiDBExpr_Const 6
00042 #define KexiDBExpr_Variable 7
00043 #define KexiDBExpr_Function 8
00044 #define KexiDBExpr_Aggregation 9
00045 #define KexiDBExpr_TableList 10
00046 #define KexiDBExpr_QueryParameter 11
00047 
00048 KEXI_DB_EXPORT QString exprClassName(int c);
00049 
00050 class ParseInfo;
00051 class NArgExpr;
00052 class UnaryExpr;
00053 class BinaryExpr;
00054 class ConstExpr;
00055 class VariableExpr;
00056 class FunctionExpr;
00057 class QueryParameterExpr;
00058 class QuerySchemaParameterValueListIterator;
00059 //class QuerySchemaParameterList;
00060 
00062 class KEXI_DB_EXPORT BaseExpr
00063 {
00064 public:
00065     typedef QPtrList<BaseExpr> List;
00066     typedef QPtrListIterator<BaseExpr> ListIterator;
00067 
00068     BaseExpr(int token);
00069     virtual ~BaseExpr();
00070     
00071     int token() const { return m_token; }
00072     
00073     virtual Field::Type type();
00074     
00075     BaseExpr* parent() const { return m_par; }
00076     
00077     virtual void setParent(BaseExpr *p) { m_par = p; }
00078     
00079     virtual bool validate(ParseInfo& parseInfo);
00080 
00084     virtual QString toString(QuerySchemaParameterValueListIterator* params = 0) = 0;
00085 
00088     virtual void getQueryParameters(QuerySchemaParameterList& params) = 0;
00089     
00090     inline void debug() { KexiDBDbg << debugString() << endl; }
00091     
00092     virtual QString debugString();
00093     
00096     inline QString tokenToDebugString() { return tokenToDebugString(m_token); }
00097 
00098     static QString tokenToDebugString(int token);
00099 
00101     virtual QString tokenToString();
00102 
00103     int exprClass() const { return m_cl; }
00104 
00106     NArgExpr* toNArg();
00107     UnaryExpr* toUnary();
00108     BinaryExpr* toBinary();
00109     ConstExpr* toConst();
00110     VariableExpr* toVariable();
00111     FunctionExpr* toFunction();
00112     QueryParameterExpr* toQueryParameter();
00113 
00114 protected:
00115     int m_cl; 
00116     BaseExpr *m_par; 
00117     int m_token;
00118 };
00119 
00121 class KEXI_DB_EXPORT NArgExpr : public BaseExpr
00122 {
00123 public:
00124     NArgExpr(int aClass, int token);
00125     virtual ~NArgExpr();
00126     void add(BaseExpr *expr);
00127     void prepend(BaseExpr *expr);
00128     BaseExpr *arg(int n);
00129     int args();
00130     virtual QString debugString();
00131     virtual QString toString(QuerySchemaParameterValueListIterator* params = 0);
00132     virtual void getQueryParameters(QuerySchemaParameterList& params);
00133     virtual bool validate(ParseInfo& parseInfo);
00134     BaseExpr::List list;
00135 };
00136 
00138 class KEXI_DB_EXPORT UnaryExpr : public BaseExpr
00139 {
00140 public:
00141     UnaryExpr(int token, BaseExpr *arg);
00142     virtual ~UnaryExpr();
00143     virtual Field::Type type();
00144     virtual QString debugString();
00145     virtual QString toString(QuerySchemaParameterValueListIterator* params = 0);
00146     virtual void getQueryParameters(QuerySchemaParameterList& params);
00147     BaseExpr *arg() const { return m_arg; }
00148     virtual bool validate(ParseInfo& parseInfo);
00149 
00150     BaseExpr *m_arg;
00151 };
00152 
00161 class KEXI_DB_EXPORT BinaryExpr : public BaseExpr
00162 {
00163 public:
00164     BinaryExpr(int aClass, BaseExpr *left_expr, int token, BaseExpr *right_expr);
00165     virtual ~BinaryExpr();
00166     virtual Field::Type type();
00167     virtual QString debugString();
00168     virtual QString toString(QuerySchemaParameterValueListIterator* params = 0);
00169     virtual void getQueryParameters(QuerySchemaParameterList& params);
00170     BaseExpr *left() const { return m_larg; }
00171     BaseExpr *right() const { return m_rarg; }
00172     virtual bool validate(ParseInfo& parseInfo);
00173     virtual QString tokenToString();
00174 
00175     BaseExpr *m_larg;
00176     BaseExpr *m_rarg;
00177 };
00178 
00182 class KEXI_DB_EXPORT ConstExpr : public BaseExpr
00183 {
00184 public:
00185     ConstExpr(int token, const QVariant& val);
00186     virtual ~ConstExpr();
00187     virtual Field::Type type();
00188     virtual QString debugString();
00189     virtual QString toString(QuerySchemaParameterValueListIterator* params = 0);
00190     virtual void getQueryParameters(QuerySchemaParameterList& params);
00191     virtual bool validate(ParseInfo& parseInfo);
00192     QVariant value;
00193 };
00194 
00197 class KEXI_DB_EXPORT QueryParameterExpr : public ConstExpr
00198 {
00199 public:
00200     QueryParameterExpr(const QString& message);
00201     virtual ~QueryParameterExpr();
00202     virtual Field::Type type();
00211     void setType(Field::Type type);
00212     virtual QString debugString();
00213     virtual QString toString(QuerySchemaParameterValueListIterator* params = 0);
00214     virtual void getQueryParameters(QuerySchemaParameterList& params);
00215     virtual bool validate(ParseInfo& parseInfo);
00216 protected:
00217     Field::Type m_type;
00218 };
00219 
00221 class KEXI_DB_EXPORT VariableExpr : public BaseExpr
00222 {
00223 public:
00224     VariableExpr(const QString& _name);
00225     virtual ~VariableExpr();
00226     virtual Field::Type type();
00227     virtual QString debugString();
00228     virtual QString toString(QuerySchemaParameterValueListIterator* params = 0);
00229     virtual void getQueryParameters(QuerySchemaParameterList& params);
00230 
00234     virtual bool validate(ParseInfo& parseInfo);
00235 
00237     QString name;
00238 
00239     /* NULL by default. After succesful validate() it will point to a field,
00240      if the variable is of a form "tablename.fieldname" or "fieldname", 
00241      otherwise (eg. for asterisks) -still NULL.
00242      Only meaningful for column expressions within a query. */
00243     Field *field;
00244 
00245     /* -1 by default. After succesful validate() it will contain a position of a table
00246      within query that needs to be bound to the field. 
00247      This value can be either be -1 if no binding is needed.
00248      This value is used in the Parser to call 
00249       QuerySchema::addField(Field* field, int bindToTable);
00250      Only meaningful for column expressions within a query. */
00251     int tablePositionForField;
00252 
00256     TableSchema *tableForQueryAsterisk;
00257 };
00258 
00262 class KEXI_DB_EXPORT FunctionExpr : public BaseExpr
00263 {
00264 public:
00265     FunctionExpr(const QString& _name, NArgExpr* args_ = 0);
00266     virtual ~FunctionExpr();
00267     virtual Field::Type type();
00268     virtual QString debugString();
00269     virtual QString toString(QuerySchemaParameterValueListIterator* params = 0);
00270     virtual void getQueryParameters(QuerySchemaParameterList& params);
00271     virtual bool validate(ParseInfo& parseInfo);
00272 
00273     static QValueList<QCString> builtInAggregates();
00274     static bool isBuiltInAggregate(const QCString& fname);
00275 
00276     QString name;
00277     NArgExpr* args;
00278 };
00279 
00280 } //namespace KexiDB
00281 
00282 #endif
KDE Home | KDE Accessibility Home | Description of Access Keys