QxOrm  1.5.1
C++ Object Relational Mapping library
QxSqlQuery.h
Go to the documentation of this file.
00001 /****************************************************************************
00002 **
00003 ** https://www.qxorm.com/
00004 ** Copyright (C) 2013 Lionel Marty (contact@qxorm.com)
00005 **
00006 ** This file is part of the QxOrm library
00007 **
00008 ** This software is provided 'as-is', without any express or implied
00009 ** warranty. In no event will the authors be held liable for any
00010 ** damages arising from the use of this software
00011 **
00012 ** Commercial Usage
00013 ** Licensees holding valid commercial QxOrm licenses may use this file in
00014 ** accordance with the commercial license agreement provided with the
00015 ** Software or, alternatively, in accordance with the terms contained in
00016 ** a written agreement between you and Lionel Marty
00017 **
00018 ** GNU General Public License Usage
00019 ** Alternatively, this file may be used under the terms of the GNU
00020 ** General Public License version 3.0 as published by the Free Software
00021 ** Foundation and appearing in the file 'license.gpl3.txt' included in the
00022 ** packaging of this file. Please review the following information to
00023 ** ensure the GNU General Public License version 3.0 requirements will be
00024 ** met : http://www.gnu.org/copyleft/gpl.html
00025 **
00026 ** If you are unsure which license is appropriate for your use, or
00027 ** if you have questions regarding the use of this file, please contact :
00028 ** contact@qxorm.com
00029 **
00030 ****************************************************************************/
00031 
00032 #ifndef _QX_SQL_QUERY_H_
00033 #define _QX_SQL_QUERY_H_
00034 
00035 #ifdef _MSC_VER
00036 #pragma once
00037 #endif
00038 
00046 #ifdef Q_COMPILER_INITIALIZER_LISTS
00047 #include <initializer_list>
00048 #endif // Q_COMPILER_INITIALIZER_LISTS
00049 
00050 #ifdef _QX_ENABLE_BOOST_SERIALIZATION
00051 #include <boost/serialization/serialization.hpp>
00052 #include <boost/serialization/split_free.hpp>
00053 #include <boost/serialization/nvp.hpp>
00054 #endif // _QX_ENABLE_BOOST_SERIALIZATION
00055 
00056 #include <QtCore/qdatastream.h>
00057 
00058 #ifndef _QX_NO_JSON
00059 #include <QtCore/qjsonvalue.h>
00060 #include <QtCore/qjsonobject.h>
00061 #include <QtCore/qjsonarray.h>
00062 #include <QtCore/qjsondocument.h>
00063 #endif // _QX_NO_JSON
00064 
00065 #include <QtSql/qsqlquery.h>
00066 
00067 #include <QxCollection/QxCollection.h>
00068 
00069 #include <QxDao/QxSqlElement/QxSqlElement.h>
00070 
00071 #include <QxSerialize/QxSerializeFastCompil.h>
00072 
00073 #include <QxTraits/get_class_name.h>
00074 
00075 #include <QxRegister/QxVersion.h>
00076 
00077 #include <QxConvert/QxConvert.h>
00078 
00079 namespace qx {
00080 class QxSqlQuery;
00081 } // namespace qx
00082 
00083 #ifdef _QX_ENABLE_BOOST_SERIALIZATION
00084 namespace boost {
00085 namespace serialization {
00086 
00087 template <class Archive> inline void qx_save(Archive & ar, const qx::QxSqlQuery & t, const unsigned int file_version);
00088 template <class Archive> inline void qx_load(Archive & ar, qx::QxSqlQuery & t, const unsigned int file_version);
00089 
00090 } // namespace serialization
00091 } // namespace boost
00092 #endif // _QX_ENABLE_BOOST_SERIALIZATION
00093 
00094 QX_DLL_EXPORT QDataStream & operator<< (QDataStream & stream, const qx::QxSqlQuery & t) QX_USED;
00095 QX_DLL_EXPORT QDataStream & operator>> (QDataStream & stream, qx::QxSqlQuery & t) QX_USED;
00096 
00097 #ifndef _QX_NO_JSON
00098 namespace qx {
00099 namespace cvt {
00100 namespace detail {
00101 template <> struct QxConvert_ToJson< qx::QxSqlQuery >;
00102 template <> struct QxConvert_FromJson< qx::QxSqlQuery >;
00103 QX_DLL_EXPORT QJsonValue QxConvert_ToJson_Helper(const qx::QxSqlQuery & t, const QString & format) QX_USED;
00104 QX_DLL_EXPORT qx_bool QxConvert_FromJson_Helper(const QJsonValue & j, qx::QxSqlQuery & t, const QString & format) QX_USED;
00105 } // namespace detail
00106 } // namespace cvt
00107 } // namespace qx
00108 #endif // _QX_NO_JSON
00109 
00110 namespace qx {
00111 
00244 class QX_DLL_EXPORT QxSqlQuery
00245 {
00246 
00247 #ifdef _QX_ENABLE_BOOST_SERIALIZATION
00248    template <class Archive> friend inline void boost::serialization::qx_save(Archive & ar, const qx::QxSqlQuery & t, const unsigned int file_version);
00249    template <class Archive> friend inline void boost::serialization::qx_load(Archive & ar, qx::QxSqlQuery & t, const unsigned int file_version);
00250 #endif // _QX_ENABLE_BOOST_SERIALIZATION
00251 
00252    friend QX_DLL_EXPORT QDataStream & ::operator<< (QDataStream & stream, const qx::QxSqlQuery & t);
00253    friend QX_DLL_EXPORT QDataStream & ::operator>> (QDataStream & stream, qx::QxSqlQuery & t);
00254 
00255 #ifndef _QX_NO_JSON
00256    friend struct qx::cvt::detail::QxConvert_ToJson< qx::QxSqlQuery >;
00257    friend struct qx::cvt::detail::QxConvert_FromJson< qx::QxSqlQuery >;
00258    friend QX_DLL_EXPORT QJsonValue qx::cvt::detail::QxConvert_ToJson_Helper(const qx::QxSqlQuery & t, const QString & format);
00259    friend QX_DLL_EXPORT qx_bool qx::cvt::detail::QxConvert_FromJson_Helper(const QJsonValue & j, qx::QxSqlQuery & t, const QString & format);
00260 #endif // _QX_NO_JSON
00261 
00262 public:
00263 
00264    typedef std::function<void (QString &)> type_fct_on_before_sql_prepare;
00265    typedef std::function<void (QSqlQuery &)> type_fct_on_after_sql_exec;
00266 
00267 protected:
00268 
00269    struct QxSqlResult
00270    { QHash<QString, int> positionByKey; QHash<QString, int> positionByKeyUpper; QVector< QVector<QVariant> > values; };
00271 
00272    typedef std::tuple<QVariant, QSql::ParamType> type_bind_value;
00273 
00274    QStringList                                     m_sQuery;                  
00275    QxCollection<QString, type_bind_value>          m_lstValue;                
00276    qx::dao::detail::IxSqlElement_ptr               m_pSqlElementTemp;         
00277    QList<qx::dao::detail::IxSqlElement_ptr>        m_lstSqlElement;           
00278    int                                             m_iSqlElementIndex;        
00279    int                                             m_iParenthesisCount;       
00280    bool                                            m_bDistinct;               
00281    std::shared_ptr<QxSqlResult>                    m_pSqlResult;              
00282    QVariant                                        m_vResponse;               
00283    QString                                         m_sType;                   
00284    QHash<QString, std::shared_ptr<QxSqlQuery> >    m_lstJoinQueryUser;        
00285    QList<std::shared_ptr<QxSqlQuery> >             m_lstJoinQueryToResolve;   
00286    type_fct_on_before_sql_prepare                  m_fctOnBeforeSqlPrepare;   
00287    type_fct_on_after_sql_exec                      m_fctOnAfterSqlExec;       
00288 
00289 public:
00290 
00291    QxSqlQuery();
00292    QxSqlQuery(const char * query, const QVariantList & values = QVariantList());
00293    QxSqlQuery(const QString & query, const QVariantList & values = QVariantList());
00294    QxSqlQuery(const QStringList & query);
00295    QxSqlQuery(const QString & type, const QString & query);
00296    QxSqlQuery(const QString & type, const QStringList & query);
00297    virtual ~QxSqlQuery();
00298 
00299 #ifndef _QX_NO_JSON
00300 #ifdef Q_COMPILER_INITIALIZER_LISTS
00301    QxSqlQuery(std::initializer_list<QPair<QString, QJsonValue> > json);
00302    QxSqlQuery(std::initializer_list<QPair<QString, QJsonValue> > json, std::initializer_list<QPair<QString, QJsonValue> > opts);
00303    QxSqlQuery(const QString & type, std::initializer_list<QPair<QString, QJsonValue> > json);
00304    QxSqlQuery(const QString & type, std::initializer_list<QPair<QString, QJsonValue> > json, std::initializer_list<QPair<QString, QJsonValue> > opts);
00305 #endif // Q_COMPILER_INITIALIZER_LISTS
00306 #endif // _QX_NO_JSON
00307 
00308    QString query();
00309    QString queryAt(int idx) const;
00310    void queryAt(int idx, const QString & query);
00311    QVariant response() const;
00312    QString type() const;
00313    bool isEmpty() const;
00314    bool isDistinct() const;
00315    void clear();
00316    void resolve(QSqlQuery & query, qx::QxCollection<QString, QVariantList> * pLstExecBatch = NULL) const;
00317    void resolveOutput(QSqlQuery & query, bool bFetchSqlResult);
00318    void postProcess(QString & sql) const;
00319    void setResponse(const QVariant & v);
00320    void setType(const QString & s);
00321    QString getJoinQuery(const QString & relationKey, const QString & relationAlias);
00322    QString getJoinQueryHash();
00323 
00324    QxSqlQuery & query(const QString & sQuery);
00325    QxSqlQuery & bind(const QVariant & vValue, QSql::ParamType paramType = QSql::In);
00326    QxSqlQuery & bind(const QString & sKey, const QVariant & vValue, QSql::ParamType paramType = QSql::In);
00327 
00328    QVariant boundValue(const QString & sKey) const;
00329    QVariant boundValue(int iPosition) const;
00330 
00331    long getSqlResultRowCount() const;
00332    long getSqlResultColumnCount() const;
00333    QVariant getSqlResultAt(long row, long column) const;
00334    QVariant getSqlResultAt(long row, const QString & column, bool caseSensitive = false) const;
00335    QVector<QVariant> getSqlResultAt(long row) const;
00336    QVector<QString> getSqlResultAllColumns() const;
00337    void dumpSqlResult();
00338 
00339    static void dumpBoundValues(const QSqlQuery & query);
00340 
00341    QxSqlQuery & setFctOnBeforeSqlPrepare(type_fct_on_before_sql_prepare fct);
00342    void onBeforeSqlPrepare(QString & sql);
00343 
00344    QxSqlQuery & setFctOnAfterSqlExec(type_fct_on_after_sql_exec fct);
00345    void onAfterSqlExec(QSqlQuery & query);
00346 
00347 private:
00348 
00349    void verifyQuery() const QX_USED;
00350    void fetchSqlResult(QSqlQuery & query);
00351 
00352 public:
00353 
00354    /* -- All methods to build SQL query using C++ syntax -- */
00355 
00356    virtual QxSqlQuery & distinct();
00357 
00358    virtual QxSqlQuery & where(const QString & column);
00359    virtual QxSqlQuery & where_OpenParenthesis(const QString & column);
00360    virtual QxSqlQuery & and_(const QString & column);
00361    virtual QxSqlQuery & and_OpenParenthesis(const QString & column);
00362    virtual QxSqlQuery & or_(const QString & column);
00363    virtual QxSqlQuery & or_OpenParenthesis(const QString & column);
00364 
00365    virtual QxSqlQuery & openParenthesis();
00366    virtual QxSqlQuery & closeParenthesis();
00367 
00368    virtual QxSqlQuery & orderAsc(const QStringList & columns);
00369    virtual QxSqlQuery & orderAsc(const QString & col1);
00370    virtual QxSqlQuery & orderAsc(const QString & col1, const QString & col2);
00371    virtual QxSqlQuery & orderAsc(const QString & col1, const QString & col2, const QString & col3);
00372    virtual QxSqlQuery & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4);
00373    virtual QxSqlQuery & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5);
00374    virtual QxSqlQuery & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6);
00375    virtual QxSqlQuery & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7);
00376    virtual QxSqlQuery & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8);
00377    virtual QxSqlQuery & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9);
00378 
00379    virtual QxSqlQuery & orderDesc(const QStringList & columns);
00380    virtual QxSqlQuery & orderDesc(const QString & col1);
00381    virtual QxSqlQuery & orderDesc(const QString & col1, const QString & col2);
00382    virtual QxSqlQuery & orderDesc(const QString & col1, const QString & col2, const QString & col3);
00383    virtual QxSqlQuery & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4);
00384    virtual QxSqlQuery & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5);
00385    virtual QxSqlQuery & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6);
00386    virtual QxSqlQuery & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7);
00387    virtual QxSqlQuery & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8);
00388    virtual QxSqlQuery & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9);
00389 
00390    virtual QxSqlQuery & groupBy(const QStringList & columns);
00391    virtual QxSqlQuery & groupBy(const QString & col1);
00392    virtual QxSqlQuery & groupBy(const QString & col1, const QString & col2);
00393    virtual QxSqlQuery & groupBy(const QString & col1, const QString & col2, const QString & col3);
00394    virtual QxSqlQuery & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4);
00395    virtual QxSqlQuery & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5);
00396    virtual QxSqlQuery & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6);
00397    virtual QxSqlQuery & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7);
00398    virtual QxSqlQuery & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8);
00399    virtual QxSqlQuery & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9);
00400 
00401    virtual QxSqlQuery & limit(int rowsCount, int startRow = 0, bool withTies = false);
00402 
00403    virtual QxSqlQuery & like(const QString & val);
00404    virtual QxSqlQuery & notLike(const QString & val);
00405    virtual QxSqlQuery & startsWith(const QString & val);
00406    virtual QxSqlQuery & endsWith(const QString & val);
00407    virtual QxSqlQuery & containsString(const QString & val);
00408 
00409    virtual QxSqlQuery & isEqualTo(const QVariant & val);
00410    virtual QxSqlQuery & isNotEqualTo(const QVariant & val);
00411    virtual QxSqlQuery & isGreaterThan(const QVariant & val);
00412    virtual QxSqlQuery & isGreaterThanOrEqualTo(const QVariant & val);
00413    virtual QxSqlQuery & isLessThan(const QVariant & val);
00414    virtual QxSqlQuery & isLessThanOrEqualTo(const QVariant & val);
00415    virtual QxSqlQuery & customOperator(const QString & sCustomOperator, const QVariant & val);
00416 
00417    virtual QxSqlQuery & in(const QVariantList & values);
00418    virtual QxSqlQuery & in(const QVariant & val1);
00419    virtual QxSqlQuery & in(const QVariant & val1, const QVariant & val2);
00420    virtual QxSqlQuery & in(const QVariant & val1, const QVariant & val2, const QVariant & val3);
00421    virtual QxSqlQuery & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4);
00422    virtual QxSqlQuery & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5);
00423    virtual QxSqlQuery & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6);
00424    virtual QxSqlQuery & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7);
00425    virtual QxSqlQuery & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8);
00426    virtual QxSqlQuery & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8, const QVariant & val9);
00427 
00428    virtual QxSqlQuery & notIn(const QVariantList & values);
00429    virtual QxSqlQuery & notIn(const QVariant & val1);
00430    virtual QxSqlQuery & notIn(const QVariant & val1, const QVariant & val2);
00431    virtual QxSqlQuery & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3);
00432    virtual QxSqlQuery & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4);
00433    virtual QxSqlQuery & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5);
00434    virtual QxSqlQuery & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6);
00435    virtual QxSqlQuery & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7);
00436    virtual QxSqlQuery & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8);
00437    virtual QxSqlQuery & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8, const QVariant & val9);
00438 
00439    virtual QxSqlQuery & in_Select(const QxSqlQuery & query);
00440    virtual QxSqlQuery & notIn_Select(const QxSqlQuery & query);
00441    virtual QxSqlQuery & isEqualTo_Select(const QxSqlQuery & query);
00442    virtual QxSqlQuery & isNotEqualTo_Select(const QxSqlQuery & query);
00443 
00444    virtual QxSqlQuery & isNull();
00445    virtual QxSqlQuery & isNotNull();
00446 
00447    virtual QxSqlQuery & isBetween(const QVariant & val1, const QVariant & val2);
00448    virtual QxSqlQuery & isNotBetween(const QVariant & val1, const QVariant & val2);
00449 
00450    virtual QxSqlQuery & freeText(const QString & text, const QVariantList & values = QVariantList());
00451 
00452    virtual QxSqlQuery & addJoinQuery(const QString & relationKeyOrAlias, const QxSqlQuery & joinQuery);
00453 
00454 private:
00455 
00456    QxSqlQuery & addSqlExpression(const QString & column, qx::dao::detail::QxSqlExpression::type type);
00457    QxSqlQuery & addSqlCompare(const QVariant & val, qx::dao::detail::QxSqlCompare::type type, const QString & sCustomOperator = QString());
00458    QxSqlQuery & addSqlSort(const QStringList & columns, qx::dao::detail::QxSqlSort::type type);
00459    QxSqlQuery & addSqlIn(const QVariantList & values, qx::dao::detail::QxSqlIn::type type);
00460    QxSqlQuery & addSqlIsNull(qx::dao::detail::QxSqlIsNull::type type);
00461    QxSqlQuery & addSqlIsBetween(const QVariant & val1, const QVariant & val2, qx::dao::detail::QxSqlIsBetween::type type);
00462    QxSqlQuery & addFreeText(const QString & text, const QVariantList & values);
00463    QxSqlQuery & addEmbedQuery(const QxSqlQuery & query, qx::dao::detail::QxSqlEmbedQuery::type type, bool requirePreviousElement);
00464 
00465 };
00466 
00467 } // namespace qx
00468 
00469 typedef qx::QxSqlQuery qx_query;
00470 
00471 namespace qx {
00472 namespace dao {
00473 
00497 QX_DLL_EXPORT QSqlError call_query(qx::QxSqlQuery & query, QSqlDatabase * pDatabase = NULL);
00498 
00503 QX_DLL_EXPORT QSqlError call_query_without_prepare(qx::QxSqlQuery & query, QSqlDatabase * pDatabase = NULL);
00504 
00505 namespace helper {
00506 
00507 QX_DLL_EXPORT QSqlError call_query_helper(qx::QxSqlQuery & query, QSqlDatabase * pDatabase, bool bPrepare);
00508 
00509 } // namespace helper
00510 } // namespace dao
00511 } // namespace qx
00512 
00513 QX_REGISTER_CLASS_NAME(qx_query)
00514 
00515 QX_CLASS_VERSION(qx::QxSqlQuery, 0)
00516 
00517 #ifdef _QX_ENABLE_BOOST_SERIALIZATION
00518 QX_SERIALIZE_FAST_COMPIL_SAVE_LOAD_HPP(QX_DLL_EXPORT, qx::QxSqlQuery)
00519 #endif // _QX_ENABLE_BOOST_SERIALIZATION
00520 
00521 #define QX_SQL_QUERY_DERIVED_IMPL_COVARIANT_RETURN_TYPE_HPP(className) \
00522 public: \
00523 \
00524 virtual className & distinct(); \
00525 \
00526 virtual className & where(const QString & column); \
00527 virtual className & where_OpenParenthesis(const QString & column); \
00528 virtual className & and_(const QString & column); \
00529 virtual className & and_OpenParenthesis(const QString & column); \
00530 virtual className & or_(const QString & column); \
00531 virtual className & or_OpenParenthesis(const QString & column); \
00532 \
00533 virtual className & openParenthesis(); \
00534 virtual className & closeParenthesis(); \
00535 \
00536 virtual className & orderAsc(const QStringList & columns); \
00537 virtual className & orderAsc(const QString & col1); \
00538 virtual className & orderAsc(const QString & col1, const QString & col2); \
00539 virtual className & orderAsc(const QString & col1, const QString & col2, const QString & col3); \
00540 virtual className & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4); \
00541 virtual className & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5); \
00542 virtual className & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6); \
00543 virtual className & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7); \
00544 virtual className & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8); \
00545 virtual className & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9); \
00546 \
00547 virtual className & orderDesc(const QStringList & columns); \
00548 virtual className & orderDesc(const QString & col1); \
00549 virtual className & orderDesc(const QString & col1, const QString & col2); \
00550 virtual className & orderDesc(const QString & col1, const QString & col2, const QString & col3); \
00551 virtual className & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4); \
00552 virtual className & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5); \
00553 virtual className & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6); \
00554 virtual className & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7); \
00555 virtual className & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8); \
00556 virtual className & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9); \
00557 \
00558 virtual className & groupBy(const QStringList & columns); \
00559 virtual className & groupBy(const QString & col1); \
00560 virtual className & groupBy(const QString & col1, const QString & col2); \
00561 virtual className & groupBy(const QString & col1, const QString & col2, const QString & col3); \
00562 virtual className & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4); \
00563 virtual className & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5); \
00564 virtual className & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6); \
00565 virtual className & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7); \
00566 virtual className & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8); \
00567 virtual className & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9); \
00568 \
00569 virtual className & limit(int rowsCount, int startRow = 0, bool withTies = false); \
00570 \
00571 virtual className & like(const QString & val); \
00572 virtual className & notLike(const QString & val); \
00573 virtual className & startsWith(const QString & val); \
00574 virtual className & endsWith(const QString & val); \
00575 virtual className & containsString(const QString & val); \
00576 \
00577 virtual className & isEqualTo(const QVariant & val); \
00578 virtual className & isNotEqualTo(const QVariant & val); \
00579 virtual className & isGreaterThan(const QVariant & val); \
00580 virtual className & isGreaterThanOrEqualTo(const QVariant & val); \
00581 virtual className & isLessThan(const QVariant & val); \
00582 virtual className & isLessThanOrEqualTo(const QVariant & val); \
00583 virtual className & customOperator(const QString & sCustomOperator, const QVariant & val); \
00584 \
00585 virtual className & in(const QVariantList & values); \
00586 virtual className & in(const QVariant & val1); \
00587 virtual className & in(const QVariant & val1, const QVariant & val2); \
00588 virtual className & in(const QVariant & val1, const QVariant & val2, const QVariant & val3); \
00589 virtual className & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4); \
00590 virtual className & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5); \
00591 virtual className & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6); \
00592 virtual className & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7); \
00593 virtual className & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8); \
00594 virtual className & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8, const QVariant & val9); \
00595 \
00596 virtual className & notIn(const QVariantList & values); \
00597 virtual className & notIn(const QVariant & val1); \
00598 virtual className & notIn(const QVariant & val1, const QVariant & val2); \
00599 virtual className & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3); \
00600 virtual className & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4); \
00601 virtual className & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5); \
00602 virtual className & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6); \
00603 virtual className & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7); \
00604 virtual className & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8); \
00605 virtual className & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8, const QVariant & val9); \
00606 \
00607 virtual className & in_Select(const QxSqlQuery & query); \
00608 virtual className & notIn_Select(const QxSqlQuery & query); \
00609 virtual className & isEqualTo_Select(const QxSqlQuery & query); \
00610 virtual className & isNotEqualTo_Select(const QxSqlQuery & query); \
00611 \
00612 virtual className & isNull(); \
00613 virtual className & isNotNull(); \
00614 \
00615 virtual className & isBetween(const QVariant & val1, const QVariant & val2); \
00616 virtual className & isNotBetween(const QVariant & val1, const QVariant & val2); \
00617 \
00618 virtual className & freeText(const QString & text, const QVariantList & values = QVariantList()); \
00619 \
00620 virtual className & addJoinQuery(const QString & relationKeyOrAlias, const QxSqlQuery & joinQuery);
00621 
00622 #define QX_SQL_QUERY_DERIVED_IMPL_COVARIANT_RETURN_TYPE_CPP(className) \
00623 \
00624 className & className::distinct() { return static_cast<className &>(qx::QxSqlQuery::distinct()); } \
00625 \
00626 className & className::where(const QString & column) { return static_cast<className &>(qx::QxSqlQuery::where(column)); } \
00627 className & className::where_OpenParenthesis(const QString & column) { return static_cast<className &>(qx::QxSqlQuery::where_OpenParenthesis(column)); } \
00628 className & className::and_(const QString & column) { return static_cast<className &>(qx::QxSqlQuery::and_(column)); } \
00629 className & className::and_OpenParenthesis(const QString & column) { return static_cast<className &>(qx::QxSqlQuery::and_OpenParenthesis(column)); } \
00630 className & className::or_(const QString & column) { return static_cast<className &>(qx::QxSqlQuery::or_(column)); } \
00631 className & className::or_OpenParenthesis(const QString & column) { return static_cast<className &>(qx::QxSqlQuery::or_OpenParenthesis(column)); } \
00632 \
00633 className & className::openParenthesis() { return static_cast<className &>(qx::QxSqlQuery::openParenthesis()); } \
00634 className & className::closeParenthesis() { return static_cast<className &>(qx::QxSqlQuery::closeParenthesis()); } \
00635 \
00636 className & className::orderAsc(const QStringList & columns) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(columns)); } \
00637 className & className::orderAsc(const QString & col1) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1)); } \
00638 className & className::orderAsc(const QString & col1, const QString & col2) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1, col2)); } \
00639 className & className::orderAsc(const QString & col1, const QString & col2, const QString & col3) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1, col2, col3)); } \
00640 className & className::orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1, col2, col3, col4)); } \
00641 className & className::orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1, col2, col3, col4, col5)); } \
00642 className & className::orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1, col2, col3, col4, col5, col6)); } \
00643 className & className::orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1, col2, col3, col4, col5, col6, col7)); } \
00644 className & className::orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1, col2, col3, col4, col5, col6, col7, col8)); } \
00645 className & className::orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1, col2, col3, col4, col5, col6, col7, col8, col9)); } \
00646 \
00647 className & className::orderDesc(const QStringList & columns) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(columns)); } \
00648 className & className::orderDesc(const QString & col1) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1)); } \
00649 className & className::orderDesc(const QString & col1, const QString & col2) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1, col2)); } \
00650 className & className::orderDesc(const QString & col1, const QString & col2, const QString & col3) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1, col2, col3)); } \
00651 className & className::orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1, col2, col3, col4)); } \
00652 className & className::orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1, col2, col3, col4, col5)); } \
00653 className & className::orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1, col2, col3, col4, col5, col6)); } \
00654 className & className::orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1, col2, col3, col4, col5, col6, col7)); } \
00655 className & className::orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1, col2, col3, col4, col5, col6, col7, col8)); } \
00656 className & className::orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1, col2, col3, col4, col5, col6, col7, col8, col9)); } \
00657 \
00658 className & className::groupBy(const QStringList & columns) { return static_cast<className &>(qx::QxSqlQuery::groupBy(columns)); } \
00659 className & className::groupBy(const QString & col1) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1)); } \
00660 className & className::groupBy(const QString & col1, const QString & col2) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1, col2)); } \
00661 className & className::groupBy(const QString & col1, const QString & col2, const QString & col3) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1, col2, col3)); } \
00662 className & className::groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1, col2, col3, col4)); } \
00663 className & className::groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1, col2, col3, col4, col5)); } \
00664 className & className::groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1, col2, col3, col4, col5, col6)); } \
00665 className & className::groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1, col2, col3, col4, col5, col6, col7)); } \
00666 className & className::groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1, col2, col3, col4, col5, col6, col7, col8)); } \
00667 className & className::groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1, col2, col3, col4, col5, col6, col7, col8, col9)); } \
00668 \
00669 className & className::limit(int rowsCount, int startRow, bool withTies) { return static_cast<className &>(qx::QxSqlQuery::limit(rowsCount, startRow, withTies)); } \
00670 \
00671 className & className::like(const QString & val) { return static_cast<className &>(qx::QxSqlQuery::like(val)); } \
00672 className & className::notLike(const QString & val) { return static_cast<className &>(qx::QxSqlQuery::notLike(val)); } \
00673 className & className::startsWith(const QString & val) { return static_cast<className &>(qx::QxSqlQuery::startsWith(val)); } \
00674 className & className::endsWith(const QString & val) { return static_cast<className &>(qx::QxSqlQuery::endsWith(val)); } \
00675 className & className::containsString(const QString & val) { return static_cast<className &>(qx::QxSqlQuery::containsString(val)); } \
00676 \
00677 className & className::isEqualTo(const QVariant & val) { return static_cast<className &>(qx::QxSqlQuery::isEqualTo(val)); } \
00678 className & className::isNotEqualTo(const QVariant & val) { return static_cast<className &>(qx::QxSqlQuery::isNotEqualTo(val)); } \
00679 className & className::isGreaterThan(const QVariant & val) { return static_cast<className &>(qx::QxSqlQuery::isGreaterThan(val)); } \
00680 className & className::isGreaterThanOrEqualTo(const QVariant & val) { return static_cast<className &>(qx::QxSqlQuery::isGreaterThanOrEqualTo(val)); } \
00681 className & className::isLessThan(const QVariant & val) { return static_cast<className &>(qx::QxSqlQuery::isLessThan(val)); } \
00682 className & className::isLessThanOrEqualTo(const QVariant & val) { return static_cast<className &>(qx::QxSqlQuery::isLessThanOrEqualTo(val)); } \
00683 className & className::customOperator(const QString & sCustomOperator, const QVariant & val) { return static_cast<className &>(qx::QxSqlQuery::customOperator(sCustomOperator, val)); } \
00684 \
00685 className & className::in(const QVariantList & values) { return static_cast<className &>(qx::QxSqlQuery::in(values)); } \
00686 className & className::in(const QVariant & val1) { return static_cast<className &>(qx::QxSqlQuery::in(val1)); } \
00687 className & className::in(const QVariant & val1, const QVariant & val2) { return static_cast<className &>(qx::QxSqlQuery::in(val1, val2)); } \
00688 className & className::in(const QVariant & val1, const QVariant & val2, const QVariant & val3) { return static_cast<className &>(qx::QxSqlQuery::in(val1, val2, val3)); } \
00689 className & className::in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4) { return static_cast<className &>(qx::QxSqlQuery::in(val1, val2, val3, val4)); } \
00690 className & className::in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5) { return static_cast<className &>(qx::QxSqlQuery::in(val1, val2, val3, val4, val5)); } \
00691 className & className::in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6) { return static_cast<className &>(qx::QxSqlQuery::in(val1, val2, val3, val4, val5, val6)); } \
00692 className & className::in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7) { return static_cast<className &>(qx::QxSqlQuery::in(val1, val2, val3, val4, val5, val6, val7)); } \
00693 className & className::in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8) { return static_cast<className &>(qx::QxSqlQuery::in(val1, val2, val3, val4, val5, val6, val7, val8)); } \
00694 className & className::in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8, const QVariant & val9) { return static_cast<className &>(qx::QxSqlQuery::in(val1, val2, val3, val4, val5, val6, val7, val8, val9)); } \
00695 \
00696 className & className::notIn(const QVariantList & values) { return static_cast<className &>(qx::QxSqlQuery::notIn(values)); } \
00697 className & className::notIn(const QVariant & val1) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1)); } \
00698 className & className::notIn(const QVariant & val1, const QVariant & val2) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1, val2)); } \
00699 className & className::notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1, val2, val3)); } \
00700 className & className::notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1, val2, val3, val4)); } \
00701 className & className::notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1, val2, val3, val4, val5)); } \
00702 className & className::notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1, val2, val3, val4, val5, val6)); } \
00703 className & className::notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1, val2, val3, val4, val5, val6, val7)); } \
00704 className & className::notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1, val2, val3, val4, val5, val6, val7, val8)); } \
00705 className & className::notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8, const QVariant & val9) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1, val2, val3, val4, val5, val6, val7, val8, val9)); } \
00706 \
00707 className & className::in_Select(const QxSqlQuery & query) { return static_cast<className &>(qx::QxSqlQuery::in_Select(query)); } \
00708 className & className::notIn_Select(const QxSqlQuery & query) { return static_cast<className &>(qx::QxSqlQuery::notIn_Select(query)); } \
00709 className & className::isEqualTo_Select(const QxSqlQuery & query) { return static_cast<className &>(qx::QxSqlQuery::isEqualTo_Select(query)); } \
00710 className & className::isNotEqualTo_Select(const QxSqlQuery & query) { return static_cast<className &>(qx::QxSqlQuery::isNotEqualTo_Select(query)); } \
00711 \
00712 className & className::isNull() { return static_cast<className &>(qx::QxSqlQuery::isNull()); } \
00713 className & className::isNotNull() { return static_cast<className &>(qx::QxSqlQuery::isNotNull()); } \
00714 \
00715 className & className::isBetween(const QVariant & val1, const QVariant & val2) { return static_cast<className &>(qx::QxSqlQuery::isBetween(val1, val2)); } \
00716 className & className::isNotBetween(const QVariant & val1, const QVariant & val2) { return static_cast<className &>(qx::QxSqlQuery::isNotBetween(val1, val2)); } \
00717 \
00718 className & className::freeText(const QString & text, const QVariantList & values) { return static_cast<className &>(qx::QxSqlQuery::freeText(text, values)); } \
00719 \
00720 className & className::addJoinQuery(const QString & relationKeyOrAlias, const QxSqlQuery & joinQuery) { return static_cast<className &>(qx::QxSqlQuery::addJoinQuery(relationKeyOrAlias, joinQuery)); }
00721 
00722 #endif // _QX_SQL_QUERY_H_