1 /***************************************************************************
2 * Copyright (C) 2007 by www.databasecache.com *
3 * Contact: praba_tuty@databasecache.com *
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. *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
16 * ***************************************************************************/
17 #include<OrderByTree.h>
19 //Used for float type field and individual order by clause
20 void OrderByTree::insertSpecialCaseDataNode(void *data
)
22 if(dataNode
.size() == 0){ dataNode
.append(data
); return;}
23 ListIterator iter
= dataNode
.getIterator();
24 ListIterator fldIter
= orderByList
.getIterator();
27 void *insertedData
= NULL
;
28 void *prevIter
= iter
.getCurrentListNode();
29 void *prev
= prevIter
;
30 bool shouldInsertHappenAtMiddle
=false;
31 OrderByFldDef
*oFldDef
= NULL
;
33 char *fldData
=NULL
, *fldInsertData
=NULL
;
35 while (iter
.hasElement())
37 bool shoudInsertHere
=false;
38 bool isPrevEqual
=false;
40 insertedData
= iter
.nextElement();
42 while (fldIter
.hasElement())
44 oFldDef
= (OrderByFldDef
*) fldIter
.nextElement();
45 fldData
= ((char*)data
)+offset
;
46 fldInsertData
= ((char*)insertedData
)+offset
;
47 offset
+= oFldDef
->length
;
48 result
=AllDataType::compareVal(fldData
, fldInsertData
, OpEquals
,oFldDef
->type
, oFldDef
->length
);
51 shoudInsertHere
= true;
57 result
=AllDataType::compareVal(fldData
, fldInsertData
, OpGreaterThan
,oFldDef
->type
, oFldDef
->length
);
62 shoudInsertHere
= true;
67 if(shoudInsertHere
&& !isPrevEqual
) { isPrevEqual
= false; continue;}
68 shoudInsertHere
=false; break;
75 shoudInsertHere
= true;
80 if(shoudInsertHere
&& !isPrevEqual
) { isPrevEqual
= false; continue;}
81 shoudInsertHere
=false; break;
85 }//inner while ends here
87 if(shouldInsertHappenAtMiddle
)
88 dataNode
.addAtMiddle(data
, prevIter
);
90 dataNode
.addAtBegin(data
);
94 prev
= iter
.getCurrentListNode();
95 shouldInsertHappenAtMiddle
=true;
97 dataNode
.append(data
);
100 DbRetVal
OrderByTree::insertDataNode(void *data
)
103 insertSpecialCaseDataNode(data
);
106 dataNode
.append(data
);
107 projMap
.insert(data
);
110 bool OrderByTree::find(void *data
)
112 void *element
= projMap
.find(data
);
113 if (element
) return true;
116 int OrderByTree::compare(void *element1
,void *element2
,int size
)
118 return os::memcmp(element1
,element2
,size
);
121 ListIterator
OrderByTree::getListIterator()
123 return dataNode
.getIterator();
125 void OrderByTree::removeAll()
128 if(fullOrderBy
) projMap
.removeAll();