fixed btree operator issues causing not serializable exceptions during od shipping

git-svn-id: https://hyracks.googlecode.com/svn/trunk/hyracks@104 123451ca-8445-de46-9d55-352943316053
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IFieldAccessor.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IFieldAccessor.java
index 55a25ea..a076f0f 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IFieldAccessor.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IFieldAccessor.java
@@ -15,9 +15,7 @@
 
 package edu.uci.ics.hyracks.storage.am.btree.api;
 
-import java.io.Serializable;
-
-public interface IFieldAccessor extends Serializable {	    
+public interface IFieldAccessor {	    
     public int getLength(byte[] data, int offset); // skip to next field (equivalent to adding length of field to offset)        
 	public String print(byte[] data, int offset); // debug
 }
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IFieldAccessorFactory.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IFieldAccessorFactory.java
index 5ecdc10..4fbcceb 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IFieldAccessorFactory.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/api/IFieldAccessorFactory.java
@@ -15,6 +15,8 @@
 
 package edu.uci.ics.hyracks.storage.am.btree.api;
 
-public interface IFieldAccessorFactory {
-	public IFieldAccessor getKey();
+import java.io.Serializable;
+
+public interface IFieldAccessorFactory extends Serializable {
+	public IFieldAccessor getFieldAccessor();
 }
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/AbstractBTreeOperatorDescriptor.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/AbstractBTreeOperatorDescriptor.java
index 72a9f12..0a1efa5 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/AbstractBTreeOperatorDescriptor.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/AbstractBTreeOperatorDescriptor.java
@@ -1,13 +1,13 @@
 package edu.uci.ics.hyracks.storage.am.btree.dataflow;
 
+import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import edu.uci.ics.hyracks.api.dataflow.value.RecordDescriptor;
 import edu.uci.ics.hyracks.api.job.JobSpecification;
 import edu.uci.ics.hyracks.dataflow.std.base.AbstractSingleActivityOperatorDescriptor;
 import edu.uci.ics.hyracks.dataflow.std.file.IFileSplitProvider;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeInteriorFrameFactory;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeLeafFrameFactory;
-import edu.uci.ics.hyracks.storage.am.btree.impls.MultiComparator;
-import edu.uci.ics.hyracks.storage.am.btree.impls.RangePredicate;
+import edu.uci.ics.hyracks.storage.am.btree.api.IFieldAccessorFactory;
 
 public abstract class AbstractBTreeOperatorDescriptor extends AbstractSingleActivityOperatorDescriptor {
 	
@@ -15,9 +15,9 @@
 	
 	protected String btreeFileName;
 	protected int btreeFileId;
-	
-	protected MultiComparator cmp;	
-	protected RangePredicate rangePred;
+		
+	protected IFieldAccessorFactory[] fieldAccessorFactories;
+	protected IBinaryComparatorFactory[] comparatorFactories;	
 	
 	protected IBTreeInteriorFrameFactory interiorFrameFactory;
 	protected IBTreeLeafFrameFactory leafFrameFactory;
@@ -25,16 +25,16 @@
 	protected IBufferCacheProvider bufferCacheProvider;
 	protected IBTreeRegistryProvider btreeRegistryProvider;
 	
-	public AbstractBTreeOperatorDescriptor(JobSpecification spec, int inputArity, int outputArity, IFileSplitProvider fileSplitProvider, RecordDescriptor recDesc, IBufferCacheProvider bufferCacheProvider, IBTreeRegistryProvider btreeRegistryProvider,  int btreeFileId, String btreeFileName, IBTreeInteriorFrameFactory interiorFactory, IBTreeLeafFrameFactory leafFactory, MultiComparator cmp, RangePredicate rangePred) {
+	public AbstractBTreeOperatorDescriptor(JobSpecification spec, int inputArity, int outputArity, IFileSplitProvider fileSplitProvider, RecordDescriptor recDesc, IBufferCacheProvider bufferCacheProvider, IBTreeRegistryProvider btreeRegistryProvider,  int btreeFileId, String btreeFileName, IBTreeInteriorFrameFactory interiorFactory, IBTreeLeafFrameFactory leafFactory, IFieldAccessorFactory[] fieldAccessorFactories, IBinaryComparatorFactory[] comparatorFactories) {
         super(spec, inputArity, outputArity);
-        this.cmp = cmp;
-        this.rangePred = rangePred;
         this.btreeFileId = btreeFileId;
         this.btreeFileName = btreeFileName;
         this.bufferCacheProvider = bufferCacheProvider;
         this.btreeRegistryProvider = btreeRegistryProvider;        
         this.interiorFrameFactory = interiorFactory;
         this.leafFrameFactory = leafFactory;
+        this.fieldAccessorFactories = fieldAccessorFactories;
+        this.comparatorFactories = comparatorFactories;        
         if(outputArity > 0) recordDescriptors[0] = recDesc;   
     }
 
@@ -46,14 +46,14 @@
 		return btreeFileId;
 	}
 
-	public MultiComparator getMultiComparator() {
-		return cmp;
+	public IBinaryComparatorFactory[] getComparatorFactories() {
+		return comparatorFactories;
 	}
-
-	public RangePredicate getRangePredicate() {
-		return rangePred;
+	
+	public IFieldAccessorFactory[] getFieldAccessorFactories() {
+		return fieldAccessorFactories;
 	}
-
+		
 	public IBTreeInteriorFrameFactory getInteriorFactory() {
 		return interiorFrameFactory;
 	}
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/AbstractBTreeOperatorNodePushable.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/AbstractBTreeOperatorNodePushable.java
index ef0ab4d..af7c3c6 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/AbstractBTreeOperatorNodePushable.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/AbstractBTreeOperatorNodePushable.java
@@ -6,14 +6,18 @@
 import java.io.RandomAccessFile;
 import java.util.Random;
 
+import edu.uci.ics.hyracks.api.comm.IFrameTupleAccessor;
 import edu.uci.ics.hyracks.api.context.IHyracksContext;
+import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparator;
 import edu.uci.ics.hyracks.dataflow.common.comm.io.ByteArrayAccessibleOutputStream;
 import edu.uci.ics.hyracks.dataflow.common.data.marshalling.IntegerSerializerDeserializer;
 import edu.uci.ics.hyracks.dataflow.std.base.AbstractUnaryOutputOperatorNodePushable;
 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.api.IFieldAccessor;
 import edu.uci.ics.hyracks.storage.am.btree.frames.MetaDataFrame;
 import edu.uci.ics.hyracks.storage.am.btree.impls.BTree;
+import edu.uci.ics.hyracks.storage.am.btree.impls.MultiComparator;
 import edu.uci.ics.hyracks.storage.common.buffercache.IBufferCache;
 import edu.uci.ics.hyracks.storage.common.file.FileInfo;
 import edu.uci.ics.hyracks.storage.common.file.FileManager;
@@ -33,7 +37,7 @@
 		this.ctx = ctx;
 	}
 	
-	public void init() throws FileNotFoundException {
+	public void init() throws FileNotFoundException {				
 		IBufferCache bufferCache = opDesc.getBufferCacheProvider().getBufferCache();
 		FileManager fileManager = opDesc.getBufferCacheProvider().getFileManager();
 		
@@ -55,14 +59,24 @@
             btreeRegistry.lock();
             try {
                 // check if btree has already been registered by another thread
-                btree = btreeRegistry.get(opDesc.getBtreeFileId());
-                if(btree == null) {
-                                    	
-                	// this thread should create and register the btee                                        
-                    btree = new BTree(bufferCache, 
-                    		opDesc.getInteriorFactory(), 
-                    		opDesc.getLeafFactory(), 
-                    		opDesc.getMultiComparator());
+                btree = btreeRegistry.get(opDesc.getBtreeFileId());                
+                if(btree == null) {                                    	                	                	
+                	// this thread should create and register the btee
+                	
+                	// start by building the multicomparator from the factories
+                	IFieldAccessor[] fields = new IFieldAccessor[opDesc.getFieldAccessorFactories().length];
+                	for(int i = 0; i < opDesc.getFieldAccessorFactories().length; i++) {
+                		fields[i] = opDesc.getFieldAccessorFactories()[i].getFieldAccessor();
+                	}
+                	
+                	IBinaryComparator[] comparators = new IBinaryComparator[opDesc.getComparatorFactories().length];
+                	for(int i = 0; i < opDesc.getComparatorFactories().length; i++) {
+                		comparators[i] = opDesc.getComparatorFactories()[i].createBinaryComparator();
+                	}
+                	
+                    MultiComparator cmp = new MultiComparator(comparators, fields);
+                	
+                	btree = new BTree(bufferCache, opDesc.getInteriorFactory(), opDesc.getLeafFactory(), cmp);
                     btree.open(opDesc.getBtreeFileId());
                     btreeRegistry.register(opDesc.getBtreeFileId(), btree);
                 }                
@@ -149,4 +163,34 @@
         }	
         */	 
 	}
+	
+	protected byte[] buildBTreeRecordFromHyraxRecord(IFrameTupleAccessor accessor, int tupleId, int[] keyFields, int[] payloadFields) {
+		
+		// determine size of record
+		int btreeRecordSize = 0;			
+		for(int j = 0; j < keyFields.length; j++) {
+			btreeRecordSize += accessor.getFieldLength(tupleId, keyFields[j]);
+		}
+		for(int j = 0; j < payloadFields.length; j++) {
+			btreeRecordSize += accessor.getFieldLength(tupleId, payloadFields[j]);
+		}			
+		
+		// allocate record and copy fields
+		byte[] btreeRecord = new byte[btreeRecordSize];
+		int recRunner = 0;
+		for(int j = 0; j < keyFields.length; j++) {
+			int fieldStartOff = accessor.getTupleStartOffset(tupleId) + + accessor.getFieldSlotsLength() + accessor.getFieldStartOffset(tupleId, keyFields[j]);				
+			int fieldLength = accessor.getFieldLength(tupleId, keyFields[j]);						
+			System.arraycopy(accessor.getBuffer().array(), fieldStartOff, btreeRecord, recRunner, fieldLength);				
+			recRunner += fieldLength;
+		}
+		for(int j = 0; j < payloadFields.length; j++) {
+			int fieldStartOff = accessor.getTupleStartOffset(tupleId) + + accessor.getFieldSlotsLength() + accessor.getFieldStartOffset(tupleId, payloadFields[j]);
+			int fieldLength = accessor.getFieldLength(tupleId, payloadFields[j]);
+			System.arraycopy(accessor.getBuffer().array(), fieldStartOff, btreeRecord, recRunner, fieldLength);
+			recRunner += fieldLength;				
+		}						
+		
+		return btreeRecord;
+	}
 }
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeBulkLoadOperatorDescriptor.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeBulkLoadOperatorDescriptor.java
index c559cf6..221adab 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeBulkLoadOperatorDescriptor.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeBulkLoadOperatorDescriptor.java
@@ -2,6 +2,7 @@
 
 import edu.uci.ics.hyracks.api.context.IHyracksContext;
 import edu.uci.ics.hyracks.api.dataflow.IOperatorNodePushable;
+import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import edu.uci.ics.hyracks.api.dataflow.value.IRecordDescriptorProvider;
 import edu.uci.ics.hyracks.api.dataflow.value.RecordDescriptor;
 import edu.uci.ics.hyracks.api.job.IOperatorEnvironment;
@@ -9,7 +10,7 @@
 import edu.uci.ics.hyracks.dataflow.std.file.IFileSplitProvider;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeInteriorFrameFactory;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeLeafFrameFactory;
-import edu.uci.ics.hyracks.storage.am.btree.impls.MultiComparator;
+import edu.uci.ics.hyracks.storage.am.btree.api.IFieldAccessorFactory;
 
 public class BTreeBulkLoadOperatorDescriptor extends AbstractBTreeOperatorDescriptor {
 	
@@ -25,11 +26,12 @@
 			IBufferCacheProvider bufferCacheProvider,
 			IBTreeRegistryProvider btreeRegistryProvider, int btreeFileId,
 			String btreeFileName, IBTreeInteriorFrameFactory interiorFactory,
-			IBTreeLeafFrameFactory leafFactory, MultiComparator cmp, 
+			IBTreeLeafFrameFactory leafFactory, IFieldAccessorFactory[] fieldAccessorFactories, 
+			IBinaryComparatorFactory[] comparatorFactories,			
 			int[] keyFields, int[] payloadFields, float fillFactor) {
 		super(spec, 1, 0, fileSplitProvider, recDesc, bufferCacheProvider,
 				btreeRegistryProvider, btreeFileId, btreeFileName, interiorFactory,
-				leafFactory, cmp, null);
+				leafFactory, fieldAccessorFactories, comparatorFactories);
 		this.keyFields = keyFields;
 		this.payloadFields = payloadFields;
 		this.fillFactor = fillFactor;
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeBulkLoadOperatorNodePushable.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeBulkLoadOperatorNodePushable.java
index 58b3265..e88cca4 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeBulkLoadOperatorNodePushable.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeBulkLoadOperatorNodePushable.java
@@ -10,7 +10,6 @@
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeMetaDataFrame;
 import edu.uci.ics.hyracks.storage.am.btree.frames.MetaDataFrame;
 import edu.uci.ics.hyracks.storage.am.btree.impls.BTree;
-import edu.uci.ics.hyracks.storage.am.btree.impls.MultiComparator;
 
 public class BTreeBulkLoadOperatorNodePushable extends AbstractBTreeOperatorNodePushable {
 	
@@ -44,48 +43,16 @@
 	@Override
 	public void nextFrame(ByteBuffer buffer) throws HyracksDataException {		
 		accessor.reset(buffer);
-				
-        // build record for insertion into btree               
+		                      
 		int tupleCount = accessor.getTupleCount();
-		for(int i = 0; i < tupleCount; i++) {						
-			// determine size of record
-			int btreeRecordSize = 0;			
-			for(int j = 0; j < keyFields.length; j++) {
-				btreeRecordSize += accessor.getFieldLength(i, keyFields[j]);
-			}
-			for(int j = 0; j < payloadFields.length; j++) {
-				btreeRecordSize += accessor.getFieldLength(i, payloadFields[j]);
-			}			
-			
-			MultiComparator cmp = opDesc.getMultiComparator();
-			
-			// allocate record and copy fields
-			byte[] btreeRecord = new byte[btreeRecordSize];
-			int recRunner = 0;
-			for(int j = 0; j < keyFields.length; j++) {
-				int fieldStartOff = accessor.getTupleStartOffset(i) + + accessor.getFieldSlotsLength() + accessor.getFieldStartOffset(i, keyFields[j]);				
-				int fieldLength = accessor.getFieldLength(i, keyFields[j]);								
-				
-				String rec = cmp.printKey(buffer.array(), fieldStartOff);
-				System.out.println("REC: " + rec);
-				
-				System.arraycopy(buffer.array(), fieldStartOff, btreeRecord, recRunner, fieldLength);				
-				recRunner += fieldLength;
-			}
-			for(int j = 0; j < payloadFields.length; j++) {
-				int fieldStartOff = accessor.getTupleStartOffset(i) + + accessor.getFieldSlotsLength() + accessor.getFieldStartOffset(i, payloadFields[j]);
-				int fieldLength = accessor.getFieldLength(i, payloadFields[j]);
-				System.arraycopy(buffer.array(), fieldStartOff, btreeRecord, recRunner, fieldLength);
-				recRunner += fieldLength;								
-			}			
-											
-			// append to btree
+		for(int i = 0; i < tupleCount; i++) {
+			byte[] btreeRecord = buildBTreeRecordFromHyraxRecord(accessor, i, keyFields, payloadFields);
 			try {
 				btree.bulkLoadAddRecord(bulkLoadCtx, btreeRecord);
 			} catch (Exception e) {
 				e.printStackTrace();
 			}
-		}
+		}		
 	}
 	
 	@Override
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeDiskOrderScanOperatorDescriptor.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeDiskOrderScanOperatorDescriptor.java
index 6172f60..4509d8c 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeDiskOrderScanOperatorDescriptor.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeDiskOrderScanOperatorDescriptor.java
@@ -2,6 +2,7 @@
 
 import edu.uci.ics.hyracks.api.context.IHyracksContext;
 import edu.uci.ics.hyracks.api.dataflow.IOperatorNodePushable;
+import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import edu.uci.ics.hyracks.api.dataflow.value.IRecordDescriptorProvider;
 import edu.uci.ics.hyracks.api.dataflow.value.RecordDescriptor;
 import edu.uci.ics.hyracks.api.job.IOperatorEnvironment;
@@ -9,7 +10,7 @@
 import edu.uci.ics.hyracks.dataflow.std.file.IFileSplitProvider;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeInteriorFrameFactory;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeLeafFrameFactory;
-import edu.uci.ics.hyracks.storage.am.btree.impls.MultiComparator;
+import edu.uci.ics.hyracks.storage.am.btree.api.IFieldAccessorFactory;
 
 public class BTreeDiskOrderScanOperatorDescriptor extends AbstractBTreeOperatorDescriptor {
 	
@@ -20,10 +21,11 @@
 			IBufferCacheProvider bufferCacheProvider,
 			IBTreeRegistryProvider btreeRegistryProvider, int btreeFileId,
 			String btreeFileName, IBTreeInteriorFrameFactory interiorFactory,
-			IBTreeLeafFrameFactory leafFactory, MultiComparator cmp) {
+			IBTreeLeafFrameFactory leafFactory, 
+			IFieldAccessorFactory[] fieldAccessorFactories, IBinaryComparatorFactory[] comparatorFactories) {
 		super(spec, 0, 1, fileSplitProvider, recDesc, bufferCacheProvider,
 				btreeRegistryProvider, btreeFileId, btreeFileName, interiorFactory,
-				leafFactory, cmp, null);
+				leafFactory, fieldAccessorFactories, comparatorFactories);
 	}
 	
 	@Override
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeDiskOrderScanOperatorNodePushable.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeDiskOrderScanOperatorNodePushable.java
index b54952a..47c612b 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeDiskOrderScanOperatorNodePushable.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeDiskOrderScanOperatorNodePushable.java
@@ -38,7 +38,7 @@
 			e.printStackTrace();
 		}
 		
-		MultiComparator cmp = opDesc.getMultiComparator();
+		MultiComparator cmp = btree.getMultiComparator();
 		ByteBuffer frame = ctx.getResourceManager().allocateFrame();
 		FrameTupleAppender appender = new FrameTupleAppender(ctx);
 		appender.reset(frame, true);
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeInsertOperatorDescriptor.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeInsertOperatorDescriptor.java
new file mode 100644
index 0000000..80066be
--- /dev/null
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeInsertOperatorDescriptor.java
@@ -0,0 +1,45 @@
+package edu.uci.ics.hyracks.storage.am.btree.dataflow;
+
+import edu.uci.ics.hyracks.api.context.IHyracksContext;
+import edu.uci.ics.hyracks.api.dataflow.IOperatorNodePushable;
+import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparatorFactory;
+import edu.uci.ics.hyracks.api.dataflow.value.IRecordDescriptorProvider;
+import edu.uci.ics.hyracks.api.dataflow.value.RecordDescriptor;
+import edu.uci.ics.hyracks.api.job.IOperatorEnvironment;
+import edu.uci.ics.hyracks.api.job.JobSpecification;
+import edu.uci.ics.hyracks.dataflow.std.file.IFileSplitProvider;
+import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeInteriorFrameFactory;
+import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeLeafFrameFactory;
+import edu.uci.ics.hyracks.storage.am.btree.api.IFieldAccessorFactory;
+
+public class BTreeInsertOperatorDescriptor extends AbstractBTreeOperatorDescriptor {
+	
+	private static final long serialVersionUID = 1L;
+	
+	private final int[] keyFields;
+	private final int[] payloadFields;
+	
+	public BTreeInsertOperatorDescriptor(JobSpecification spec,
+			IFileSplitProvider fileSplitProvider, RecordDescriptor recDesc,
+			IBufferCacheProvider bufferCacheProvider,
+			IBTreeRegistryProvider btreeRegistryProvider, int btreeFileId,
+			String btreeFileName, IBTreeInteriorFrameFactory interiorFactory,
+			IBTreeLeafFrameFactory leafFactory, IFieldAccessorFactory[] fieldAccessorFactories, 
+			IBinaryComparatorFactory[] comparatorFactories,			
+			int[] keyFields, int[] payloadFields) {
+		super(spec, 1, 1, fileSplitProvider, recDesc, bufferCacheProvider,
+				btreeRegistryProvider, btreeFileId, btreeFileName, interiorFactory,
+				leafFactory, fieldAccessorFactories, comparatorFactories);
+		this.keyFields = keyFields;
+		this.payloadFields = payloadFields;
+	}
+	
+	@Override
+	public IOperatorNodePushable createPushRuntime(IHyracksContext ctx,
+			IOperatorEnvironment env,
+			IRecordDescriptorProvider recordDescProvider, int partition,
+			int nPartitions) {
+		return new BTreeInsertOperatorNodePushable(this, ctx, keyFields, payloadFields, recordDescProvider);
+	}
+	
+}
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeInsertOperatorNodePushable.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeInsertOperatorNodePushable.java
new file mode 100644
index 0000000..6cc64ee
--- /dev/null
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeInsertOperatorNodePushable.java
@@ -0,0 +1,67 @@
+package edu.uci.ics.hyracks.storage.am.btree.dataflow;
+
+import java.nio.ByteBuffer;
+
+import edu.uci.ics.hyracks.api.context.IHyracksContext;
+import edu.uci.ics.hyracks.api.dataflow.value.IRecordDescriptorProvider;
+import edu.uci.ics.hyracks.api.dataflow.value.RecordDescriptor;
+import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
+import edu.uci.ics.hyracks.dataflow.common.comm.io.FrameTupleAccessor;
+import edu.uci.ics.hyracks.dataflow.common.comm.util.FrameUtils;
+import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeMetaDataFrame;
+import edu.uci.ics.hyracks.storage.am.btree.frames.MetaDataFrame;
+
+public class BTreeInsertOperatorNodePushable extends AbstractBTreeOperatorNodePushable {
+	
+	private final int[] keyFields;
+	private final int[] payloadFields;
+	    
+    private FrameTupleAccessor accessor;
+    
+    private IRecordDescriptorProvider recordDescProvider;
+    
+    private IBTreeMetaDataFrame metaFrame;
+    
+	public BTreeInsertOperatorNodePushable(AbstractBTreeOperatorDescriptor opDesc, IHyracksContext ctx, int[] keyFields, int[] payloadFields, IRecordDescriptorProvider recordDescProvider) {
+		super(opDesc, ctx);
+		this.keyFields = keyFields;
+		this.payloadFields = payloadFields;
+		this.recordDescProvider = recordDescProvider;
+	}
+	
+	@Override
+	public void close() throws HyracksDataException {
+		writer.close();		
+	}
+	
+	@Override
+	public void nextFrame(ByteBuffer buffer) throws HyracksDataException {		
+		accessor.reset(buffer);
+		
+		int tupleCount = accessor.getTupleCount();
+		for(int i = 0; i < tupleCount; i++) {
+			byte[] btreeRecord = buildBTreeRecordFromHyraxRecord(accessor, i, keyFields, payloadFields);
+			try {
+				btree.insert(btreeRecord, leafFrame, interiorFrame, metaFrame);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		
+		// pass a copy of the frame to next op
+		FrameUtils.flushFrame(buffer.duplicate(), writer);
+	}
+	
+	@Override
+	public void open() throws HyracksDataException {		
+		RecordDescriptor recDesc = recordDescProvider.getInputRecordDescriptor(opDesc.getOperatorId(), 0);		
+		accessor = new FrameTupleAccessor(ctx, recDesc);		
+		try {
+			init();
+			btree.open(opDesc.getBtreeFileId());
+			metaFrame = new MetaDataFrame();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}	
+}
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeRegistry.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeRegistry.java
index 24b133b..4ef4789 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeRegistry.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeRegistry.java
@@ -16,8 +16,8 @@
     }
     
     // TODO: not very high concurrency, but good enough for now    
-    public void lock() {
-        registryLock.lock();
+    public void lock() {        
+    	registryLock.lock();
     }
     
     public void unlock() {
@@ -31,4 +31,8 @@
     public void unregister(int fileId) {
         map.remove(fileId);
     }        
+    
+    public int size() {
+    	return map.size();
+    }
 }
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeRegistryProvider.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeRegistryProvider.java
index 832f8e9..c07bd8b 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeRegistryProvider.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeRegistryProvider.java
@@ -7,10 +7,10 @@
 	private static BTreeRegistry btreeRegistry = null;
 	
 	@Override
-	public BTreeRegistry getBTreeRegistry() {
+	public synchronized BTreeRegistry getBTreeRegistry() {
 		if(btreeRegistry == null) {
 			btreeRegistry = new BTreeRegistry();
 		}		
 		return btreeRegistry;
-	}	
+	}
 }
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorDescriptor.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorDescriptor.java
index 1e17b12..b30c6e2 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorDescriptor.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorDescriptor.java
@@ -1,84 +1,37 @@
 package edu.uci.ics.hyracks.storage.am.btree.dataflow;
 
-import java.io.DataOutputStream;
-
 import edu.uci.ics.hyracks.api.context.IHyracksContext;
 import edu.uci.ics.hyracks.api.dataflow.IOperatorNodePushable;
-import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparator;
+import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import edu.uci.ics.hyracks.api.dataflow.value.IRecordDescriptorProvider;
-import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
 import edu.uci.ics.hyracks.api.dataflow.value.RecordDescriptor;
-import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
 import edu.uci.ics.hyracks.api.job.IOperatorEnvironment;
 import edu.uci.ics.hyracks.api.job.JobSpecification;
-import edu.uci.ics.hyracks.dataflow.common.comm.io.ByteArrayAccessibleOutputStream;
-import edu.uci.ics.hyracks.dataflow.common.data.comparators.IntegerBinaryComparatorFactory;
-import edu.uci.ics.hyracks.dataflow.common.data.marshalling.IntegerSerializerDeserializer;
 import edu.uci.ics.hyracks.dataflow.std.file.IFileSplitProvider;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeInteriorFrameFactory;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeLeafFrameFactory;
-import edu.uci.ics.hyracks.storage.am.btree.api.IFieldAccessor;
-import edu.uci.ics.hyracks.storage.am.btree.frames.NSMInteriorFrameFactory;
-import edu.uci.ics.hyracks.storage.am.btree.frames.NSMLeafFrameFactory;
-import edu.uci.ics.hyracks.storage.am.btree.impls.MultiComparator;
-import edu.uci.ics.hyracks.storage.am.btree.impls.RangePredicate;
-import edu.uci.ics.hyracks.storage.am.btree.types.Int32Accessor;
+import edu.uci.ics.hyracks.storage.am.btree.api.IFieldAccessorFactory;
 
 public class BTreeSearchOperatorDescriptor extends AbstractBTreeOperatorDescriptor {
 
 	private static final long serialVersionUID = 1L;
 
-	public BTreeSearchOperatorDescriptor(JobSpecification spec, IFileSplitProvider fileSplitProvider, RecordDescriptor recDesc, IBufferCacheProvider bufferCacheProvider, IBTreeRegistryProvider btreeRegistryProvider,  int btreeFileId, String btreeFileName, IBTreeInteriorFrameFactory interiorFactory, IBTreeLeafFrameFactory leafFactory, MultiComparator cmp, RangePredicate rangePred) {
-		super(spec, 0, 1, fileSplitProvider, recDesc, bufferCacheProvider, btreeRegistryProvider, btreeFileId, btreeFileName, interiorFactory, leafFactory, cmp, rangePred);        
+	private boolean isForward;
+	private byte[] lowKey;
+	private byte[] highKey;
+	private int searchKeyFields;
+	
+	public BTreeSearchOperatorDescriptor(JobSpecification spec, IFileSplitProvider fileSplitProvider, RecordDescriptor recDesc, IBufferCacheProvider bufferCacheProvider, IBTreeRegistryProvider btreeRegistryProvider,  int btreeFileId, String btreeFileName, IBTreeInteriorFrameFactory interiorFactory, IBTreeLeafFrameFactory leafFactory, IFieldAccessorFactory[] fieldAccessorFactories, IBinaryComparatorFactory[] comparatorFactories, boolean isForward, byte[] lowKey, byte[] highKey, int searchKeyFields) {
+		super(spec, 0, 1, fileSplitProvider, recDesc, bufferCacheProvider, btreeRegistryProvider, btreeFileId, btreeFileName, interiorFactory, leafFactory, fieldAccessorFactories, comparatorFactories);
+		this.isForward = isForward;
+		this.lowKey = lowKey;
+		this.highKey = highKey;
+		this.searchKeyFields = searchKeyFields;
 	}
-
+	
 	@Override
 	public IOperatorNodePushable createPushRuntime(final IHyracksContext ctx, final IOperatorEnvironment env,
 			IRecordDescriptorProvider recordDescProvider, int partition, int nPartitions) {
-		return new BTreeSearchOperatorNodePushable(this, ctx);
-	}
-	
-	public static void main(String args[]) throws HyracksDataException {
-		
-		IBTreeInteriorFrameFactory interiorFrameFactory = new NSMInteriorFrameFactory();
-		IBTreeLeafFrameFactory leafFrameFactory = new NSMLeafFrameFactory();        
-		
-		IFieldAccessor[] fields = new IFieldAccessor[2];
-		fields[0] = new Int32Accessor(); // key field
-		fields[1] = new Int32Accessor(); // value field
-		
-		int keyLen = 1;
-		IBinaryComparator[] cmps = new IBinaryComparator[keyLen];
-		cmps[0] = IntegerBinaryComparatorFactory.INSTANCE.createBinaryComparator();
-		MultiComparator cmp = new MultiComparator(cmps, fields);		
-
-		ByteArrayAccessibleOutputStream lkbaaos = new ByteArrayAccessibleOutputStream();
-		DataOutputStream lkdos = new DataOutputStream(lkbaaos);    	    	    	
-		IntegerSerializerDeserializer.INSTANCE.serialize(-1000, lkdos);
-
-		ByteArrayAccessibleOutputStream hkbaaos = new ByteArrayAccessibleOutputStream();
-		DataOutputStream hkdos = new DataOutputStream(hkbaaos);    	    	    	
-		IntegerSerializerDeserializer.INSTANCE.serialize(1000, hkdos);
-
-		byte[] lowKey = lkbaaos.toByteArray();
-		byte[] highKey = hkbaaos.toByteArray();
-
-		IBinaryComparator[] searchCmps = new IBinaryComparator[1];
-		searchCmps[0] = IntegerBinaryComparatorFactory.INSTANCE.createBinaryComparator();
-		MultiComparator searchCmp = new MultiComparator(searchCmps, fields);
-
-		RangePredicate rangePred = new RangePredicate(true, lowKey, highKey, searchCmp);
-
-		IBufferCacheProvider bufferCacheProvider = new BufferCacheProvider();
-		IBTreeRegistryProvider btreeRegistryProvider = new BTreeRegistryProvider();
-
-		RecordDescriptor recDesc = new RecordDescriptor(
-				new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE });
-
-		JobSpecification spec = new JobSpecification();
-		BTreeSearchOperatorDescriptor opDesc = new BTreeSearchOperatorDescriptor(spec, null, recDesc, bufferCacheProvider, btreeRegistryProvider, 0, "/tmp/btreetest.bin", interiorFrameFactory, leafFrameFactory, cmp, rangePred);		 		 
-		IOperatorNodePushable op = opDesc.createPushRuntime(null, null, null, 0, 0);
-		op.open();		 
-	}
-
+		return new BTreeSearchOperatorNodePushable(this, ctx, isForward, lowKey, highKey, searchKeyFields);
+	}	
 }
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorNodePushable.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorNodePushable.java
index 88d263e..69f6490 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorNodePushable.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorNodePushable.java
@@ -5,6 +5,7 @@
 import java.nio.ByteBuffer;
 
 import edu.uci.ics.hyracks.api.context.IHyracksContext;
+import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparator;
 import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
 import edu.uci.ics.hyracks.dataflow.common.comm.io.ArrayTupleBuilder;
 import edu.uci.ics.hyracks.dataflow.common.comm.io.FrameTupleAppender;
@@ -12,31 +13,51 @@
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeCursor;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeLeafFrame;
 import edu.uci.ics.hyracks.storage.am.btree.impls.MultiComparator;
+import edu.uci.ics.hyracks.storage.am.btree.impls.RangePredicate;
 import edu.uci.ics.hyracks.storage.am.btree.impls.RangeSearchCursor;
 
 public class BTreeSearchOperatorNodePushable extends AbstractBTreeOperatorNodePushable {
 	
-	public BTreeSearchOperatorNodePushable(AbstractBTreeOperatorDescriptor opDesc, IHyracksContext ctx) {
+	private boolean isForward;
+	private byte[] lowKey;
+	private byte[] highKey;
+	private int searchKeyFields;
+	
+	public BTreeSearchOperatorNodePushable(AbstractBTreeOperatorDescriptor opDesc, IHyracksContext ctx, boolean isForward, byte[] lowKey, byte[] highKey, int searchKeyFields) {
 		super(opDesc, ctx);
+		this.isForward = isForward;
+		this.lowKey = lowKey;
+		this.highKey = highKey;
+		this.searchKeyFields = searchKeyFields;
 	}
-		
+	
 	@Override
 	public void open() throws HyracksDataException {		
 		
 		IBTreeLeafFrame cursorFrame = opDesc.getLeafFactory().getFrame();
 		IBTreeCursor cursor = new RangeSearchCursor(cursorFrame);
-		
+						
 		try {
-			init();				
+			init();										
 			fill();
-			btree.search(cursor, opDesc.getRangePredicate(), leafFrame, interiorFrame);
+			
+			// construct range predicate
+			assert(searchKeyFields <= btree.getMultiComparator().getKeyLength());
+			IBinaryComparator[] searchComparators = new IBinaryComparator[searchKeyFields];
+			for(int i = 0; i < searchKeyFields; i++) {
+				searchComparators[i] = btree.getMultiComparator().getComparators()[i];
+			}			
+			MultiComparator searchCmp = new MultiComparator(searchComparators, btree.getMultiComparator().getFields());
+			RangePredicate rangePred = new RangePredicate(isForward, lowKey, highKey, searchCmp);
+			
+			btree.search(cursor, rangePred, leafFrame, interiorFrame);
 		} catch (FileNotFoundException e1) {
 			e1.printStackTrace();
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
 		
-		MultiComparator cmp = opDesc.getMultiComparator();
+		MultiComparator cmp = btree.getMultiComparator();
 		ByteBuffer frame = ctx.getResourceManager().allocateFrame();
 		FrameTupleAppender appender = new FrameTupleAppender(ctx);
 		appender.reset(frame, true);
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BufferCacheProvider.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BufferCacheProvider.java
index 6881cf7..66f062e 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BufferCacheProvider.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BufferCacheProvider.java
@@ -19,7 +19,7 @@
     private static final int NUM_PAGES = 40;
 	
 	@Override
-	public IBufferCache getBufferCache() {
+	public synchronized IBufferCache getBufferCache() {
 		
 		if(bufferCache == null) {
 			if(fileManager == null) fileManager = new FileManager();			
@@ -32,7 +32,7 @@
 	}
 	
 	@Override
-	public FileManager getFileManager() {
+	public synchronized FileManager getFileManager() {
 		if(fileManager == null) fileManager = new FileManager();
 		return fileManager;
 	}	
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/FieldPrefixNSMLeafFrameFactory.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/FieldPrefixNSMLeafFrameFactory.java
index 33beaeb..e50a470 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/FieldPrefixNSMLeafFrameFactory.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/frames/FieldPrefixNSMLeafFrameFactory.java
@@ -19,6 +19,9 @@
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeLeafFrameFactory;
 
 public class FieldPrefixNSMLeafFrameFactory implements IBTreeLeafFrameFactory {
+	
+	private static final long serialVersionUID = 1L;
+
 	@Override
 	public IBTreeLeafFrame getFrame() {		
 		return new FieldPrefixNSMLeafFrame();
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 268aa4a..74e67af 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
@@ -68,6 +68,10 @@
     public int uselessCompression = 0;
         
     
+    public void treeLatchStatus() {
+    	System.out.println(treeLatch.writeLock().toString());
+    }
+    
     public String printStats() {
         StringBuilder strBuilder = new StringBuilder();
         strBuilder.append("\n");
@@ -95,18 +99,16 @@
 
     	if(created) return;
     	
-    	treeLatch.writeLock().lock();    	
+    	treeLatch.writeLock().lock();	
     	try {
     	
     		// check if another thread bet us to it
-    		if(created) return;    		
+    		if(created) return;    		    		
     		
     		// initialize meta data page
     		ICachedPage metaNode = bufferCache.pin(FileInfo.getDiskPageId(fileId, metaDataPage), false);
     		pins++;
-
-    		System.out.println(metaNode.getBuffer().capacity());
-
+    		
     		metaNode.acquireWriteLatch();
     		writeLatchesAcquired++;
     		try {
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/MultiComparator.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/MultiComparator.java
index 243a7a2..659cfbf 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/MultiComparator.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/impls/MultiComparator.java
@@ -15,12 +15,10 @@
 
 package edu.uci.ics.hyracks.storage.am.btree.impls;
 
-import java.io.Serializable;
-
 import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparator;
 import edu.uci.ics.hyracks.storage.am.btree.api.IFieldAccessor;
 
-public class MultiComparator implements Serializable {
+public class MultiComparator {
     	
 	private static final long serialVersionUID = 1L;
 	
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/types/Int32Accessor.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/types/Int32Accessor.java
index 804b2f5..0ab80cb 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/types/Int32Accessor.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/types/Int32Accessor.java
@@ -21,8 +21,6 @@
 
 public class Int32Accessor implements IFieldAccessor {
 	
-	private static final long serialVersionUID = 1L;
-
 	@Override
 	public int getLength(byte[] data, int offset) {
 		return 4;
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/types/Int32AccessorFactory.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/types/Int32AccessorFactory.java
new file mode 100644
index 0000000..b8607c0
--- /dev/null
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/types/Int32AccessorFactory.java
@@ -0,0 +1,15 @@
+package edu.uci.ics.hyracks.storage.am.btree.types;
+
+import edu.uci.ics.hyracks.storage.am.btree.api.IFieldAccessor;
+import edu.uci.ics.hyracks.storage.am.btree.api.IFieldAccessorFactory;
+
+public class Int32AccessorFactory implements IFieldAccessorFactory {
+	
+	private static final long serialVersionUID = 1L;
+		
+	@Override
+	public IFieldAccessor getFieldAccessor() {	
+		return new Int32Accessor();
+	}
+	
+}
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/types/StringAccessor.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/types/UTF8StringAccessor.java
similarity index 94%
rename from hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/types/StringAccessor.java
rename to hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/types/UTF8StringAccessor.java
index 243c62c..e47ce42 100644
--- a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/types/StringAccessor.java
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/types/UTF8StringAccessor.java
@@ -24,10 +24,8 @@
 import edu.uci.ics.hyracks.dataflow.common.data.util.StringUtils;
 import edu.uci.ics.hyracks.storage.am.btree.api.IFieldAccessor;
 
-public class StringAccessor implements IFieldAccessor {
+public class UTF8StringAccessor implements IFieldAccessor {
 	
-	private static final long serialVersionUID = 1L;
-
 	@Override
 	public int getLength(byte[] data, int offset) {
 		return StringUtils.getUTFLen(data, offset) + 2;
diff --git a/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/types/UTF8StringAccessorFactory.java b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/types/UTF8StringAccessorFactory.java
new file mode 100644
index 0000000..e2d8053
--- /dev/null
+++ b/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/types/UTF8StringAccessorFactory.java
@@ -0,0 +1,14 @@
+package edu.uci.ics.hyracks.storage.am.btree.types;
+
+import edu.uci.ics.hyracks.storage.am.btree.api.IFieldAccessor;
+import edu.uci.ics.hyracks.storage.am.btree.api.IFieldAccessorFactory;
+
+public class UTF8StringAccessorFactory implements IFieldAccessorFactory {
+	
+	private static final long serialVersionUID = 1L;
+
+	@Override
+	public IFieldAccessor getFieldAccessor() {
+		return new UTF8StringAccessor();
+	}	
+}