Fixed RTree after cleaning up TreeIndex interfaces. Fixed bugs in the BTree while doing more cleaning.

git-svn-id: https://hyracks.googlecode.com/svn/branches/hyracks_btree_updates_next@612 123451ca-8445-de46-9d55-352943316053
diff --git a/hyracks-dataflow-common/src/main/java/edu/uci/ics/hyracks/dataflow/common/util/TupleUtils.java b/hyracks-dataflow-common/src/main/java/edu/uci/ics/hyracks/dataflow/common/util/TupleUtils.java
index 801206b..d95d8a5 100644
--- a/hyracks-dataflow-common/src/main/java/edu/uci/ics/hyracks/dataflow/common/util/TupleUtils.java
+++ b/hyracks-dataflow-common/src/main/java/edu/uci/ics/hyracks/dataflow/common/util/TupleUtils.java
@@ -15,6 +15,9 @@
 
 package edu.uci.ics.hyracks.dataflow.common.util;
 
+import java.io.ByteArrayInputStream;
+import java.io.DataInput;
+import java.io.DataInputStream;
 import java.io.DataOutput;
 
 import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
@@ -60,5 +63,22 @@
         ArrayTupleReference tuple = new ArrayTupleReference();
         createIntegerTuple(tupleBuilder, tuple, fields);
         return tuple;
-    }    
+    }
+    
+    public static String printTuple(ITupleReference tuple,
+            ISerializerDeserializer[] fields) throws HyracksDataException {
+        StringBuilder strBuilder = new StringBuilder();
+        for (int i = 0; i < fields.length; i++) {
+            ByteArrayInputStream inStream = new ByteArrayInputStream(
+                    tuple.getFieldData(i), tuple.getFieldStart(i),
+                    tuple.getFieldLength(i));
+            DataInput dataIn = new DataInputStream(inStream);
+            Object o = fields[i].deserialize(dataIn);
+            strBuilder.append(o.toString());
+            if (i != fields.length - 1) {
+                strBuilder.append(" ");
+            }
+        }
+        return strBuilder.toString();
+    }
 }
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IBTreeFrame.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IBTreeFrame.java
new file mode 100644
index 0000000..1f2a168
--- /dev/null
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IBTreeFrame.java
@@ -0,0 +1,14 @@
+package edu.uci.ics.hyracks.storage.am.btree.api;
+
+import edu.uci.ics.hyracks.dataflow.common.data.accessors.ITupleReference;
+import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexFrame;
+import edu.uci.ics.hyracks.storage.am.common.api.TreeIndexException;
+import edu.uci.ics.hyracks.storage.am.common.ophelpers.MultiComparator;
+
+public interface IBTreeFrame extends ITreeIndexFrame {
+	public int findUpdateTupleIndex(ITupleReference tuple, MultiComparator cmp) throws TreeIndexException;
+	public int findInsertTupleIndex(ITupleReference tuple, MultiComparator cmp) throws TreeIndexException;
+	public int findDeleteTupleIndex(ITupleReference tuple, MultiComparator cmp) throws TreeIndexException;
+    public boolean getSmFlag();
+    public void setSmFlag(boolean smFlag);
+}
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IBTreeInteriorFrame.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IBTreeInteriorFrame.java
index 25ab167..09af783 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IBTreeInteriorFrame.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IBTreeInteriorFrame.java
@@ -18,10 +18,9 @@
 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.btree.impls.RangePredicate;
-import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexFrame;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.MultiComparator;
 
