Cleaned some more and added some Javadocs.

git-svn-id: https://hyracks.googlecode.com/svn/branches/hyracks_btree_updates_next@645 123451ca-8445-de46-9d55-352943316053
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 3ba30ba..190e2b4 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
@@ -15,14 +15,10 @@
 
 package edu.uci.ics.hyracks.storage.am.btree.frames;
 
-import java.io.ByteArrayInputStream;
-import java.io.DataInput;
-import java.io.DataInputStream;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collections;
 
-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;
@@ -267,8 +263,6 @@
     public FrameOpSpaceStatus hasSpaceUpdate(ITupleReference newTuple, int oldTupleIndex) {
         int tupleIndex = slotManager.decodeSecondSlotField(oldTupleIndex);
         frameTuple.resetByTupleIndex(this, tupleIndex);
-        // TODO: Do we need to set the field count here?
-        //frameTuple.setFieldCount(cmp.getFieldCount());
         
         int oldTupleBytes = 0;
         int newTupleBytes = 0;
@@ -341,7 +335,7 @@
 
     @Override
     public void initBuffer(byte level) {
-        buf.putInt(pageLsnOff, 0); // TODO: might to set to a different lsn
+        buf.putInt(pageLsnOff, 0);
         // during creation
         buf.putInt(tupleCountOff, 0);
         resetSpaceParams();
@@ -413,26 +407,6 @@
     }
 
     @Override
-    public String printKeys(MultiComparator cmp, ISerializerDeserializer[] fields) throws HyracksDataException {
-        StringBuilder strBuilder = new StringBuilder();
-        int tupleCount = buf.getInt(tupleCountOff);
-        frameTuple.setFieldCount(fields.length);
-        for (int i = 0; i < tupleCount; i++) {
-            frameTuple.resetByTupleIndex(this, i);
-            for (int j = 0; j < cmp.getKeyFieldCount(); j++) {
-                ByteArrayInputStream inStream = new ByteArrayInputStream(frameTuple.getFieldData(j),
-                        frameTuple.getFieldStart(j), frameTuple.getFieldLength(j));
-                DataInput dataIn = new DataInputStream(inStream);
-                Object o = fields[j].deserialize(dataIn);
-                strBuilder.append(o.toString() + " ");
-            }
-            strBuilder.append(" | ");
-        }
-        strBuilder.append("\n");
-        return strBuilder.toString();
-    }
-
-    @Override
     public int getTupleOffset(int slotNum) {
         int tupleSlotOff = slotManager.getTupleSlotOff(slotNum);
         int tupleSlot = buf.getInt(tupleSlotOff);
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 995c447..3c510ec 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
@@ -43,6 +43,7 @@
 import edu.uci.ics.hyracks.storage.am.common.impls.TreeDiskOrderScanCursor;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.IndexOp;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.MultiComparator;
+import edu.uci.ics.hyracks.storage.am.common.util.TreeIndexUtils;
 import edu.uci.ics.hyracks.storage.common.buffercache.IBufferCache;
 import edu.uci.ics.hyracks.storage.common.buffercache.ICachedPage;
 import edu.uci.ics.hyracks.storage.common.file.BufferedFileHandle;
@@ -1082,17 +1083,17 @@
     }
     
     @SuppressWarnings("rawtypes") 
-    public String printTree(IBTreeLeafFrame leafFrame, IBTreeInteriorFrame interiorFrame, ISerializerDeserializer[] fieldSerdes)
+    public String printTree(IBTreeLeafFrame leafFrame, IBTreeInteriorFrame interiorFrame, ISerializerDeserializer[] keySerdes)
             throws Exception {
         byte treeHeight = getTreeHeight(leafFrame);
         StringBuilder strBuilder = new StringBuilder();
-        printTree(rootPage, null, false, leafFrame, interiorFrame, treeHeight, fieldSerdes, strBuilder);
+        printTree(rootPage, null, false, leafFrame, interiorFrame, treeHeight, keySerdes, strBuilder);
         return strBuilder.toString();
     }
 
     @SuppressWarnings("rawtypes") 
     public void printTree(int pageId, ICachedPage parent, boolean unpin, IBTreeLeafFrame leafFrame,
-            IBTreeInteriorFrame interiorFrame, byte treeHeight, ISerializerDeserializer[] fieldSerdes, StringBuilder strBuilder) throws Exception {
+            IBTreeInteriorFrame interiorFrame, byte treeHeight, ISerializerDeserializer[] keySerdes, StringBuilder strBuilder) throws Exception {
         ICachedPage node = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, pageId), false);
         node.acquireReadLatch();
         try {
@@ -1111,16 +1112,16 @@
             String keyString;
             if (interiorFrame.isLeaf()) {
                 leafFrame.setPage(node);
-                keyString = leafFrame.printKeys(cmp, fieldSerdes);
+                keyString = TreeIndexUtils.printFrameTuples(leafFrame, keySerdes);
             } else {
-                keyString = interiorFrame.printKeys(cmp, fieldSerdes);
+                keyString = TreeIndexUtils.printFrameTuples(interiorFrame, keySerdes);
             }
 
             strBuilder.append(keyString);
             if (!interiorFrame.isLeaf()) {
                 ArrayList<Integer> children = ((BTreeNSMInteriorFrame) (interiorFrame)).getChildren(cmp);
                 for (int i = 0; i < children.size(); i++) {
-                    printTree(children.get(i), node, i == children.size() - 1, leafFrame, interiorFrame, treeHeight, fieldSerdes, strBuilder);
+                    printTree(children.get(i), node, i == children.size() - 1, leafFrame, interiorFrame, treeHeight, keySerdes, strBuilder);
                 }
             } else {
                 node.releaseReadLatch();
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/api/ITreeIndex.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/api/ITreeIndex.java
index 6fe5219..1db33c1 100644
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/api/ITreeIndex.java
+++ b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/api/ITreeIndex.java
@@ -20,64 +20,203 @@
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.IndexOp;
 
 /**
- * Interface implemented by tree-based index structures, describing their
- * supported operations. Indexes implementing this interface can easily reuse
- * the tree index operators for dataflow.
+ * Interface describing the operations of tree-based index structures. Indexes
+ * implementing this interface can easily reuse the tree index operators for
+ * dataflow. We assume that indexes store tuples with a fixed number of fields.
  */
 public interface ITreeIndex {
-	// init:
 
+	/**
+	 * Initializes the persistent state of a tree index, e.g., the root page,
+	 * and metadata pages.
+	 * 
+	 * @param indexFileId
+	 *            The file id to use for this index.
+	 * @param leafFrame
+	 *            Leaf frame to use for initializing the root.
+	 * @param metaFrame
+	 *            Metadata frame to use for initializing metadata information.
+	 * @throws HyracksDataException
+	 *             If the BufferCache throws while un/pinning or un/latching.
+	 */
 	public void create(int indexFileId, ITreeIndexFrame leafFrame,
 			ITreeIndexMetaDataFrame metaFrame) throws HyracksDataException;
 
+	/**
+	 * Opens the tree index backed by the given file id.
+	 * 
+	 * @param indexFileId
+	 *            The file id backing this index.
+	 */
 	public void open(int indexFileId);
 
+	/**
+	 * Closes the tree index.
+	 */
 	public void close();
 
-	// operations:
-
-	public void insert(ITupleReference tuple, IIndexOpContext ictx)
-			throws HyracksDataException, TreeIndexException;
-
-	public void update(ITupleReference tuple, IIndexOpContext ictx)
-			throws HyracksDataException, TreeIndexException;
-
-	public void delete(ITupleReference tuple, IIndexOpContext ictx)
-			throws HyracksDataException, TreeIndexException;
-
+	/**
+	 * Creates an operation context for a given index operation
+	 * (insert/delete/update/search/diskorderscan). An operation context
+	 * maintains a cache of objects used during the traversal of the tree index.
+	 * The context is intended to be reused for multiple subsequent operations
+	 * by the same user/thread.
+	 * 
+	 * @param indexOp
+	 *            Intended index operation.
+	 * @param leafFrame
+	 *            Leaf frame for interpreting leaf pages.
+	 * @param interiorFrame
+	 *            Interior frame for interpreting interior pages.
+	 * @param metaFrame
+	 *            Metadata frame for interpreting metadata pages.
+	 * @returns IITreeIndexOpContext Operation context for the desired index
+	 *          operation.
+	 */
 	public IIndexOpContext createOpContext(IndexOp op,
 			ITreeIndexFrame leafFrame, ITreeIndexFrame interiorFrame,
 			ITreeIndexMetaDataFrame metaFrame);
+	
+	/**
+	 * Inserts the given tuple into the index using an existing operation
+	 * context.
+	 * 
+	 * @param tuple
+	 *            Tuple to be inserted.
+	 * @param ictx
+	 *            Existing operation context.
+	 * @throws HyracksDataException
+	 *             If the BufferCache throws while un/pinning or un/latching.
+	 * @throws TreeIndexException
+	 *             If an index-specific constraint is violated, e.g., the key
+	 *             already exists.
+	 */
+	public void insert(ITupleReference tuple, IIndexOpContext ictx)
+			throws HyracksDataException, TreeIndexException;
 
-	// bulk loading:
+	/**
+	 * Updates the tuple in the index matching the given tuple with the new
+	 * contents in the given tuple.
+	 * 
+	 * @param tuple
+	 *            Tuple whose match in the index is to be update with the given
+	 *            tuples contents.
+	 * @param ictx
+	 *            Existing operation context.
+	 * @throws HyracksDataException
+	 *             If the BufferCache throws while un/pinning or un/latching.
+	 * @throws TreeIndexException
+	 *             If there is no matching tuple in the index.
+	 */
+	public void update(ITupleReference tuple, IIndexOpContext ictx)
+			throws HyracksDataException, TreeIndexException;
 
+	/**
+	 * Deletes the tuple in the index matching the given tuple.
+	 * 
+	 * @param tuple
+	 *            Tuple to be deleted.
+	 * @param ictx
+	 *            Existing operation context.
+	 * @throws HyracksDataException
+	 *             If the BufferCache throws while un/pinning or un/latching.
+	 * @throws TreeIndexException
+	 *             If there is no matching tuple in the index.
+	 */
+	public void delete(ITupleReference tuple, IIndexOpContext ictx)
+			throws HyracksDataException, TreeIndexException;
+
+	/**
+	 * Prepares the index for bulk loading, returning a bulk load context. The
+	 * index must be empty for bulk loading to be possible.
+	 * 
+	 * @param fillFactor
+	 *            Desired fill factor in [0, 1.0].
+	 * @param leafFrame
+	 *            Leaf frame for filling leaf pages.
+	 * @param interiorFrame
+	 *            Interior frame for filling interior pages.
+	 * @param metaFrame
+	 *            Metadata frame for accessing metadata pages.
+	 * @throws HyracksDataException
+	 *             If the BufferCache throws while un/pinning or un/latching.
+	 * @throws TreeIndexException
+	 *             If the tree is not empty.
+	 * @returns A new context for bulk loading, required for appending tuples.
+	 */
 	public IIndexBulkLoadContext beginBulkLoad(float fillFactor,
 			ITreeIndexFrame leafFrame, ITreeIndexFrame interiorFrame,
 			ITreeIndexMetaDataFrame metaFrame) throws TreeIndexException,
 			HyracksDataException;
 
+	/**
+	 * Append a tuple to the index in the context of a bulk load.
+	 * 
+	 * @param tuple
+	 *            Tuple to be inserted.
+	 * @param ictx
+	 *            Existing bulk load context.
+	 * @throws HyracksDataException
+	 *             If the BufferCache throws while un/pinning or un/latching.
+	 */
 	public void bulkLoadAddTuple(ITupleReference tuple,
 			IIndexBulkLoadContext ictx) throws HyracksDataException;
 
+	/**
+	 * Finalize the bulk loading operation in the given context.
+	 * 
+	 * @param ictx
+	 *            Existing bulk load context to be finalized.
+	 * @throws HyracksDataException
+	 *             If the BufferCache throws while un/pinning or un/latching.
+	 */
 	public void endBulkLoad(IIndexBulkLoadContext ictx)
 			throws HyracksDataException;
 
-	// search:
+	/**
+	 * Open the given cursor for a disk-order scan, positioning the cursor to
+	 * the first leaf tuple.
+	 * 
+	 * @param leafFrame
+	 *            Leaf frame for interpreting leaf pages.
+	 * @param metaFrame
+	 *            Metadata frame for interpreting metadata pages.
+	 * @param ictx
+	 *            Existing operation context.
+	 * @throws HyracksDataException
+	 *             If the BufferCache throws while un/pinning or un/latching.
+	 */
 	public void diskOrderScan(ITreeIndexCursor icursor,
 			ITreeIndexFrame leafFrame, ITreeIndexMetaDataFrame metaFrame,
 			IIndexOpContext ictx) throws HyracksDataException;
-
-	// utility:
-
-	public IFreePageManager getFreePageManager();
-
+	
+	/**
+	 * @return The index's leaf frame factory.
+	 */
 	public ITreeIndexFrameFactory getLeafFrameFactory();
 
+	/**
+	 * @return The index's interior frame factory.
+	 */
 	public ITreeIndexFrameFactory getInteriorFrameFactory();
-
-	public int getRootPageId();
 	
-	public int getFieldCount();
+	/**
+	 * @return The index's free page manager.
+	 */
+	public IFreePageManager getFreePageManager();
 
+	/**
+	 * @return The number of fields tuples of this index have.
+	 */
+	public int getFieldCount();
+	
+	/**
+	 * @return The current root page id of this index.
+	 */
+	public int getRootPageId();
+
+	/**
+	 * @return An enum of the concrete type of this index.
+	 */
 	public IndexType getIndexType();
 }
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 01ea75f..76e19b5 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
@@ -17,11 +17,9 @@
 
 import java.nio.ByteBuffer;
 
-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.common.frames.FrameOpSpaceStatus;
-import edu.uci.ics.hyracks.storage.am.common.ophelpers.MultiComparator;
 import edu.uci.ics.hyracks.storage.common.buffercache.ICachedPage;
 
 public interface ITreeIndexFrame {
@@ -63,9 +61,6 @@
     // for debugging
     public void printHeader();
 
-    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, ISplitKey splitKey) throws TreeIndexException;
 
     public ISlotManager getSlotManager();
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 5f15c2f..98b3e0b 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
@@ -15,21 +15,15 @@
 
 package edu.uci.ics.hyracks.storage.am.common.frames;
 
-import java.io.ByteArrayInputStream;
-import java.io.DataInput;
-import java.io.DataInputStream;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collections;
 
-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.common.api.ISlotManager;
 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.ophelpers.MultiComparator;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.SlotOffTupleOff;
 import edu.uci.ics.hyracks.storage.common.buffercache.ICachedPage;
 
@@ -249,26 +243,6 @@
     }
 
     @Override
-    public String printKeys(MultiComparator cmp, ISerializerDeserializer[] fields) throws HyracksDataException {
-        StringBuilder strBuilder = new StringBuilder();
-        int tupleCount = buf.getInt(tupleCountOff);
-        frameTuple.setFieldCount(fields.length);
-        for (int i = 0; i < tupleCount; i++) {
-            frameTuple.resetByTupleIndex(this, i);
-            for (int j = 0; j < cmp.getKeyFieldCount(); j++) {
-                ByteArrayInputStream inStream = new ByteArrayInputStream(frameTuple.getFieldData(j),
-                        frameTuple.getFieldStart(j), frameTuple.getFieldLength(j));
-                DataInput dataIn = new DataInputStream(inStream);
-                Object o = fields[j].deserialize(dataIn);
-                strBuilder.append(o.toString() + " ");
-            }
-            strBuilder.append(" | ");
-        }
-        strBuilder.append("\n");
-        return strBuilder.toString();
-    }
-
-    @Override
     public int getTupleOffset(int slotNum) {
         return slotManager.getTupleOff(slotManager.getSlotStartOff() - slotNum * slotManager.getSlotSize());
     }
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 6f125e0..8b56f97 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
@@ -15,15 +15,10 @@
 
 package edu.uci.ics.hyracks.storage.am.rtree.frames;
 
-import java.io.ByteArrayInputStream;
-import java.io.DataInput;
-import java.io.DataInputStream;
 import java.util.ArrayList;
 import java.util.Collections;
 
 import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparator;
-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.dataflow.common.data.comparators.IntegerBinaryComparatorFactory;
 import edu.uci.ics.hyracks.dataflow.common.data.marshalling.IntegerSerializerDeserializer;
@@ -56,26 +51,6 @@
     }
 
     @Override
