fixed bug in lsm search cursors: reset properly resets the cursors

git-svn-id: https://hyracks.googlecode.com/svn/branches/hyracks_lsm_tree@1739 123451ca-8445-de46-9d55-352943316053
diff --git a/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java b/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java
index 8333a95..f7e3aae 100644
--- a/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java
+++ b/hyracks-storage-am-lsm-btree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java
@@ -63,7 +63,7 @@
             rangeCursors[i] = new BTreeRangeSearchCursor(leafFrame, false);
         }
         includeMemComponent = lsmInitialState.getIncludeMemComponent();
-        searcherfRefCount = lsmInitialState.getSearcherRefCount();
+        searcherRefCount = lsmInitialState.getSearcherRefCount();
         lsmHarness = lsmInitialState.getLSMHarness();
         setPriorityQueueComparator();
     }
diff --git a/hyracks-storage-am-lsm-common/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/common/impls/LSMTreeSearchCursor.java b/hyracks-storage-am-lsm-common/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/common/impls/LSMTreeSearchCursor.java
index a8e0873..f622d87 100644
--- a/hyracks-storage-am-lsm-common/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/common/impls/LSMTreeSearchCursor.java
+++ b/hyracks-storage-am-lsm-common/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/common/impls/LSMTreeSearchCursor.java
@@ -35,7 +35,7 @@
     protected PriorityQueueElement reusedElement;
     protected boolean needPush;
     protected boolean includeMemComponent;
-    protected AtomicInteger searcherfRefCount;
+    protected AtomicInteger searcherRefCount;
     protected LSMHarness lsmHarness;
 
     public LSMTreeSearchCursor() {
@@ -48,9 +48,24 @@
     }
 
     @Override
-    public void reset() {
+    public void reset() throws HyracksDataException {
         outputElement = null;
         needPush = false;
+
+        if (outputPriorityQueue != null) {
+            outputPriorityQueue.clear();
+        }
+
+        if (rangeCursors != null) {
+            for (int i = 0; i < rangeCursors.length; i++) {
+                rangeCursors[i].reset();
+            }
+        }
+        rangeCursors = null;
+
+        if (searcherRefCount != null) {
+            lsmHarness.closeSearchCursor(searcherRefCount, includeMemComponent);
+        }
     }
 
     @Override
@@ -85,7 +100,7 @@
             }
             rangeCursors = null;
         } finally {
-            lsmHarness.closeSearchCursor(searcherfRefCount, includeMemComponent);
+            lsmHarness.closeSearchCursor(searcherRefCount, includeMemComponent);
         }
     }
 
diff --git a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeAbstractCursor.java b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeAbstractCursor.java
index 93834f9..969031e 100644
--- a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeAbstractCursor.java
+++ b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeAbstractCursor.java
@@ -29,6 +29,7 @@
 

     public abstract void reset() throws HyracksDataException;

 

+    protected boolean open = false;

     protected BTreeRangeSearchCursor[] btreeCursors;

     protected ITreeIndexAccessor[] diskRTreeAccessors;

     protected ITreeIndexAccessor[] diskBTreeAccessors;

@@ -37,9 +38,9 @@
     protected SearchPredicate rtreeSearchPredicate;

     protected RangePredicate btreeRangePredicate;

     protected ITupleReference frameTuple;

-    private AtomicInteger searcherRefCount;

-    private boolean includeMemRTree;

-    private LSMHarness lsmHarness;

+    protected AtomicInteger searcherRefCount;

+    protected boolean includeMemRTree;

+    protected LSMHarness lsmHarness;

     protected boolean foundNext;

 

     public LSMRTreeAbstractCursor() {

@@ -73,6 +74,8 @@
         }

         rtreeSearchPredicate = (SearchPredicate) searchPred;

         btreeRangePredicate = new RangePredicate(null, null, true, true, btreeCmp, btreeCmp);

+

