xref: /trunk/main/dbaccess/source/core/inc/SingleSelectQueryComposer.hxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 #ifndef DBACCESS_CORE_API_SINGLESELECTQUERYCOMPOSER_HXX
28 #define DBACCESS_CORE_API_SINGLESELECTQUERYCOMPOSER_HXX
29 
30 #include <com/sun/star/sdb/XParametersSupplier.hpp>
31 #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
32 #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
33 #include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp>
34 #include <com/sun/star/lang/XServiceInfo.hpp>
35 #include <com/sun/star/script/XTypeConverter.hpp>
36 #include <cppuhelper/implbase5.hxx>
37 #include <connectivity/sqliterator.hxx>
38 #include <connectivity/sqlparse.hxx>
39 #include "apitools.hxx"
40 #include <comphelper/broadcasthelper.hxx>
41 #include <comphelper/uno3.hxx>
42 #include <comphelper/proparrhlp.hxx>
43 #include <comphelper/propertycontainer.hxx>
44 #include <comphelper/componentcontext.hxx>
45 
46 #include <memory>
47 
48 namespace com { namespace sun { namespace star { namespace util {
49     class XNumberFormatsSupplier;
50     class XNumberFormatter;
51 }}}}
52 
53 namespace dbaccess
54 {
55     typedef ::cppu::ImplHelper5<    ::com::sun::star::sdb::XSingleSelectQueryComposer,
56                                     ::com::sun::star::sdb::XParametersSupplier,
57                                     ::com::sun::star::sdbcx::XColumnsSupplier,
58                                     ::com::sun::star::sdbcx::XTablesSupplier,
59                                     ::com::sun::star::lang::XServiceInfo    > OSingleSelectQueryComposer_BASE;
60 
61     class OPrivateColumns;
62     class OPrivateTables;
63 
64     class OSingleSelectQueryComposer :   public ::comphelper::OMutexAndBroadcastHelper
65                                         ,public OSubComponent
66                                         ,public ::comphelper::OPropertyContainer
67                                         ,public ::comphelper::OPropertyArrayUsageHelper < OSingleSelectQueryComposer >
68                                         ,public OSingleSelectQueryComposer_BASE
69     {
70         enum SQLPart
71         {
72             Where = 0,      // the 0 is important, as it will be used as index into arrays
73             Group,
74             Having,
75             Order,
76 
77             SQLPartCount
78         };
79         inline void incSQLPart( SQLPart& e ) { e = (SQLPart)(1 + (size_t)e); }
80         enum EColumnType
81         {
82             SelectColumns       = 0,
83             GroupByColumns      = 1,
84             OrderColumns        = 2,
85             ParameterColumns    = 3
86         };
87         typedef ::std::const_mem_fun_t< const ::connectivity::OSQLParseNode*, ::connectivity::OSQLParseTreeIterator >
88                                                 TGetParseNode;
89         ::connectivity::OSQLParser              m_aSqlParser;
90         ::connectivity::OSQLParseTreeIterator   m_aSqlIterator;         // the iterator for the complete statement
91         ::connectivity::OSQLParseTreeIterator   m_aAdditiveIterator;    // the iterator for the "additive statement" (means without the clauses of the elementary statement)
92         ::std::vector<OPrivateColumns*>         m_aColumnsCollection;   // used for columns and parameters of old queries
93         ::std::vector<OPrivateTables*>          m_aTablesCollection;
94 
95         ::std::vector< ::rtl::OUString >        m_aElementaryParts;     // the filter/groupby/having/order of the elementary statement
96 
97         ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>              m_xConnection;
98         ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData>        m_xMetaData;
99         ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess>         m_xConnectionTables;
100         ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess>         m_xConnectionQueries;
101         ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier >  m_xNumberFormatsSupplier;
102         ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess>         m_xColumns;
103         ::comphelper::ComponentContext                                                      m_aContext;
104         ::com::sun::star::uno::Reference< ::com::sun::star::script::XTypeConverter >        m_xTypeConverter;
105 
106         ::std::vector<OPrivateColumns*>         m_aCurrentColumns;
107         OPrivateTables*                         m_pTables;      // currently used tables
108 
109         ::rtl::OUString                         m_aPureSelectSQL;   // the pure select statement, without filter/order/groupby/having
110         ::rtl::OUString                         m_sDecimalSep;
111         ::rtl::OUString                         m_sCommand;
112         ::com::sun::star::lang::Locale          m_aLocale;
113         sal_Int32                               m_nBoolCompareMode; // how to compare bool values
114         sal_Int32                               m_nCommandType;
115 
116         // <properties>
117         ::rtl::OUString                         m_sOrignal;
118         // </properties>
119 
120 
121         sal_Bool setORCriteria(::connectivity::OSQLParseNode* pCondition, ::connectivity::OSQLParseTreeIterator& _rIterator,
122             ::std::vector< ::std::vector < ::com::sun::star::beans::PropertyValue > >& rFilters, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter > & xFormatter) const;
123         sal_Bool setANDCriteria(::connectivity::OSQLParseNode* pCondition, ::connectivity::OSQLParseTreeIterator& _rIterator,
124             ::std::vector < ::com::sun::star::beans::PropertyValue > & rFilters, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter > & xFormatter) const;
125         sal_Bool setComparsionPredicate(::connectivity::OSQLParseNode* pCondition, ::connectivity::OSQLParseTreeIterator& _rIterator,
126             ::std::vector < ::com::sun::star::beans::PropertyValue > & rFilters, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter > & xFormatter) const;
127 
128         ::rtl::OUString getColumnName(::connectivity::OSQLParseNode* pColumnRef,::connectivity::OSQLParseTreeIterator& _rIterator) const;
129         ::rtl::OUString getTableAlias(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& column ) const;
130         sal_Int32 getPredicateType(::connectivity::OSQLParseNode * _pPredicate) const;
131         // clears all Columns,Parameters and tables and insert it to their vectors
132         void clearCurrentCollections();
133         // clears the columns collection given by EColumnType
134         void clearColumns( const EColumnType _eType );
135 
136         /** retrieves a particular part of a statement
137             @param _rIterator
138                 the iterator to use.
139         */
140         ::rtl::OUString getStatementPart( TGetParseNode& _aGetFunctor, ::connectivity::OSQLParseTreeIterator& _rIterator );
141         void setQuery_Impl( const ::rtl::OUString& command );
142 
143         void setConditionByColumn( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& column
144                                 , sal_Bool andCriteria
145                                 ,::std::mem_fun1_t<bool,OSingleSelectQueryComposer,::rtl::OUString>& _aSetFunctor
146                                 ,sal_Int32 filterOperator);
147 
148         /** getStructuredCondition returns the structured condition for the where or having clause
149             @param  _aGetFunctor
150                 A member function to get the correct parse node.
151 
152             @return
153                 The structured filter
154         */
155         ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > >
156                     getStructuredCondition( TGetParseNode& _aGetFunctor );
157 
158         ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess >
159                     setCurrentColumns( EColumnType _eType, const ::vos::ORef< ::connectivity::OSQLColumns >& _rCols );
160 
161         //helper methods for mem_fun_t
162         inline bool implSetFilter(::rtl::OUString _sFilter) { setFilter(_sFilter); return true;}
163         inline bool implSetHavingClause(::rtl::OUString _sFilter) { setHavingClause(_sFilter); return true;}
164 
165         /** returns the part of the seelect statement
166             @param  _ePart
167                 Which part should be returned.
168             @param  _bWithKeyword
169                 If <TRUE/> the keyword will be added too. Otherwise not.
170             @param _rIterator
171                 The iterator to use.
172 
173             @return
174                 The part of the select statement.
175         */
176         ::rtl::OUString getSQLPart( SQLPart _ePart, ::connectivity::OSQLParseTreeIterator& _rIterator, sal_Bool _bWithKeyword );
177 
178         /** retrieves the keyword for the given SQLPart
179         */
180         ::rtl::OUString getKeyword( SQLPart _ePart ) const;
181 
182         /** sets a single "additive" clause, means a filter/groupby/having/order clause
183         */
184         void setSingleAdditiveClause( SQLPart _ePart, const ::rtl::OUString& _rClause );
185 
186         /** composes a statement from m_aPureSelectSQL and the 4 usual clauses
187         */
188         ::rtl::OUString composeStatementFromParts( const ::std::vector< ::rtl::OUString >& _rParts );
189 
190         /** return the name of the column.
191         */
192         ::rtl::OUString impl_getColumnName_throw(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& column);
193 
194     protected:
195         virtual ~OSingleSelectQueryComposer();
196     public:
197 
198         OSingleSelectQueryComposer( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess>& _xTableSupplier,
199                         const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection,
200                         const ::comphelper::ComponentContext& _rContext);
201 
202 
203         void SAL_CALL disposing(void);
204         // ::com::sun::star::lang::XTypeProvider
205         DECLARE_TYPEPROVIDER( );
206 
207         // com::sun::star::lang::XUnoTunnel
208         virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);
209         // ::com::sun::star::uno::XInterface
210         DECLARE_XINTERFACE( )
211 
212         // XServiceInfo
213         DECLARE_SERVICE_INFO();
214 
215         DECLARE_PROPERTYCONTAINER_DEFAULTS();
216 
217         // ::com::sun::star::sdb::XSingleSelectQueryComposer
218         virtual ::rtl::OUString SAL_CALL getElementaryQuery() throw (::com::sun::star::uno::RuntimeException);
219         virtual void SAL_CALL setElementaryQuery( const ::rtl::OUString& _rElementary ) throw (::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
220         virtual void SAL_CALL setFilter( const ::rtl::OUString& filter ) throw (::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
221         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);
222         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);
223         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);
224         virtual void SAL_CALL setGroup( const ::rtl::OUString& group ) throw (::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
225         virtual void SAL_CALL setHavingClause( const ::rtl::OUString& filter ) throw (::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
226         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);
227         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);
228         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);
229         virtual void SAL_CALL setOrder( const ::rtl::OUString& order ) throw (::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
230 
231         // XSingleSelectQueryAnalyzer
232         virtual ::rtl::OUString SAL_CALL getQuery(  ) throw (::com::sun::star::uno::RuntimeException);
233         virtual void SAL_CALL setQuery( const ::rtl::OUString& command ) throw (::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
234         virtual void SAL_CALL setCommand( const ::rtl::OUString& command,sal_Int32 CommandType ) throw (::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
235         virtual ::rtl::OUString SAL_CALL getFilter(  ) throw (::com::sun::star::uno::RuntimeException);
236         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);
237         virtual ::rtl::OUString SAL_CALL getGroup(  ) throw (::com::sun::star::uno::RuntimeException);
238         virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > SAL_CALL getGroupColumns(  ) throw (::com::sun::star::uno::RuntimeException);
239         virtual ::rtl::OUString SAL_CALL getHavingClause(  ) throw (::com::sun::star::uno::RuntimeException);
240         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);
241         virtual ::rtl::OUString SAL_CALL getOrder(  ) throw (::com::sun::star::uno::RuntimeException);
242         virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > SAL_CALL getOrderColumns(  ) throw (::com::sun::star::uno::RuntimeException);
243         virtual ::rtl::OUString SAL_CALL getQueryWithSubstitution(  ) throw (::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
244 
245         // XColumnsSupplier
246         virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getColumns(  ) throw(::com::sun::star::uno::RuntimeException);
247         // XTablesSupplier
248         virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getTables(  ) throw(::com::sun::star::uno::RuntimeException);
249         // XParametersSupplier
250         virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > SAL_CALL getParameters(  ) throw(::com::sun::star::uno::RuntimeException);
251     };
252 }
253 #endif // DBACCESS_CORE_API_SINGLESELECTQUERYCOMPOSER_HXX
254