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();
+ }
+}