2003-12-16 11:41:56 +00:00
/*************************************************************************
*
2008-04-10 11:51:41 +00:00
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
2003-12-16 11:41:56 +00:00
*
2010-02-12 15:01:35 +01:00
* Copyright 2000 , 2010 Oracle and / or its affiliates .
2003-12-16 11:41:56 +00:00
*
2008-04-10 11:51:41 +00:00
* OpenOffice . org - a multi - platform office productivity suite
2003-12-16 11:41:56 +00:00
*
2008-04-10 11:51:41 +00:00
* This file is part of OpenOffice . org .
2003-12-16 11:41:56 +00:00
*
2008-04-10 11:51:41 +00:00
* OpenOffice . org is free software : you can redistribute it and / or modify
* it under the terms of the GNU Lesser General Public License version 3
* only , as published by the Free Software Foundation .
2003-12-16 11:41:56 +00:00
*
2008-04-10 11:51:41 +00:00
* OpenOffice . org is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Lesser General Public License version 3 for more details
* ( a copy is included in the LICENSE file that accompanied this code ) .
2003-12-16 11:41:56 +00:00
*
2008-04-10 11:51:41 +00:00
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice . org . If not , see
* < http : //www.openoffice.org/license.html>
* for a copy of the LGPLv3 License .
2003-12-16 11:41:56 +00:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# ifndef DBACCESS_CORE_API_SINGLESELECTQUERYCOMPOSER_HXX
# define DBACCESS_CORE_API_SINGLESELECTQUERYCOMPOSER_HXX
# include <com/sun/star/sdb/XParametersSupplier.hpp>
# include <com/sun/star/sdbcx/XTablesSupplier.hpp>
# include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
# include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp>
# include <com/sun/star/lang/XServiceInfo.hpp>
# include <com/sun/star/script/XTypeConverter.hpp>
2005-01-05 11:29:15 +00:00
# include <cppuhelper/implbase5.hxx>
2003-12-16 11:41:56 +00:00
# include <connectivity/sqliterator.hxx>
# include <connectivity/sqlparse.hxx>
# include "apitools.hxx"
# include <comphelper/broadcasthelper.hxx>
# include <comphelper/uno3.hxx>
# include <comphelper/proparrhlp.hxx>
# include <comphelper/propertycontainer.hxx>
2007-11-21 14:40:24 +00:00
# include <comphelper/componentcontext.hxx>
2003-12-16 11:41:56 +00:00
2005-01-05 11:29:15 +00:00
# include <memory>
2003-12-16 11:41:56 +00:00
namespace com { namespace sun { namespace star { namespace util {
class XNumberFormatsSupplier ;
class XNumberFormatter ;
} } } }
namespace dbaccess
{
2005-01-05 11:29:15 +00:00
typedef : : cppu : : ImplHelper5 < : : com : : sun : : star : : sdb : : XSingleSelectQueryComposer ,
2003-12-16 11:41:56 +00:00
: : com : : sun : : star : : sdb : : XParametersSupplier ,
: : com : : sun : : star : : sdbcx : : XColumnsSupplier ,
: : com : : sun : : star : : sdbcx : : XTablesSupplier ,
: : com : : sun : : star : : lang : : XServiceInfo > OSingleSelectQueryComposer_BASE ;
class OPrivateColumns ;
class OPrivateTables ;
class OSingleSelectQueryComposer : public : : comphelper : : OMutexAndBroadcastHelper
, public OSubComponent
, public : : comphelper : : OPropertyContainer
, public : : comphelper : : OPropertyArrayUsageHelper < OSingleSelectQueryComposer >
, public OSingleSelectQueryComposer_BASE
{
enum SQLPart
{
2005-01-05 11:29:15 +00:00
Where = 0 , // the 0 is important, as it will be used as index into arrays
2003-12-16 11:41:56 +00:00
Group ,
Having ,
2005-01-05 11:29:15 +00:00
Order ,
SQLPartCount
2003-12-16 11:41:56 +00:00
} ;
2005-01-05 11:29:15 +00:00
inline void incSQLPart ( SQLPart & e ) { e = ( SQLPart ) ( 1 + ( size_t ) e ) ; }
2003-12-16 11:41:56 +00:00
enum EColumnType
{
SelectColumns = 0 ,
GroupByColumns = 1 ,
OrderColumns = 2 ,
ParameterColumns = 3
} ;
2005-01-05 11:29:15 +00:00
typedef : : std : : const_mem_fun_t < const : : connectivity : : OSQLParseNode * , : : connectivity : : OSQLParseTreeIterator >
TGetParseNode ;
2003-12-16 11:41:56 +00:00
: : connectivity : : OSQLParser m_aSqlParser ;
2005-01-05 11:29:15 +00:00
: : connectivity : : OSQLParseTreeIterator m_aSqlIterator ; // the iterator for the complete statement
: : connectivity : : OSQLParseTreeIterator m_aAdditiveIterator ; // the iterator for the "additive statement" (means without the clauses of the elementary statement)
: : std : : vector < OPrivateColumns * > m_aColumnsCollection ; // used for columns and parameters of old queries
2003-12-16 11:41:56 +00:00
: : std : : vector < OPrivateTables * > m_aTablesCollection ;
2005-01-05 11:29:15 +00:00
: : std : : vector < : : rtl : : OUString > m_aElementaryParts ; // the filter/groupby/having/order of the elementary statement
2003-12-16 11:41:56 +00:00
: : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : sdbc : : XConnection > m_xConnection ;
: : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : sdbc : : XDatabaseMetaData > m_xMetaData ;
2006-07-10 14:12:10 +00:00
: : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : container : : XNameAccess > m_xConnectionTables ;
2010-01-22 08:14:22 +01:00
: : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : container : : XNameAccess > m_xConnectionQueries ;
2003-12-16 11:41:56 +00:00
: : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : util : : XNumberFormatsSupplier > m_xNumberFormatsSupplier ;
: : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : container : : XNameAccess > m_xColumns ;
2007-11-21 14:40:24 +00:00
: : comphelper : : ComponentContext m_aContext ;
2003-12-16 11:41:56 +00:00
: : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : script : : XTypeConverter > m_xTypeConverter ;
: : std : : vector < OPrivateColumns * > m_aCurrentColumns ;
OPrivateTables * m_pTables ; // currently used tables
2005-01-05 11:29:15 +00:00
: : rtl : : OUString m_aPureSelectSQL ; // the pure select statement, without filter/order/groupby/having
2003-12-16 11:41:56 +00:00
: : rtl : : OUString m_sDecimalSep ;
2010-01-22 08:14:22 +01:00
: : rtl : : OUString m_sCommand ;
2003-12-16 11:41:56 +00:00
: : com : : sun : : star : : lang : : Locale m_aLocale ;
sal_Int32 m_nBoolCompareMode ; // how to compare bool values
2010-01-22 08:14:22 +01:00
sal_Int32 m_nCommandType ;
2003-12-16 11:41:56 +00:00
// <properties>
: : rtl : : OUString m_sOrignal ;
// </properties>
2005-01-05 11:29:15 +00:00
sal_Bool setORCriteria ( : : connectivity : : OSQLParseNode * pCondition , : : connectivity : : OSQLParseTreeIterator & _rIterator ,
2003-12-16 11:41:56 +00:00
: : std : : vector < : : std : : vector < : : com : : sun : : star : : beans : : PropertyValue > > & rFilters , const : : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : util : : XNumberFormatter > & xFormatter ) const ;
2005-01-05 11:29:15 +00:00
sal_Bool setANDCriteria ( : : connectivity : : OSQLParseNode * pCondition , : : connectivity : : OSQLParseTreeIterator & _rIterator ,
2003-12-16 11:41:56 +00:00
: : std : : vector < : : com : : sun : : star : : beans : : PropertyValue > & rFilters , const : : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : util : : XNumberFormatter > & xFormatter ) const ;
2005-01-05 11:29:15 +00:00
sal_Bool setComparsionPredicate ( : : connectivity : : OSQLParseNode * pCondition , : : connectivity : : OSQLParseTreeIterator & _rIterator ,
2003-12-16 11:41:56 +00:00
: : std : : vector < : : com : : sun : : star : : beans : : PropertyValue > & rFilters , const : : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : util : : XNumberFormatter > & xFormatter ) const ;
2005-01-05 11:29:15 +00:00
: : rtl : : OUString getColumnName ( : : connectivity : : OSQLParseNode * pColumnRef , : : connectivity : : OSQLParseTreeIterator & _rIterator ) const ;
2003-12-16 11:41:56 +00:00
: : rtl : : OUString getTableAlias ( const : : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : beans : : XPropertySet > & column ) const ;
sal_Int32 getPredicateType ( : : connectivity : : OSQLParseNode * _pPredicate ) const ;
// clears all Columns,Parameters and tables and insert it to their vectors
void clearCurrentCollections ( ) ;
2009-07-06 09:00:26 +00:00
// clears the columns collection given by EColumnType
void clearColumns ( const EColumnType _eType ) ;
2003-12-16 11:41:56 +00:00
2005-01-05 11:29:15 +00:00
/** retrieves a particular part of a statement
@ param _rIterator
the iterator to use .
*/
: : rtl : : OUString getStatementPart ( TGetParseNode & _aGetFunctor , : : connectivity : : OSQLParseTreeIterator & _rIterator ) ;
2003-12-16 11:41:56 +00:00
void setQuery_Impl ( const : : rtl : : OUString & command ) ;
void setConditionByColumn ( const : : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : beans : : XPropertySet > & column
, sal_Bool andCriteria
2010-01-22 08:14:22 +01:00
, : : std : : mem_fun1_t < bool , OSingleSelectQueryComposer , : : rtl : : OUString > & _aSetFunctor
, sal_Int32 filterOperator ) ;
2003-12-16 11:41:56 +00:00
/** getStructuredCondition returns the structured condition for the where or having clause
@ param _aGetFunctor
A member function to get the correct parse node .
@ return
The structured filter
*/
: : com : : sun : : star : : uno : : Sequence < : : com : : sun : : star : : uno : : Sequence < : : com : : sun : : star : : beans : : PropertyValue > >
2005-01-05 11:29:15 +00:00
getStructuredCondition ( TGetParseNode & _aGetFunctor ) ;
2003-12-16 11:41:56 +00:00
: : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : container : : XIndexAccess >
2005-01-05 11:29:15 +00:00
setCurrentColumns ( EColumnType _eType , const : : vos : : ORef < : : connectivity : : OSQLColumns > & _rCols ) ;
2003-12-16 11:41:56 +00:00
//helper methods for mem_fun_t
inline bool implSetFilter ( : : rtl : : OUString _sFilter ) { setFilter ( _sFilter ) ; return true ; }
inline bool implSetHavingClause ( : : rtl : : OUString _sFilter ) { setHavingClause ( _sFilter ) ; return true ; }
/** returns the part of the seelect statement
@ param _ePart
Which part should be returned .
@ param _bWithKeyword
If < TRUE / > the keyword will be added too . Otherwise not .
2005-01-05 11:29:15 +00:00
@ param _rIterator
The iterator to use .
2003-12-16 11:41:56 +00:00
@ return
The part of the select statement .
*/
2005-01-05 11:29:15 +00:00
: : rtl : : OUString getSQLPart ( SQLPart _ePart , : : connectivity : : OSQLParseTreeIterator & _rIterator , sal_Bool _bWithKeyword ) ;
/** retrieves the keyword for the given SQLPart
*/
: : rtl : : OUString getKeyword ( SQLPart _ePart ) const ;
/** sets a single "additive" clause, means a filter/groupby/having/order clause
*/
void setSingleAdditiveClause ( SQLPart _ePart , const : : rtl : : OUString & _rClause ) ;
/** composes a statement from m_aPureSelectSQL and the 4 usual clauses
*/
: : rtl : : OUString composeStatementFromParts ( const : : std : : vector < : : rtl : : OUString > & _rParts ) ;
2003-12-16 11:41:56 +00:00
2009-04-23 10:42:05 +00:00
/** return the name of the column.
*/
: : rtl : : OUString impl_getColumnName_throw ( const : : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : beans : : XPropertySet > & column ) ;
2003-12-16 11:41:56 +00:00
protected :
virtual ~ OSingleSelectQueryComposer ( ) ;
public :
OSingleSelectQueryComposer ( const : : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : container : : XNameAccess > & _xTableSupplier ,
const : : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : sdbc : : XConnection > & _xConnection ,
2007-11-21 14:40:24 +00:00
const : : comphelper : : ComponentContext & _rContext ) ;
2003-12-16 11:41:56 +00:00
void SAL_CALL disposing ( void ) ;
// ::com::sun::star::lang::XTypeProvider
DECLARE_TYPEPROVIDER ( ) ;
// com::sun::star::lang::XUnoTunnel
virtual sal_Int64 SAL_CALL getSomething ( const : : com : : sun : : star : : uno : : Sequence < sal_Int8 > & aIdentifier ) throw ( : : com : : sun : : star : : uno : : RuntimeException ) ;
// ::com::sun::star::uno::XInterface
DECLARE_XINTERFACE ( )
// XServiceInfo
DECLARE_SERVICE_INFO ( ) ;
DECLARE_PROPERTYCONTAINER_DEFAULTS ( ) ;
// ::com::sun::star::sdb::XSingleSelectQueryComposer
2005-01-05 11:29:15 +00:00
virtual : : rtl : : OUString SAL_CALL getElementaryQuery ( ) throw ( : : com : : sun : : star : : uno : : RuntimeException ) ;
virtual void SAL_CALL setElementaryQuery ( const : : rtl : : OUString & _rElementary ) throw ( : : com : : sun : : star : : sdbc : : SQLException , : : com : : sun : : star : : uno : : RuntimeException ) ;
2003-12-16 11:41:56 +00:00
virtual void SAL_CALL setFilter ( const : : rtl : : OUString & filter ) throw ( : : com : : sun : : star : : sdbc : : SQLException , : : com : : sun : : star : : uno : : RuntimeException ) ;
virtual void SAL_CALL setStructuredFilter ( const : : com : : sun : : star : : uno : : Sequence < : : com : : sun : : star : : uno : : Sequence < : : com : : sun : : star : : beans : : PropertyValue > > & filter ) throw ( : : com : : sun : : star : : sdbc : : SQLException , : : com : : sun : : star : : lang : : IllegalArgumentException , : : com : : sun : : star : : uno : : RuntimeException ) ;
2010-01-22 08:14:22 +01:00
virtual void SAL_CALL appendFilterByColumn ( const : : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : beans : : XPropertySet > & column , sal_Bool andCriteria , sal_Int32 filterOperator ) throw ( : : com : : sun : : star : : sdbc : : SQLException , : : com : : sun : : star : : uno : : RuntimeException ) ;
2003-12-16 11:41:56 +00:00
virtual void SAL_CALL appendGroupByColumn ( const : : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : beans : : XPropertySet > & column ) throw ( : : com : : sun : : star : : sdbc : : SQLException , : : com : : sun : : star : : uno : : RuntimeException ) ;
virtual void SAL_CALL setGroup ( const : : rtl : : OUString & group ) throw ( : : com : : sun : : star : : sdbc : : SQLException , : : com : : sun : : star : : uno : : RuntimeException ) ;
virtual void SAL_CALL setHavingClause ( const : : rtl : : OUString & filter ) throw ( : : com : : sun : : star : : sdbc : : SQLException , : : com : : sun : : star : : uno : : RuntimeException ) ;
2005-01-05 11:29:15 +00:00
virtual void SAL_CALL setStructuredHavingClause ( const : : com : : sun : : star : : uno : : Sequence < : : com : : sun : : star : : uno : : Sequence < : : com : : sun : : star : : beans : : PropertyValue > > & filter ) throw ( : : com : : sun : : star : : sdbc : : SQLException , : : com : : sun : : star : : uno : : RuntimeException ) ;
2010-01-22 08:14:22 +01:00
virtual void SAL_CALL appendHavingClauseByColumn ( const : : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : beans : : XPropertySet > & column , sal_Bool andCriteria , sal_Int32 filterOperator ) throw ( : : com : : sun : : star : : sdbc : : SQLException , : : com : : sun : : star : : uno : : RuntimeException ) ;
2003-12-16 11:41:56 +00:00
virtual void SAL_CALL appendOrderByColumn ( const : : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : beans : : XPropertySet > & column , sal_Bool ascending ) throw ( : : com : : sun : : star : : sdbc : : SQLException , : : com : : sun : : star : : uno : : RuntimeException ) ;
virtual void SAL_CALL setOrder ( const : : rtl : : OUString & order ) throw ( : : com : : sun : : star : : sdbc : : SQLException , : : com : : sun : : star : : uno : : RuntimeException ) ;
// XSingleSelectQueryAnalyzer
virtual : : rtl : : OUString SAL_CALL getQuery ( ) throw ( : : com : : sun : : star : : uno : : RuntimeException ) ;
virtual void SAL_CALL setQuery ( const : : rtl : : OUString & command ) throw ( : : com : : sun : : star : : sdbc : : SQLException , : : com : : sun : : star : : uno : : RuntimeException ) ;
2010-01-22 08:14:22 +01:00
virtual void SAL_CALL setCommand ( const : : rtl : : OUString & command , sal_Int32 CommandType ) throw ( : : com : : sun : : star : : sdbc : : SQLException , : : com : : sun : : star : : uno : : RuntimeException ) ;
2003-12-16 11:41:56 +00:00
virtual : : rtl : : OUString SAL_CALL getFilter ( ) throw ( : : com : : sun : : star : : uno : : RuntimeException ) ;
virtual : : com : : sun : : star : : uno : : Sequence < : : com : : sun : : star : : uno : : Sequence < : : com : : sun : : star : : beans : : PropertyValue > > SAL_CALL getStructuredFilter ( ) throw ( : : com : : sun : : star : : uno : : RuntimeException ) ;
virtual : : rtl : : OUString SAL_CALL getGroup ( ) throw ( : : com : : sun : : star : : uno : : RuntimeException ) ;
virtual : : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : container : : XIndexAccess > SAL_CALL getGroupColumns ( ) throw ( : : com : : sun : : star : : uno : : RuntimeException ) ;
virtual : : rtl : : OUString SAL_CALL getHavingClause ( ) throw ( : : com : : sun : : star : : uno : : RuntimeException ) ;
2005-01-05 11:29:15 +00:00
virtual : : com : : sun : : star : : uno : : Sequence < : : com : : sun : : star : : uno : : Sequence < : : com : : sun : : star : : beans : : PropertyValue > > SAL_CALL getStructuredHavingClause ( ) throw ( : : com : : sun : : star : : uno : : RuntimeException ) ;
2003-12-16 11:41:56 +00:00
virtual : : rtl : : OUString SAL_CALL getOrder ( ) throw ( : : com : : sun : : star : : uno : : RuntimeException ) ;
virtual : : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : container : : XIndexAccess > SAL_CALL getOrderColumns ( ) throw ( : : com : : sun : : star : : uno : : RuntimeException ) ;
2006-07-10 14:12:10 +00:00
virtual : : rtl : : OUString SAL_CALL getQueryWithSubstitution ( ) throw ( : : com : : sun : : star : : sdbc : : SQLException , : : com : : sun : : star : : uno : : RuntimeException ) ;
2003-12-16 11:41:56 +00:00
// XColumnsSupplier
virtual : : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : container : : XNameAccess > SAL_CALL getColumns ( ) throw ( : : com : : sun : : star : : uno : : RuntimeException ) ;
// XTablesSupplier
virtual : : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : container : : XNameAccess > SAL_CALL getTables ( ) throw ( : : com : : sun : : star : : uno : : RuntimeException ) ;
// XParametersSupplier
virtual : : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : container : : XIndexAccess > SAL_CALL getParameters ( ) throw ( : : com : : sun : : star : : uno : : RuntimeException ) ;
} ;
}
# endif // DBACCESS_CORE_API_SINGLESELECTQUERYCOMPOSER_HXX