Big fix

git-svn-id: https://hyracks.googlecode.com/svn/branches/hyracks_indexes@410 123451ca-8445-de46-9d55-352943316053
diff --git a/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/frames/NSMRTreeFrame.java b/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/frames/NSMRTreeFrame.java
index d414073..9107b23 100644
--- a/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/frames/NSMRTreeFrame.java
+++ b/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/frames/NSMRTreeFrame.java
@@ -105,6 +105,12 @@
     }
 
     @Override
+    public void insert(ITupleReference tuple, MultiComparator cmp) throws Exception {
+        super.insert(tuple, cmp);
+        setSmFlag(false);
+    }
+
+    @Override
     public int split(ITreeIndexFrame rightFrame, ITupleReference tuple, MultiComparator cmp, ISplitKey splitKey,
             TupleEntryArrayList entries1, TupleEntryArrayList entries2, Rectangle[] rec) throws Exception {
 
@@ -603,19 +609,28 @@
         for (int i = 0; i < getTupleCount(); i++) {
             frameTuple.resetByTupleIndex(this, i);
 
+            boolean foundTuple = true;
             for (int j = 0; j < maxFieldPos; j++) {
                 int k = maxFieldPos + j;
                 int c1 = cmp.getComparators()[j].compare(frameTuple.getFieldData(j), frameTuple.getFieldStart(j),
                         frameTuple.getFieldLength(j), tuple.getFieldData(j), tuple.getFieldStart(j),
                         tuple.getFieldLength(j));
 
+                if (c1 != 0) {
+                    foundTuple = false;
+                    break;
+                }
                 int c2 = cmp.getComparators()[k].compare(frameTuple.getFieldData(k), frameTuple.getFieldStart(k),
                         frameTuple.getFieldLength(k), tuple.getFieldData(k), tuple.getFieldStart(k),
                         tuple.getFieldLength(k));
-                if (c1 == 0 && c2 == 0) {
-                    return i;
+                if (c2 != 0) {
+                    foundTuple = false;
+                    break;
                 }
             }
+            if (foundTuple) {
+                return i;
+            }
         }
         return -1;
     }
@@ -638,21 +653,21 @@
         buf.putInt(tupleCountOff, buf.getInt(tupleCountOff) - 1);
         buf.putInt(totalFreeSpaceOff, buf.getInt(totalFreeSpaceOff) + tupleSize + slotManager.getSlotSize());
     }
-    
+
     @Override
     public int findTupleByPointer(int pageId, MultiComparator cmp) {
         frameTuple.setFieldCount(cmp.getFieldCount());
         for (int i = 0; i < getTupleCount(); i++) {
             frameTuple.resetByTupleIndex(this, i);
             int id = IntegerSerializerDeserializer.getInt(frameTuple.getFieldData(cmp.getKeyFieldCount()),
-                        frameTuple.getFieldStart(cmp.getKeyFieldCount()));
+                    frameTuple.getFieldStart(cmp.getKeyFieldCount()));
             if (id == pageId) {
                 return i;
             }
         }
         return -1;
     }
-    
+
     @Override
     public int findTupleByPointer(ITupleReference tuple, MultiComparator cmp) {
         frameTuple.setFieldCount(cmp.getFieldCount());
@@ -777,7 +792,7 @@
         RTreeSplitKey rTreeSplitKey = ((RTreeSplitKey) splitKey);
         RTreeTypeAwareTupleWriter rTreeTupleWriterLeftFrame = ((RTreeTypeAwareTupleWriter) tupleWriter);
         frameTuple.setFieldCount(cmp.getFieldCount());
-        
+
         int tupleOff = slotManager.getTupleOff(slotManager.getSlotEndOff());
         frameTuple.resetByTupleOffset(buf, tupleOff);
         int splitKeySize = tupleWriter.bytesRequired(frameTuple, 0, cmp.getKeyFieldCount());
@@ -787,12 +802,12 @@
         rTreeTupleWriterLeftFrame.writeTupleFields(tuples, 0, rTreeSplitKey.getLeftPageBuffer(), 0);
         rTreeSplitKey.getLeftTuple().resetByTupleOffset(rTreeSplitKey.getLeftPageBuffer(), 0);
     }
-    
+
     @Override
     public boolean recomputeMBR(ITupleReference tuple, int tupleIndex, MultiComparator cmp) {
         frameTuple.setFieldCount(cmp.getFieldCount());
         frameTuple.resetByTupleIndex(this, tupleIndex);
-        
+
         int maxFieldPos = cmp.getKeyFieldCount() / 2;
         for (int i = 0; i < maxFieldPos; i++) {
             int j = maxFieldPos + i;
diff --git a/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/impls/RTree.java b/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/impls/RTree.java
index 2815e48..8a22317 100644
--- a/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/impls/RTree.java
+++ b/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/impls/RTree.java
@@ -638,14 +638,13 @@
                 tupleIndex = ctx.interiorFrame.findTupleByPointer(ctx.splitKey.getLeftTuple(), interiorCmp);
             }
             boolean recomputeMBR = ctx.interiorFrame.recomputeMBR(ctx.splitKey.getLeftTuple(), tupleIndex, interiorCmp);
-            
-            
+
             if (recomputeMBR) {
                 ctx.interiorFrame.adjustKey(ctx.splitKey.getLeftTuple(), tupleIndex, interiorCmp);
                 ctx.pathList.removeLast();
-                
+
                 ctx.splitKey.reset();
-                if (!ctx.pathList.isEmpty()) {                   
+                if (!ctx.pathList.isEmpty()) {
                     ctx.interiorFrame.computeMBR(ctx.splitKey, interiorCmp);
                     ctx.splitKey.setLeftPage(parentId);
                 }
@@ -669,7 +668,7 @@
         findPath(ctx);
         updateParentForDelete(ctx);
     }
-    
+
     public int findTupleToDelete(RTreeOpContext ctx) throws Exception {
 
         ctx.traverseList.add(rootPage, -1, -1);
@@ -747,16 +746,13 @@
     }
 
     public void deleteTuple(int pageId, int tupleIndex, RTreeOpContext ctx) throws Exception {
-
-         if (ctx.leafFrame.getTupleCount() == 1) {
-        
-         } else {
-
         ctx.leafFrame.delete(tupleIndex, leafCmp);
-        ctx.leafFrame.computeMBR(ctx.splitKey, leafCmp);
-        ctx.splitKey.setLeftPage(pageId);
-
-         }
+        if (ctx.leafFrame.getTupleCount() == 0) {
+            ctx.leafFrame.setSmFlag(true);
+        } else {
+            ctx.leafFrame.computeMBR(ctx.splitKey, leafCmp);
+            ctx.splitKey.setLeftPage(pageId);
+        }
     }
 
     public void search(Stack<Integer> s, ITupleReference tuple, RTreeOpContext ctx, ArrayList<Rectangle> results)