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