1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_connectivity.hxx"
26*b1cdbd2cSJim Jagielski #include "file/fanalyzer.hxx"
27*b1cdbd2cSJim Jagielski #include "connectivity/sqlparse.hxx"
28*b1cdbd2cSJim Jagielski #include <osl/diagnose.h>
29*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
30*b1cdbd2cSJim Jagielski #include <comphelper/extract.hxx>
31*b1cdbd2cSJim Jagielski #include "connectivity/sqlnode.hxx"
32*b1cdbd2cSJim Jagielski #include "connectivity/dbexception.hxx"
33*b1cdbd2cSJim Jagielski #include "file/FConnection.hxx"
34*b1cdbd2cSJim Jagielski #include "resource/file_res.hrc"
35*b1cdbd2cSJim Jagielski
36*b1cdbd2cSJim Jagielski using namespace ::connectivity;
37*b1cdbd2cSJim Jagielski using namespace ::connectivity::file;
38*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
39*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
40*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdbc;
41*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
42*b1cdbd2cSJim Jagielski
DBG_NAME(file_OSQLAnalyzer)43*b1cdbd2cSJim Jagielski DBG_NAME( file_OSQLAnalyzer )
44*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
45*b1cdbd2cSJim Jagielski OSQLAnalyzer::OSQLAnalyzer(OConnection* _pConnection)
46*b1cdbd2cSJim Jagielski :m_pConnection(_pConnection)
47*b1cdbd2cSJim Jagielski ,m_bHasSelectionCode(sal_False)
48*b1cdbd2cSJim Jagielski ,m_bSelectionFirstTime(sal_True)
49*b1cdbd2cSJim Jagielski {
50*b1cdbd2cSJim Jagielski DBG_CTOR( file_OSQLAnalyzer, NULL );
51*b1cdbd2cSJim Jagielski m_aCompiler = new OPredicateCompiler(this);
52*b1cdbd2cSJim Jagielski m_aInterpreter = new OPredicateInterpreter(m_aCompiler);
53*b1cdbd2cSJim Jagielski }
54*b1cdbd2cSJim Jagielski
55*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
~OSQLAnalyzer()56*b1cdbd2cSJim Jagielski OSQLAnalyzer::~OSQLAnalyzer()
57*b1cdbd2cSJim Jagielski {
58*b1cdbd2cSJim Jagielski DBG_DTOR( file_OSQLAnalyzer, NULL );
59*b1cdbd2cSJim Jagielski }
60*b1cdbd2cSJim Jagielski
61*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
setIndexes(const Reference<XNameAccess> & _xIndexes)62*b1cdbd2cSJim Jagielski void OSQLAnalyzer::setIndexes(const Reference< XNameAccess>& _xIndexes)
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski m_aCompiler->m_xIndexes = _xIndexes;
65*b1cdbd2cSJim Jagielski }
66*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
start(OSQLParseNode * pSQLParseNode)67*b1cdbd2cSJim Jagielski void OSQLAnalyzer::start(OSQLParseNode* pSQLParseNode)
68*b1cdbd2cSJim Jagielski {
69*b1cdbd2cSJim Jagielski if (SQL_ISRULE(pSQLParseNode,select_statement))
70*b1cdbd2cSJim Jagielski {
71*b1cdbd2cSJim Jagielski DBG_ASSERT(pSQLParseNode->count() >= 4,"OFILECursor: Fehler im Parse Tree");
72*b1cdbd2cSJim Jagielski
73*b1cdbd2cSJim Jagielski // check that we don't use anything other than count(*) as function
74*b1cdbd2cSJim Jagielski OSQLParseNode* pSelection = pSQLParseNode->getChild(2);
75*b1cdbd2cSJim Jagielski if ( SQL_ISRULE(pSelection,scalar_exp_commalist) )
76*b1cdbd2cSJim Jagielski {
77*b1cdbd2cSJim Jagielski for (sal_uInt32 i = 0; i < pSelection->count(); i++)
78*b1cdbd2cSJim Jagielski {
79*b1cdbd2cSJim Jagielski OSQLParseNode *pColumnRef = pSelection->getChild(i)->getChild(0);
80*b1cdbd2cSJim Jagielski if ( ( SQL_ISRULE(pColumnRef,set_fct_spec) && pColumnRef->count() == 4 )
81*b1cdbd2cSJim Jagielski || SQL_ISRULE(pColumnRef,char_value_fct)
82*b1cdbd2cSJim Jagielski || SQL_ISRULE(pColumnRef,char_substring_fct)
83*b1cdbd2cSJim Jagielski || SQL_ISRULE(pColumnRef,position_exp)
84*b1cdbd2cSJim Jagielski || SQL_ISRULE(pColumnRef,fold)
85*b1cdbd2cSJim Jagielski || SQL_ISRULE(pColumnRef,length_exp)
86*b1cdbd2cSJim Jagielski || SQL_ISRULE(pColumnRef,num_value_exp)
87*b1cdbd2cSJim Jagielski || SQL_ISRULE(pColumnRef,term)
88*b1cdbd2cSJim Jagielski || SQL_ISRULE(pColumnRef,factor)
89*b1cdbd2cSJim Jagielski || SQL_ISRULE(pColumnRef,set_fct_spec) )
90*b1cdbd2cSJim Jagielski {
91*b1cdbd2cSJim Jagielski ::vos::ORef<OPredicateCompiler> pCompiler = new OPredicateCompiler(this);
92*b1cdbd2cSJim Jagielski pCompiler->setOrigColumns(m_aCompiler->getOrigColumns());
93*b1cdbd2cSJim Jagielski ::vos::ORef<OPredicateInterpreter> pInterpreter = new OPredicateInterpreter(pCompiler);
94*b1cdbd2cSJim Jagielski pCompiler->execute( pColumnRef );
95*b1cdbd2cSJim Jagielski m_aSelectionEvaluations.push_back( TPredicates(pCompiler,pInterpreter) );
96*b1cdbd2cSJim Jagielski }
97*b1cdbd2cSJim Jagielski else if ( ( SQL_ISRULE(pColumnRef,general_set_fct) && pColumnRef->count() != 4 ) )
98*b1cdbd2cSJim Jagielski {
99*b1cdbd2cSJim Jagielski m_pConnection->throwGenericSQLException(STR_QUERY_COMPLEX_COUNT,NULL);
100*b1cdbd2cSJim Jagielski }
101*b1cdbd2cSJim Jagielski else
102*b1cdbd2cSJim Jagielski {
103*b1cdbd2cSJim Jagielski if ( SQL_ISPUNCTUATION( pColumnRef, "*" )
104*b1cdbd2cSJim Jagielski || ( SQL_ISRULE( pColumnRef, column_ref )
105*b1cdbd2cSJim Jagielski && ( pColumnRef->count() == 3 )
106*b1cdbd2cSJim Jagielski && ( pColumnRef->getChild(0)->getNodeType() == SQL_NODE_NAME )
107*b1cdbd2cSJim Jagielski && SQL_ISPUNCTUATION( pColumnRef->getChild(1), "." )
108*b1cdbd2cSJim Jagielski && SQL_ISRULE( pColumnRef->getChild(2), column_val )
109*b1cdbd2cSJim Jagielski && SQL_ISPUNCTUATION( pColumnRef->getChild(2)->getChild(0), "*" )
110*b1cdbd2cSJim Jagielski )
111*b1cdbd2cSJim Jagielski )
112*b1cdbd2cSJim Jagielski {
113*b1cdbd2cSJim Jagielski // push one element for each column of our table
114*b1cdbd2cSJim Jagielski const Reference< XNameAccess > xColumnNames( m_aCompiler->getOrigColumns() );
115*b1cdbd2cSJim Jagielski const Sequence< ::rtl::OUString > aColumnNames( xColumnNames->getElementNames() );
116*b1cdbd2cSJim Jagielski for ( sal_Int32 j=0; j<aColumnNames.getLength(); ++j )
117*b1cdbd2cSJim Jagielski m_aSelectionEvaluations.push_back( TPredicates() );
118*b1cdbd2cSJim Jagielski }
119*b1cdbd2cSJim Jagielski else
120*b1cdbd2cSJim Jagielski m_aSelectionEvaluations.push_back( TPredicates() );
121*b1cdbd2cSJim Jagielski }
122*b1cdbd2cSJim Jagielski }
123*b1cdbd2cSJim Jagielski }
124*b1cdbd2cSJim Jagielski }
125*b1cdbd2cSJim Jagielski
126*b1cdbd2cSJim Jagielski m_aCompiler->start(pSQLParseNode);
127*b1cdbd2cSJim Jagielski }
128*b1cdbd2cSJim Jagielski
129*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
bindRow(OCodeList & rCodeList,const OValueRefRow & _pRow,OEvaluateSetList & _rEvaluateSetList)130*b1cdbd2cSJim Jagielski void OSQLAnalyzer::bindRow(OCodeList& rCodeList,const OValueRefRow& _pRow,OEvaluateSetList& _rEvaluateSetList)
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski // Zaehlen, wieviele Kriterien
133*b1cdbd2cSJim Jagielski // wenn nur ein Kriterium, und das entsprechende Feld ist indiziert
134*b1cdbd2cSJim Jagielski // dann wird der Index verwendet
135*b1cdbd2cSJim Jagielski
136*b1cdbd2cSJim Jagielski OEvaluateSet* pEvaluateSet = NULL;
137*b1cdbd2cSJim Jagielski
138*b1cdbd2cSJim Jagielski for (OCodeList::iterator aIter = rCodeList.begin(); aIter != rCodeList.end(); ++aIter)
139*b1cdbd2cSJim Jagielski {
140*b1cdbd2cSJim Jagielski OOperandAttr* pAttr = PTR_CAST(OOperandAttr,(*aIter));
141*b1cdbd2cSJim Jagielski if (pAttr)
142*b1cdbd2cSJim Jagielski {
143*b1cdbd2cSJim Jagielski if (pAttr->isIndexed() && !m_aCompiler->hasORCondition())
144*b1cdbd2cSJim Jagielski {
145*b1cdbd2cSJim Jagielski OCode* pCode1 = *(aIter + 1);
146*b1cdbd2cSJim Jagielski OCode* pCode2 = *(aIter + 2);
147*b1cdbd2cSJim Jagielski
148*b1cdbd2cSJim Jagielski if (PTR_CAST(OOperand,pCode1))
149*b1cdbd2cSJim Jagielski pEvaluateSet = pAttr->preProcess(PTR_CAST(OBoolOperator,pCode2), PTR_CAST(OOperand,pCode1));
150*b1cdbd2cSJim Jagielski else
151*b1cdbd2cSJim Jagielski pEvaluateSet = pAttr->preProcess(PTR_CAST(OBoolOperator,pCode1));
152*b1cdbd2cSJim Jagielski }
153*b1cdbd2cSJim Jagielski
154*b1cdbd2cSJim Jagielski if (pEvaluateSet)
155*b1cdbd2cSJim Jagielski {
156*b1cdbd2cSJim Jagielski _rEvaluateSetList.push_back(pEvaluateSet);
157*b1cdbd2cSJim Jagielski pEvaluateSet = NULL;
158*b1cdbd2cSJim Jagielski }
159*b1cdbd2cSJim Jagielski pAttr->bindValue(_pRow);
160*b1cdbd2cSJim Jagielski }
161*b1cdbd2cSJim Jagielski }
162*b1cdbd2cSJim Jagielski }
163*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
bindSelectRow(const OValueRefRow & _pRow)164*b1cdbd2cSJim Jagielski void OSQLAnalyzer::bindSelectRow(const OValueRefRow& _pRow)
165*b1cdbd2cSJim Jagielski {
166*b1cdbd2cSJim Jagielski // first the select part
167*b1cdbd2cSJim Jagielski OEvaluateSetList aEvaluateSetList;
168*b1cdbd2cSJim Jagielski for ( ::std::vector< TPredicates >::iterator aIter = m_aSelectionEvaluations.begin(); aIter != m_aSelectionEvaluations.end();++aIter)
169*b1cdbd2cSJim Jagielski {
170*b1cdbd2cSJim Jagielski if ( aIter->first.isValid() )
171*b1cdbd2cSJim Jagielski bindRow( aIter->first->m_aCodeList,_pRow,aEvaluateSetList);
172*b1cdbd2cSJim Jagielski }
173*b1cdbd2cSJim Jagielski }
174*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
bindEvaluationRow(OValueRefRow & _pRow)175*b1cdbd2cSJim Jagielski ::std::vector<sal_Int32>* OSQLAnalyzer::bindEvaluationRow(OValueRefRow& _pRow)
176*b1cdbd2cSJim Jagielski {
177*b1cdbd2cSJim Jagielski OEvaluateSetList aEvaluateSetList;
178*b1cdbd2cSJim Jagielski bindRow( m_aCompiler->m_aCodeList,_pRow,aEvaluateSetList);
179*b1cdbd2cSJim Jagielski
180*b1cdbd2cSJim Jagielski ::std::vector<sal_Int32>* pKeySet = NULL;
181*b1cdbd2cSJim Jagielski OEvaluateSet* pEvaluateSet = NULL;
182*b1cdbd2cSJim Jagielski
183*b1cdbd2cSJim Jagielski // Keyset erzeugen mit kleinster Liste
184*b1cdbd2cSJim Jagielski if(!aEvaluateSetList.empty())
185*b1cdbd2cSJim Jagielski {
186*b1cdbd2cSJim Jagielski // welche Liste hat den kleinsten count ?
187*b1cdbd2cSJim Jagielski OEvaluateSetList::iterator i = aEvaluateSetList.begin();
188*b1cdbd2cSJim Jagielski pEvaluateSet = *(i);
189*b1cdbd2cSJim Jagielski for(++i; i != aEvaluateSetList.end();++i)
190*b1cdbd2cSJim Jagielski {
191*b1cdbd2cSJim Jagielski OEvaluateSet* pEvaluateSetComp = (*i);
192*b1cdbd2cSJim Jagielski for(OEvaluateSet::reverse_iterator j = pEvaluateSet->rbegin(); j != pEvaluateSet->rend(); ++j)
193*b1cdbd2cSJim Jagielski {
194*b1cdbd2cSJim Jagielski if (pEvaluateSetComp->find(j->second) != pEvaluateSetComp->end())
195*b1cdbd2cSJim Jagielski pEvaluateSet->erase(j->second);
196*b1cdbd2cSJim Jagielski }
197*b1cdbd2cSJim Jagielski }
198*b1cdbd2cSJim Jagielski pKeySet = new ::std::vector<sal_Int32>(pEvaluateSet->size());
199*b1cdbd2cSJim Jagielski sal_Int32 k=0;
200*b1cdbd2cSJim Jagielski for(OEvaluateSet::iterator j = pEvaluateSet->begin(); j != pEvaluateSet->end(); ++j,++k)
201*b1cdbd2cSJim Jagielski {
202*b1cdbd2cSJim Jagielski (*pKeySet)[k] = j->second;
203*b1cdbd2cSJim Jagielski }
204*b1cdbd2cSJim Jagielski
205*b1cdbd2cSJim Jagielski // alle loeschen
206*b1cdbd2cSJim Jagielski for(i = aEvaluateSetList.begin(); i != aEvaluateSetList.end();++i)
207*b1cdbd2cSJim Jagielski delete (*i);
208*b1cdbd2cSJim Jagielski }
209*b1cdbd2cSJim Jagielski
210*b1cdbd2cSJim Jagielski return pKeySet;
211*b1cdbd2cSJim Jagielski }
212*b1cdbd2cSJim Jagielski
213*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
describeParam(::vos::ORef<OSQLColumns> rParameterColumns)214*b1cdbd2cSJim Jagielski void OSQLAnalyzer::describeParam(::vos::ORef<OSQLColumns> rParameterColumns)
215*b1cdbd2cSJim Jagielski {
216*b1cdbd2cSJim Jagielski OCodeList& rCodeList = m_aCompiler->m_aCodeList;
217*b1cdbd2cSJim Jagielski OCodeStack aCodeStack;
218*b1cdbd2cSJim Jagielski
219*b1cdbd2cSJim Jagielski if (!rCodeList.size())
220*b1cdbd2cSJim Jagielski return; // kein Praedikat
221*b1cdbd2cSJim Jagielski if (!rParameterColumns->get().size())
222*b1cdbd2cSJim Jagielski return; // keine Parameter
223*b1cdbd2cSJim Jagielski
224*b1cdbd2cSJim Jagielski // Anlegen von Columns, die eine genauere Beschreibung fuer die enthalten
225*b1cdbd2cSJim Jagielski ::vos::ORef<OSQLColumns> aNewParamColumns = new OSQLColumns(*rParameterColumns);
226*b1cdbd2cSJim Jagielski
227*b1cdbd2cSJim Jagielski
228*b1cdbd2cSJim Jagielski // Anlegen einer Testzeile, wird benoetigt um die Parameter zu beschreiben
229*b1cdbd2cSJim Jagielski OValueRefRow aParameterRow = new OValueRefVector(rParameterColumns->get().size());
230*b1cdbd2cSJim Jagielski bindParameterRow(aParameterRow);
231*b1cdbd2cSJim Jagielski
232*b1cdbd2cSJim Jagielski OValueRefRow aTestRow = new OValueRefVector(Reference< XIndexAccess>(m_aCompiler->getOrigColumns(),UNO_QUERY)->getCount());
233*b1cdbd2cSJim Jagielski delete bindEvaluationRow(aTestRow); // Binden der Attribute an die Values
234*b1cdbd2cSJim Jagielski
235*b1cdbd2cSJim Jagielski for(OCodeList::iterator aIter = rCodeList.begin(); aIter != rCodeList.end(); ++aIter)
236*b1cdbd2cSJim Jagielski {
237*b1cdbd2cSJim Jagielski OOperand* pOperand = PTR_CAST(OOperand,(*aIter));
238*b1cdbd2cSJim Jagielski OOperator* pOperator = PTR_CAST(OOperator,(*aIter));
239*b1cdbd2cSJim Jagielski if (pOperand)
240*b1cdbd2cSJim Jagielski aCodeStack.push(pOperand);
241*b1cdbd2cSJim Jagielski else
242*b1cdbd2cSJim Jagielski {
243*b1cdbd2cSJim Jagielski if (pOperator->getRequestedOperands() == 2) // bei zwei Operatoren ist es moeglich
244*b1cdbd2cSJim Jagielski { // einen Parameter weiter zu spezifizieren
245*b1cdbd2cSJim Jagielski OOperandParam *pParam = PTR_CAST(OOperandParam,aCodeStack.top());
246*b1cdbd2cSJim Jagielski if (pParam) // Anpassen des ParameterTyps, wenn der linke Operand ein Attribut ist
247*b1cdbd2cSJim Jagielski {
248*b1cdbd2cSJim Jagielski OOperandAttr *pLeft = PTR_CAST(OOperandAttr,*(rCodeList.end() - 2));
249*b1cdbd2cSJim Jagielski if (pLeft)
250*b1cdbd2cSJim Jagielski {
251*b1cdbd2cSJim Jagielski Reference< XPropertySet> xCol;
252*b1cdbd2cSJim Jagielski Reference< XIndexAccess>(m_aCompiler->getOrigColumns(),UNO_QUERY)->getByIndex(pLeft->getRowPos()) >>= xCol;
253*b1cdbd2cSJim Jagielski OSL_ENSURE(xCol.is(), "Ungueltige Struktur");
254*b1cdbd2cSJim Jagielski pParam->describe(xCol, aNewParamColumns);
255*b1cdbd2cSJim Jagielski }
256*b1cdbd2cSJim Jagielski }
257*b1cdbd2cSJim Jagielski }
258*b1cdbd2cSJim Jagielski pOperator->Exec(aCodeStack);
259*b1cdbd2cSJim Jagielski }
260*b1cdbd2cSJim Jagielski }
261*b1cdbd2cSJim Jagielski OOperand* pOperand = aCodeStack.top();
262*b1cdbd2cSJim Jagielski aCodeStack.pop();
263*b1cdbd2cSJim Jagielski
264*b1cdbd2cSJim Jagielski OSL_ENSURE(aCodeStack.size() == 0, "StackFehler");
265*b1cdbd2cSJim Jagielski OSL_ENSURE(pOperand, "StackFehler");
266*b1cdbd2cSJim Jagielski if (IS_TYPE(OOperandResult,pOperand))
267*b1cdbd2cSJim Jagielski delete pOperand;
268*b1cdbd2cSJim Jagielski else
269*b1cdbd2cSJim Jagielski OSL_ENSURE(0,"Illegal here!");
270*b1cdbd2cSJim Jagielski
271*b1cdbd2cSJim Jagielski rParameterColumns = aNewParamColumns;
272*b1cdbd2cSJim Jagielski // m_aCompiler->setParameterColumns(rParameterColumns);
273*b1cdbd2cSJim Jagielski }
274*b1cdbd2cSJim Jagielski
275*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
createOperandAttr(sal_Int32 _nPos,const Reference<XPropertySet> & _xCol,const Reference<XNameAccess> &)276*b1cdbd2cSJim Jagielski OOperandAttr* OSQLAnalyzer::createOperandAttr(sal_Int32 _nPos,
277*b1cdbd2cSJim Jagielski const Reference< XPropertySet>& _xCol,
278*b1cdbd2cSJim Jagielski const Reference< XNameAccess>& /*_xIndexes*/)
279*b1cdbd2cSJim Jagielski {
280*b1cdbd2cSJim Jagielski return new OOperandAttr(static_cast<sal_uInt16>(_nPos),_xCol);
281*b1cdbd2cSJim Jagielski }
282*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
hasRestriction() const283*b1cdbd2cSJim Jagielski sal_Bool OSQLAnalyzer::hasRestriction() const
284*b1cdbd2cSJim Jagielski {
285*b1cdbd2cSJim Jagielski return m_aCompiler->hasCode();
286*b1cdbd2cSJim Jagielski }
287*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
hasFunctions() const288*b1cdbd2cSJim Jagielski sal_Bool OSQLAnalyzer::hasFunctions() const
289*b1cdbd2cSJim Jagielski {
290*b1cdbd2cSJim Jagielski if ( m_bSelectionFirstTime )
291*b1cdbd2cSJim Jagielski {
292*b1cdbd2cSJim Jagielski m_bSelectionFirstTime = sal_False;
293*b1cdbd2cSJim Jagielski for ( ::std::vector< TPredicates >::const_iterator aIter = m_aSelectionEvaluations.begin(); aIter != m_aSelectionEvaluations.end() && !m_bHasSelectionCode ;++aIter)
294*b1cdbd2cSJim Jagielski {
295*b1cdbd2cSJim Jagielski if ( aIter->first.isValid() )
296*b1cdbd2cSJim Jagielski m_bHasSelectionCode = aIter->first->hasCode();
297*b1cdbd2cSJim Jagielski }
298*b1cdbd2cSJim Jagielski }
299*b1cdbd2cSJim Jagielski return m_bHasSelectionCode;;
300*b1cdbd2cSJim Jagielski }
301*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
setSelectionEvaluationResult(OValueRefRow & _pRow,const::std::vector<sal_Int32> & _rColumnMapping)302*b1cdbd2cSJim Jagielski void OSQLAnalyzer::setSelectionEvaluationResult(OValueRefRow& _pRow,const ::std::vector<sal_Int32>& _rColumnMapping)
303*b1cdbd2cSJim Jagielski {
304*b1cdbd2cSJim Jagielski sal_Int32 nPos = 1;
305*b1cdbd2cSJim Jagielski for ( ::std::vector< TPredicates >::iterator aIter = m_aSelectionEvaluations.begin(); aIter != m_aSelectionEvaluations.end();++aIter,++nPos)
306*b1cdbd2cSJim Jagielski {
307*b1cdbd2cSJim Jagielski if ( aIter->second.isValid() )
308*b1cdbd2cSJim Jagielski {
309*b1cdbd2cSJim Jagielski // the first column (index 0) is for convenience only. The first real select column is no 1.
310*b1cdbd2cSJim Jagielski sal_Int32 map = nPos;
311*b1cdbd2cSJim Jagielski if ( nPos < static_cast< sal_Int32 >( _rColumnMapping.size() ) )
312*b1cdbd2cSJim Jagielski map = _rColumnMapping[nPos];
313*b1cdbd2cSJim Jagielski if ( map > 0 )
314*b1cdbd2cSJim Jagielski aIter->second->startSelection( (_pRow->get())[map] );
315*b1cdbd2cSJim Jagielski }
316*b1cdbd2cSJim Jagielski }
317*b1cdbd2cSJim Jagielski }
318*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
dispose()319*b1cdbd2cSJim Jagielski void OSQLAnalyzer::dispose()
320*b1cdbd2cSJim Jagielski {
321*b1cdbd2cSJim Jagielski m_aCompiler->dispose();
322*b1cdbd2cSJim Jagielski for ( ::std::vector< TPredicates >::iterator aIter = m_aSelectionEvaluations.begin(); aIter != m_aSelectionEvaluations.end();++aIter)
323*b1cdbd2cSJim Jagielski {
324*b1cdbd2cSJim Jagielski if ( aIter->first.isValid() )
325*b1cdbd2cSJim Jagielski aIter->first->dispose();
326*b1cdbd2cSJim Jagielski }
327*b1cdbd2cSJim Jagielski }
328*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
setOrigColumns(const OFileColumns & rCols)329*b1cdbd2cSJim Jagielski void OSQLAnalyzer::setOrigColumns(const OFileColumns& rCols)
330*b1cdbd2cSJim Jagielski {
331*b1cdbd2cSJim Jagielski m_aCompiler->setOrigColumns(rCols);
332*b1cdbd2cSJim Jagielski for ( ::std::vector< TPredicates >::iterator aIter = m_aSelectionEvaluations.begin(); aIter != m_aSelectionEvaluations.end();++aIter)
333*b1cdbd2cSJim Jagielski {
334*b1cdbd2cSJim Jagielski if ( aIter->first.isValid() )
335*b1cdbd2cSJim Jagielski aIter->first->setOrigColumns(rCols);
336*b1cdbd2cSJim Jagielski }
337*b1cdbd2cSJim Jagielski }
338*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
339