-public interface IBTreeInteriorFrame extends ITreeIndexFrame {
+public interface IBTreeInteriorFrame extends IBTreeFrame {
     public void insertSorted(ITupleReference tuple, MultiComparator cmp) throws HyracksDataException;
     
     public int getChildPageId(RangePredicate pred, MultiComparator srcCmp);
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IBTreeLeafFrame.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IBTreeLeafFrame.java
index 14355fe..3429ba6 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IBTreeLeafFrame.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IBTreeLeafFrame.java
@@ -17,13 +17,12 @@
 
 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.ITreeIndexFrame;
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexTupleReference;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.FindTupleMode;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.FindTupleNoExactMatchPolicy;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.MultiComparator;
 
-public interface IBTreeLeafFrame extends ITreeIndexFrame {
+public interface IBTreeLeafFrame extends IBTreeFrame {
     public void insertSorted(ITupleReference tuple, MultiComparator cmp) throws HyracksDataException;
     
     public void setNextLeaf(int nextPage);
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IPrefixSlotManager.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IPrefixSlotManager.java
index d01db11..38b4e61 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IPrefixSlotManager.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IPrefixSlotManager.java
@@ -17,6 +17,7 @@
 
 import edu.uci.ics.hyracks.dataflow.common.data.accessors.ITupleReference;
 import edu.uci.ics.hyracks.storage.am.btree.frames.BTreeFieldPrefixNSMLeafFrame;
+import edu.uci.ics.hyracks.storage.am.common.api.ISlotManager;
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexTupleReference;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.FindTupleMode;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.FindTupleNoExactMatchPolicy;
@@ -42,9 +43,9 @@
 // potentially all tuples slots would have to change their prefix slot pointers
 // all prefixes are recomputed during a reorg or compaction
 
-public interface IPrefixSlotManager {
-    public void setFrame(BTreeFieldPrefixNSMLeafFrame frame);
-
+public interface IPrefixSlotManager extends ISlotManager {
+    // TODO: Clean up interface after extending ISlotManager.
+	
     public int decodeFirstSlotField(int slot);
 
     public int decodeSecondSlotField(int slot);
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/BTreeFieldPrefixNSMLeafFrame.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/BTreeFieldPrefixNSMLeafFrame.java
index 9710b61..33a1457 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/BTreeFieldPrefixNSMLeafFrame.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/BTreeFieldPrefixNSMLeafFrame.java
@@ -369,17 +369,12 @@
 
     @Override
     public int findInsertTupleIndex(ITupleReference tuple, MultiComparator cmp) throws TreeIndexException {
-        int slot = slotManager.findSlot(tuple, frameTuple, framePrefixTuple, cmp, FindTupleMode.INCLUSIVE,
+    	int slot = slotManager.findSlot(tuple, frameTuple, framePrefixTuple, cmp, FindTupleMode.EXCLUSIVE_ERROR_IF_EXISTS,
                 FindTupleNoExactMatchPolicy.HIGHER_KEY);
-        // TODO: Push this check into findSlot, and distinguish between greatest slot and errors.
         int tupleIndex = slotManager.decodeSecondSlotField(slot);
-        if (tupleIndex != FieldPrefixSlotManager.GREATEST_SLOT) {
-            frameTuple.setFieldCount(cmp.getFieldCount());
-            frameTuple.resetByTupleIndex(this, tupleIndex);
-            int comparison = cmp.fieldRangeCompare(tuple, frameTuple, 0, cmp.getKeyFieldCount());
-            if (comparison == 0) {
-                throw new BTreeDuplicateKeyException("Trying to insert duplicate key into leaf node.");
-            }
+        // Error indicator is set if there is an exact match.
+        if (tupleIndex == slotManager.getErrorIndicator()) {
+            throw new BTreeDuplicateKeyException("Trying to insert duplicate key into leaf node.");
         }
         return slot;
     }
@@ -388,11 +383,11 @@
     public int findUpdateTupleIndex(ITupleReference tuple, MultiComparator cmp) throws TreeIndexException {
         int slot = slotManager.findSlot(tuple, frameTuple, framePrefixTuple, cmp, FindTupleMode.EXACT,
                 FindTupleNoExactMatchPolicy.HIGHER_KEY);
-        // TODO: Push this check into findSlot, and distinguish between greatest slot and errors.
         int tupleIndex = slotManager.decodeSecondSlotField(slot);
-        if (tupleIndex == FieldPrefixSlotManager.GREATEST_SLOT) {
+        // Error indicator is set if there is no exact match.
+        if (tupleIndex == slotManager.getErrorIndicator()) {
             throw new BTreeNonExistentKeyException("Trying to update a tuple with a nonexistent key in leaf node.");
-        }
+        }    
         return slot;
     }
     
@@ -400,11 +395,11 @@
     public int findDeleteTupleIndex(ITupleReference tuple, MultiComparator cmp) throws TreeIndexException {
         int slot = slotManager.findSlot(tuple, frameTuple, framePrefixTuple, cmp, FindTupleMode.EXACT,
                 FindTupleNoExactMatchPolicy.HIGHER_KEY);
-        // TODO: Push this check into findSlot, and distinguish between greatest slot and errors.
         int tupleIndex = slotManager.decodeSecondSlotField(slot);
-        if (tupleIndex == FieldPrefixSlotManager.GREATEST_SLOT) {
+        // Error indicator is set if there is no exact match.
+        if (tupleIndex == slotManager.getErrorIndicator()) {
             throw new BTreeNonExistentKeyException("Trying to delete a tuple with a nonexistent key in leaf node.");
-        }
+        }    
         return slot;
     }
     
@@ -528,7 +523,7 @@
             prefixSlotNum = buf.getInt(prefixTupleCountOff) - 1;
         else
             buf.putInt(uncompressedTupleCountOff, buf.getInt(uncompressedTupleCountOff) + 1);
-        int insSlot = slotManager.encodeSlotFields(prefixSlotNum, FieldPrefixSlotManager.GREATEST_SLOT);
+        int insSlot = slotManager.encodeSlotFields(prefixSlotNum, FieldPrefixSlotManager.GREATEST_KEY_INDICATOR);
         slotManager.insertSlot(insSlot, freeSpace);
 
         // update page metadata
@@ -539,7 +534,7 @@
 
     @Override
     public int split(ITreeIndexFrame rightFrame, ITupleReference tuple, MultiComparator cmp, ISplitKey splitKey)
-            throws Exception {
+    		throws TreeIndexException {
 
         BTreeFieldPrefixNSMLeafFrame rf = (BTreeFieldPrefixNSMLeafFrame) rightFrame;
 
@@ -654,7 +649,7 @@
         rightFrame.compact(cmp);
 
         // insert last key
-        int targetTupleIndex = targetFrame.findInsertTupleIndex(tuple, cmp);
+        int targetTupleIndex = ((IBTreeLeafFrame)targetFrame).findInsertTupleIndex(tuple, cmp);
         targetFrame.insert(tuple, cmp, targetTupleIndex);
 
         // set split key to be highest value in left page
@@ -715,11 +710,6 @@
         return slotManager.getSlotSize();
     }
 
-    //@Override
-    //public void setPageTupleFieldCount(int fieldCount) {
-    //    frameTuple.setFieldCount(fieldCount);
-    //}
-
     public ITreeIndexTupleWriter getTupleWriter() {
         return tupleWriter;
     }
@@ -734,7 +724,8 @@
             FindTupleMode ftm, FindTupleNoExactMatchPolicy ftp) {
         int slot = slotManager.findSlot(searchKey, pageTuple, framePrefixTuple, cmp, ftm, ftp);
         int tupleIndex = slotManager.decodeSecondSlotField(slot);
-        if (tupleIndex == FieldPrefixSlotManager.GREATEST_SLOT)
+        // TODO: Revisit this one. Maybe there is a cleaner way to solve this in the RangeSearchCursor.
+        if (tupleIndex == FieldPrefixSlotManager.GREATEST_KEY_INDICATOR || tupleIndex == FieldPrefixSlotManager.ERROR_INDICATOR)
             return -1;
         else
             return tupleIndex;
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/BTreeNSMInteriorFrame.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/BTreeNSMInteriorFrame.java
index ddf056d..00ec3cd 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/BTreeNSMInteriorFrame.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/BTreeNSMInteriorFrame.java
@@ -144,8 +144,7 @@
     }
 
     @Override
-    public int split(ITreeIndexFrame rightFrame, ITupleReference tuple, MultiComparator cmp, ISplitKey splitKey)
-            throws Exception {
+    public int split(ITreeIndexFrame rightFrame, ITupleReference tuple, MultiComparator cmp, ISplitKey splitKey) throws TreeIndexException {
         // before doing anything check if key already exists
         frameTuple.setFieldCount(cmp.getKeyFieldCount());
 
@@ -200,7 +199,7 @@
         compact(cmp);
 
         // insert key
-        int targetTupleIndex = targetFrame.findInsertTupleIndex(savedSplitKey.getTuple(), cmp);
+        int targetTupleIndex = ((BTreeNSMInteriorFrame)targetFrame).findInsertTupleIndex(savedSplitKey.getTuple(), cmp);
         targetFrame.insert(savedSplitKey.getTuple(), cmp, targetTupleIndex);
 
         return 0;
@@ -284,7 +283,7 @@
         int tupleIndex = slotManager.findTupleIndex(tuple, frameTuple, targetCmp, fsm,
                 FindTupleNoExactMatchPolicy.HIGHER_KEY);
         int slotOff = slotManager.getSlotOff(tupleIndex);
-        if (slotManager.isHighestTupleIndex(tupleIndex)) {
+        if (tupleIndex == slotManager.getGreatestKeyIndicator()) {
             return buf.getInt(rightLeafOff);
         } else {
             int origTupleOff = slotManager.getTupleOff(slotOff);
@@ -326,7 +325,7 @@
         int slotOff = slotManager.getSlotOff(tupleIndex);
         int tupleOff;
         int keySize;
-        if (slotManager.isHighestTupleIndex(tupleIndex)) {
+        if (tupleIndex == slotManager.getGreatestKeyIndicator()) {
             tupleOff = slotManager.getTupleOff(slotManager.getSlotEndOff());
             frameTuple.resetByTupleOffset(buf, tupleOff);
             keySize = tupleWriter.bytesRequired(frameTuple, 0, cmp.getKeyFieldCount());
@@ -445,4 +444,19 @@
     public int getPageHeaderSize() {
         return rightLeafOff;
     }
+    
+    // TODO: can we put these into a common AbstractFrame or something?
+    @Override
+    public boolean getSmFlag() {
+        return buf.get(smFlagOff) != 0;
+    }
+
+    // TODO: can we put these into a common AbstractFrame or something?
+    @Override
+    public void setSmFlag(boolean smFlag) {
+        if (smFlag)
+            buf.put(smFlagOff, (byte) 1);
+        else
+            buf.put(smFlagOff, (byte) 0);
+    }
 }
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/BTreeNSMLeafFrame.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/BTreeNSMLeafFrame.java
index 9b75843..a9d9e78 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/BTreeNSMLeafFrame.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/BTreeNSMLeafFrame.java
@@ -73,7 +73,7 @@
         int tupleIndex = slotManager.findTupleIndex(tuple, frameTuple, cmp, FindTupleMode.EXCLUSIVE_ERROR_IF_EXISTS,
                 FindTupleNoExactMatchPolicy.HIGHER_KEY);
         // Error indicator is set if there is an exact match.
-        if (slotManager.isErrorTupleIndex(tupleIndex)) {
+        if (tupleIndex == slotManager.getErrorIndicator()) {
             throw new BTreeDuplicateKeyException("Trying to insert duplicate key into leaf node.");
         }
         return tupleIndex;
@@ -85,7 +85,7 @@
         int tupleIndex = slotManager.findTupleIndex(tuple, frameTuple, cmp, FindTupleMode.EXACT,
                 FindTupleNoExactMatchPolicy.HIGHER_KEY);
         // Error indicator is set if there is no exact match.
-        if (slotManager.isErrorTupleIndex(tupleIndex)) {
+        if (tupleIndex == slotManager.getErrorIndicator()) {
             throw new BTreeNonExistentKeyException("Trying to update a tuple with a nonexistent key in leaf node.");
         }        
         return tupleIndex;
@@ -97,7 +97,7 @@
         int tupleIndex = slotManager.findTupleIndex(tuple, frameTuple, cmp, FindTupleMode.EXACT,
                 FindTupleNoExactMatchPolicy.HIGHER_KEY);
         // Error indicator is set if there is no exact match.
-        if (slotManager.isErrorTupleIndex(tupleIndex)) {
+        if (tupleIndex == slotManager.getErrorIndicator()) {
             throw new BTreeNonExistentKeyException("Trying to delete a tuple with a nonexistent key in leaf node.");
         }        
         return tupleIndex;
@@ -124,8 +124,7 @@
     }
 
     @Override
-    public int split(ITreeIndexFrame rightFrame, ITupleReference tuple, MultiComparator cmp, ISplitKey splitKey)
-            throws Exception {
+    public int split(ITreeIndexFrame rightFrame, ITupleReference tuple, MultiComparator cmp, ISplitKey splitKey) throws TreeIndexException {
 
         frameTuple.setFieldCount(cmp.getFieldCount());
 
@@ -165,7 +164,7 @@
         compact(cmp);
 
         // insert last key
-        int targetTupleIndex = targetFrame.findInsertTupleIndex(tuple, cmp);
+        int targetTupleIndex = ((BTreeNSMLeafFrame)targetFrame).findInsertTupleIndex(tuple, cmp);
         targetFrame.insert(tuple, cmp, targetTupleIndex);
 
         // set split key to be highest value in left page
@@ -201,4 +200,19 @@
     public int getPageHeaderSize() {
         return nextLeafOff;
     }
+
+    // TODO: can we put these into a common AbstractFrame or something?
+    @Override
+    public boolean getSmFlag() {
+        return buf.get(smFlagOff) != 0;
+    }
+
+    // TODO: can we put these into a common AbstractFrame or something?
+    @Override
+    public void setSmFlag(boolean smFlag) {
+        if (smFlag)
+            buf.put(smFlagOff, (byte) 1);
+        else
+            buf.put(smFlagOff, (byte) 0);
+    }
 }
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/OrderedSlotManager.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/OrderedSlotManager.java
index 4a07fa4..b2bab85 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/OrderedSlotManager.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/OrderedSlotManager.java
@@ -24,9 +24,6 @@
 
 public class OrderedSlotManager extends AbstractSlotManager {
     
-    private final int HIGHEST_TUPLE_INDEX = -1;
-    private final int ERROR_TUPLE_INDEX = -2;
-    
 	@Override
     public int findTupleIndex(ITupleReference searchKey, ITreeIndexTupleReference frameTuple, MultiComparator multiCmp,
             FindTupleMode mode, FindTupleNoExactMatchPolicy matchPolicy) {
@@ -56,7 +53,7 @@
                     }
                 } else {
                     if (mode == FindTupleMode.EXCLUSIVE_ERROR_IF_EXISTS) {
-                        return ERROR_TUPLE_INDEX;
+                        return ERROR_INDICATOR;
                     } else {
                         return mid;
                     }
@@ -65,28 +62,28 @@
         }
 
         if (mode == FindTupleMode.EXACT) {
-            return ERROR_TUPLE_INDEX;
+            return ERROR_INDICATOR;
         }
 
         if (matchPolicy == FindTupleNoExactMatchPolicy.HIGHER_KEY) {
             if (begin > frame.getTupleCount() - 1) {
-                return HIGHEST_TUPLE_INDEX;
+                return GREATEST_KEY_INDICATOR;
             }
             frameTuple.resetByTupleIndex(frame, begin);
             if (multiCmp.compare(searchKey, frameTuple) < 0) {
                 return begin;
             } else {
-                return HIGHEST_TUPLE_INDEX;
+                return GREATEST_KEY_INDICATOR;
             }
         } else {
             if (end < 0) {
-                return HIGHEST_TUPLE_INDEX;
+                return GREATEST_KEY_INDICATOR;
             }
             frameTuple.resetByTupleIndex(frame, end);
             if (multiCmp.compare(searchKey, frameTuple) > 0) {
                 return end;
             } else {
-                return HIGHEST_TUPLE_INDEX;
+                return GREATEST_KEY_INDICATOR;
             }
         }
     }
@@ -94,7 +91,7 @@
     @Override
     public int insertSlot(int tupleIndex, int tupleOff) {
         int slotOff = getSlotOff(tupleIndex);
-        if (tupleIndex == HIGHEST_TUPLE_INDEX) {
+        if (tupleIndex == GREATEST_KEY_INDICATOR) {
             slotOff = getSlotEndOff() - slotSize;
             setSlot(slotOff, tupleOff);
             return slotOff;
@@ -107,14 +104,4 @@
             return slotOff;
         }
     }
-
-    @Override
-    public boolean isHighestTupleIndex(int tupleIndex) {
-        return tupleIndex == HIGHEST_TUPLE_INDEX;
-    }
-
-    @Override
-    public boolean isErrorTupleIndex(int tupleIndex) {
-        return tupleIndex == ERROR_TUPLE_INDEX;
-    }
 }
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTree.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTree.java
index 112fcca..cf7ed6f 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTree.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/BTree.java
@@ -22,6 +22,7 @@
 import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
 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.btree.api.IBTreeFrame;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeInteriorFrame;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeLeafFrame;
 import edu.uci.ics.hyracks.storage.am.btree.exceptions.BTreeException;
@@ -119,7 +120,7 @@
         BTreeOpContext ctx = (BTreeOpContext) ictx;
         ctx.reset();
 
-        int currentPageId = rootPage + 1;
+        int currentPageId = rootPage;
         int maxPageId = freePageManager.getMaxPage(metaFrame);
 
         ICachedPage page = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, currentPageId), false);
@@ -143,10 +144,12 @@
         ctx.pred = pred;
         ctx.cursor = cursor;
         // simple index scan
-        if (ctx.pred.getLowKeyComparator() == null)
+        if (ctx.pred.getLowKeyComparator() == null) {
             ctx.pred.setLowKeyComparator(cmp);
-        if (ctx.pred.getHighKeyComparator() == null)
+        }
+        if (ctx.pred.getHighKeyComparator() == null) {
             ctx.pred.setHighKeyComparator(cmp);
+        }
         // we use this loop to deal with possibly multiple operation restarts
         // due to ongoing structure modifications during the descent
         boolean repeatOp = true;
@@ -253,7 +256,7 @@
         ctx.pred.setLowKey(tuple, true);
         ctx.pred.setHighKey(tuple, true);
         ctx.splitKey.reset();
-        ctx.splitKey.getTuple().setFieldCount(cmp.getKeyFieldCount());        
+        ctx.splitKey.getTuple().setFieldCount(cmp.getKeyFieldCount());
         // We use this loop to deal with possibly multiple operation restarts
         // due to ongoing structure modifications during the descent.
         boolean repeatOp = true;
@@ -359,10 +362,9 @@
                     true);
             rightNode.acquireWriteLatch();
             try {
-                IBTreeLeafFrame rightFrame = (IBTreeLeafFrame) leafFrameFactory.createFrame();
+                IBTreeLeafFrame rightFrame = (IBTreeLeafFrame)leafFrameFactory.createFrame();
                 rightFrame.setPage(rightNode);
                 rightFrame.initBuffer((byte) 0);
-                //rightFrame.setPageTupleFieldCount(cmp.getFieldCount());
 
                 int ret = ctx.leafFrame.split(rightFrame, tuple, cmp, ctx.splitKey);
 
@@ -470,7 +472,7 @@
                 ICachedPage rightNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, rightPageId), true);
                 rightNode.acquireWriteLatch();
                 try {
-                    ITreeIndexFrame rightFrame = interiorFrameFactory.createFrame();
+                    IBTreeFrame rightFrame = (IBTreeFrame)interiorFrameFactory.createFrame();
                     rightFrame.setPage(rightNode);
                     rightFrame.initBuffer((byte) ctx.interiorFrame.getLevel());
                     // instead of creating a new split key, use the existing
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/FieldPrefixSlotManager.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/FieldPrefixSlotManager.java
index ac3bed0..c874605 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/FieldPrefixSlotManager.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/FieldPrefixSlotManager.java
@@ -20,6 +20,7 @@
 import edu.uci.ics.hyracks.dataflow.common.data.accessors.ITupleReference;
 import edu.uci.ics.hyracks.storage.am.btree.api.IPrefixSlotManager;
 import edu.uci.ics.hyracks.storage.am.btree.frames.BTreeFieldPrefixNSMLeafFrame;
+import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexFrame;
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexTupleReference;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.FindTupleMode;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.FindTupleNoExactMatchPolicy;
@@ -30,7 +31,8 @@
     private static final int slotSize = 4;
     public static final int TUPLE_UNCOMPRESSED = 0xFF;
     public static final int MAX_PREFIX_SLOTS = 0xFE;
-    public static final int GREATEST_SLOT = 0x00FFFFFF;
+    public static final int GREATEST_KEY_INDICATOR = 0x00FFFFFF;
+    public static final int ERROR_INDICATOR = 0x00FFFFFE;
 
     private ByteBuffer buf;
     private BTreeFieldPrefixNSMLeafFrame frame;
@@ -75,7 +77,7 @@
             ITreeIndexTupleReference framePrefixTuple, MultiComparator multiCmp, FindTupleMode mode,
             FindTupleNoExactMatchPolicy matchPolicy) {
         if (frame.getTupleCount() <= 0)
-            encodeSlotFields(TUPLE_UNCOMPRESSED, GREATEST_SLOT);
+            encodeSlotFields(TUPLE_UNCOMPRESSED, GREATEST_KEY_INDICATOR);
 
         frameTuple.setFieldCount(multiCmp.getFieldCount());
 
@@ -159,7 +161,11 @@
                     else
                         tupleEnd = tupleMid - 1;
                 } else {
-                    return encodeSlotFields(prefixMatch, tupleMid);
+                	if (mode == FindTupleMode.EXCLUSIVE_ERROR_IF_EXISTS) {
+                		return encodeSlotFields(prefixMatch, ERROR_INDICATOR);
+                	} else {
+                		return encodeSlotFields(prefixMatch, tupleMid);
+                	}
                 }
             }
         }
@@ -168,26 +174,26 @@
         // recEnd);
 
         if (mode == FindTupleMode.EXACT)
-            return encodeSlotFields(prefixMatch, GREATEST_SLOT);
+            return encodeSlotFields(prefixMatch, ERROR_INDICATOR);
 
         // do final comparison to determine whether the search key is greater
         // than all keys or in between some existing keys
         if (matchPolicy == FindTupleNoExactMatchPolicy.HIGHER_KEY) {
             if (tupleBegin > frame.getTupleCount() - 1)
-                return encodeSlotFields(prefixMatch, GREATEST_SLOT);
+                return encodeSlotFields(prefixMatch, GREATEST_KEY_INDICATOR);
             frameTuple.resetByTupleIndex(frame, tupleBegin);
             if (multiCmp.compare(searchKey, frameTuple) < 0)
                 return encodeSlotFields(prefixMatch, tupleBegin);
             else
-                return encodeSlotFields(prefixMatch, GREATEST_SLOT);
+                return encodeSlotFields(prefixMatch, GREATEST_KEY_INDICATOR);
         } else {
             if (tupleEnd < 0)
-                return encodeSlotFields(prefixMatch, GREATEST_SLOT);
+                return encodeSlotFields(prefixMatch, GREATEST_KEY_INDICATOR);
             frameTuple.resetByTupleIndex(frame, tupleEnd);
             if (multiCmp.compare(searchKey, frameTuple) > 0)
                 return encodeSlotFields(prefixMatch, tupleEnd);
             else
-                return encodeSlotFields(prefixMatch, GREATEST_SLOT);
+                return encodeSlotFields(prefixMatch, GREATEST_KEY_INDICATOR);
         }
     }
 
@@ -217,7 +223,10 @@
 
     public int insertSlot(int slot, int tupleOff) {
         int slotNum = decodeSecondSlotField(slot);
-        if (slotNum == GREATEST_SLOT) {
+        if (slotNum == ERROR_INDICATOR) {
+        	System.out.println("WOW BIG PROBLEM!");
+        }
+        if (slotNum == GREATEST_KEY_INDICATOR) {
             int slotOff = getTupleSlotEndOff() - slotSize;
             int newSlot = encodeSlotFields(decodeFirstSlotField(slot), tupleOff);
             setSlot(slotOff, newSlot);
@@ -235,11 +244,6 @@
         }
     }
 
-    public void setFrame(BTreeFieldPrefixNSMLeafFrame frame) {
-        this.frame = frame;
-        this.buf = frame.getBuffer();
-    }
-
     public int getPrefixSlotOff(int tupleIndex) {
         return getPrefixSlotStartOff() - tupleIndex * slotSize;
     }
@@ -251,4 +255,47 @@
     public void setPrefixSlot(int tupleIndex, int slot) {
         buf.putInt(getPrefixSlotOff(tupleIndex), slot);
     }
+
+	@Override
+	public int getGreatestKeyIndicator() {
+		return GREATEST_KEY_INDICATOR;
+	}
+
+	@Override
+	public int getErrorIndicator() {
+		return ERROR_INDICATOR;
+	}
+
+	@Override
+	public void setFrame(ITreeIndexFrame frame) {
+		this.frame = (BTreeFieldPrefixNSMLeafFrame)frame;
+        this.buf = frame.getBuffer();
+	}
+
+	@Override
+	public int findTupleIndex(ITupleReference searchKey,
+			ITreeIndexTupleReference frameTuple, MultiComparator multiCmp,
+			FindTupleMode mode, FindTupleNoExactMatchPolicy matchPolicy) {
+		throw new UnsupportedOperationException("Not implemented.");
+	}
+	
+	@Override
+	public int getSlotStartOff() {
+		throw new UnsupportedOperationException("Not implemented.");
+	}
+
+	@Override
+	public int getSlotEndOff() {
+		throw new UnsupportedOperationException("Not implemented.");
+	}
+
+	@Override
+	public int getTupleOff(int slotOff) {
+		throw new UnsupportedOperationException("Not implemented.");
+	}
+
+	@Override
+	public int getSlotOff(int tupleIndex) {
+		throw new UnsupportedOperationException("Not implemented.");
+	}
 }
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/api/ICursorInitialState.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/api/ICursorInitialState.java
index 7c80be1..60e8ba9 100644
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/api/ICursorInitialState.java
+++ b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/api/ICursorInitialState.java
@@ -19,6 +19,5 @@
 
 public interface ICursorInitialState {
 	public ICachedPage getPage();
-
 	public void setPage(ICachedPage page);
 }
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/api/ISlotManager.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/api/ISlotManager.java
index afdfb7c..2619493 100644
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/api/ISlotManager.java
+++ b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/api/ISlotManager.java
@@ -25,9 +25,9 @@
 			ITreeIndexTupleReference frameTuple, MultiComparator multiCmp,
 			FindTupleMode mode, FindTupleNoExactMatchPolicy matchPolicy);
 
-	public boolean isHighestTupleIndex(int tupleIndex);
+	public int getGreatestKeyIndicator();
 	
-	public boolean isErrorTupleIndex(int tupleIndex);
+	public int getErrorIndicator();
 
 	public void setFrame(ITreeIndexFrame frame);
 	
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/api/ITreeIndexFrame.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/api/ITreeIndexFrame.java
index 29ee967..5a9cb23 100644
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/api/ITreeIndexFrame.java
+++ b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/api/ITreeIndexFrame.java
@@ -25,15 +25,9 @@
 import edu.uci.ics.hyracks.storage.common.buffercache.ICachedPage;
 
 public interface ITreeIndexFrame {
-    public int findInsertTupleIndex(ITupleReference tuple, MultiComparator cmp) throws TreeIndexException;
+    public void insert(ITupleReference tuple, MultiComparator cmp, int tupleIndex);    
     
-    public void insert(ITupleReference tuple, MultiComparator cmp, int tupleIndex);
-
-    public int findUpdateTupleIndex(ITupleReference tuple, MultiComparator cmp) throws TreeIndexException;
-    
-    public void update(ITupleReference newTuple, int oldTupleIndex, boolean inPlace);
-
-    public int findDeleteTupleIndex(ITupleReference tuple, MultiComparator cmp) throws TreeIndexException;
+    public void update(ITupleReference newTuple, int oldTupleIndex, boolean inPlace);    
     
     public void delete(ITupleReference tuple, MultiComparator cmp, int tupleIndex);
 
@@ -71,8 +65,7 @@
     public String printKeys(MultiComparator cmp, ISerializerDeserializer[] fields) throws HyracksDataException;
 
     // TODO; what if tuples more than half-page size?
-    public int split(ITreeIndexFrame rightFrame, ITupleReference tuple, MultiComparator cmp, ISplitKey splitKey)
-            throws Exception;
+    public int split(ITreeIndexFrame rightFrame, ITupleReference tuple, MultiComparator cmp, ISplitKey splitKey) throws TreeIndexException;
 
     public ISlotManager getSlotManager();
 
@@ -88,11 +81,6 @@
 
     public void setLevel(byte level);
 
-    // structure modification flag
-    public boolean getSmFlag();
-
-    public void setSmFlag(boolean smFlag);
-
     public int getSlotSize();
 
     // for debugging
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/frames/AbstractSlotManager.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/frames/AbstractSlotManager.java
index 00fd584..a1a38ab 100644
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/frames/AbstractSlotManager.java
+++ b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/frames/AbstractSlotManager.java
@@ -20,6 +20,9 @@
 
 public abstract class AbstractSlotManager implements ISlotManager {
 	
+	protected final int GREATEST_KEY_INDICATOR = -1;
+    protected final int ERROR_INDICATOR = -2;
+	
 	protected static final int slotSize = 4;
 	protected ITreeIndexFrame frame;
 
@@ -58,4 +61,14 @@
 	public int getSlotOff(int tupleIndex) {
 		return getSlotStartOff() - tupleIndex * slotSize;
 	}
+	
+	@Override
+    public int getGreatestKeyIndicator() {
+        return GREATEST_KEY_INDICATOR;
+    }
+
+    @Override
+    public int getErrorIndicator() {
+        return ERROR_INDICATOR;
+    }
 }
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/frames/TreeIndexNSMFrame.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/frames/TreeIndexNSMFrame.java
index 6c02bbe..7ecaf17 100644
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/frames/TreeIndexNSMFrame.java
+++ b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/frames/TreeIndexNSMFrame.java
@@ -87,19 +87,6 @@
     }
 
     @Override
-    public boolean getSmFlag() {
-        return buf.get(smFlagOff) != 0;
-    }
-
-    @Override
-    public void setSmFlag(boolean smFlag) {
-        if (smFlag)
-            buf.put(smFlagOff, (byte) 1);
-        else
-            buf.put(smFlagOff, (byte) 0);
-    }
-
-    @Override
     public int getFreeSpaceOff() {
         return buf.getInt(freeSpaceOff);
     }
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/ophelpers/MultiComparator.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/ophelpers/MultiComparator.java
index 81da948..e46070b 100644
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/ophelpers/MultiComparator.java
+++ b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/ophelpers/MultiComparator.java
@@ -15,22 +15,14 @@
 
 package edu.uci.ics.hyracks.storage.am.common.ophelpers;
 
-import java.io.ByteArrayInputStream;
-import java.io.DataInput;
-import java.io.DataInputStream;
-
 import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparator;
-import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
 import edu.uci.ics.hyracks.api.dataflow.value.ITypeTrait;
-import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
 import edu.uci.ics.hyracks.dataflow.common.data.accessors.ITupleReference;
 import edu.uci.ics.hyracks.dataflow.common.data.comparators.IntegerBinaryComparatorFactory;
 import edu.uci.ics.hyracks.storage.am.common.api.IPrimitiveValueProvider;
 
 public class MultiComparator {
 
-	private static final long serialVersionUID = 1L;
-
 	private IBinaryComparator[] cmps = null;
 	private ITypeTrait[] typeTraits;
 	private IPrimitiveValueProvider[] valueProviders = null;
@@ -83,23 +75,6 @@
 		return 0;
 	}
 
-	public String printTuple(ITupleReference tuple,
-			ISerializerDeserializer[] fields) throws HyracksDataException {
-		StringBuilder strBuilder = new StringBuilder();
-		for (int i = 0; i < fields.length; i++) {
-			ByteArrayInputStream inStream = new ByteArrayInputStream(
-					tuple.getFieldData(i), tuple.getFieldStart(i),
-					tuple.getFieldLength(i));
-			DataInput dataIn = new DataInputStream(inStream);
-			Object o = fields[i].deserialize(dataIn);
-			strBuilder.append(o.toString());
-			if (i != fields.length - 1) {
-				strBuilder.append(" ");
-			}
-		}
-		return strBuilder.toString();
-	}
-
 	public IBinaryComparator[] getComparators() {
 		return cmps;
 	}
diff --git a/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/api/IRTreeFrame.java b/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/api/IRTreeFrame.java
index e3b9b96..10aba54 100644
--- a/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/api/IRTreeFrame.java
+++ b/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/api/IRTreeFrame.java
@@ -15,24 +15,16 @@
 
 package edu.uci.ics.hyracks.storage.am.rtree.api;
 
-import edu.uci.ics.hyracks.dataflow.common.data.accessors.ITupleReference;
 import edu.uci.ics.hyracks.storage.am.common.api.ISplitKey;
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexFrame;
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexTupleReference;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.MultiComparator;
-import edu.uci.ics.hyracks.storage.am.rtree.impls.Rectangle;
-import edu.uci.ics.hyracks.storage.am.rtree.impls.TupleEntryArrayList;
 
 public interface IRTreeFrame extends ITreeIndexFrame {
 
-	public ITreeIndexTupleReference createTupleReference();
-
 	public void computeMBR(ISplitKey splitKey, MultiComparator cmp);
 
-	public void insert(ITupleReference tuple, MultiComparator cmp,
-			int tupleIndex) throws Exception;
-
-	public void delete(int tupleIndex, MultiComparator cmp) throws Exception;
+	public void delete(int tupleIndex, MultiComparator cmp);
 
 	public int getPageNsn();
 
diff --git a/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/frames/RTreeNSMInteriorFrame.java b/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/frames/RTreeNSMInteriorFrame.java
index 18c0d38..802a48c 100644
--- a/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/frames/RTreeNSMInteriorFrame.java
+++ b/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/frames/RTreeNSMInteriorFrame.java
@@ -29,6 +29,7 @@
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexFrame;
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexTupleReference;
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexTupleWriter;
+import edu.uci.ics.hyracks.storage.am.common.api.TreeIndexException;
 import edu.uci.ics.hyracks.storage.am.common.frames.FrameOpSpaceStatus;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.MultiComparator;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.SlotOffTupleOff;
@@ -294,11 +295,11 @@
     }
 
     @Override
-    public int split(ITreeIndexFrame rightFrame, ITupleReference tuple, MultiComparator cmp, ISplitKey splitKey)
-            throws Exception {
+    public int split(ITreeIndexFrame rightFrame, ITupleReference tuple, MultiComparator cmp, ISplitKey splitKey) throws TreeIndexException {
 
-        rightFrame.setPageTupleFieldCount(cmp.getKeyFieldCount());
-        frameTuple.setFieldCount(cmp.getKeyFieldCount());
+    	// TODO: ALEX
+        //rightFrame.setPageTupleFieldCount(cmp.getKeyFieldCount());
+        //frameTuple.setFieldCount(cmp.getKeyFieldCount());
 
         RTreeSplitKey rTreeSplitKey = ((RTreeSplitKey) splitKey);
         RTreeTypeAwareTupleWriter rTreeTupleWriterLeftFrame = ((RTreeTypeAwareTupleWriter) tupleWriter);
@@ -457,7 +458,7 @@
     }
 
     @Override
-    public void insert(ITupleReference tuple, MultiComparator cmp, int tupleIndex) throws Exception {
+    public void insert(ITupleReference tuple, MultiComparator cmp, int tupleIndex) {
         frameTuple.setFieldCount(cmp.getKeyFieldCount());
         slotManager.insertSlot(-1, buf.getInt(freeSpaceOff));
         int freeSpace = buf.getInt(freeSpaceOff);
@@ -473,7 +474,7 @@
     }
 
     @Override
-    public void delete(int tupleIndex, MultiComparator cmp) throws Exception {
+    public void delete(int tupleIndex, MultiComparator cmp) {
         frameTuple.setFieldCount(cmp.getKeyFieldCount());
         int slotOff = slotManager.getSlotOff(tupleIndex);
 
diff --git a/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/frames/RTreeNSMLeafFrame.java b/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/frames/RTreeNSMLeafFrame.java
index ed366ca..71ffea1 100644
--- a/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/frames/RTreeNSMLeafFrame.java
+++ b/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/frames/RTreeNSMLeafFrame.java
@@ -20,6 +20,7 @@
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexFrame;
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexTupleReference;
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexTupleWriter;
+import edu.uci.ics.hyracks.storage.am.common.api.TreeIndexException;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.MultiComparator;
 import edu.uci.ics.hyracks.storage.am.rtree.api.IRTreeFrame;
 import edu.uci.ics.hyracks.storage.am.rtree.api.IRTreeLeafFrame;
@@ -64,11 +65,11 @@
     }
 
     @Override
-    public int split(ITreeIndexFrame rightFrame, ITupleReference tuple, MultiComparator cmp, ISplitKey splitKey)
-            throws Exception {
+    public int split(ITreeIndexFrame rightFrame, ITupleReference tuple, MultiComparator cmp, ISplitKey splitKey) throws TreeIndexException {
 
-        rightFrame.setPageTupleFieldCount(cmp.getFieldCount());
-        frameTuple.setFieldCount(cmp.getFieldCount());
+        // TODO: ALEX CHANGES
+    	//rightFrame.setPageTupleFieldCount(cmp.getFieldCount());
+        //frameTuple.setFieldCount(cmp.getFieldCount());
 
         RTreeSplitKey rTreeSplitKey = ((RTreeSplitKey) splitKey);
         RTreeTypeAwareTupleWriter rTreeTupleWriterLeftFrame = ((RTreeTypeAwareTupleWriter) tupleWriter);
@@ -224,7 +225,7 @@
     }
 
     @Override
-    public void insert(ITupleReference tuple, MultiComparator cmp, int tupleIndex) throws Exception {
+    public void insert(ITupleReference tuple, MultiComparator cmp, int tupleIndex) {
         frameTuple.setFieldCount(cmp.getFieldCount());
         slotManager.insertSlot(-1, buf.getInt(freeSpaceOff));
         int bytesWritten = tupleWriter.writeTuple(tuple, buf.array(), buf.getInt(freeSpaceOff));
@@ -235,7 +236,7 @@
     }
 
     @Override
-    public void delete(int tupleIndex, MultiComparator cmp) throws Exception {
+    public void delete(int tupleIndex, MultiComparator cmp) {
         frameTuple.setFieldCount(cmp.getFieldCount());
         int slotOff = slotManager.getSlotOff(tupleIndex);
 
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 d0afcc7..d47ba10 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
@@ -26,13 +26,14 @@
 import edu.uci.ics.hyracks.dataflow.common.data.accessors.ITupleReference;
 import edu.uci.ics.hyracks.storage.am.common.api.IFreePageManager;
 import edu.uci.ics.hyracks.storage.am.common.api.IIndexBulkLoadContext;
+import edu.uci.ics.hyracks.storage.am.common.api.IIndexOpContext;
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndex;
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexCursor;
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexFrame;
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexMetaDataFrame;
-import edu.uci.ics.hyracks.storage.am.common.api.IIndexOpContext;
 import edu.uci.ics.hyracks.storage.am.common.api.IndexType;
+import edu.uci.ics.hyracks.storage.am.common.api.TreeIndexException;
 import edu.uci.ics.hyracks.storage.am.common.frames.FrameOpSpaceStatus;
 import edu.uci.ics.hyracks.storage.am.common.impls.TreeDiskOrderScanCursor;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.IndexOp;
@@ -196,7 +197,7 @@
     }
 
     @Override
-    public void create(int fileId, ITreeIndexFrame leafFrame, ITreeIndexMetaDataFrame metaFrame) throws Exception {
+    public void create(int fileId, ITreeIndexFrame leafFrame, ITreeIndexMetaDataFrame metaFrame) throws HyracksDataException {
         if (created)
             return;
 
@@ -246,15 +247,15 @@
     }
 
     @Override
-    public void insert(ITupleReference tuple, IIndexOpContext ictx) throws Exception {
+    public void insert(ITupleReference tuple, IIndexOpContext ictx) throws HyracksDataException, TreeIndexException {
         RTreeOpContext ctx = (RTreeOpContext) ictx;
         ctx.reset();
         ctx.setTuple(tuple);
         ctx.splitKey.reset();
         ctx.splitKey.getLeftTuple().setFieldCount(cmp.getKeyFieldCount());
         ctx.splitKey.getRightTuple().setFieldCount(cmp.getKeyFieldCount());
-        ctx.interiorFrame.setPageTupleFieldCount(cmp.getKeyFieldCount());
-        ctx.leafFrame.setPageTupleFieldCount(cmp.getFieldCount());
+        //ctx.interiorFrame.setPageTupleFieldCount(cmp.getKeyFieldCount());
+        //ctx.leafFrame.setPageTupleFieldCount(cmp.getFieldCount());
 
         int maxFieldPos = cmp.getKeyFieldCount() / 2;
         for (int i = 0; i < maxFieldPos; i++) {
@@ -286,7 +287,7 @@
         incrementUnpins();
     }
 
-    public ICachedPage findLeaf(RTreeOpContext ctx) throws Exception {
+    public ICachedPage findLeaf(RTreeOpContext ctx) throws HyracksDataException {
         int pageId = rootPage;
         boolean writeLatched = false;
         ICachedPage node = null;
@@ -396,7 +397,7 @@
     }
 
     private void insertTuple(ICachedPage node, int pageId, ITupleReference tuple, RTreeOpContext ctx, boolean isLeaf)
-            throws Exception {
+            throws HyracksDataException, TreeIndexException {
     	FrameOpSpaceStatus spaceStatus;
         if (!isLeaf) {
             spaceStatus = ctx.interiorFrame.hasSpaceInsert(tuple, cmp);
@@ -451,7 +452,7 @@
                         rightFrame = (IRTreeFrame) interiorFrameFactory.createFrame();
                         rightFrame.setPage(rightNode);
                         rightFrame.initBuffer((byte) ctx.interiorFrame.getLevel());
-                        rightFrame.setPageTupleFieldCount(cmp.getKeyFieldCount());
+                        //rightFrame.setPageTupleFieldCount(cmp.getKeyFieldCount());
                         ret = ctx.interiorFrame.split(rightFrame, tuple, cmp, ctx.splitKey);
                         ctx.interiorFrame.setRightPage(rightPageId);
                         rightFrame.setPageNsn(ctx.interiorFrame.getPageNsn());
@@ -465,7 +466,7 @@
                         rightFrame = (IRTreeFrame) leafFrameFactory.createFrame();
                         rightFrame.setPage(rightNode);
                         rightFrame.initBuffer((byte) 0);
-                        rightFrame.setPageTupleFieldCount(cmp.getFieldCount());
+                        //rightFrame.setPageTupleFieldCount(cmp.getFieldCount());
                         ret = ctx.leafFrame.split(rightFrame, tuple, cmp, ctx.splitKey);
                         ctx.leafFrame.setRightPage(rightPageId);
                         rightFrame.setPageNsn(ctx.leafFrame.getPageNsn());
@@ -529,7 +530,7 @@
         }
     }
 
-    public void updateParentForInsert(RTreeOpContext ctx) throws Exception {
+    public void updateParentForInsert(RTreeOpContext ctx) throws HyracksDataException, TreeIndexException {
         int parentId = ctx.pathList.getLastPageId();
         ICachedPage parentNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, parentId), false);
         incrementPins();
@@ -585,7 +586,7 @@
         updateParentForInsert(ctx);
     }
 
-    public void findPath(RTreeOpContext ctx) throws Exception {
+    public void findPath(RTreeOpContext ctx) throws HyracksDataException {
         int pageId = rootPage;
         int parentIndex = -1;
         int parentLsn = 0;
@@ -630,7 +631,7 @@
         }
     }
 
-    public void fillPath(RTreeOpContext ctx, int pageIndex) throws Exception {
+    public void fillPath(RTreeOpContext ctx, int pageIndex) {
         if (pageIndex != -1) {
             fillPath(ctx, ctx.traverseList.getPageIndex(pageIndex));
             ctx.pathList.add(ctx.traverseList.getPageId(pageIndex), ctx.traverseList.getPageLsn(pageIndex), -1);
@@ -638,14 +639,14 @@
     }
 
     @Override
-    public void delete(ITupleReference tuple, IIndexOpContext ictx) throws Exception {
+    public void delete(ITupleReference tuple, IIndexOpContext ictx) throws HyracksDataException, TreeIndexException {
         RTreeOpContext ctx = (RTreeOpContext) ictx;
         ctx.reset();
         ctx.setTuple(tuple);
         ctx.splitKey.reset();
         ctx.splitKey.getLeftTuple().setFieldCount(cmp.getKeyFieldCount());
-        ctx.interiorFrame.setPageTupleFieldCount(cmp.getKeyFieldCount());
-        ctx.leafFrame.setPageTupleFieldCount(cmp.getFieldCount());
+        //ctx.interiorFrame.setPageTupleFieldCount(cmp.getKeyFieldCount());
+        //ctx.leafFrame.setPageTupleFieldCount(cmp.getFieldCount());
 
         int tupleIndex = findTupleToDelete(ctx);
 
@@ -669,7 +670,7 @@
         }
     }
 
-    public void updateParentForDelete(RTreeOpContext ctx) throws Exception {
+    public void updateParentForDelete(RTreeOpContext ctx) throws HyracksDataException {
         int parentId = ctx.pathList.getLastPageId();
         ICachedPage parentNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, parentId), false);
         incrementPins();
@@ -745,7 +746,7 @@
         updateParentForDelete(ctx);
     }
 
-    public int findTupleToDelete(RTreeOpContext ctx) throws Exception {
+    public int findTupleToDelete(RTreeOpContext ctx) throws HyracksDataException {
 
         ctx.traverseList.add(rootPage, -1, -1);
         ctx.pathList.add(rootPage, -1, ctx.traverseList.size() - 1);
@@ -831,7 +832,7 @@
         return -1;
     }
 
-    public void deleteTuple(int pageId, int tupleIndex, RTreeOpContext ctx) throws Exception {
+    public void deleteTuple(int pageId, int tupleIndex, RTreeOpContext ctx) throws HyracksDataException {
         ctx.leafFrame.delete(tupleIndex, cmp);
         incrementGlobalNsn();
         ctx.leafFrame.setPageLsn(getGlobalNsn());
@@ -870,8 +871,8 @@
     }
 
     @Override
-    public void update(ITupleReference tuple, IIndexOpContext ictx) throws Exception {
-        throw new Exception("RTree Update not implemented.");
+    public void update(ITupleReference tuple, IIndexOpContext ictx) {
+        throw new UnsupportedOperationException("RTree Update not implemented.");
     }
 
     public final class BulkLoadContext implements IIndexBulkLoadContext {
diff --git a/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/impls/UnorderedSlotManager.java b/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/impls/UnorderedSlotManager.java
index 7badb8e..dc8c758 100644
--- a/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/impls/UnorderedSlotManager.java
+++ b/hyracks-storage-am-rtree/src/main/java/edu/uci/ics/hyracks/storage/am/rtree/impls/UnorderedSlotManager.java
@@ -24,6 +24,7 @@
 import edu.uci.ics.hyracks.storage.am.rtree.frames.RTreeNSMFrame;
 
 public class UnorderedSlotManager extends AbstractSlotManager {
+	
 	@Override
 	public int findTupleIndex(ITupleReference searchKey,
 			ITreeIndexTupleReference frameTuple, MultiComparator multiCmp,
diff --git a/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/btree/BTreeTest.java b/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/btree/BTreeTest.java
index 7d5ea18..3b3819f 100644
--- a/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/btree/BTreeTest.java
+++ b/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/btree/BTreeTest.java
@@ -45,6 +45,7 @@
 import edu.uci.ics.hyracks.dataflow.common.data.comparators.UTF8StringBinaryComparatorFactory;
 import edu.uci.ics.hyracks.dataflow.common.data.marshalling.IntegerSerializerDeserializer;
 import edu.uci.ics.hyracks.dataflow.common.data.marshalling.UTF8StringSerializerDeserializer;
+import edu.uci.ics.hyracks.dataflow.common.util.TupleUtils;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeInteriorFrame;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeLeafFrame;
 import edu.uci.ics.hyracks.storage.am.btree.frames.BTreeNSMInteriorFrameFactory;
@@ -200,7 +201,7 @@
             while (scanCursor.hasNext()) {
                 scanCursor.next();
                 ITupleReference frameTuple = scanCursor.getTuple();
-                String rec = cmp.printTuple(frameTuple, recDescSers);
+                String rec = TupleUtils.printTuple(frameTuple, recDescSers);
                 LOGGER.info(rec);
             }
         } catch (Exception e) {
@@ -218,7 +219,7 @@
             while (diskOrderCursor.hasNext()) {
                 diskOrderCursor.next();
                 ITupleReference frameTuple = diskOrderCursor.getTuple();
-                String rec = cmp.printTuple(frameTuple, recDescSers);
+                String rec = TupleUtils.printTuple(frameTuple, recDescSers);
                 LOGGER.info(rec);
             }
         } catch (Exception e) {
@@ -273,7 +274,7 @@
             while (rangeCursor.hasNext()) {
                 rangeCursor.next();
                 ITupleReference frameTuple = rangeCursor.getTuple();
-                String rec = cmp.printTuple(frameTuple, recDescSers);
+                String rec = TupleUtils.printTuple(frameTuple, recDescSers);
                 LOGGER.info(rec);
             }
         } catch (Exception e) {
@@ -405,7 +406,7 @@
             while (scanCursor.hasNext()) {
                 scanCursor.next();
                 ITupleReference frameTuple = scanCursor.getTuple();
-                String rec = cmp.printTuple(frameTuple, recDescSers);
+                String rec = TupleUtils.printTuple(frameTuple, recDescSers);
                 LOGGER.info(rec);
             }
         } catch (Exception e) {
@@ -465,7 +466,7 @@
             while (rangeCursor.hasNext()) {
                 rangeCursor.next();
                 ITupleReference frameTuple = rangeCursor.getTuple();
-                String rec = cmp.printTuple(frameTuple, recDescSers);
+                String rec = TupleUtils.printTuple(frameTuple, recDescSers);
                 LOGGER.info(rec);
             }
         } catch (Exception e) {
@@ -583,7 +584,7 @@
             while (scanCursor.hasNext()) {
                 scanCursor.next();
                 ITupleReference frameTuple = scanCursor.getTuple();
-                String rec = cmp.printTuple(frameTuple, recDescSers);
+                String rec = TupleUtils.printTuple(frameTuple, recDescSers);
                 LOGGER.info(rec);
             }
         } catch (Exception e) {
@@ -638,7 +639,7 @@
             while (rangeCursor.hasNext()) {
                 rangeCursor.next();
                 ITupleReference frameTuple = rangeCursor.getTuple();
-                String rec = cmp.printTuple(frameTuple, recDescSers);
+                String rec = TupleUtils.printTuple(frameTuple, recDescSers);
                 LOGGER.info(rec);
             }
         } catch (Exception e) {
@@ -825,7 +826,7 @@
             while (scanCursor.hasNext()) {
                 scanCursor.next();
                 ITupleReference frameTuple = scanCursor.getTuple();
-                String rec = btree.getMultiComparator().printTuple(frameTuple, recDescSers);
+                String rec = TupleUtils.printTuple(frameTuple, recDescSers);
                 scanResults.append("\n" + rec);
             }
         } catch (Exception e) {
@@ -1162,7 +1163,7 @@
             while (rangeCursor.hasNext()) {
                 rangeCursor.next();
                 ITupleReference frameTuple = rangeCursor.getTuple();
-                String rec = cmp.printTuple(frameTuple, recDescSers);
+                String rec = TupleUtils.printTuple(frameTuple, recDescSers);
                 LOGGER.info(rec);
             }
         } catch (Exception e) {
@@ -1318,7 +1319,7 @@
             while (scanCursor.hasNext()) {
                 scanCursor.next();
                 ITupleReference frameTuple = scanCursor.getTuple();
-                String rec = cmp.printTuple(frameTuple, recDescSers);
+                String rec = TupleUtils.printTuple(frameTuple, recDescSers);
                 // TODO: fix me.
                 //print(rec + "\n");
             }
@@ -1379,7 +1380,7 @@
             while (rangeCursor.hasNext()) {
                 rangeCursor.next();
                 ITupleReference frameTuple = rangeCursor.getTuple();
-                String rec = cmp.printTuple(frameTuple, recDescSers);
+                String rec = TupleUtils.printTuple(frameTuple, recDescSers);
                 LOGGER.info(rec);
             }
         } catch (Exception e) {
diff --git a/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/btree/util/BTreeTestUtils.java b/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/btree/util/BTreeTestUtils.java
index 7929db1..aa363aa 100644
--- a/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/btree/util/BTreeTestUtils.java
+++ b/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/btree/util/BTreeTestUtils.java
@@ -287,7 +287,7 @@
                 tupleValues[j] = j;
             }
             TupleUtils.createIntegerTuple(testCtx.tupleBuilder, testCtx.tuple, tupleValues);
-            if ((i + 1) % (numTuples / 10) == 0) {
+            if ((i + 1) % (numTuples / Math.min(10, numTuples)) == 0) {
                 LOGGER.info("Inserting Tuple " + (i + 1) + "/" + numTuples);
             }
             try {
@@ -311,7 +311,7 @@
         BTreeOpContext insertOpCtx = testCtx.btree.createOpContext(IndexOp.INSERT, testCtx.leafFrame, testCtx.interiorFrame, testCtx.metaFrame);
         Object[] tupleValues = new Object[numFields];
         for (int i = 0; i < numTuples; i++) {
-            if ((i + 1) % (numTuples / 10) == 0) {
+            if ((i + 1) % (numTuples / Math.min(10, numTuples)) == 0) {
                 LOGGER.info("Inserting Tuple " + (i + 1) + "/" + numTuples);
             }
             // Set keys.
@@ -419,7 +419,7 @@
             checkTuples[idx++] = checkTuple;
         }
         for (int i = 0; i < numTuples && numCheckTuples > 0; i++) {
-            if ((i + 1) % (numTuples / 10) == 0) {
+            if ((i + 1) % (numTuples / Math.min(10, numTuples)) == 0) {
                 LOGGER.info("Deleting Tuple " + (i + 1) + "/" + numTuples);
             }
             int checkTupleIdx = Math.abs(rnd.nextInt() % numCheckTuples);
@@ -457,7 +457,7 @@
             checkTuples[idx++] = checkTuple;
         }
         for (int i = 0; i < numTuples && numCheckTuples > 0; i++) {
-            if ((i + 1) % (numTuples / 10) == 0) {
+            if ((i + 1) % (numTuples / Math.min(10, numTuples)) == 0) {
                 LOGGER.info("Updating Tuple " + (i + 1) + "/" + numTuples);
             }
             int checkTupleIdx = Math.abs(rnd.nextInt() % numCheckTuples);
diff --git a/hyracks-tests/hyracks-storage-am-rtree-test/src/test/java/edu/uci/ics/hyracks/storage/am/rtree/RTreeTest.java b/hyracks-tests/hyracks-storage-am-rtree-test/src/test/java/edu/uci/ics/hyracks/storage/am/rtree/RTreeTest.java
index 907d5dc..91388f5 100644
--- a/hyracks-tests/hyracks-storage-am-rtree-test/src/test/java/edu/uci/ics/hyracks/storage/am/rtree/RTreeTest.java
+++ b/hyracks-tests/hyracks-storage-am-rtree-test/src/test/java/edu/uci/ics/hyracks/storage/am/rtree/RTreeTest.java
@@ -39,6 +39,7 @@
 import edu.uci.ics.hyracks.dataflow.common.data.comparators.IntegerBinaryComparatorFactory;
 import edu.uci.ics.hyracks.dataflow.common.data.marshalling.DoubleSerializerDeserializer;
 import edu.uci.ics.hyracks.dataflow.common.data.marshalling.IntegerSerializerDeserializer;
+import edu.uci.ics.hyracks.dataflow.common.util.TupleUtils;
 import edu.uci.ics.hyracks.storage.am.common.api.IFreePageManager;
 import edu.uci.ics.hyracks.storage.am.common.api.IPrimitiveValueProvider;
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
@@ -239,7 +240,7 @@
 			while (diskOrderCursor.hasNext()) {
 				diskOrderCursor.next();
 				ITupleReference frameTuple = diskOrderCursor.getTuple();
-				String rec = cmp.printTuple(frameTuple, recDescSers);
+				String rec = TupleUtils.printTuple(frameTuple, recDescSers);
 				print(rec + "\n");
 			}
 		} catch (Exception e) {
@@ -662,7 +663,7 @@
 			while (diskOrderCursor.hasNext()) {
 				diskOrderCursor.next();
 				ITupleReference frameTuple = diskOrderCursor.getTuple();
-				String rec = cmp.printTuple(frameTuple, recDescSers);
+				String rec = TupleUtils.printTuple(frameTuple, recDescSers);
 				print(rec + "\n");
 			}
 		} catch (Exception e) {
@@ -850,7 +851,7 @@
 			while (diskOrderCursor.hasNext()) {
 				diskOrderCursor.next();
 				ITupleReference frameTuple = diskOrderCursor.getTuple();
-				String rec = cmp.printTuple(frameTuple, recDescSers);
+				String rec = TupleUtils.printTuple(frameTuple, recDescSers);
 				print(rec + "\n");
 			}
 		} catch (Exception e) {