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 ***************************************************************************/
18 #include<CatalogTables.h>
22 #include<PredicateImpl.h>
23 DbRetVal
TupleIterator::open()
26 if (fullTableScan
== scanType_
)
28 cIter
= new ChunkIterator();
29 *cIter
= ((Chunk
*)chunkPtr_
)->getIterator();
30 }else if (hashIndexScan
== scanType_
)
32 SingleFieldHashIndexInfo
*hIdxInfo
= (SingleFieldHashIndexInfo
*)info
;
33 PredicateImpl
*predImpl
= (PredicateImpl
*) pred_
;
35 void *keyPtr
= (void*)predImpl
->valPtrForIndexField(hIdxInfo
->fldName
);
37 int bucketNo
= HashIndex::computeHashBucket(hIdxInfo
->type
,
38 keyPtr
, hIdxInfo
->noOfBuckets
);
39 Bucket
*bucket
= &(hIdxInfo
->buckets
[bucketNo
]);
40 int ret
= bucket
->mutex_
.getLock(procSlot
);
43 printError(ErrLockTimeOut
,"Unable to acquire bucket Mutex for bucket %d",bucketNo
);
44 return ErrLockTimeOut
;
46 HashIndexNode
*head
= (HashIndexNode
*) bucket
->bucketList_
;
49 bucket
->mutex_
.releaseLock(procSlot
);
53 printDebug(DM_HashIndex
, "open:head for bucket %x is :%x", bucket
, head
);
54 bIter
= new BucketIter(head
);
55 bucket
->mutex_
.releaseLock(procSlot
);
61 void* TupleIterator::next()
63 PredicateImpl
*predImpl
= (PredicateImpl
*) pred_
;
66 if (fullTableScan
== scanType_
)
72 return cIter
->nextElement();
76 //evaluate till it succeeds
80 tuple
= cIter
->nextElement();
81 if(NULL
== tuple
) return NULL
;
82 predImpl
->setTuple(tuple
);
83 printDebug(DM_Table
, "Evaluating the predicate from fullTableScan");
84 rv
= predImpl
->evaluate(result
);
85 if (rv
!= OK
) return NULL
;
88 }else if (hashIndexScan
== scanType_
)
92 //if there are no nodes in bucket bIter will be null
95 //evaluate till it succeeds
99 HashIndexNode
*node
= bIter
->next();
100 if (node
== NULL
) return NULL
;
101 printDebug(DM_HashIndex
, "next: returned HashIndexNode: %x", node
);
102 tuple
= node
->ptrToTuple_
;
104 printDebug(DM_HashIndex
, "next::tuple is null");
108 //if (!predImpl->isSingleTerm()) {
109 printDebug(DM_HashIndex
, "next: predicate has more than single term");
110 predImpl
->setTuple(tuple
);
111 printDebug(DM_Table
, "Evaluating the predicate from hashIndexScan: has more than one term");
112 rv
= predImpl
->evaluate(result
);
113 if (rv
!= OK
) return NULL
;
123 DbRetVal
TupleIterator::close()
125 if (scanType_
== fullTableScan
)
129 } else if (scanType_
== hashIndexScan
)
134 scanType_
= unknownScan
;