-    public String printKeys(MultiComparator cmp, ISerializerDeserializer[] fields) throws HyracksDataException {
-        StringBuilder strBuilder = new StringBuilder();
-        int tupleCount = buf.getInt(tupleCountOff);
-        frameTuple.setFieldCount(cmp.getKeyFieldCount());
-        for (int i = 0; i < tupleCount; i++) {
-            frameTuple.resetByTupleIndex(this, i);
-            for (int j = 0; j < cmp.getKeyFieldCount(); j++) {
-                ByteArrayInputStream inStream = new ByteArrayInputStream(frameTuple.getFieldData(j),
-                        frameTuple.getFieldStart(j), frameTuple.getFieldLength(j));
-                DataInput dataIn = new DataInputStream(inStream);
-                Object o = fields[j].deserialize(dataIn);
-                strBuilder.append(o.toString() + " ");
-            }
-            strBuilder.append(" | ");
-        }
-        strBuilder.append("\n");
-        return strBuilder.toString();
-    }
-
-    @Override
     public boolean findBestChild(ITupleReference tuple, MultiComparator cmp) {
         cmpFrameTuple.setFieldCount(cmp.getKeyFieldCount());
         frameTuple.setFieldCount(cmp.getKeyFieldCount());
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 cccd326..e361f92 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
@@ -38,6 +38,7 @@
 import edu.uci.ics.hyracks.storage.am.common.impls.TreeDiskOrderScanCursor;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.IndexOp;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.MultiComparator;
+import edu.uci.ics.hyracks.storage.am.common.util.TreeIndexUtils;
 import edu.uci.ics.hyracks.storage.am.rtree.api.IRTreeFrame;
 import edu.uci.ics.hyracks.storage.am.rtree.api.IRTreeInteriorFrame;
 import edu.uci.ics.hyracks.storage.am.rtree.api.IRTreeLeafFrame;
@@ -141,13 +142,13 @@
         return strBuilder.toString();
     }
 
