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