1
/***************************************************************************
2
* (C) 2005 William Hoggarth <whoggarth@users.sourceforge.net> *
3
* (C) 2005-2006 Marius Roets <roets.marius@gmail.com> *
4
* (C) 2006-2009 Michal Rudolf <mrudolf@kdewebdev.org> *
6
* This program is free software; you can redistribute it and/or modify *
7
* it under the terms of the GNU General Public License as published by *
8
* the Free Software Foundation; either version 2 of the License, or *
9
* (at your option) any later version. *
10
***************************************************************************/
21
while(!m_search.isEmpty())
23
delete m_search.takeFirst();
28
Search::Operator Query::searchOperator(int index) const
30
if(!isValidIndex(index))
32
return Search::NullOperator;
34
int i = m_operatorMap.indexOf(index);
37
return m_operator.at(i);
41
return Search::NullOperator;
45
Search* Query::search(int index)
47
if(!isValidIndex(index))
51
int i = m_searchMap.indexOf(index);
54
return m_search.at(i);
62
int Query::count() const
64
return m_elementType.count();
67
int Query::countOperators() const
69
return m_operatorMap.count();
72
int Query::countOperands() const
74
return m_searchMap.count();
77
bool Query::isElementSearch(int index) const
79
if(!isValidIndex(index))
83
if(m_elementType[index] == SearchElement)
93
bool Query::isElementOperator(int index) const
95
if(!isValidIndex(index))
99
if(m_elementType[index] == OperatorElement)
109
bool Query::isValid()
116
// Check if there are enough operands for the operators
117
int operandCount = 0;
119
ElementTypeList::iterator elementIter;
120
for(elementIter = m_elementType.begin(), i = 0; elementIter != m_elementType.end(); ++elementIter, ++i)
127
case OperatorElement :
128
op = searchOperator(i);
133
case Search::Remove :
134
// These operators need 2 operands, and leaves one answer on the stack
142
//Not needs one operand, and it leaves one answer on the stack
148
case Search::NullOperator :
149
// Not sure if this is valid or not
152
// Undefined operator
161
if(operandCount != 1)
163
qDebug("Warning: Not enough operators to evaluate all operands");
169
void Query::append(Search::Operator op)
171
m_operator.append(op);
172
m_operatorMap.append(m_elementType.count());
173
m_elementType.append(OperatorElement);
176
void Query::append(const Search& search)
178
m_search.append(search.clone());
179
m_searchMap.append(m_elementType.count());
180
m_elementType.append(SearchElement);
183
bool Query::set(int index, Search::Operator op)
185
if(!isValidIndex(index))
189
int subindex = m_operatorMap.indexOf(index);
192
// In this case the given index is already an operator, so we just replace it
193
m_operator[subindex] = op;
198
subindex = m_searchMap.indexOf(index);
201
// Here the given index is a search, so we have to remove the search,
202
// and add a operator at that position. If autodelete is set, the memory
203
// for the search will be deallocated.
204
m_searchMap.removeAt(m_searchMap.at(subindex));
205
delete m_search.at(subindex);
206
m_search.removeAt(subindex);
207
m_operator.append(op);
208
m_operatorMap.append(index);
209
m_elementType[index] = OperatorElement;
214
// The index could not be found in the search or operator lists. Strange!?
220
bool Query::set(int index, const Search& search)
222
if(!isValidIndex(index))
226
int subindex = m_searchMap.indexOf(index);
229
delete m_search.at(subindex);
230
m_search.replace(subindex, search.clone());
235
subindex = m_operatorMap.indexOf(index);
238
// Here the given index is a operator, so we have to remove the operator,
239
// and add a search at that position
240
m_operatorMap.removeAt(m_operatorMap.at(subindex));
241
m_operator.removeAt(m_operator.at(subindex));
242
m_search.append(search.clone());
243
m_searchMap.append(index);
244
m_elementType[index] = SearchElement;
249
// The index could not be found in the operator or search lists
255
bool Query::remove(int index)
258
IntList::iterator intIt;
259
if(!isValidIndex(index))
264
switch(m_elementType[index])
266
case OperatorElement:
267
indexToRemove = m_operatorMap.indexOf(index);
268
if(indexToRemove >= 0)
270
m_operatorMap.removeAt(m_operatorMap.at(indexToRemove));
271
m_operator.removeAt(m_operator.at(indexToRemove));
275
// Element type does not match actual element
280
indexToRemove = m_searchMap.indexOf(index);
281
if(indexToRemove >= 0)
283
m_searchMap.removeAt(m_searchMap.at(indexToRemove));
284
delete m_search.at(indexToRemove);
285
m_search.removeAt(indexToRemove);
289
// Element type does not match actual element
297
m_elementType.removeAt(m_elementType.at(index));
298
// Reduces index for elements after the element being remove, moving them
299
// up in the virtual list.
300
for(intIt = m_operatorMap.begin(); intIt != m_operatorMap.end(); ++intIt)
307
for(intIt = m_searchMap.begin(); intIt != m_searchMap.end(); ++intIt)
319
while(!m_search.isEmpty())
321
delete m_search.takeFirst();
326
m_operatorMap.clear();
327
m_elementType.clear();
330
bool Query::isValidIndex(unsigned int index) const
332
if((int)index > (int)(m_elementType.count() - 1))
339
bool Query::internalCheck()
344
ElementTypeList::iterator elementIter;
346
if(count() != (countOperands() + countOperators()))
351
for(elementIter = m_elementType.begin(), i = 0; elementIter != m_elementType.end(); ++elementIter, ++i)
363
case Search::NullSearch :
364
case Search::PositionSearch :
365
case Search::EloSearch :
372
case OperatorElement :
373
op = searchOperator(i);
378
case Search::Remove :
380
case Search::NullOperator :
383
// Undefined operator