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