-    public void printTree(IRTreeFrame leafFrame, IRTreeFrame interiorFrame, ISerializerDeserializer[] fields)
+    public void printTree(IRTreeFrame leafFrame, IRTreeFrame interiorFrame, ISerializerDeserializer[] keySerdes)
             throws Exception {
-        printTree(rootPage, null, false, leafFrame, interiorFrame, fields);
+        printTree(rootPage, null, false, leafFrame, interiorFrame, keySerdes);
     }
 
     public void printTree(int pageId, ICachedPage parent, boolean unpin, IRTreeFrame leafFrame,
-            IRTreeFrame interiorFrame, ISerializerDeserializer[] fields) throws Exception {
+            IRTreeFrame interiorFrame, ISerializerDeserializer[] keySerdes) throws Exception {
 
         ICachedPage node = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, pageId), false);
         incrementPins();
@@ -173,16 +174,16 @@
             String keyString;
             if (interiorFrame.isLeaf()) {
                 leafFrame.setPage(node);
-                keyString = leafFrame.printKeys(cmp, fields);
+                keyString = TreeIndexUtils.printFrameTuples(leafFrame, keySerdes);
             } else {
-                keyString = interiorFrame.printKeys(cmp, fields);
+                keyString = TreeIndexUtils.printFrameTuples(interiorFrame, keySerdes);
             }
 
             System.out.format(keyString);
             if (!interiorFrame.isLeaf()) {
                 ArrayList<Integer> children = ((RTreeNSMFrame) (interiorFrame)).getChildren(cmp);
                 for (int i = 0; i < children.size(); i++) {
-                    printTree(children.get(i), node, i == children.size() - 1, leafFrame, interiorFrame, fields);
+                    printTree(children.get(i), node, i == children.size() - 1, leafFrame, interiorFrame, keySerdes);
                 }
             } else {
                 node.releaseReadLatch();
diff --git a/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/btree/BTreeFieldPrefixNSMTest.java b/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/btree/BTreeFieldPrefixNSMTest.java
index 49403a1..c5ca61c 100644
--- a/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/btree/BTreeFieldPrefixNSMTest.java
+++ b/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/edu/uci/ics/hyracks/storage/am/btree/BTreeFieldPrefixNSMTest.java
@@ -43,6 +43,7 @@
 import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexTupleWriter;
 import edu.uci.ics.hyracks.storage.am.common.ophelpers.MultiComparator;
 import edu.uci.ics.hyracks.storage.am.common.tuples.TypeAwareTupleWriter;
+import edu.uci.ics.hyracks.storage.am.common.util.TreeIndexUtils;
 import edu.uci.ics.hyracks.storage.common.buffercache.ICachedPage;
 import edu.uci.ics.hyracks.storage.common.file.BufferedFileHandle;
 
@@ -105,7 +106,7 @@
         MultiComparator cmp = new MultiComparator(cmps);
 
         // just for printing
-        ISerializerDeserializer[] sers = { IntegerSerializerDeserializer.INSTANCE,
+        ISerializerDeserializer[] fieldSerdes = { IntegerSerializerDeserializer.INSTANCE,
                 IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE };
 
         Random rnd = new Random();
@@ -156,16 +157,16 @@
                 savedFields[i][2] = c;
 
                 if (rnd.nextInt() % compactFreq == 0) {
-                    before = frame.printKeys(cmp, sers);                    
+                    before = TreeIndexUtils.printFrameTuples(frame, fieldSerdes);
                     frame.compact();
-                    after = frame.printKeys(cmp, sers);
+                    after = TreeIndexUtils.printFrameTuples(frame, fieldSerdes);
                     Assert.assertEquals(before, after);
                 }
 
                 if (rnd.nextInt() % compressFreq == 0) {
-                    before = frame.printKeys(cmp, sers);
+                    before = TreeIndexUtils.printFrameTuples(frame, fieldSerdes);
                     frame.compress();
-                    after = frame.printKeys(cmp, sers);
+                    after = TreeIndexUtils.printFrameTuples(frame, fieldSerdes);
                     Assert.assertEquals(before, after);
                 }
 
@@ -185,16 +186,16 @@
                 }
 
                 if (rnd.nextInt() % compactFreq == 0) {
-                    before = frame.printKeys(cmp, sers);
+                    before = TreeIndexUtils.printFrameTuples(frame, fieldSerdes);
                     frame.compact();
-                    after = frame.printKeys(cmp, sers);
+                    after = TreeIndexUtils.printFrameTuples(frame, fieldSerdes);
                     Assert.assertEquals(before, after);
                 }
 
                 if (rnd.nextInt() % compressFreq == 0) {
-                    before = frame.printKeys(cmp, sers);
+                    before = TreeIndexUtils.printFrameTuples(frame, fieldSerdes);
                     frame.compress();
-                    after = frame.printKeys(cmp, sers);
+                    after = TreeIndexUtils.printFrameTuples(frame, fieldSerdes);
                     Assert.assertEquals(before, after);
                 }
             }