Moved tree index test framework to hyracks-test-support. Removed JUnit dependency from access method poms. Cleaned up all access method dependencies.
git-svn-id: https://hyracks.googlecode.com/svn/branches/hyracks_lsm_tree@1185 123451ca-8445-de46-9d55-352943316053
diff --git a/hyracks-storage-am-common/pom.xml b/hyracks-storage-am-common/pom.xml
index 12b4de9..7b3a0f7 100644
--- a/hyracks-storage-am-common/pom.xml
+++ b/hyracks-storage-am-common/pom.xml
@@ -51,13 +51,13 @@
<version>0.2.0-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
- </dependency>
+ </dependency>
<dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.8.1</version>
+ <groupId>edu.uci.ics.hyracks</groupId>
+ <artifactId>hyracks-control-nc</artifactId>
+ <version>0.2.0-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
- </dependency>
+ </dependency>
</dependencies>
</project>
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/AbstractTreeIndexTestWorker.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/AbstractTreeIndexTestWorker.java
deleted file mode 100644
index a98efde..0000000
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/AbstractTreeIndexTestWorker.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2009-2010 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package edu.uci.ics.hyracks.storage.am.common.test;
-
-import java.util.Random;
-
-import edu.uci.ics.hyracks.dataflow.common.data.accessors.ITupleReference;
-import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndex;
-import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexAccessor;
-import edu.uci.ics.hyracks.storage.am.common.datagen.DataGenThread;
-import edu.uci.ics.hyracks.storage.am.common.datagen.TupleBatch;
-import edu.uci.ics.hyracks.storage.am.common.test.TestOperationSelector.TestOperation;
-
-public abstract class AbstractTreeIndexTestWorker extends Thread implements ITreeIndexTestWorker {
- private Random rnd = new Random();
- private final DataGenThread dataGen;
- private final TestOperationSelector opSelector;
- private final int numBatches;
-
- protected final ITreeIndexAccessor indexAccessor;
-
- public AbstractTreeIndexTestWorker(DataGenThread dataGen, TestOperationSelector opSelector, ITreeIndex index, int numBatches) {
- this.dataGen = dataGen;
- this.opSelector = opSelector;
- this.numBatches = numBatches;
- indexAccessor = index.createAccessor();
- }
-
- @Override
- public void run() {
- try {
- for (int i = 0; i < numBatches; i++) {
- TupleBatch batch = dataGen.getBatch();
- for (int j = 0; j < batch.size(); j++) {
- TestOperation op = opSelector.getOp(rnd.nextInt());
- ITupleReference tuple = batch.get(j);
- performOp(tuple, op);
- }
- dataGen.releaseBatch(batch);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-}
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/CheckTuple.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/CheckTuple.java
deleted file mode 100644
index 22cd5df..0000000
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/CheckTuple.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2009-2010 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package edu.uci.ics.hyracks.storage.am.common.test;
-
-@SuppressWarnings({"rawtypes", "unchecked"})
-public class CheckTuple<T extends Comparable<T>> implements Comparable<T> {
- protected final int numKeys;
- protected final Comparable[] tuple;
- protected int pos;
-
- public CheckTuple(int numFields, int numKeys) {
- this.numKeys = numKeys;
- this.tuple = new Comparable[numFields];
- pos = 0;
- }
-
- public void add(T e) {
- tuple[pos++] = e;
- }
-
- @Override
- public int compareTo(T o) {
- CheckTuple<T> other = (CheckTuple<T>)o;
- for (int i = 0; i < numKeys; i++) {
- int cmp = tuple[i].compareTo(other.get(i));
- if (cmp != 0) {
- return cmp;
- }
- }
- return 0;
- }
-
- public T get(int idx) {
- return (T)tuple[idx];
- }
-
- public void set(int idx, T e) {
- tuple[idx] = e;
- }
-
- public int size() {
- return tuple.length;
- }
-
- public int getNumKeys() {
- return numKeys;
- }
-
- @Override
- public String toString() {
- StringBuilder strBuilder = new StringBuilder();
- for (int i = 0; i < tuple.length; i++) {
- strBuilder.append(tuple[i].toString());
- if (i != tuple.length-1) {
- strBuilder.append(" ");
- }
- }
- return strBuilder.toString();
- }
-}
\ No newline at end of file
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/ITreeIndexTestContext.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/ITreeIndexTestContext.java
deleted file mode 100644
index ec57dbf..0000000
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/ITreeIndexTestContext.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2009-2010 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package edu.uci.ics.hyracks.storage.am.common.test;
-
-import java.util.Collection;
-
-import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparatorFactory;
-import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
-import edu.uci.ics.hyracks.dataflow.common.comm.io.ArrayTupleBuilder;
-import edu.uci.ics.hyracks.dataflow.common.comm.io.ArrayTupleReference;
-import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndex;
-import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexAccessor;
-
-@SuppressWarnings("rawtypes")
-public interface ITreeIndexTestContext<T extends CheckTuple> {
- public int getFieldCount();
-
- public int getKeyFieldCount();
-
- public ISerializerDeserializer[] getFieldSerdes();
-
- public IBinaryComparatorFactory[] getComparatorFactories();
-
- public ITreeIndexAccessor getIndexAccessor();
-
- public ITreeIndex getIndex();
-
- public ArrayTupleReference getTuple();
-
- public ArrayTupleBuilder getTupleBuilder();
-
- public void insertCheckTuple(T checkTuple, Collection<T> checkTuples);
-
- public void deleteCheckTuple(T checkTuple, Collection<T> checkTuples);
-
- public Collection<T> getCheckTuples();
-
-}
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/ITreeIndexTestWorker.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/ITreeIndexTestWorker.java
deleted file mode 100644
index a12bf73..0000000
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/ITreeIndexTestWorker.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright 2009-2010 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package edu.uci.ics.hyracks.storage.am.common.test;
-
-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.TreeIndexException;
-import edu.uci.ics.hyracks.storage.am.common.test.TestOperationSelector.TestOperation;
-
-public interface ITreeIndexTestWorker {
- void performOp(ITupleReference tuple, TestOperation op) throws HyracksDataException, TreeIndexException;
-}
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/ITreeIndexTestWorkerFactory.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/ITreeIndexTestWorkerFactory.java
deleted file mode 100644
index d0ee2b4..0000000
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/ITreeIndexTestWorkerFactory.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2009-2010 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package edu.uci.ics.hyracks.storage.am.common.test;
-
-import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndex;
-import edu.uci.ics.hyracks.storage.am.common.datagen.DataGenThread;
-
-public interface ITreeIndexTestWorkerFactory {
- public AbstractTreeIndexTestWorker create(DataGenThread dataGen, TestOperationSelector opSelector, ITreeIndex index, int numBatches);
-}
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/TestOperationSelector.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/TestOperationSelector.java
deleted file mode 100644
index bed8da6..0000000
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/TestOperationSelector.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2009-2010 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package edu.uci.ics.hyracks.storage.am.common.test;
-
-import java.util.Arrays;
-
-public class TestOperationSelector {
-
- public static enum TestOperation {
- INSERT,
- DELETE,
- UPDATE,
- POINT_SEARCH,
- RANGE_SEARCH,
- SCAN,
- DISKORDER_SCAN,
- MERGE
- }
-
- private final TestOperation[] ops;
- private final int[] opRanges;
-
- public TestOperationSelector(TestOperation[] ops, float[] opProbs) {
- sanityCheck(ops, opProbs);
- this.ops = ops;
- this.opRanges = getOpRanges(opProbs);
- }
-
- private void sanityCheck(TestOperation[] ops, float[] opProbs) {
- if (ops.length == 0) {
- throw new RuntimeException("Empty op array.");
- }
- if (opProbs.length == 0) {
- throw new RuntimeException("Empty op probabilities.");
- }
- if (ops.length != opProbs.length) {
- throw new RuntimeException("Ops and op probabilities have unequal length.");
- }
- float sum = 0.0f;
- for (int i = 0; i < opProbs.length; i++) {
- sum += opProbs[i];
- }
- if (sum != 1.0f) {
- throw new RuntimeException("Op probabilities don't add up to 1.");
- }
- }
-
- private int[] getOpRanges(float[] opProbabilities) {
- int[] opRanges = new int[opProbabilities.length];
- if (opRanges.length > 1) {
- opRanges[0] = (int) Math.floor(Integer.MAX_VALUE * opProbabilities[0]);
- for (int i = 1; i < opRanges.length - 1; i++) {
- opRanges[i] = opRanges[i - 1] + (int) Math.floor(Integer.MAX_VALUE * opProbabilities[i]);
- }
- opRanges[opRanges.length - 1] = Integer.MAX_VALUE;
- } else {
- opRanges[0] = Integer.MAX_VALUE;
- }
- return opRanges;
- }
-
- public TestOperation getOp(int randomInt) {
- int ix = Arrays.binarySearch(opRanges, randomInt);
- if (ix < 0) {
- ix = -ix - 1;
- }
- return ops[ix];
- }
-}
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/TestWorkloadConf.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/TestWorkloadConf.java
deleted file mode 100644
index 355f919..0000000
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/TestWorkloadConf.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2009-2010 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package edu.uci.ics.hyracks.storage.am.common.test;
-
-import edu.uci.ics.hyracks.storage.am.common.test.TestOperationSelector.TestOperation;
-
-public class TestWorkloadConf {
- public final TestOperation[] ops;
- public final float[] opProbs;
-
- public TestWorkloadConf(TestOperation[] ops, float[] opProbs) {
- this.ops = ops;
- this.opProbs = opProbs;
- }
-
- public String toString() {
- StringBuilder strBuilder = new StringBuilder();
- for (TestOperation op : ops) {
- strBuilder.append(op.toString());
- strBuilder.append(',');
- }
- strBuilder.deleteCharAt(strBuilder.length() - 1);
- return strBuilder.toString();
- }
-}
\ No newline at end of file
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/TreeIndexMultiThreadTestDriver.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/TreeIndexMultiThreadTestDriver.java
deleted file mode 100644
index bc3350b..0000000
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/TreeIndexMultiThreadTestDriver.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2009-2010 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package edu.uci.ics.hyracks.storage.am.common.test;
-
-import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
-import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
-import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndex;
-import edu.uci.ics.hyracks.storage.am.common.api.TreeIndexException;
-import edu.uci.ics.hyracks.storage.am.common.datagen.DataGenThread;
-import edu.uci.ics.hyracks.storage.am.common.test.TestOperationSelector.TestOperation;
-
-@SuppressWarnings("rawtypes")
-public class TreeIndexMultiThreadTestDriver {
- private static final int RANDOM_SEED = 50;
- // Means no additional payload. Only the specified fields.
- private static final int PAYLOAD_SIZE = 0;
- private final TestOperationSelector opSelector;
- private final ISerializerDeserializer[] fieldSerdes;
- private final ITreeIndex index;
- private final ITreeIndexTestWorkerFactory workerFactory;
-
- public TreeIndexMultiThreadTestDriver(ITreeIndex index, ITreeIndexTestWorkerFactory workerFactory,
- ISerializerDeserializer[] fieldSerdes, TestOperation[] ops, float[] opProbs) {
- this.index = index;
- this.workerFactory = workerFactory;
- this.fieldSerdes = fieldSerdes;
- this.opSelector = new TestOperationSelector(ops, opProbs);
- }
-
- public void init(int fileId) throws HyracksDataException {
- index.create(fileId);
- index.open(fileId);
- }
-
- public long[] run(int numThreads, int numRepeats, int numOps, int batchSize) throws InterruptedException, TreeIndexException {
- int numBatches = numOps / batchSize;
- int threadNumBatches = numBatches / numThreads;
- if (threadNumBatches <= 0) {
- throw new TreeIndexException("Inconsistent parameters given. Need at least one batch per thread.");
- }
- long[] times = new long[numRepeats];
- for (int i = 0; i < numRepeats; i++) {
- DataGenThread dataGen = createDatagenThread(numThreads, numBatches, batchSize);
- dataGen.start();
- // Wait until the tupleBatchQueue is filled to capacity.
- while (dataGen.tupleBatchQueue.remainingCapacity() != 0 && dataGen.tupleBatchQueue.size() != numBatches) {
- Thread.sleep(10);
- }
-
- // Start worker threads.
- AbstractTreeIndexTestWorker[] workers = new AbstractTreeIndexTestWorker[numThreads];
- long start = System.currentTimeMillis();
- for (int j = 0; j < numThreads; j++) {
- workers[j] = workerFactory.create(dataGen, opSelector, index, threadNumBatches);
- workers[j].start();
- }
- // Join worker threads.
- for (int j = 0; j < numThreads; j++) {
- workers[j].join();
- }
- long end = System.currentTimeMillis();
- times[i] = end - start;
- }
- return times;
- }
-
- public void deinit() throws HyracksDataException {
- index.close();
- }
-
- // To allow subclasses to override the data gen params.
- public DataGenThread createDatagenThread(int numThreads, int numBatches, int batchSize) {
- return new DataGenThread(numThreads, numBatches, batchSize, fieldSerdes, PAYLOAD_SIZE, RANDOM_SEED, 2*numThreads, false);
- }
-}
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/TreeIndexTestContext.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/TreeIndexTestContext.java
deleted file mode 100644
index 113fc8e..0000000
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/TreeIndexTestContext.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2009-2010 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package edu.uci.ics.hyracks.storage.am.common.test;
-
-import java.util.Collection;
-
-import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
-import edu.uci.ics.hyracks.dataflow.common.comm.io.ArrayTupleBuilder;
-import edu.uci.ics.hyracks.dataflow.common.comm.io.ArrayTupleReference;
-import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndex;
-import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexAccessor;
-
-@SuppressWarnings("rawtypes")
-public abstract class TreeIndexTestContext<T extends CheckTuple> implements ITreeIndexTestContext<T> {
- protected final ISerializerDeserializer[] fieldSerdes;
- protected final ITreeIndex treeIndex;
- protected final ArrayTupleBuilder tupleBuilder;
- protected final ArrayTupleReference tuple = new ArrayTupleReference();
- protected final ITreeIndexAccessor indexAccessor;
-
- public TreeIndexTestContext(ISerializerDeserializer[] fieldSerdes, ITreeIndex treeIndex) {
- this.fieldSerdes = fieldSerdes;
- this.treeIndex = treeIndex;
- this.indexAccessor = treeIndex.createAccessor();
- this.tupleBuilder = new ArrayTupleBuilder(fieldSerdes.length);
- }
-
- @Override
- public int getFieldCount() {
- return fieldSerdes.length;
- }
-
- @Override
- public ITreeIndexAccessor getIndexAccessor() {
- return indexAccessor;
- }
-
- @Override
- public ArrayTupleReference getTuple() {
- return tuple;
- }
-
- @Override
- public ArrayTupleBuilder getTupleBuilder() {
- return tupleBuilder;
- }
-
- @Override
- public ISerializerDeserializer[] getFieldSerdes() {
- return fieldSerdes;
- }
-
- @Override
- public ITreeIndex getIndex() {
- return treeIndex;
- }
-
- @Override
- public void insertCheckTuple(T checkTuple, Collection<T> checkTuples) {
- checkTuples.add(checkTuple);
- }
-
- @Override
- public void deleteCheckTuple(T checkTuple, Collection<T> checkTuples) {
- checkTuples.remove(checkTuple);
- }
-}
\ No newline at end of file
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/TreeIndexTestUtils.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/TreeIndexTestUtils.java
deleted file mode 100644
index 4073f59..0000000
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/test/TreeIndexTestUtils.java
+++ /dev/null
@@ -1,245 +0,0 @@
-package edu.uci.ics.hyracks.storage.am.common.test;
-
-import static org.junit.Assert.fail;
-
-import java.io.ByteArrayInputStream;
-import java.io.DataInput;
-import java.io.DataInputStream;
-import java.io.DataOutput;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Random;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
-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.ArrayTupleReference;
-import edu.uci.ics.hyracks.dataflow.common.data.accessors.ITupleReference;
-import edu.uci.ics.hyracks.dataflow.common.util.TupleUtils;
-import edu.uci.ics.hyracks.storage.am.common.api.IIndexBulkLoadContext;
-import edu.uci.ics.hyracks.storage.am.common.api.ISearchPredicate;
-import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexCursor;
-import edu.uci.ics.hyracks.storage.am.common.api.TreeIndexException;
-
-@SuppressWarnings("rawtypes")
-public abstract class TreeIndexTestUtils {
- private static final Logger LOGGER = Logger.getLogger(TreeIndexTestUtils.class.getName());
-
- protected abstract CheckTuple createCheckTuple(int numFields, int numKeyFields);
-
- protected abstract ISearchPredicate createNullSearchPredicate();
-
- public abstract void checkExpectedResults(ITreeIndexCursor cursor, Collection checkTuples,
- ISerializerDeserializer[] fieldSerdes, int keyFieldCount, Iterator<CheckTuple> checkIter) throws Exception;
-
- protected abstract CheckTuple createIntCheckTuple(int[] fieldValues, int numKeyFields);
-
- protected abstract void setIntKeyFields(int[] fieldValues, int numKeyFields, int maxValue, Random rnd);
-
- protected abstract Collection createCheckTuplesCollection();
-
- protected abstract ArrayTupleBuilder createDeleteTupleBuilder(ITreeIndexTestContext ctx);
-
- // See if tuple with corresponding checkTuple exists in ctx.checkTuples.
- protected abstract boolean checkDiskOrderScanResult(ITupleReference tuple, CheckTuple checkTuple, ITreeIndexTestContext ctx) throws HyracksDataException;
-
- @SuppressWarnings("unchecked")
- public static void createTupleFromCheckTuple(CheckTuple checkTuple, ArrayTupleBuilder tupleBuilder,
- ArrayTupleReference tuple, ISerializerDeserializer[] fieldSerdes) throws HyracksDataException {
- int fieldCount = tupleBuilder.getFieldEndOffsets().length;
- DataOutput dos = tupleBuilder.getDataOutput();
- tupleBuilder.reset();
- for (int i = 0; i < fieldCount; i++) {
- fieldSerdes[i].serialize(checkTuple.get(i), dos);
- tupleBuilder.addFieldEndOffset();
- }
- tuple.reset(tupleBuilder.getFieldEndOffsets(), tupleBuilder.getByteArray());
- }
-
- @SuppressWarnings("unchecked")
- public CheckTuple createCheckTupleFromTuple(ITupleReference tuple, ISerializerDeserializer[] fieldSerdes,
- int numKeys) throws HyracksDataException {
- CheckTuple checkTuple = createCheckTuple(fieldSerdes.length, numKeys);
- int fieldCount = Math.min(fieldSerdes.length, tuple.getFieldCount());
- for (int i = 0; i < fieldCount; i++) {
- ByteArrayInputStream inStream = new ByteArrayInputStream(tuple.getFieldData(i), tuple.getFieldStart(i),
- tuple.getFieldLength(i));
- DataInput dataIn = new DataInputStream(inStream);
- Comparable fieldObj = (Comparable) fieldSerdes[i].deserialize(dataIn);
- checkTuple.add(fieldObj);
- }
- return checkTuple;
- }
-
- @SuppressWarnings("unchecked")
- public void checkScan(ITreeIndexTestContext ctx) throws Exception {
- if (LOGGER.isLoggable(Level.INFO)) {
- LOGGER.info("Testing Scan.");
- }
- ITreeIndexCursor scanCursor = ctx.getIndexAccessor().createSearchCursor();
- ISearchPredicate nullPred = createNullSearchPredicate();
- ctx.getIndexAccessor().search(scanCursor, nullPred);
- Iterator<CheckTuple> checkIter = ctx.getCheckTuples().iterator();
- checkExpectedResults(scanCursor, ctx.getCheckTuples(), ctx.getFieldSerdes(), ctx.getKeyFieldCount(), checkIter);
- }
-
- public void checkDiskOrderScan(ITreeIndexTestContext ctx) throws Exception {
- try {
- if (LOGGER.isLoggable(Level.INFO)) {
- LOGGER.info("Testing Disk-Order Scan.");
- }
- ITreeIndexCursor diskOrderCursor = ctx.getIndexAccessor().createDiskOrderScanCursor();
- ctx.getIndexAccessor().diskOrderScan(diskOrderCursor);
- int actualCount = 0;
- try {
- while (diskOrderCursor.hasNext()) {
- diskOrderCursor.next();
- ITupleReference tuple = diskOrderCursor.getTuple();
- CheckTuple checkTuple = createCheckTupleFromTuple(tuple, ctx.getFieldSerdes(),
- ctx.getKeyFieldCount());
- if (!checkDiskOrderScanResult(tuple, checkTuple, ctx)) {
- fail("Disk-order scan returned unexpected answer: " + checkTuple.toString());
- }
- actualCount++;
- }
- if (actualCount < ctx.getCheckTuples().size()) {
- fail("Disk-order scan returned fewer answers than expected.\nExpected: "
- + ctx.getCheckTuples().size() + "\nActual : " + actualCount);
- }
- if (actualCount > ctx.getCheckTuples().size()) {
- fail("Disk-order scan returned more answers than expected.\nExpected: "
- + ctx.getCheckTuples().size() + "\nActual : " + actualCount);
- }
- } finally {
- diskOrderCursor.close();
- }
- } catch (UnsupportedOperationException e) {
- // Ignore exception because some indexes, e.g. the LSMTrees, don't
- // support disk-order scan.
- if (LOGGER.isLoggable(Level.INFO)) {
- LOGGER.info("Ignoring disk-order scan since it's not supported.");
- }
- }
- }
-
- @SuppressWarnings("unchecked")
- public void insertIntTuples(ITreeIndexTestContext ctx, int numTuples, Random rnd) throws Exception {
- int fieldCount = ctx.getFieldCount();
- int numKeyFields = ctx.getKeyFieldCount();
- int[] fieldValues = new int[ctx.getFieldCount()];
- // Scale range of values according to number of keys.
- // For example, for 2 keys we want the square root of numTuples, for 3
- // keys the cube root of numTuples, etc.
- int maxValue = (int) Math.ceil(Math.pow(numTuples, 1.0 / (double) numKeyFields));
- for (int i = 0; i < numTuples; i++) {
- // Set keys.
- setIntKeyFields(fieldValues, numKeyFields, maxValue, rnd);
- // Set values.
- for (int j = numKeyFields; j < fieldCount; j++) {
- fieldValues[j] = j;
- }
- TupleUtils.createIntegerTuple(ctx.getTupleBuilder(), ctx.getTuple(), fieldValues);
- if (LOGGER.isLoggable(Level.INFO)) {
- if ((i + 1) % (numTuples / Math.min(10, numTuples)) == 0) {
- LOGGER.info("Inserting Tuple " + (i + 1) + "/" + numTuples);
- }
- }
- try {
- ctx.getIndexAccessor().insert(ctx.getTuple());
- ctx.insertCheckTuple(createIntCheckTuple(fieldValues, ctx.getKeyFieldCount()), ctx.getCheckTuples());
- } catch (TreeIndexException e) {
- // We set expected values only after insertion succeeds because
- // we ignore duplicate keys.
- }
- }
- }
-
- @SuppressWarnings("unchecked")
- public void bulkLoadIntTuples(ITreeIndexTestContext ctx, int numTuples, Random rnd) throws Exception {
- int fieldCount = ctx.getFieldCount();
- int numKeyFields = ctx.getKeyFieldCount();
- int[] fieldValues = new int[ctx.getFieldCount()];
- int maxValue = (int) Math.ceil(Math.pow(numTuples, 1.0 / (double) numKeyFields));
- Collection<CheckTuple> tmpCheckTuples = createCheckTuplesCollection();
- for (int i = 0; i < numTuples; i++) {
- // Set keys.
- setIntKeyFields(fieldValues, numKeyFields, maxValue, rnd);
- // Set values.
- for (int j = numKeyFields; j < fieldCount; j++) {
- fieldValues[j] = j;
- }
-
- // Set expected values. (We also use these as the pre-sorted stream
- // for ordered indexes bulk loading).
- ctx.insertCheckTuple(createIntCheckTuple(fieldValues, ctx.getKeyFieldCount()), tmpCheckTuples);
- }
- bulkLoadCheckTuples(ctx, tmpCheckTuples);
-
- // Add tmpCheckTuples to ctx check tuples for comparing searches.
- for (CheckTuple checkTuple : tmpCheckTuples) {
- ctx.insertCheckTuple(checkTuple, ctx.getCheckTuples());
- }
- }
-
- public static void bulkLoadCheckTuples(ITreeIndexTestContext ctx, Collection<CheckTuple> checkTuples)
- throws HyracksDataException, TreeIndexException {
- int fieldCount = ctx.getFieldCount();
- int numTuples = checkTuples.size();
- ArrayTupleBuilder tupleBuilder = new ArrayTupleBuilder(fieldCount);
- ArrayTupleReference tuple = new ArrayTupleReference();
- // Perform bulk load.
- IIndexBulkLoadContext bulkLoadCtx = ctx.getIndex().beginBulkLoad(0.7f);
- int c = 1;
- for (CheckTuple checkTuple : checkTuples) {
- if (LOGGER.isLoggable(Level.INFO)) {
- if (c % (numTuples / 10) == 0) {
- LOGGER.info("Bulk Loading Tuple " + c + "/" + numTuples);
- }
- }
- createTupleFromCheckTuple(checkTuple, tupleBuilder, tuple, ctx.getFieldSerdes());
- ctx.getIndex().bulkLoadAddTuple(tuple, bulkLoadCtx);
- c++;
- }
- ctx.getIndex().endBulkLoad(bulkLoadCtx);
- }
-
- @SuppressWarnings("unchecked")
- public void deleteTuples(ITreeIndexTestContext ctx, int numTuples, Random rnd) throws Exception {
- ArrayTupleBuilder deleteTupleBuilder = createDeleteTupleBuilder(ctx);
- ArrayTupleReference deleteTuple = new ArrayTupleReference();
- int numCheckTuples = ctx.getCheckTuples().size();
- // Copy CheckTuple references into array, so we can randomly pick from
- // there.
- CheckTuple[] checkTuples = new CheckTuple[numCheckTuples];
- int idx = 0;
- Iterator<CheckTuple> iter = ctx.getCheckTuples().iterator();
- while (iter.hasNext()) {
- CheckTuple checkTuple = iter.next();
- checkTuples[idx++] = checkTuple;
- }
-
- for (int i = 0; i < numTuples && numCheckTuples > 0; i++) {
- if (LOGGER.isLoggable(Level.INFO)) {
- if ((i + 1) % (numTuples / Math.min(10, numTuples)) == 0) {
- LOGGER.info("Deleting Tuple " + (i + 1) + "/" + numTuples);
- }
- }
- int checkTupleIdx = Math.abs(rnd.nextInt() % numCheckTuples);
- CheckTuple checkTuple = checkTuples[checkTupleIdx];
- createTupleFromCheckTuple(checkTuple, deleteTupleBuilder, deleteTuple, ctx.getFieldSerdes());
- ctx.getIndexAccessor().delete(deleteTuple);
-
- // Remove check tuple from expected results.
- ctx.deleteCheckTuple(checkTuple, ctx.getCheckTuples());
-
- // Swap with last "valid" CheckTuple.
- CheckTuple tmp = checkTuples[numCheckTuples - 1];
- checkTuples[numCheckTuples - 1] = checkTuple;
- checkTuples[checkTupleIdx] = tmp;
- numCheckTuples--;
- }
- }
-
-}