+        open = true;

     }

 

     public ICachedPage getPage() {

@@ -81,16 +84,24 @@
     }

 

     public void close() throws HyracksDataException {

+        if (!open) {

+            return;

+        }

+

         try {

-            for (int i = 0; i < numberOfTrees; i++) {

-                rtreeCursors[i].close();

-                btreeCursors[i].close();

+            if (rtreeCursors != null && btreeCursors != null) {

+                for (int i = 0; i < numberOfTrees; i++) {

+                    rtreeCursors[i].close();

+                    btreeCursors[i].close();

+                }

             }

             rtreeCursors = null;

             btreeCursors = null;

         } finally {

             lsmHarness.closeSearchCursor(searcherRefCount, includeMemRTree);

         }

+

+        open = false;

     }

 

     public void setBufferCache(IBufferCache bufferCache) {

diff --git a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSearchCursor.java b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSearchCursor.java
index c578902..ca5c9e7 100644
--- a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSearchCursor.java
+++ b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSearchCursor.java
@@ -18,7 +18,6 @@
 import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
 import edu.uci.ics.hyracks.dataflow.common.data.accessors.ITupleReference;
 import edu.uci.ics.hyracks.storage.am.common.api.ICursorInitialState;
-import edu.uci.ics.hyracks.storage.am.common.api.ISearchOperationCallback;
 import edu.uci.ics.hyracks.storage.am.common.api.ISearchPredicate;
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexCursor;
 import edu.uci.ics.hyracks.storage.am.common.api.IndexException;
@@ -26,16 +25,29 @@
 public class LSMRTreeSearchCursor extends LSMRTreeAbstractCursor implements ITreeIndexCursor {
 
     private int currentCursror;
-    private ISearchOperationCallback searchCallback;
 
     public LSMRTreeSearchCursor() {
         currentCursror = 0;
     }
 
     @Override
-    public void reset() {
+    public void reset() throws HyracksDataException {
+        if (!open) {
+            return;
+        }
+
         currentCursror = 0;
         foundNext = false;
+        try {
+            for (int i = 0; i < numberOfTrees; i++) {
+                rtreeCursors[i].close();
+                btreeCursors[i].close();
+            }
+            rtreeCursors = null;
+            btreeCursors = null;
+        } finally {
+            lsmHarness.closeSearchCursor(searcherRefCount, includeMemRTree);
+        }
     }
 
     private void searchNextCursor() throws HyracksDataException {
diff --git a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSortedCursor.java b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSortedCursor.java
index 1e0916a..2859d04 100644
--- a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSortedCursor.java
+++ b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSortedCursor.java
@@ -37,6 +37,10 @@
 
     @Override
     public void reset() throws HyracksDataException {
+        if (!open) {
+            return;
+        }
+
         depletedRtreeCursors = new boolean[numberOfTrees];
         foundNext = false;
         for (int i = 0; i < numberOfTrees; i++) {
@@ -52,6 +56,8 @@
                 depletedRtreeCursors[i] = true;
             }
         }
+
+        lsmHarness.closeSearchCursor(searcherRefCount, includeMemRTree);
     }
 
     @Override
diff --git a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesSearchCursor.java b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesSearchCursor.java
index 9556230..1dddfb7 100644
--- a/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesSearchCursor.java
+++ b/hyracks-storage-am-lsm-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesSearchCursor.java
@@ -80,7 +80,7 @@
             memBTreeAccessor = lsmInitialState.getBTreeAccessors()[0];
             btreeRangePredicate = new RangePredicate(null, null, true, true, btreeCmp, btreeCmp);
         }
-        searcherfRefCount = lsmInitialState.getSearcherRefCount();
+        searcherRefCount = lsmInitialState.getSearcherRefCount();
         lsmHarness = lsmInitialState.getLSMHarness();
         comparatorFields = lsmInitialState.getComparatorFields();
         setPriorityQueueComparator();