Repository: asterixdb Updated Branches: refs/heads/master 323403bab -> b8ea58cd8
[NO ISSUE] Misc Fixes for Point MBR RTree - user-model changes: no - storage format changes: no - interface changes: no Details: 1. Fix the MBR calculation of Point MBR RTrees when finalizing the bulkload process. 2. Fix the nullFlagBytes of Point MBR Rtrees. 3. Add unit test cases to cover Point MBR RTrees. Change-Id: Ice24112152a2d93c7d2316b7506e6d6e81f2df44 Reviewed-on: https://asterix-gerrit.ics.uci.edu/2911 Sonar-Qube: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Contrib: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: abdullah alamoudi <bamou...@gmail.com> Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/b8ea58cd Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/b8ea58cd Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/b8ea58cd Branch: refs/heads/master Commit: b8ea58cd85077c0d28d746cda49be7dc946ff6e1 Parents: 323403b Author: luochen01 <cl...@uci.edu> Authored: Wed Aug 15 11:32:05 2018 -0700 Committer: Luo Chen <cl...@uci.edu> Committed: Wed Aug 15 14:20:22 2018 -0700 ---------------------------------------------------------------------- .../LSMRTreeTupleReferenceForPointMBR.java | 4 +- .../hyracks/storage/am/rtree/impls/RTree.java | 1 + .../am/rtree/AbstractRTreeBulkLoadTest.java | 10 ++- .../storage/am/rtree/RTreeTestUtils.java | 75 ++++++++++++++++---- .../lsm/rtree/LSMRTreePointMBRBulkLoadTest.java | 70 ++++++++++++++++++ .../am/lsm/rtree/util/LSMRTreeTestContext.java | 13 +++- 6 files changed, 156 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/asterixdb/blob/b8ea58cd/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/tuples/LSMRTreeTupleReferenceForPointMBR.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/tuples/LSMRTreeTupleReferenceForPointMBR.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/tuples/LSMRTreeTupleReferenceForPointMBR.java index 1432aba..e28d5a2 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/tuples/LSMRTreeTupleReferenceForPointMBR.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/tuples/LSMRTreeTupleReferenceForPointMBR.java @@ -128,7 +128,9 @@ public class LSMRTreeTupleReferenceForPointMBR extends RTreeTypeAwareTupleRefere @Override protected int getNullFlagsBytes() { - return BitOperationUtils.getFlagBytes(inputTotalFieldCount + (antimatterAware ? 1 : 0)); + // stored key field count + value field count + return BitOperationUtils.getFlagBytes( + storedKeyFieldCount + inputTotalFieldCount - inputKeyFieldCount + (antimatterAware ? 1 : 0)); } @Override http://git-wip-us.apache.org/repos/asf/asterixdb/blob/b8ea58cd/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTree.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTree.java b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTree.java index f12f423..635fe7a 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTree.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTree.java @@ -1006,6 +1006,7 @@ public class RTree extends AbstractTreeIndex { //set next guide MBR //if propagateBulk didnt have to do anything this may be un-necessary if (nodeFrontiers.size() > 1 && nodeFrontiers.indexOf(n) < nodeFrontiers.size() - 1) { + lowerFrame = nodeFrontiers.indexOf(n) != 0 ? prevInteriorFrame : leafFrame; lowerFrame.setPage(n.page); ((RTreeNSMFrame) lowerFrame).adjustMBR(); interiorFrameTupleWriter.writeTupleFields(((RTreeNSMFrame) lowerFrame).getMBRTuples(), 0, mbr, 0); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/b8ea58cd/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeBulkLoadTest.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeBulkLoadTest.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeBulkLoadTest.java index 67b24a2..2d6f97c 100644 --- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeBulkLoadTest.java +++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeBulkLoadTest.java @@ -30,10 +30,16 @@ import org.apache.hyracks.storage.am.rtree.frames.RTreePolicyType; public abstract class AbstractRTreeBulkLoadTest extends AbstractRTreeTestDriver { private final RTreeTestUtils rTreeTestUtils; + private final boolean isPoint; public AbstractRTreeBulkLoadTest(boolean testRstarPolicy) { + this(testRstarPolicy, false); + } + + public AbstractRTreeBulkLoadTest(boolean testRstarPolicy, boolean isPoint) { super(testRstarPolicy); this.rTreeTestUtils = new RTreeTestUtils(); + this.isPoint = isPoint; } @Override @@ -47,9 +53,9 @@ public abstract class AbstractRTreeBulkLoadTest extends AbstractRTreeTestDriver // We assume all fieldSerdes are of the same type. Check the first // one to determine which field types to generate. if (fieldSerdes[0] instanceof IntegerSerializerDeserializer) { - rTreeTestUtils.bulkLoadIntTuples(ctx, numTuplesToInsert, getRandom()); + rTreeTestUtils.bulkLoadIntTuples(ctx, numTuplesToInsert, getRandom(), isPoint); } else if (fieldSerdes[0] instanceof DoubleSerializerDeserializer) { - rTreeTestUtils.bulkLoadDoubleTuples(ctx, numTuplesToInsert, getRandom()); + rTreeTestUtils.bulkLoadDoubleTuples(ctx, numTuplesToInsert, getRandom(), isPoint); } rTreeTestUtils.checkScan(ctx); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/b8ea58cd/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/RTreeTestUtils.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/RTreeTestUtils.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/RTreeTestUtils.java index 165bf43..92f5055 100644 --- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/RTreeTestUtils.java +++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/RTreeTestUtils.java @@ -93,8 +93,13 @@ public class RTreeTestUtils extends TreeIndexTestUtils { } } + public void insertDoubleTuples(IIndexTestContext ctx, int numTuples, Random rnd) throws HyracksDataException { + insertDoubleTuples(ctx, numTuples, rnd, false); + } + @SuppressWarnings("unchecked") - public void insertDoubleTuples(IIndexTestContext ctx, int numTuples, Random rnd) throws Exception { + public void insertDoubleTuples(IIndexTestContext ctx, int numTuples, Random rnd, boolean isPoint) + throws HyracksDataException { int fieldCount = ctx.getFieldCount(); int numKeyFields = ctx.getKeyFieldCount(); double[] fieldValues = new double[ctx.getFieldCount()]; @@ -104,7 +109,7 @@ public class RTreeTestUtils extends TreeIndexTestUtils { double maxValue = Math.ceil(Math.pow(numTuples, 1.0 / numKeyFields)); for (int i = 0; i < numTuples; i++) { // Set keys. - setDoubleKeyFields(fieldValues, numKeyFields, maxValue, rnd); + setDoubleKeyFields(fieldValues, numKeyFields, maxValue, rnd, isPoint); // Set values. setDoublePayloadFields(fieldValues, numKeyFields, fieldCount); TupleUtils.createDoubleTuple(ctx.getTupleBuilder(), ctx.getTuple(), fieldValues); @@ -126,15 +131,20 @@ public class RTreeTestUtils extends TreeIndexTestUtils { } } - private void setDoubleKeyFields(double[] fieldValues, int numKeyFields, double maxValue, Random rnd) { + private void setDoubleKeyFields(double[] fieldValues, int numKeyFields, double maxValue, Random rnd, + boolean isPoint) { int maxFieldPos = numKeyFields / 2; for (int j = 0; j < maxFieldPos; j++) { int k = maxFieldPos + j; double firstValue = rnd.nextDouble() % maxValue; double secondValue; - do { - secondValue = rnd.nextDouble() % maxValue; - } while (secondValue < firstValue); + if (isPoint) { + secondValue = firstValue; + } else { + do { + secondValue = rnd.nextDouble() % maxValue; + } while (secondValue < firstValue); + } fieldValues[j] = firstValue; fieldValues[k] = secondValue; } @@ -155,8 +165,13 @@ public class RTreeTestUtils extends TreeIndexTestUtils { return checkTuple; } - @SuppressWarnings("unchecked") public void bulkLoadDoubleTuples(IIndexTestContext ctx, int numTuples, Random rnd) throws Exception { + bulkLoadDoubleTuples(ctx, numTuples, rnd, false); + } + + @SuppressWarnings("unchecked") + public void bulkLoadDoubleTuples(IIndexTestContext ctx, int numTuples, Random rnd, boolean isPoint) + throws HyracksDataException { int fieldCount = ctx.getFieldCount(); int numKeyFields = ctx.getKeyFieldCount(); double[] fieldValues = new double[ctx.getFieldCount()]; @@ -164,7 +179,7 @@ public class RTreeTestUtils extends TreeIndexTestUtils { Collection<CheckTuple> tmpCheckTuples = createCheckTuplesCollection(); for (int i = 0; i < numTuples; i++) { // Set keys. - setDoubleKeyFields(fieldValues, numKeyFields, maxValue, rnd); + setDoubleKeyFields(fieldValues, numKeyFields, maxValue, rnd, isPoint); // Set values. setDoublePayloadFields(fieldValues, numKeyFields, fieldCount); @@ -222,22 +237,56 @@ public class RTreeTestUtils extends TreeIndexTestUtils { return checkTuple; } - @Override - protected void setIntKeyFields(int[] fieldValues, int numKeyFields, int maxValue, Random rnd) { + @SuppressWarnings("unchecked") + public void bulkLoadIntTuples(IIndexTestContext ctx, int numTuples, Random rnd, boolean isPoint) + throws HyracksDataException { + int fieldCount = ctx.getFieldCount(); + int numKeyFields = ctx.getKeyFieldCount(); + int[] fieldValues = new int[ctx.getFieldCount()]; + int maxValue = (int) Math.ceil(Math.pow(numTuples, 1.0 / numKeyFields)); + Collection<CheckTuple> tmpCheckTuples = createCheckTuplesCollection(); + for (int i = 0; i < numTuples; i++) { + // Set keys. + setIntKeyFields(fieldValues, numKeyFields, maxValue, rnd, isPoint); + // Set values. + setIntPayloadFields(fieldValues, numKeyFields, fieldCount); + + // 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, false); + + // Add tmpCheckTuples to ctx check tuples for comparing searches. + for (CheckTuple checkTuple : tmpCheckTuples) { + ctx.insertCheckTuple(checkTuple, ctx.getCheckTuples()); + } + } + + protected void setIntKeyFields(int[] fieldValues, int numKeyFields, int maxValue, Random rnd, boolean isPoint) { int maxFieldPos = numKeyFields / 2; for (int j = 0; j < maxFieldPos; j++) { int k = maxFieldPos + j; int firstValue = rnd.nextInt() % maxValue; int secondValue; - do { - secondValue = rnd.nextInt() % maxValue; - } while (secondValue < firstValue); + if (isPoint) { + secondValue = firstValue; + } else { + do { + secondValue = rnd.nextInt() % maxValue; + } while (secondValue < firstValue); + } fieldValues[j] = firstValue; fieldValues[k] = secondValue; } } @Override + protected void setIntKeyFields(int[] fieldValues, int numKeyFields, int maxValue, Random rnd) { + setIntKeyFields(fieldValues, numKeyFields, maxValue, rnd, false); + } + + @Override protected void setIntPayloadFields(int[] fieldValues, int numKeyFields, int numFields) { for (int j = numKeyFields; j < numFields; j++) { fieldValues[j] = intPayloadValue++; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/b8ea58cd/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/LSMRTreePointMBRBulkLoadTest.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/LSMRTreePointMBRBulkLoadTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/LSMRTreePointMBRBulkLoadTest.java new file mode 100644 index 0000000..0df7caf --- /dev/null +++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/LSMRTreePointMBRBulkLoadTest.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 at + * + * 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 org.apache.hyracks.storage.am.lsm.rtree; + +import java.util.Random; + +import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer; +import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.storage.am.common.api.IPrimitiveValueProviderFactory; +import org.apache.hyracks.storage.am.config.AccessMethodTestsConfig; +import org.apache.hyracks.storage.am.lsm.rtree.util.LSMRTreeTestContext; +import org.apache.hyracks.storage.am.lsm.rtree.util.LSMRTreeTestHarness; +import org.apache.hyracks.storage.am.rtree.AbstractRTreeBulkLoadTest; +import org.apache.hyracks.storage.am.rtree.AbstractRTreeTestContext; +import org.apache.hyracks.storage.am.rtree.frames.RTreePolicyType; +import org.junit.After; +import org.junit.Before; + +@SuppressWarnings("rawtypes") +public class LSMRTreePointMBRBulkLoadTest extends AbstractRTreeBulkLoadTest { + + public LSMRTreePointMBRBulkLoadTest() { + super(AccessMethodTestsConfig.LSM_RTREE_TEST_RSTAR_POLICY, true); + } + + private final LSMRTreeTestHarness harness = new LSMRTreeTestHarness(); + + @Before + public void setUp() throws HyracksDataException { + harness.setUp(); + } + + @After + public void tearDown() throws HyracksDataException { + harness.tearDown(); + } + + @Override + protected AbstractRTreeTestContext createTestContext(ISerializerDeserializer[] fieldSerdes, + IPrimitiveValueProviderFactory[] valueProviderFactories, int numKeys, RTreePolicyType rtreePolicyType) + throws Exception { + return LSMRTreeTestContext.create(harness.getIOManager(), harness.getVirtualBufferCaches(), + harness.getFileReference(), harness.getDiskBufferCache(), fieldSerdes, valueProviderFactories, numKeys, + rtreePolicyType, harness.getBoomFilterFalsePositiveRate(), harness.getMergePolicy(), + harness.getOperationTracker(), harness.getIOScheduler(), harness.getIOOperationCallbackFactory(), + harness.getMetadataPageManagerFactory(), true); + } + + @Override + protected Random getRandom() { + return harness.getRandom(); + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/b8ea58cd/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/util/LSMRTreeTestContext.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/util/LSMRTreeTestContext.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/util/LSMRTreeTestContext.java index 2bd74af..acdb268 100644 --- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/util/LSMRTreeTestContext.java +++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/util/LSMRTreeTestContext.java @@ -79,6 +79,17 @@ public final class LSMRTreeTestContext extends AbstractRTreeTestContext { double bloomFilterFalsePositiveRate, ILSMMergePolicy mergePolicy, ILSMOperationTracker opTracker, ILSMIOOperationScheduler ioScheduler, ILSMIOOperationCallbackFactory ioOpCallbackFactory, IMetadataPageManagerFactory metadataPageManagerFactory) throws Exception { + return create(ioManager, virtualBufferCaches, file, diskBufferCache, fieldSerdes, valueProviderFactories, + numKeyFields, rtreePolicyType, bloomFilterFalsePositiveRate, mergePolicy, opTracker, ioScheduler, + ioOpCallbackFactory, metadataPageManagerFactory, false); + } + + public static LSMRTreeTestContext create(IIOManager ioManager, List<IVirtualBufferCache> virtualBufferCaches, + FileReference file, IBufferCache diskBufferCache, ISerializerDeserializer[] fieldSerdes, + IPrimitiveValueProviderFactory[] valueProviderFactories, int numKeyFields, RTreePolicyType rtreePolicyType, + double bloomFilterFalsePositiveRate, ILSMMergePolicy mergePolicy, ILSMOperationTracker opTracker, + ILSMIOOperationScheduler ioScheduler, ILSMIOOperationCallbackFactory ioOpCallbackFactory, + IMetadataPageManagerFactory metadataPageManagerFactory, boolean isPointMBR) throws Exception { ITypeTraits[] typeTraits = SerdeUtils.serdesToTypeTraits(fieldSerdes); IBinaryComparatorFactory[] rtreeCmpFactories = SerdeUtils.serdesToComparatorFactories(fieldSerdes, numKeyFields); @@ -95,7 +106,7 @@ public final class LSMRTreeTestContext extends AbstractRTreeTestContext { typeTraits, rtreeCmpFactories, btreeCmpFactories, valueProviderFactories, rtreePolicyType, bloomFilterFalsePositiveRate, mergePolicy, opTracker, ioScheduler, ioOpCallbackFactory, LSMRTreeUtils.proposeBestLinearizer(typeTraits, rtreeCmpFactories.length), null, btreeFields, null, - null, null, true, false, metadataPageManagerFactory); + null, null, true, isPointMBR, metadataPageManagerFactory); LSMRTreeTestContext testCtx = new LSMRTreeTestContext(fieldSerdes, lsmTree); return testCtx; }