expression.h
Go to the documentation of this file.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 successful 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 successful 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
