1 /***************************************************************************
2 * Copyright (C) 2007 by www.databasecache.com *
3 * Contact: praba_tuty@databasecache.com *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 ***************************************************************************/
19 void* TreeIter::getFirstElement()
21 if (NULL
== iter
) return NULL
;
22 TreeNode
*node
= iter
;
24 if(NULL
== node
->prev_
) break;
27 if (node
== NULL
) printf("Node returned is NULL\n");
28 if (0 == node
->noElements_
) return NULL
;
29 char **rec
= (char**)((char*)node
+ sizeof(TreeNode
));
30 int loc
= 0; //first element
31 char **tuple
= (char**)((char*)rec
+ (loc
* sizeof(void *)));
34 void* TreeIter::getLastElement()
36 if (NULL
== iter
) return NULL
;
37 TreeNode
*node
= iter
;
38 while(node
!= NULL
) {
39 if(NULL
== node
->next_
) break;
42 if (node
== NULL
) printf("Node returned is NULL\n");
43 if (0 == node
->noElements_
) return NULL
;
44 char **rec
= (char**)((char*)node
+ sizeof(TreeNode
));
45 int loc
= node
->noElements_
-1; //last element
46 char **tuple
= (char**)((char*)rec
+ (loc
* sizeof(void *)));
49 void* TreeIter::prev()
58 if (NULL
== iter
) return NULL
;
59 nodeOffset
= iter
->noElements_
;
61 char **rec
= (char**)((char*)iter
+ sizeof(TreeNode
));
62 rec
= (char**)((char *)rec
+ ((nodeOffset
) * sizeof(void **)));
65 void TreeIter::nextNode()
67 if (recordsOver
) return ;
68 if (NULL
== iter
) return ;
72 void* TreeIter::next()
75 if (recordsOver
) return NULL
;
76 if (NULL
== iter
) return NULL
;
79 if (OpLessThan
==op
|| OpLessThanEquals
== op
)
87 char **rec
= (char**)((char*) iter
+ sizeof(TreeNode
));
88 //iter->displayAll(fldOffset);
91 else if (OpGreaterThan
== op
|| OpGreaterThanEquals
== op
||
94 void *rec
= locateNode();
96 //iter->displayAll(fldOffset);
102 if (nodeOffset
== iter
->noElements_
)
104 if (NULL
== iter
->next_
) {recordsOver
= true; return NULL
;}
105 char* record
= ((char*)iter
->next_
->min_
)+ fldOffset
;
106 bool result
= AllDataType::compareVal(searchKey
, record
,
109 if (!result
&& (OpLessThan
==op
|| OpLessThanEquals
== op
))
111 recordsOver
= true; return NULL
;
112 }else if (result
&& (OpGreaterThan
== op
||
113 OpGreaterThanEquals
== op
))
115 recordsOver
= true; return NULL
;
118 if (NULL
== iter
) return NULL
;
121 //TODO::take node mutex here
122 char **rec
= (char**)((char*)iter
+ sizeof(TreeNode
));
123 rec
= (char**)((char *)rec
+ ((nodeOffset
) * sizeof(void **)));
125 //TODO::release node mutex here
130 void* TreeIter::locateNode()
134 char *record
= ((char*)iter
->max_
)+ fldOffset
;
135 bool result
= AllDataType::compareVal(searchKey
, record
,
144 record
= ((char*)iter
->min_
)+ fldOffset
;
145 result
= AllDataType::compareVal(searchKey
, record
,
149 //current node contains the key
150 void *rec
= locateElement();
156 if(NULL
==iter
->prev_
)
158 void *rec
= locateElement();
167 void* TreeIter::locateElement()
169 //do binary search and locate the element
170 int loc
=0, middle
=0, start
=0, end
=iter
->noElements_
-1;
171 char **rec
= (char**)((char*)iter
+ sizeof(TreeNode
));
172 //TODO::take node mutex
173 for(middle
= (start
+ end
) / 2; start
<= end
; middle
= (start
+end
)/2)
176 char *record
= ((char*)*(rec
+middle
)) + fldOffset
;
177 bool res
= AllDataType::compareVal(searchKey
, record
, OpEquals
,
184 res
= AllDataType::compareVal(searchKey
, record
, OpLessThan
,
197 char **tuple
= (char**)((char*)rec
+ (loc
* sizeof(void *)));
199 //TODO::release node mutex here