Jianfeng Jia has uploaded a new change for review.
https://asterix-gerrit.ics.uci.edu/1720
Change subject: Carry filter in 2ndary-to-primary index search
......................................................................
Carry filter in 2ndary-to-primary index search
Change-Id: I287f1dbd230aa649f1350114abf0a1d47e2bb53c
---
M
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
M
asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
M
asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/ExternalBTreeSearchOperatorNodePushable.java
M
asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/ExternalRTreeSearchOperatorNodePushable.java
M
hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/AbstractBTreeOperatorTest.java
M
hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreePrimaryIndexScanOperatorTest.java
M
hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreePrimaryIndexSearchOperatorTest.java
M
hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreePrimaryIndexStatsOperatorTest.java
M
hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreeSecondaryIndexInsertOperatorTest.java
M
hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreeSecondaryIndexSearchOperatorTest.java
M
hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreeSecondaryIndexUpsertOperatorTest.java
A
hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/common/DataSetConstants.java
M
hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreeOperatorTestHelper.java
M
hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreePrimaryIndexScanOperatorTest.java
M
hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreePrimaryIndexSearchOperatorTest.java
M
hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreeSecondaryIndexInsertOperatorTest.java
M
hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreeSecondaryIndexSearchOperatorTest.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorDescriptor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorNodePushable.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeUpdateSearchOperatorNodePushable.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeCountingSearchCursor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeRangeSearchCursor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/test/java/org/apache/hyracks/storage/am/btree/test/FramewriterTest.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/IIndexCursor.java
D
hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/ITreeIndexOperatorDescriptor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexDataflowHelper.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/TreeIndexDataflowHelper.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/TreeIndexDiskOrderScanCursor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeSearchCursor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySearchCursor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySortedCursor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/AbstractLSMIndexDataflowHelper.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexSearchCursor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/dataflow/LSMInvertedIndexSearchOperatorDescriptor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/dataflow/LSMInvertedIndexSearchOperatorNodePushable.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexSearchCursor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexRangeSearchCursor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexSearchCursor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSearchCursor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSortedCursor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesFlushCursor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/TreeTupleSorter.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/dataflow/RTreeSearchOperatorDescriptor.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/dataflow/RTreeSearchOperatorNodePushable.java
M
hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTreeSearchCursor.java
47 files changed, 878 insertions(+), 239 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/20/1720/1
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
index e059574..d4a80e2 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
@@ -355,6 +355,7 @@
sourceVars = ((AbstractUnnestMapOperator) unnestMapOp).getVariables();
// Assumes the primary keys are located at the end.
+ // TODO look at here about the variables
int start = sourceVars.size() - numPrimaryKeys;
int stop = sourceVars.size();
for (int i = start; i < stop; i++) {
@@ -537,6 +538,7 @@
// Optionally add a sort on the primary-index keys before searching
the primary index.
OrderOperator order = null;
if (sortPrimaryKeys) {
+ //FIXME should sort on filter first
order = new OrderOperator();
for (LogicalVariable pkVar : primaryKeyVars) {
Mutable<ILogicalExpression> vRef = new MutableObject<>(
diff --git
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
index 3c2bee1..cdb9b5b 100644
---
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
+++
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
@@ -211,7 +211,7 @@
filterFields,
storageComponentProvider.getMetadataPageManagerFactory());
BTreeSearchOperatorNodePushable searchOp = new
BTreeSearchOperatorNodePushable(searchOpDesc, ctx, 0,
primaryIndexInfo.getSearchRecordDescriptorProvider(),
/*primaryIndexInfo.primaryKeyIndexes*/null,
- /*primaryIndexInfo.primaryKeyIndexes*/null, true, true,
filterFields, filterFields);
+ /*primaryIndexInfo.primaryKeyIndexes*/null, true, true, false,
filterFields, filterFields);
emptyTupleOp.setFrameWriter(0, searchOp,
primaryIndexInfo.getSearchRecordDescriptorProvider().getInputRecordDescriptor(null,
0));
searchOp.setOutputFrameWriter(0, countOp, primaryIndexInfo.rDesc);
diff --git
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/ExternalBTreeSearchOperatorNodePushable.java
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/ExternalBTreeSearchOperatorNodePushable.java
index 69a2020..6e3b5d7 100644
---
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/ExternalBTreeSearchOperatorNodePushable.java
+++
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/ExternalBTreeSearchOperatorNodePushable.java
@@ -40,7 +40,7 @@
IHyracksTaskContext ctx, int partition, IRecordDescriptorProvider
recordDescProvider, int[] lowKeyFields,
int[] highKeyFields, boolean lowKeyInclusive, boolean
highKeyInclusive) throws HyracksDataException {
super(opDesc, ctx, partition, recordDescProvider, lowKeyFields,
highKeyFields, lowKeyInclusive,
- highKeyInclusive, null, null);
+ highKeyInclusive, false, null, null);
}
// We override the open function to search a specific version of the index
diff --git
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/ExternalRTreeSearchOperatorNodePushable.java
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/ExternalRTreeSearchOperatorNodePushable.java
index 237e2c0..29c7242 100644
---
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/ExternalRTreeSearchOperatorNodePushable.java
+++
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/ExternalRTreeSearchOperatorNodePushable.java
@@ -39,7 +39,7 @@
public
ExternalRTreeSearchOperatorNodePushable(AbstractTreeIndexOperatorDescriptor
opDesc, IHyracksTaskContext ctx,
int partition, IRecordDescriptorProvider recordDescProvider, int[]
keyFields) throws HyracksDataException {
- super(opDesc, ctx, partition, recordDescProvider, keyFields, null,
null);
+ super(opDesc, ctx, partition, recordDescProvider, keyFields, false,
null, null);
}
// We override this method to specify the searched version of the index
diff --git
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/AbstractBTreeOperatorTest.java
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/AbstractBTreeOperatorTest.java
index 94252b3..bfe5da9 100644
---
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/AbstractBTreeOperatorTest.java
+++
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/AbstractBTreeOperatorTest.java
@@ -24,8 +24,6 @@
import org.apache.hyracks.api.constraints.PartitionConstraintHelper;
import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
-import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
-import org.apache.hyracks.api.dataflow.value.ITypeTraits;
import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.api.io.FileSplit;
@@ -35,8 +33,6 @@
import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleBuilder;
import
org.apache.hyracks.dataflow.common.data.marshalling.UTF8StringSerializerDeserializer;
-import org.apache.hyracks.dataflow.common.data.parsers.IValueParserFactory;
-import org.apache.hyracks.dataflow.common.data.parsers.UTF8StringParserFactory;
import org.apache.hyracks.dataflow.std.connectors.OneToOneConnectorDescriptor;
import org.apache.hyracks.dataflow.std.file.ConstantFileSplitProvider;
import org.apache.hyracks.dataflow.std.file.DelimitedDataTupleParserFactory;
@@ -53,6 +49,7 @@
import
org.apache.hyracks.storage.am.common.dataflow.TreeIndexBulkLoadOperatorDescriptor;
import
org.apache.hyracks.storage.am.common.dataflow.TreeIndexCreateOperatorDescriptor;
import
org.apache.hyracks.storage.am.common.dataflow.TreeIndexInsertUpdateDeleteOperatorDescriptor;
+import
org.apache.hyracks.storage.am.common.freepage.AppendOnlyLinkedMetadataPageManagerFactory;
import
org.apache.hyracks.storage.am.common.freepage.LinkedMetadataPageManagerFactory;
import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallbackFactory;
import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
@@ -66,6 +63,8 @@
import org.junit.After;
import org.junit.Before;
+import static org.apache.hyracks.tests.am.common.DataSetConstants.*;
+
public abstract class AbstractBTreeOperatorTest extends
AbstractIntegrationTest {
static {
TestStorageManagerComponentHolder.init(8192, 20, 20);
@@ -73,38 +72,13 @@
protected final IStorageManager storageManager = new TestStorageManager();
protected final IIndexLifecycleManagerProvider lcManagerProvider = new
TestIndexLifecycleManagerProvider();
- protected IIndexDataflowHelperFactory dataflowHelperFactory;
-
- // field, type and key declarations for primary index
- protected final int primaryFieldCount = 6;
- protected final ITypeTraits[] primaryTypeTraits = new
ITypeTraits[primaryFieldCount];
- protected final int primaryKeyFieldCount = 1;
- protected final IBinaryComparatorFactory[] primaryComparatorFactories =
- new IBinaryComparatorFactory[primaryKeyFieldCount];
- protected final int[] primaryBloomFilterKeyFields = new
int[primaryKeyFieldCount];
-
- protected final RecordDescriptor primaryRecDesc = new RecordDescriptor(new
ISerializerDeserializer[] {
- new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
- new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
- new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer() });
+ protected IIndexDataflowHelperFactory primaryDataflowHelperFactory;
+ protected IIndexDataflowHelperFactory secondaryDataflowHelperFactory;
// to be set by subclasses
- protected String primaryFileName;
protected IFileSplitProvider primarySplitProvider;
- protected IPageManagerFactory pageManagerFactory = new
LinkedMetadataPageManagerFactory();
+ protected IPageManagerFactory pageManagerFactory =
AppendOnlyLinkedMetadataPageManagerFactory.INSTANCE;
- // field, type and key declarations for secondary indexes
- protected final int secondaryFieldCount = 2;
- protected final ITypeTraits[] secondaryTypeTraits = new
ITypeTraits[secondaryFieldCount];
- protected final int secondaryKeyFieldCount = 2;
- protected final IBinaryComparatorFactory[] secondaryComparatorFactories =
- new IBinaryComparatorFactory[secondaryKeyFieldCount];
- protected final int[] secondaryBloomFilterKeyFields = new
int[secondaryKeyFieldCount];
-
- protected final RecordDescriptor secondaryRecDesc = new
RecordDescriptor(new ISerializerDeserializer[] {
- new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer() });
-
- protected String secondaryFileName;
protected IFileSplitProvider secondarySplitProvider;
protected ITreeIndexOperatorTestHelper testHelper;
@@ -116,44 +90,29 @@
@Before
public void setup() throws Exception {
testHelper = createTestHelper();
- dataflowHelperFactory = createDataFlowHelperFactory();
- primaryFileName = testHelper.getPrimaryIndexName();
- primarySplitProvider = new ConstantFileSplitProvider(new FileSplit[] {
new ManagedFileSplit(NC1_ID,
- primaryFileName) });
- secondaryFileName = testHelper.getSecondaryIndexName();
- secondarySplitProvider = new ConstantFileSplitProvider(new FileSplit[]
{ new ManagedFileSplit(NC1_ID,
- secondaryFileName) });
-
-
- // field, type and key declarations for primary index
- primaryTypeTraits[0] = UTF8StringPointable.TYPE_TRAITS;
- primaryTypeTraits[1] = UTF8StringPointable.TYPE_TRAITS;
- primaryTypeTraits[2] = UTF8StringPointable.TYPE_TRAITS;
- primaryTypeTraits[3] = UTF8StringPointable.TYPE_TRAITS;
- primaryTypeTraits[4] = UTF8StringPointable.TYPE_TRAITS;
- primaryTypeTraits[5] = UTF8StringPointable.TYPE_TRAITS;
- primaryComparatorFactories[0] =
PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY);
- primaryBloomFilterKeyFields[0] = 0;
-
- // field, type and key declarations for secondary indexes
- secondaryTypeTraits[0] = UTF8StringPointable.TYPE_TRAITS;
- secondaryTypeTraits[1] = UTF8StringPointable.TYPE_TRAITS;
- secondaryComparatorFactories[0] =
PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY);
- secondaryComparatorFactories[1] =
PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY);
- secondaryBloomFilterKeyFields[0] = 0;
- secondaryBloomFilterKeyFields[1] = 1;
+ primaryDataflowHelperFactory = createPrimaryDataFlowHelperFactory();
+ secondaryDataflowHelperFactory =
createSecondaryDataFlowHelperFactory();
+ String primaryFileName = testHelper.getPrimaryIndexName();
+ primarySplitProvider =
+ new ConstantFileSplitProvider(new FileSplit[] { new
ManagedFileSplit(NC1_ID, primaryFileName) });
+ String secondaryFileName = testHelper.getSecondaryIndexName();
+ secondarySplitProvider =
+ new ConstantFileSplitProvider(new FileSplit[] { new
ManagedFileSplit(NC1_ID, secondaryFileName) });
}
- protected abstract IIndexDataflowHelperFactory
createDataFlowHelperFactory();
+ protected abstract IIndexDataflowHelperFactory
createPrimaryDataFlowHelperFactory();
+
+ protected abstract IIndexDataflowHelperFactory
createSecondaryDataFlowHelperFactory();
public void createPrimaryIndex() throws Exception {
JobSpecification spec = new JobSpecification();
TransientLocalResourceFactoryProvider localResourceFactoryProvider =
new TransientLocalResourceFactoryProvider();
- TreeIndexCreateOperatorDescriptor primaryCreateOp = new
TreeIndexCreateOperatorDescriptor(spec, storageManager,
- lcManagerProvider, primarySplitProvider, primaryTypeTraits,
primaryComparatorFactories,
- primaryBloomFilterKeyFields, dataflowHelperFactory,
localResourceFactoryProvider,
- NoOpOperationCallbackFactory.INSTANCE, pageManagerFactory);
+ TreeIndexCreateOperatorDescriptor primaryCreateOp =
+ new TreeIndexCreateOperatorDescriptor(spec, storageManager,
lcManagerProvider, primarySplitProvider,
+ primaryTypeTraits, primaryComparatorFactories,
primaryBloomFilterKeyFields,
+ primaryDataflowHelperFactory,
localResourceFactoryProvider,
+ NoOpOperationCallbackFactory.INSTANCE,
pageManagerFactory);
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
primaryCreateOp, NC1_ID);
spec.addRoot(primaryCreateOp);
runTest(spec);
@@ -165,19 +124,10 @@
FileSplit[] ordersSplits = new FileSplit[] { new
ManagedFileSplit(NC1_ID,
"data" + File.separator + "tpch0.001" + File.separator +
"orders-part1.tbl") };
IFileSplitProvider ordersSplitProvider = new
ConstantFileSplitProvider(ordersSplits);
- RecordDescriptor ordersDesc = new RecordDescriptor(new
ISerializerDeserializer[] {
- new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
- new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
- new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
- new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
- new UTF8StringSerializerDeserializer() });
+ RecordDescriptor ordersDesc = inputRecordDesc;
FileScanOperatorDescriptor ordScanner = new
FileScanOperatorDescriptor(spec, ordersSplitProvider,
- new DelimitedDataTupleParserFactory(new IValueParserFactory[]
{ UTF8StringParserFactory.INSTANCE,
- UTF8StringParserFactory.INSTANCE,
UTF8StringParserFactory.INSTANCE,
- UTF8StringParserFactory.INSTANCE,
UTF8StringParserFactory.INSTANCE,
- UTF8StringParserFactory.INSTANCE,
UTF8StringParserFactory.INSTANCE,
- UTF8StringParserFactory.INSTANCE,
UTF8StringParserFactory.INSTANCE }, '|'), ordersDesc);
+ new DelimitedDataTupleParserFactory(inputParserFactories,
'|'), ordersDesc);
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
ordScanner, NC1_ID);
ExternalSortOperatorDescriptor sorter = new
ExternalSortOperatorDescriptor(spec, 1000, new int[] { 0 },
@@ -185,11 +135,11 @@
ordersDesc);
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, sorter,
NC1_ID);
- int[] fieldPermutation = { 0, 1, 2, 4, 5, 7 };
- TreeIndexBulkLoadOperatorDescriptor primaryBtreeBulkLoad = new
TreeIndexBulkLoadOperatorDescriptor(spec,
- primaryRecDesc, storageManager, lcManagerProvider,
primarySplitProvider, primaryTypeTraits,
- primaryComparatorFactories, primaryBloomFilterKeyFields,
fieldPermutation, 0.7f, true, 1000L, true,
- dataflowHelperFactory, pageManagerFactory);
+ TreeIndexBulkLoadOperatorDescriptor primaryBtreeBulkLoad =
+ new TreeIndexBulkLoadOperatorDescriptor(spec, primaryRecDesc,
storageManager, lcManagerProvider,
+ primarySplitProvider, primaryTypeTraits,
primaryComparatorFactories,
+ primaryBloomFilterKeyFields, primaryFieldPermutation,
0.7f, true, 1000L, true,
+ primaryDataflowHelperFactory, pageManagerFactory);
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
primaryBtreeBulkLoad, NC1_ID);
NullSinkOperatorDescriptor nsOpDesc = new
NullSinkOperatorDescriptor(spec);
@@ -207,10 +157,11 @@
JobSpecification spec = new JobSpecification();
TransientLocalResourceFactoryProvider localResourceFactoryProvider =
new TransientLocalResourceFactoryProvider();
- TreeIndexCreateOperatorDescriptor secondaryCreateOp = new
TreeIndexCreateOperatorDescriptor(spec,
- storageManager, lcManagerProvider, secondarySplitProvider,
secondaryTypeTraits,
- secondaryComparatorFactories, secondaryBloomFilterKeyFields,
dataflowHelperFactory,
- localResourceFactoryProvider,
NoOpOperationCallbackFactory.INSTANCE, pageManagerFactory);
+ TreeIndexCreateOperatorDescriptor secondaryCreateOp =
+ new TreeIndexCreateOperatorDescriptor(spec, storageManager,
lcManagerProvider, secondarySplitProvider,
+ secondaryTypeTraits, secondaryComparatorFactories,
secondaryBloomFilterKeyFields,
+ secondaryDataflowHelperFactory,
localResourceFactoryProvider,
+ NoOpOperationCallbackFactory.INSTANCE,
pageManagerFactory);
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
secondaryCreateOp, NC1_ID);
spec.addRoot(secondaryCreateOp);
runTest(spec);
@@ -227,36 +178,40 @@
new UTF8StringSerializerDeserializer().serialize("0", dos);
tb.addFieldEndOffset();
- ISerializerDeserializer[] keyRecDescSers = { new
UTF8StringSerializerDeserializer(),
- new UTF8StringSerializerDeserializer() };
- RecordDescriptor keyRecDesc = new RecordDescriptor(keyRecDescSers);
+ RecordDescriptor keyRecDesc = secondaryRecDesc;
- ConstantTupleSourceOperatorDescriptor keyProviderOp = new
ConstantTupleSourceOperatorDescriptor(spec,
- keyRecDesc, tb.getFieldEndOffsets(), tb.getByteArray(),
tb.getSize());
+ ConstantTupleSourceOperatorDescriptor keyProviderOp =
+ new ConstantTupleSourceOperatorDescriptor(spec, keyRecDesc,
tb.getFieldEndOffsets(), tb.getByteArray(),
+ tb.getSize());
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
keyProviderOp, NC1_ID);
int[] lowKeyFields = null; // - infinity
int[] highKeyFields = null; // + infinity
// scan primary index
- BTreeSearchOperatorDescriptor primaryBtreeSearchOp = new
BTreeSearchOperatorDescriptor(spec, primaryRecDesc,
- storageManager, lcManagerProvider, primarySplitProvider,
primaryTypeTraits, primaryComparatorFactories,
- primaryBloomFilterKeyFields, lowKeyFields, highKeyFields,
true, true, dataflowHelperFactory, false,
- false, null, NoOpOperationCallbackFactory.INSTANCE, null,
null, new LinkedMetadataPageManagerFactory());
+ BTreeSearchOperatorDescriptor primaryBtreeSearchOp =
+ new BTreeSearchOperatorDescriptor(spec, primaryRecDesc,
storageManager, lcManagerProvider,
+ primarySplitProvider, primaryTypeTraits,
primaryComparatorFactories,
+ primaryBloomFilterKeyFields, lowKeyFields,
highKeyFields, true, true,
+ secondaryDataflowHelperFactory, false, false, null,
NoOpOperationCallbackFactory.INSTANCE, null,
+ null, new LinkedMetadataPageManagerFactory());
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
primaryBtreeSearchOp, NC1_ID);
// sort based on secondary keys
- ExternalSortOperatorDescriptor sorter = new
ExternalSortOperatorDescriptor(spec, 1000, new int[] { 3, 0 },
- new IBinaryComparatorFactory[] {
PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
-
PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
primaryRecDesc);
+ ExternalSortOperatorDescriptor sorter =
+ new ExternalSortOperatorDescriptor(spec, 1000,
secondaryFieldPermutationA,
+ new IBinaryComparatorFactory[] {
+
PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
+
PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
primaryRecDesc);
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, sorter,
NC1_ID);
// load secondary index
- int[] fieldPermutation = { 3, 0 };
- TreeIndexBulkLoadOperatorDescriptor secondaryBtreeBulkLoad = new
TreeIndexBulkLoadOperatorDescriptor(spec,
- secondaryRecDesc, storageManager, lcManagerProvider,
secondarySplitProvider, secondaryTypeTraits,
- secondaryComparatorFactories, secondaryBloomFilterKeyFields,
fieldPermutation, 0.7f, true, 1000L, true,
- dataflowHelperFactory, pageManagerFactory);
+ int[] fieldPermutation = secondaryFieldPermutationA;
+ TreeIndexBulkLoadOperatorDescriptor secondaryBtreeBulkLoad =
+ new TreeIndexBulkLoadOperatorDescriptor(spec,
secondaryRecDesc, storageManager, lcManagerProvider,
+ secondarySplitProvider, secondaryTypeTraits,
secondaryComparatorFactories,
+ secondaryBloomFilterKeyFields, fieldPermutation, 0.7f,
true, 1000L, true,
+ secondaryDataflowHelperFactory, pageManagerFactory);
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
secondaryBtreeBulkLoad, NC1_ID);
NullSinkOperatorDescriptor nsOpDesc = new
NullSinkOperatorDescriptor(spec);
@@ -278,37 +233,28 @@
FileSplit[] ordersSplits = new FileSplit[] { new
ManagedFileSplit(NC1_ID,
"data" + File.separator + "tpch0.002" + File.separator +
"orders-part2.tbl") };
IFileSplitProvider ordersSplitProvider = new
ConstantFileSplitProvider(ordersSplits);
- RecordDescriptor ordersDesc = new RecordDescriptor(new
ISerializerDeserializer[] {
- new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
- new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
- new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
- new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
- new UTF8StringSerializerDeserializer() });
+ RecordDescriptor ordersDesc = inputRecordDesc;
FileScanOperatorDescriptor ordScanner = new
FileScanOperatorDescriptor(spec, ordersSplitProvider,
- new DelimitedDataTupleParserFactory(new IValueParserFactory[]
{ UTF8StringParserFactory.INSTANCE,
- UTF8StringParserFactory.INSTANCE,
UTF8StringParserFactory.INSTANCE,
- UTF8StringParserFactory.INSTANCE,
UTF8StringParserFactory.INSTANCE,
- UTF8StringParserFactory.INSTANCE,
UTF8StringParserFactory.INSTANCE,
- UTF8StringParserFactory.INSTANCE,
UTF8StringParserFactory.INSTANCE }, '|'), ordersDesc);
+ new DelimitedDataTupleParserFactory(inputParserFactories,
'|'), ordersDesc);
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
ordScanner, NC1_ID);
// insert into primary index
- int[] primaryFieldPermutation = { 0, 1, 2, 4, 5, 7 };
TreeIndexInsertUpdateDeleteOperatorDescriptor primaryBtreeInsertOp =
- new TreeIndexInsertUpdateDeleteOperatorDescriptor(
- spec, ordersDesc, storageManager, lcManagerProvider,
primarySplitProvider, primaryTypeTraits,
- primaryComparatorFactories, primaryBloomFilterKeyFields,
primaryFieldPermutation, pipelineOperation,
- dataflowHelperFactory, null,
NoOpOperationCallbackFactory.INSTANCE, pageManagerFactory);
+ new TreeIndexInsertUpdateDeleteOperatorDescriptor(spec,
ordersDesc, storageManager, lcManagerProvider,
+ primarySplitProvider, primaryTypeTraits,
primaryComparatorFactories,
+ primaryBloomFilterKeyFields, primaryFieldPermutation,
pipelineOperation,
+ primaryDataflowHelperFactory, null,
NoOpOperationCallbackFactory.INSTANCE, pageManagerFactory);
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
primaryBtreeInsertOp, NC1_ID);
// first secondary index
- int[] fieldPermutationB = { 4, 0 };
+ int[] fieldPermutationB = secondaryFieldPermutationB;
TreeIndexInsertUpdateDeleteOperatorDescriptor secondaryInsertOp =
- new TreeIndexInsertUpdateDeleteOperatorDescriptor(
- spec, ordersDesc, storageManager, lcManagerProvider,
secondarySplitProvider, secondaryTypeTraits,
- secondaryComparatorFactories, secondaryBloomFilterKeyFields,
fieldPermutationB, pipelineOperation,
- dataflowHelperFactory, null,
NoOpOperationCallbackFactory.INSTANCE, pageManagerFactory);
+ new TreeIndexInsertUpdateDeleteOperatorDescriptor(spec,
ordersDesc, storageManager, lcManagerProvider,
+ secondarySplitProvider, secondaryTypeTraits,
secondaryComparatorFactories,
+ secondaryBloomFilterKeyFields, fieldPermutationB,
pipelineOperation,
+ secondaryDataflowHelperFactory, null,
NoOpOperationCallbackFactory.INSTANCE,
+ pageManagerFactory);
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
secondaryInsertOp, NC1_ID);
NullSinkOperatorDescriptor nullSink = new
NullSinkOperatorDescriptor(spec);
@@ -326,8 +272,9 @@
protected void destroyPrimaryIndex() throws Exception {
JobSpecification spec = new JobSpecification();
- IndexDropOperatorDescriptor primaryDropOp = new
IndexDropOperatorDescriptor(spec, storageManager,
- lcManagerProvider, primarySplitProvider,
dataflowHelperFactory, pageManagerFactory);
+ IndexDropOperatorDescriptor primaryDropOp =
+ new IndexDropOperatorDescriptor(spec, storageManager,
lcManagerProvider, primarySplitProvider,
+ primaryDataflowHelperFactory, pageManagerFactory);
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
primaryDropOp, NC1_ID);
spec.addRoot(primaryDropOp);
runTest(spec);
@@ -335,8 +282,9 @@
protected void destroySecondaryIndex() throws Exception {
JobSpecification spec = new JobSpecification();
- IndexDropOperatorDescriptor secondaryDropOp = new
IndexDropOperatorDescriptor(spec, storageManager,
- lcManagerProvider, secondarySplitProvider,
dataflowHelperFactory, pageManagerFactory);
+ IndexDropOperatorDescriptor secondaryDropOp =
+ new IndexDropOperatorDescriptor(spec, storageManager,
lcManagerProvider, secondarySplitProvider,
+ secondaryDataflowHelperFactory, pageManagerFactory);
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
secondaryDropOp, NC1_ID);
spec.addRoot(secondaryDropOp);
runTest(spec);
diff --git
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreePrimaryIndexScanOperatorTest.java
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreePrimaryIndexScanOperatorTest.java
index 4b7bac2..7a56452 100644
---
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreePrimaryIndexScanOperatorTest.java
+++
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreePrimaryIndexScanOperatorTest.java
@@ -36,10 +36,11 @@
import
org.apache.hyracks.dataflow.std.misc.ConstantTupleSourceOperatorDescriptor;
import
org.apache.hyracks.storage.am.btree.dataflow.BTreeSearchOperatorDescriptor;
import
org.apache.hyracks.storage.am.common.dataflow.IIndexDataflowHelperFactory;
-import
org.apache.hyracks.storage.am.common.freepage.LinkedMetadataPageManagerFactory;
import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallbackFactory;
import org.junit.Before;
import org.junit.Test;
+
+import static org.apache.hyracks.tests.am.common.DataSetConstants.*;
public class BTreePrimaryIndexScanOperatorTest extends
AbstractBTreeOperatorTest {
@@ -76,8 +77,8 @@
BTreeSearchOperatorDescriptor primaryBtreeSearchOp = new
BTreeSearchOperatorDescriptor(spec, primaryRecDesc,
storageManager, lcManagerProvider, primarySplitProvider,
primaryTypeTraits, primaryComparatorFactories,
- primaryBloomFilterKeyFields, lowKeyFields, highKeyFields,
true, true, dataflowHelperFactory, false,
- false, null, NoOpOperationCallbackFactory.INSTANCE, null,
null, new LinkedMetadataPageManagerFactory());
+ primaryBloomFilterKeyFields, lowKeyFields, highKeyFields,
true, true, primaryDataflowHelperFactory, false,
+ false, null, NoOpOperationCallbackFactory.INSTANCE, null,
null, pageManagerFactory);
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
primaryBtreeSearchOp, NC1_ID);
IFileSplitProvider outSplits = new ConstantFileSplitProvider(new
FileSplit[] { createFile(nc1) });
@@ -92,7 +93,12 @@
}
@Override
- protected IIndexDataflowHelperFactory createDataFlowHelperFactory() {
+ protected IIndexDataflowHelperFactory createPrimaryDataFlowHelperFactory()
{
+ return ((BTreeOperatorTestHelper)
testHelper).createDataFlowHelperFactory();
+ }
+
+ @Override
+ protected IIndexDataflowHelperFactory
createSecondaryDataFlowHelperFactory() {
return ((BTreeOperatorTestHelper)
testHelper).createDataFlowHelperFactory();
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreePrimaryIndexSearchOperatorTest.java
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreePrimaryIndexSearchOperatorTest.java
index 7f1b39b..e01b9bc 100644
---
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreePrimaryIndexSearchOperatorTest.java
+++
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreePrimaryIndexSearchOperatorTest.java
@@ -41,6 +41,8 @@
import org.junit.Before;
import org.junit.Test;
+import static org.apache.hyracks.tests.am.common.DataSetConstants.*;
+
public class BTreePrimaryIndexSearchOperatorTest extends
AbstractBTreeOperatorTest {
@Override
@@ -81,7 +83,7 @@
BTreeSearchOperatorDescriptor primaryBtreeSearchOp = new
BTreeSearchOperatorDescriptor(spec, primaryRecDesc,
storageManager, lcManagerProvider, primarySplitProvider,
primaryTypeTraits, primaryComparatorFactories,
- primaryBloomFilterKeyFields, lowKeyFields, highKeyFields,
true, true, dataflowHelperFactory, false,
+ primaryBloomFilterKeyFields, lowKeyFields, highKeyFields,
true, true, primaryDataflowHelperFactory, false,
false, null, NoOpOperationCallbackFactory.INSTANCE, null,
null, new LinkedMetadataPageManagerFactory());
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
primaryBtreeSearchOp, NC1_ID);
@@ -97,7 +99,12 @@
}
@Override
- protected IIndexDataflowHelperFactory createDataFlowHelperFactory() {
+ protected IIndexDataflowHelperFactory createPrimaryDataFlowHelperFactory()
{
+ return ((BTreeOperatorTestHelper)
testHelper).createDataFlowHelperFactory();
+ }
+
+ @Override
+ protected IIndexDataflowHelperFactory
createSecondaryDataFlowHelperFactory() {
return ((BTreeOperatorTestHelper)
testHelper).createDataFlowHelperFactory();
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreePrimaryIndexStatsOperatorTest.java
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreePrimaryIndexStatsOperatorTest.java
index 14e8816..53e54ad 100644
---
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreePrimaryIndexStatsOperatorTest.java
+++
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreePrimaryIndexStatsOperatorTest.java
@@ -33,6 +33,10 @@
import org.junit.Before;
import org.junit.Test;
+import static
org.apache.hyracks.tests.am.common.DataSetConstants.primaryBloomFilterKeyFields;
+import static
org.apache.hyracks.tests.am.common.DataSetConstants.primaryComparatorFactories;
+import static
org.apache.hyracks.tests.am.common.DataSetConstants.primaryTypeTraits;
+
public class BTreePrimaryIndexStatsOperatorTest extends
AbstractBTreeOperatorTest {
@Override
@@ -49,7 +53,7 @@
TreeIndexStatsOperatorDescriptor primaryStatsOp = new
TreeIndexStatsOperatorDescriptor(spec, storageManager,
lcManagerProvider, primarySplitProvider, primaryTypeTraits,
primaryComparatorFactories,
- primaryBloomFilterKeyFields, dataflowHelperFactory,
NoOpOperationCallbackFactory.INSTANCE,
+ primaryBloomFilterKeyFields, primaryDataflowHelperFactory,
NoOpOperationCallbackFactory.INSTANCE,
pageManagerFactory);
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
primaryStatsOp, NC1_ID);
IFileSplitProvider outSplits = new ConstantFileSplitProvider(new
FileSplit[] { createFile(nc1) });
@@ -62,7 +66,12 @@
}
@Override
- protected IIndexDataflowHelperFactory createDataFlowHelperFactory() {
+ protected IIndexDataflowHelperFactory createPrimaryDataFlowHelperFactory()
{
+ return ((BTreeOperatorTestHelper)
testHelper).createDataFlowHelperFactory();
+ }
+
+ @Override
+ protected IIndexDataflowHelperFactory
createSecondaryDataFlowHelperFactory() {
return ((BTreeOperatorTestHelper)
testHelper).createDataFlowHelperFactory();
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreeSecondaryIndexInsertOperatorTest.java
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreeSecondaryIndexInsertOperatorTest.java
index 9d04dbd..368654c 100644
---
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreeSecondaryIndexInsertOperatorTest.java
+++
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreeSecondaryIndexInsertOperatorTest.java
@@ -41,6 +41,8 @@
import org.junit.Before;
import org.junit.Test;
+import static org.apache.hyracks.tests.am.common.DataSetConstants.*;
+
public class BTreeSecondaryIndexInsertOperatorTest extends
AbstractBTreeOperatorTest {
@Override
@@ -86,7 +88,7 @@
BTreeSearchOperatorDescriptor secondaryBtreeSearchOp = new
BTreeSearchOperatorDescriptor(spec,
secondaryRecDesc, storageManager, lcManagerProvider,
secondarySplitProvider, secondaryTypeTraits,
secondaryComparatorFactories, secondaryBloomFilterKeyFields,
secondaryLowKeyFields,
- secondaryHighKeyFields, true, true, dataflowHelperFactory,
false, false, null,
+ secondaryHighKeyFields, true, true,
primaryDataflowHelperFactory, false, false, null,
NoOpOperationCallbackFactory.INSTANCE, null, null, new
LinkedMetadataPageManagerFactory());
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
secondaryBtreeSearchOp, NC1_ID);
@@ -100,7 +102,7 @@
BTreeSearchOperatorDescriptor primaryBtreeSearchOp = new
BTreeSearchOperatorDescriptor(spec, primaryRecDesc,
storageManager, lcManagerProvider, primarySplitProvider,
primaryTypeTraits, primaryComparatorFactories,
primaryBloomFilterKeyFields, primaryLowKeyFields,
primaryHighKeyFields, true, true,
- dataflowHelperFactory, false, false, null,
NoOpOperationCallbackFactory.INSTANCE, null, null,
+ primaryDataflowHelperFactory, false, false, null,
NoOpOperationCallbackFactory.INSTANCE, null, null,
new LinkedMetadataPageManagerFactory());
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
primaryBtreeSearchOp, NC1_ID);
@@ -117,7 +119,12 @@
}
@Override
- protected IIndexDataflowHelperFactory createDataFlowHelperFactory() {
+ protected IIndexDataflowHelperFactory createPrimaryDataFlowHelperFactory()
{
+ return ((BTreeOperatorTestHelper)
testHelper).createDataFlowHelperFactory();
+ }
+
+ @Override
+ protected IIndexDataflowHelperFactory
createSecondaryDataFlowHelperFactory() {
return ((BTreeOperatorTestHelper)
testHelper).createDataFlowHelperFactory();
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreeSecondaryIndexSearchOperatorTest.java
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreeSecondaryIndexSearchOperatorTest.java
index 49174a9..d3e42af 100644
---
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreeSecondaryIndexSearchOperatorTest.java
+++
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreeSecondaryIndexSearchOperatorTest.java
@@ -41,6 +41,8 @@
import org.junit.Before;
import org.junit.Test;
+import static org.apache.hyracks.tests.am.common.DataSetConstants.*;
+
public class BTreeSecondaryIndexSearchOperatorTest extends
AbstractBTreeOperatorTest {
@Override
@@ -85,7 +87,7 @@
BTreeSearchOperatorDescriptor secondaryBtreeSearchOp = new
BTreeSearchOperatorDescriptor(spec,
secondaryRecDesc, storageManager, lcManagerProvider,
secondarySplitProvider, secondaryTypeTraits,
secondaryComparatorFactories, secondaryBloomFilterKeyFields,
secondaryLowKeyFields,
- secondaryHighKeyFields, true, true, dataflowHelperFactory,
false, false, null,
+ secondaryHighKeyFields, true, true,
primaryDataflowHelperFactory, false, false, null,
NoOpOperationCallbackFactory.INSTANCE, null, null, new
LinkedMetadataPageManagerFactory());
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
secondaryBtreeSearchOp, NC1_ID);
@@ -99,7 +101,7 @@
BTreeSearchOperatorDescriptor primaryBtreeSearchOp = new
BTreeSearchOperatorDescriptor(spec, primaryRecDesc,
storageManager, lcManagerProvider, primarySplitProvider,
primaryTypeTraits, primaryComparatorFactories,
primaryBloomFilterKeyFields, primaryLowKeyFields,
primaryHighKeyFields, true, true,
- dataflowHelperFactory, false, false, null,
NoOpOperationCallbackFactory.INSTANCE, null, null,
+ primaryDataflowHelperFactory, false, false, null,
NoOpOperationCallbackFactory.INSTANCE, null, null,
new LinkedMetadataPageManagerFactory());
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
primaryBtreeSearchOp, NC1_ID);
IFileSplitProvider outSplits = new ConstantFileSplitProvider(new
FileSplit[] { createFile(nc1) });
@@ -113,7 +115,12 @@
}
@Override
- protected IIndexDataflowHelperFactory createDataFlowHelperFactory() {
+ protected IIndexDataflowHelperFactory createPrimaryDataFlowHelperFactory()
{
+ return ((BTreeOperatorTestHelper)
testHelper).createDataFlowHelperFactory();
+ }
+
+ @Override
+ protected IIndexDataflowHelperFactory
createSecondaryDataFlowHelperFactory() {
return ((BTreeOperatorTestHelper)
testHelper).createDataFlowHelperFactory();
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreeSecondaryIndexUpsertOperatorTest.java
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreeSecondaryIndexUpsertOperatorTest.java
index a355f60..77ee4e4 100644
---
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreeSecondaryIndexUpsertOperatorTest.java
+++
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/BTreeSecondaryIndexUpsertOperatorTest.java
@@ -40,6 +40,8 @@
import org.junit.Before;
import org.junit.Test;
+import static org.apache.hyracks.tests.am.common.DataSetConstants.*;
+
public class BTreeSecondaryIndexUpsertOperatorTest extends
AbstractBTreeOperatorTest {
@Override
@@ -85,7 +87,7 @@
BTreeSearchOperatorDescriptor secondaryBtreeSearchOp = new
BTreeSearchOperatorDescriptor(spec,
secondaryRecDesc, storageManager, lcManagerProvider,
secondarySplitProvider, secondaryTypeTraits,
secondaryComparatorFactories, secondaryBloomFilterKeyFields,
secondaryLowKeyFields,
- secondaryHighKeyFields, true, true, dataflowHelperFactory,
false, false, null,
+ secondaryHighKeyFields, true, true,
primaryDataflowHelperFactory, false, false, null,
NoOpOperationCallbackFactory.INSTANCE, null, null, new
LinkedMetadataPageManagerFactory());
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
secondaryBtreeSearchOp, NC1_ID);
@@ -99,7 +101,7 @@
BTreeSearchOperatorDescriptor primaryBtreeSearchOp = new
BTreeSearchOperatorDescriptor(spec, primaryRecDesc,
storageManager, lcManagerProvider, primarySplitProvider,
primaryTypeTraits, primaryComparatorFactories,
primaryBloomFilterKeyFields, primaryLowKeyFields,
primaryHighKeyFields, true, true,
- dataflowHelperFactory, false, false, null,
NoOpOperationCallbackFactory.INSTANCE, null, null,
+ primaryDataflowHelperFactory, false, false, null,
NoOpOperationCallbackFactory.INSTANCE, null, null,
new LinkedMetadataPageManagerFactory());
PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
primaryBtreeSearchOp, NC1_ID);
@@ -116,7 +118,12 @@
}
@Override
- protected IIndexDataflowHelperFactory createDataFlowHelperFactory() {
+ protected IIndexDataflowHelperFactory createPrimaryDataFlowHelperFactory()
{
+ return ((BTreeOperatorTestHelper)
testHelper).createDataFlowHelperFactory();
+ }
+
+ @Override
+ protected IIndexDataflowHelperFactory
createSecondaryDataFlowHelperFactory() {
return ((BTreeOperatorTestHelper)
testHelper).createDataFlowHelperFactory();
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/common/DataSetConstants.java
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/common/DataSetConstants.java
new file mode 100644
index 0000000..d4d734d
--- /dev/null
+++
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/common/DataSetConstants.java
@@ -0,0 +1,107 @@
+/*
+ * 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.tests.am.common;
+
+import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
+import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
+import org.apache.hyracks.api.dataflow.value.ITypeTraits;
+import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
+import org.apache.hyracks.data.std.accessors.PointableBinaryComparatorFactory;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
+import
org.apache.hyracks.dataflow.common.data.marshalling.UTF8StringSerializerDeserializer;
+import org.apache.hyracks.dataflow.common.data.parsers.IValueParserFactory;
+import org.apache.hyracks.dataflow.common.data.parsers.UTF8StringParserFactory;
+
+public class DataSetConstants {
+
+ public static final RecordDescriptor inputRecordDesc = new
RecordDescriptor(
+ new ISerializerDeserializer[] { new
UTF8StringSerializerDeserializer(),
+ new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
+ new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
+ new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
+ new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer() });
+
+ public static final IValueParserFactory[] inputParserFactories =
+ new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
UTF8StringParserFactory.INSTANCE,
+ UTF8StringParserFactory.INSTANCE,
UTF8StringParserFactory.INSTANCE,
+ UTF8StringParserFactory.INSTANCE,
UTF8StringParserFactory.INSTANCE,
+ UTF8StringParserFactory.INSTANCE,
UTF8StringParserFactory.INSTANCE,
+ UTF8StringParserFactory.INSTANCE };
+
+ // field, type and key declarations for primary index
+ public static int[] primaryFieldPermutation = { 0, 1, 2, 4, 5, 7 };
+ public static final int[] primaryFilterFields = new int[] { 0 };
+ public static final int[] primaryBtreeFields = new int[] { 0, 1, 2, 3, 4,
5 };
+
+ public static final ITypeTraits[] primaryFilterTypeTraits = new
ITypeTraits[] { UTF8StringPointable.TYPE_TRAITS };
+ public static final IBinaryComparatorFactory[] primaryFilterCmpFactories =
+ new IBinaryComparatorFactory[] {
PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) };
+
+ public static final ITypeTraits[] primaryTypeTraits =
+ new ITypeTraits[] { UTF8StringPointable.TYPE_TRAITS,
UTF8StringPointable.TYPE_TRAITS,
+ UTF8StringPointable.TYPE_TRAITS,
UTF8StringPointable.TYPE_TRAITS, UTF8StringPointable.TYPE_TRAITS,
+ UTF8StringPointable.TYPE_TRAITS };
+
+ public static final IBinaryComparatorFactory[] primaryComparatorFactories =
+ new IBinaryComparatorFactory[] {
PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) };
+ public static final int primaryKeyFieldCount =
primaryComparatorFactories.length;
+
+ public static final int[] primaryBloomFilterKeyFields = new int[] { 0 };
+
+ public static final RecordDescriptor primaryRecDesc = new RecordDescriptor(
+ new ISerializerDeserializer[] { new
UTF8StringSerializerDeserializer(),
+ new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
+ new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
+ new UTF8StringSerializerDeserializer() });
+
+ public static final RecordDescriptor primaryAndFilterRecDesc = new
RecordDescriptor(
+ new ISerializerDeserializer[] { new
UTF8StringSerializerDeserializer(),
+ new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
+ new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
+ new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
+ new UTF8StringSerializerDeserializer() });
+
+ // field, type and key declarations for secondary indexes
+
+ public static final int secondaryKeyFieldCount = 2;
+ public static final int[] secondaryFieldPermutationA = { 3, 0 };
+ public static final int[] secondaryFieldPermutationB = { 4, 0 };
+ public static final int[] secondaryFilterFields = new int[] { 1 };
+ public static final int[] secondaryBtreeFields = new int[] { 0, 1 };
+ public static final int[] secondaryBloomFilterKeyFields = new int[] { 0, 1
};
+ public static final ITypeTraits[] secondaryFilterTypeTraits = new
ITypeTraits[] { UTF8StringPointable.TYPE_TRAITS };
+ public static final IBinaryComparatorFactory[] secondaryFilterCmpFactories
=
+ new IBinaryComparatorFactory[] {
PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) };
+
+ public static final ITypeTraits[] secondaryTypeTraits =
+ new ITypeTraits[] { UTF8StringPointable.TYPE_TRAITS,
UTF8StringPointable.TYPE_TRAITS };
+
+ public static final IBinaryComparatorFactory[]
secondaryComparatorFactories =
+ new IBinaryComparatorFactory[] {
PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
+
PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) };
+
+ public static final RecordDescriptor secondaryRecDesc = new
RecordDescriptor(
+ new ISerializerDeserializer[] { new
UTF8StringSerializerDeserializer(),
+ new UTF8StringSerializerDeserializer() });
+ public static final RecordDescriptor secondaryWithFilterRecDesc = new
RecordDescriptor(
+ new ISerializerDeserializer[] { new
UTF8StringSerializerDeserializer(),
+ new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
+ new UTF8StringSerializerDeserializer() });
+}
diff --git
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreeOperatorTestHelper.java
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreeOperatorTestHelper.java
index 936bd13..fecf9b4 100644
---
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreeOperatorTestHelper.java
+++
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreeOperatorTestHelper.java
@@ -19,9 +19,6 @@
package org.apache.hyracks.tests.am.lsm.btree;
-import java.util.HashMap;
-import java.util.Map;
-
import org.apache.hyracks.control.nc.io.IOManager;
import
org.apache.hyracks.storage.am.common.dataflow.IIndexDataflowHelperFactory;
import
org.apache.hyracks.storage.am.lsm.btree.dataflow.LSMBTreeDataflowHelperFactory;
@@ -31,9 +28,15 @@
import
org.apache.hyracks.storage.am.lsm.common.impls.ThreadCountingOperationTrackerFactory;
import org.apache.hyracks.tests.am.common.LSMTreeOperatorTestHelper;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.hyracks.tests.am.common.DataSetConstants.*;
+
public class LSMBTreeOperatorTestHelper extends LSMTreeOperatorTestHelper {
private static final Map<String, String> MERGE_POLICY_PROPERTIES;
+
static {
MERGE_POLICY_PROPERTIES = new HashMap<String, String>();
MERGE_POLICY_PROPERTIES.put("num-components", "3");
@@ -43,11 +46,20 @@
super(ioManager);
}
- public IIndexDataflowHelperFactory createDataFlowHelperFactory() {
+ public IIndexDataflowHelperFactory createPrimaryDataFlowHelperFactory() {
return new LSMBTreeDataflowHelperFactory(virtualBufferCacheProvider,
new ConstantMergePolicyFactory(),
MERGE_POLICY_PROPERTIES,
ThreadCountingOperationTrackerFactory.INSTANCE,
SynchronousSchedulerProvider.INSTANCE,
NoOpIOOperationCallback.INSTANCE,
- DEFAULT_BLOOM_FILTER_FALSE_POSITIVE_RATE, true, null, null,
null, null, true);
+ DEFAULT_BLOOM_FILTER_FALSE_POSITIVE_RATE, true,
primaryFilterTypeTraits, primaryFilterCmpFactories,
+ primaryBtreeFields, primaryFilterFields, true);
+ }
+
+ public IIndexDataflowHelperFactory createSecondaryDataFlowHelperFactory() {
+ return new LSMBTreeDataflowHelperFactory(virtualBufferCacheProvider,
new ConstantMergePolicyFactory(),
+ MERGE_POLICY_PROPERTIES,
ThreadCountingOperationTrackerFactory.INSTANCE,
+ SynchronousSchedulerProvider.INSTANCE,
NoOpIOOperationCallback.INSTANCE,
+ DEFAULT_BLOOM_FILTER_FALSE_POSITIVE_RATE, true,
secondaryFilterTypeTraits, secondaryFilterCmpFactories,
+ secondaryBtreeFields, secondaryFilterFields, true);
}
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreePrimaryIndexScanOperatorTest.java
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreePrimaryIndexScanOperatorTest.java
index 839187c..c872d62 100644
---
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreePrimaryIndexScanOperatorTest.java
+++
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreePrimaryIndexScanOperatorTest.java
@@ -33,7 +33,12 @@
}
@Override
- protected IIndexDataflowHelperFactory createDataFlowHelperFactory() {
- return ((LSMBTreeOperatorTestHelper)
testHelper).createDataFlowHelperFactory();
+ protected IIndexDataflowHelperFactory createPrimaryDataFlowHelperFactory()
{
+ return ((LSMBTreeOperatorTestHelper)
testHelper).createPrimaryDataFlowHelperFactory();
+ }
+
+ @Override
+ protected IIndexDataflowHelperFactory
createSecondaryDataFlowHelperFactory() {
+ return ((LSMBTreeOperatorTestHelper)
testHelper).createSecondaryDataFlowHelperFactory();
}
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreePrimaryIndexSearchOperatorTest.java
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreePrimaryIndexSearchOperatorTest.java
index e29465d..6dea4a6 100644
---
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreePrimaryIndexSearchOperatorTest.java
+++
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreePrimaryIndexSearchOperatorTest.java
@@ -19,11 +19,33 @@
package org.apache.hyracks.tests.am.lsm.btree;
+import org.apache.hyracks.api.constraints.PartitionConstraintHelper;
+import org.apache.hyracks.api.dataflow.IOperatorDescriptor;
+import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
+import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.io.FileSplit;
+import org.apache.hyracks.api.job.JobSpecification;
+import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleBuilder;
+import
org.apache.hyracks.dataflow.common.data.marshalling.UTF8StringSerializerDeserializer;
+import org.apache.hyracks.dataflow.std.connectors.OneToOneConnectorDescriptor;
+import org.apache.hyracks.dataflow.std.file.ConstantFileSplitProvider;
+import org.apache.hyracks.dataflow.std.file.IFileSplitProvider;
+import org.apache.hyracks.dataflow.std.file.PlainFileWriterOperatorDescriptor;
+import
org.apache.hyracks.dataflow.std.misc.ConstantTupleSourceOperatorDescriptor;
+import
org.apache.hyracks.storage.am.btree.dataflow.BTreeSearchOperatorDescriptor;
import
org.apache.hyracks.storage.am.common.dataflow.IIndexDataflowHelperFactory;
+import
org.apache.hyracks.storage.am.common.freepage.LinkedMetadataPageManagerFactory;
+import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallbackFactory;
import org.apache.hyracks.test.support.TestStorageManagerComponentHolder;
import org.apache.hyracks.tests.am.btree.BTreePrimaryIndexSearchOperatorTest;
import org.apache.hyracks.tests.am.common.ITreeIndexOperatorTestHelper;
+import org.apache.hyracks.tests.util.NoopMissingWriterFactory;
+import org.junit.Test;
+
+import java.io.DataOutput;
+
+import static org.apache.hyracks.tests.am.common.DataSetConstants.*;
public class LSMBTreePrimaryIndexSearchOperatorTest extends
BTreePrimaryIndexSearchOperatorTest {
@Override
@@ -32,7 +54,119 @@
}
@Override
- protected IIndexDataflowHelperFactory createDataFlowHelperFactory() {
- return ((LSMBTreeOperatorTestHelper)
testHelper).createDataFlowHelperFactory();
+ protected IIndexDataflowHelperFactory createPrimaryDataFlowHelperFactory()
{
+ return ((LSMBTreeOperatorTestHelper)
testHelper).createPrimaryDataFlowHelperFactory();
+ }
+
+ @Override
+ protected IIndexDataflowHelperFactory
createSecondaryDataFlowHelperFactory() {
+ return ((LSMBTreeOperatorTestHelper)
testHelper).createSecondaryDataFlowHelperFactory();
+ }
+
+ @Test
+ public void shouldWriteFilterValueIfAppendFilterIsTrue() throws Exception {
+ JobSpecification spec = new JobSpecification();
+
+ // build tuple containing low and high search key
+ // high key and low key
+ ArrayTupleBuilder tb = new ArrayTupleBuilder(primaryKeyFieldCount * 2);
+ DataOutput dos = tb.getDataOutput();
+
+ tb.reset();
+ // low key
+ new UTF8StringSerializerDeserializer().serialize("100", dos);
+ tb.addFieldEndOffset();
+ // high key
+ new UTF8StringSerializerDeserializer().serialize("200", dos);
+ tb.addFieldEndOffset();
+
+ ISerializerDeserializer[] keyRecDescSers =
+ { new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer() };
+ RecordDescriptor keyRecDesc = new RecordDescriptor(keyRecDescSers);
+
+ ConstantTupleSourceOperatorDescriptor keyProviderOp =
+ new ConstantTupleSourceOperatorDescriptor(spec, keyRecDesc,
tb.getFieldEndOffsets(), tb.getByteArray(),
+ tb.getSize());
+ PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
keyProviderOp, NC1_ID);
+
+ int[] lowKeyFields = { 0 };
+ int[] highKeyFields = { 1 };
+
+ BTreeSearchOperatorDescriptor primaryBtreeSearchOp =
+ new BTreeSearchOperatorDescriptor(spec,
primaryAndFilterRecDesc, storageManager, lcManagerProvider,
+ primarySplitProvider, primaryTypeTraits,
primaryComparatorFactories,
+ primaryBloomFilterKeyFields, lowKeyFields,
highKeyFields, true, true,
+ primaryDataflowHelperFactory,
+ false, false, NoopMissingWriterFactory.INSTANCE,
NoOpOperationCallbackFactory.INSTANCE, true,
+ null, null, new LinkedMetadataPageManagerFactory());
+ PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
primaryBtreeSearchOp, NC1_ID);
+
+ IFileSplitProvider outSplits = new ConstantFileSplitProvider(new
FileSplit[] { createFile(nc1) });
+ IOperatorDescriptor printer = new
PlainFileWriterOperatorDescriptor(spec, outSplits, ",");
+ PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer,
NC1_ID);
+
+ spec.connect(new OneToOneConnectorDescriptor(spec), keyProviderOp, 0,
primaryBtreeSearchOp, 0);
+ spec.connect(new OneToOneConnectorDescriptor(spec),
primaryBtreeSearchOp, 0, printer, 0);
+
+ spec.addRoot(printer);
+ runTest(spec);
+ }
+
+ @Test
+ public void shouldWriteNothingIfGivenFilterValueIsOutOfRange() throws
Exception {
+ JobSpecification spec = new JobSpecification();
+
+ // build tuple containing low and high search key
+ // high key and low key
+ ArrayTupleBuilder tb = new ArrayTupleBuilder((primaryKeyFieldCount +
primaryFilterFields.length) * 2);
+ DataOutput dos = tb.getDataOutput();
+
+ tb.reset();
+ // low key
+ new UTF8StringSerializerDeserializer().serialize("100", dos);
+ tb.addFieldEndOffset();
+ // high key
+ new UTF8StringSerializerDeserializer().serialize("200", dos);
+ tb.addFieldEndOffset();
+ // min filter
+ new UTF8StringSerializerDeserializer().serialize("9999", dos);
+ tb.addFieldEndOffset();
+ // max filter
+ new UTF8StringSerializerDeserializer().serialize("9999", dos);
+ tb.addFieldEndOffset();
+
+ ISerializerDeserializer[] keyRecDescSers =
+ { new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer(),
+ new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer() };
+ RecordDescriptor keyRecDesc = new RecordDescriptor(keyRecDescSers);
+
+ ConstantTupleSourceOperatorDescriptor keyProviderOp =
+ new ConstantTupleSourceOperatorDescriptor(spec, keyRecDesc,
tb.getFieldEndOffsets(), tb.getByteArray(),
+ tb.getSize());
+ PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
keyProviderOp, NC1_ID);
+
+ int[] lowKeyFields = { 0 };
+ int[] highKeyFields = { 1 };
+ int[] minFilterFields = { 2 };
+ int[] maxFilterFields = { 3 };
+
+ BTreeSearchOperatorDescriptor primaryBtreeSearchOp =
+ new BTreeSearchOperatorDescriptor(spec,
primaryAndFilterRecDesc, storageManager, lcManagerProvider,
+ primarySplitProvider, primaryTypeTraits,
primaryComparatorFactories,
+ primaryBloomFilterKeyFields, lowKeyFields,
highKeyFields, true, true,
+ primaryDataflowHelperFactory,
+ false, false, NoopMissingWriterFactory.INSTANCE,
NoOpOperationCallbackFactory.INSTANCE, true,
+ minFilterFields, maxFilterFields, new
LinkedMetadataPageManagerFactory());
+ PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
primaryBtreeSearchOp, NC1_ID);
+
+ IFileSplitProvider outSplits = new ConstantFileSplitProvider(new
FileSplit[] { createFile(nc1) });
+ IOperatorDescriptor printer = new
PlainFileWriterOperatorDescriptor(spec, outSplits, ",");
+ PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer,
NC1_ID);
+
+ spec.connect(new OneToOneConnectorDescriptor(spec), keyProviderOp, 0,
primaryBtreeSearchOp, 0);
+ spec.connect(new OneToOneConnectorDescriptor(spec),
primaryBtreeSearchOp, 0, printer, 0);
+
+ spec.addRoot(printer);
+ runTest(spec);
}
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreeSecondaryIndexInsertOperatorTest.java
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreeSecondaryIndexInsertOperatorTest.java
index f0b4436..9e275e0 100644
---
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreeSecondaryIndexInsertOperatorTest.java
+++
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreeSecondaryIndexInsertOperatorTest.java
@@ -32,7 +32,13 @@
}
@Override
- protected IIndexDataflowHelperFactory createDataFlowHelperFactory() {
- return ((LSMBTreeOperatorTestHelper)
testHelper).createDataFlowHelperFactory();
+ protected IIndexDataflowHelperFactory createPrimaryDataFlowHelperFactory()
{
+ return ((LSMBTreeOperatorTestHelper)
testHelper).createPrimaryDataFlowHelperFactory();
}
+
+ @Override
+ protected IIndexDataflowHelperFactory
createSecondaryDataFlowHelperFactory() {
+ return ((LSMBTreeOperatorTestHelper)
testHelper).createSecondaryDataFlowHelperFactory();
+ }
+
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreeSecondaryIndexSearchOperatorTest.java
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreeSecondaryIndexSearchOperatorTest.java
index 22a5700..65276da 100644
---
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreeSecondaryIndexSearchOperatorTest.java
+++
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/btree/LSMBTreeSecondaryIndexSearchOperatorTest.java
@@ -19,11 +19,33 @@
package org.apache.hyracks.tests.am.lsm.btree;
+import org.apache.hyracks.api.constraints.PartitionConstraintHelper;
+import org.apache.hyracks.api.dataflow.IOperatorDescriptor;
+import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
+import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.io.FileSplit;
+import org.apache.hyracks.api.job.JobSpecification;
+import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleBuilder;
+import
org.apache.hyracks.dataflow.common.data.marshalling.UTF8StringSerializerDeserializer;
+import org.apache.hyracks.dataflow.std.connectors.OneToOneConnectorDescriptor;
+import org.apache.hyracks.dataflow.std.file.ConstantFileSplitProvider;
+import org.apache.hyracks.dataflow.std.file.IFileSplitProvider;
+import org.apache.hyracks.dataflow.std.file.PlainFileWriterOperatorDescriptor;
+import
org.apache.hyracks.dataflow.std.misc.ConstantTupleSourceOperatorDescriptor;
+import
org.apache.hyracks.storage.am.btree.dataflow.BTreeSearchOperatorDescriptor;
import
org.apache.hyracks.storage.am.common.dataflow.IIndexDataflowHelperFactory;
+import
org.apache.hyracks.storage.am.common.freepage.LinkedMetadataPageManagerFactory;
+import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallbackFactory;
import org.apache.hyracks.test.support.TestStorageManagerComponentHolder;
import org.apache.hyracks.tests.am.btree.BTreeSecondaryIndexSearchOperatorTest;
import org.apache.hyracks.tests.am.common.ITreeIndexOperatorTestHelper;
+import org.apache.hyracks.tests.util.NoopMissingWriterFactory;
+import org.junit.Test;
+
+import java.io.DataOutput;
+
+import static org.apache.hyracks.tests.am.common.DataSetConstants.*;
public class LSMBTreeSecondaryIndexSearchOperatorTest extends
BTreeSecondaryIndexSearchOperatorTest {
@Override
@@ -32,7 +54,76 @@
}
@Override
- protected IIndexDataflowHelperFactory createDataFlowHelperFactory() {
- return ((LSMBTreeOperatorTestHelper)
testHelper).createDataFlowHelperFactory();
+ protected IIndexDataflowHelperFactory createPrimaryDataFlowHelperFactory()
{
+ return ((LSMBTreeOperatorTestHelper)
testHelper).createPrimaryDataFlowHelperFactory();
}
+
+ @Override
+ protected IIndexDataflowHelperFactory
createSecondaryDataFlowHelperFactory() {
+ return ((LSMBTreeOperatorTestHelper)
testHelper).createSecondaryDataFlowHelperFactory();
+ }
+
+ @Test
+ public void shouldCarryFilterValueToPrimaryIndexSearch() throws Exception {
+ JobSpecification spec = new JobSpecification();
+
+ // build tuple containing search keys (only use the first key as search
+ // key)
+ ArrayTupleBuilder tb = new ArrayTupleBuilder(secondaryKeyFieldCount);
+ DataOutput dos = tb.getDataOutput();
+
+ tb.reset();
+ // low key
+ new UTF8StringSerializerDeserializer().serialize("1998-07-21", dos);
+ tb.addFieldEndOffset();
+ // high key
+ new UTF8StringSerializerDeserializer().serialize("2000-10-18", dos);
+ tb.addFieldEndOffset();
+
+ ISerializerDeserializer[] keyRecDescSers =
+ { new UTF8StringSerializerDeserializer(), new
UTF8StringSerializerDeserializer() };
+ RecordDescriptor keyRecDesc = new RecordDescriptor(keyRecDescSers);
+
+ ConstantTupleSourceOperatorDescriptor keyProviderOp =
+ new ConstantTupleSourceOperatorDescriptor(spec, keyRecDesc,
tb.getFieldEndOffsets(), tb.getByteArray(),
+ tb.getSize());
+ PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
keyProviderOp, NC1_ID);
+
+ int[] secondaryLowKeyFields = { 0 };
+ int[] secondaryHighKeyFields = { 1 };
+
+ // search secondary index
+ BTreeSearchOperatorDescriptor secondaryBtreeSearchOp =
+ new BTreeSearchOperatorDescriptor(spec,
secondaryWithFilterRecDesc, storageManager, lcManagerProvider,
+ secondarySplitProvider, secondaryTypeTraits,
secondaryComparatorFactories,
+ secondaryBloomFilterKeyFields, secondaryLowKeyFields,
secondaryHighKeyFields, true, true,
+ primaryDataflowHelperFactory, false, false,
NoopMissingWriterFactory.INSTANCE,
+ NoOpOperationCallbackFactory.INSTANCE, true, null,
null,
+ new LinkedMetadataPageManagerFactory());
+
+ PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
secondaryBtreeSearchOp, NC1_ID);
+
+ int[] primaryLowKeyFields = { 1 }; // second field from the tuples
+ int[] primaryHighKeyFields = { 1 }; // second field from the tuples
+ int[] minFilterFields = { 2 };
+ int[] maxFilterFields = { 3 };
+
+ // search primary index
+ BTreeSearchOperatorDescriptor primaryBtreeSearchOp =
+ new BTreeSearchOperatorDescriptor(spec, primaryRecDesc,
storageManager, lcManagerProvider,
+ primarySplitProvider, primaryTypeTraits,
primaryComparatorFactories,
+ primaryBloomFilterKeyFields, primaryLowKeyFields,
primaryHighKeyFields, true, true,
+ primaryDataflowHelperFactory, false, false, null,
NoOpOperationCallbackFactory.INSTANCE,
+ minFilterFields, maxFilterFields, new
LinkedMetadataPageManagerFactory());
+ PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
primaryBtreeSearchOp, NC1_ID);
+ IFileSplitProvider outSplits = new ConstantFileSplitProvider(new
FileSplit[] { createFile(nc1) });
+ IOperatorDescriptor printer = new
PlainFileWriterOperatorDescriptor(spec, outSplits, ",");
+ PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer,
NC1_ID);
+ spec.connect(new OneToOneConnectorDescriptor(spec), keyProviderOp, 0,
secondaryBtreeSearchOp, 0);
+ spec.connect(new OneToOneConnectorDescriptor(spec),
secondaryBtreeSearchOp, 0, primaryBtreeSearchOp, 0);
+ spec.connect(new OneToOneConnectorDescriptor(spec),
primaryBtreeSearchOp, 0, printer, 0);
+ spec.addRoot(printer);
+ runTest(spec);
+ }
+
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorDescriptor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorDescriptor.java
index acb008d..7a98fb8 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorDescriptor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorDescriptor.java
@@ -48,6 +48,7 @@
protected final boolean highKeyInclusive;
private final int[] minFilterFieldIndexes;
private final int[] maxFilterFieldIndexes;
+ private boolean appendFilter;
public BTreeSearchOperatorDescriptor(IOperatorDescriptorRegistry spec,
RecordDescriptor recDesc,
IStorageManager storageManager, IIndexLifecycleManagerProvider
lifecycleManagerProvider,
@@ -56,7 +57,8 @@
int[] highKeyFields, boolean lowKeyInclusive, boolean
highKeyInclusive,
IIndexDataflowHelperFactory dataflowHelperFactory, boolean
retainInput, boolean retainMissing,
IMissingWriterFactory missingWriterFactory,
ISearchOperationCallbackFactory searchOpCallbackProvider,
- int[] minFilterFieldIndexes, int[] maxFilterFieldIndexes,
IPageManagerFactory pageManagerFactory) {
+ boolean appendFilter, int[] minFilterFieldIndexes, int[]
maxFilterFieldIndexes,
+ IPageManagerFactory pageManagerFactory) {
super(spec, 1, 1, recDesc, storageManager, lifecycleManagerProvider,
fileSplitProvider, typeTraits,
comparatorFactories, bloomFilterKeyFields,
dataflowHelperFactory, null, retainInput, retainMissing,
missingWriterFactory,
NoOpLocalResourceFactoryProvider.INSTANCE, searchOpCallbackProvider,
@@ -67,12 +69,28 @@
this.highKeyInclusive = highKeyInclusive;
this.minFilterFieldIndexes = minFilterFieldIndexes;
this.maxFilterFieldIndexes = maxFilterFieldIndexes;
+ this.appendFilter = appendFilter;
+ }
+
+ public BTreeSearchOperatorDescriptor(IOperatorDescriptorRegistry spec,
RecordDescriptor recDesc,
+ IStorageManager storageManager, IIndexLifecycleManagerProvider
lifecycleManagerProvider,
+ IFileSplitProvider fileSplitProvider, ITypeTraits[] typeTraits,
+ IBinaryComparatorFactory[] comparatorFactories, int[]
bloomFilterKeyFields, int[] lowKeyFields,
+ int[] highKeyFields, boolean lowKeyInclusive, boolean
highKeyInclusive,
+ IIndexDataflowHelperFactory dataflowHelperFactory, boolean
retainInput, boolean retainMissing,
+ IMissingWriterFactory missingWriterFactory,
ISearchOperationCallbackFactory searchOpCallbackProvider,
+ int[] minFilterFieldIndexes, int[] maxFilterFieldIndexes,
IPageManagerFactory pageManagerFactory) {
+ this(spec, recDesc, storageManager, lifecycleManagerProvider,
fileSplitProvider, typeTraits,
+ comparatorFactories, bloomFilterKeyFields, lowKeyFields,
highKeyFields, lowKeyInclusive,
+ highKeyInclusive, dataflowHelperFactory, retainInput,
retainMissing, missingWriterFactory,
+ searchOpCallbackProvider, false, minFilterFieldIndexes,
maxFilterFieldIndexes, pageManagerFactory);
}
@Override
public IOperatorNodePushable createPushRuntime(final IHyracksTaskContext
ctx,
IRecordDescriptorProvider recordDescProvider, int partition, int
nPartitions) throws HyracksDataException {
return new BTreeSearchOperatorNodePushable(this, ctx, partition,
recordDescProvider, lowKeyFields,
- highKeyFields, lowKeyInclusive, highKeyInclusive,
minFilterFieldIndexes, maxFilterFieldIndexes);
+ highKeyFields, lowKeyInclusive, highKeyInclusive, appendFilter,
+ minFilterFieldIndexes, maxFilterFieldIndexes);
}
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorNodePushable.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorNodePushable.java
index c7af3fe..64be47e 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorNodePushable.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorNodePushable.java
@@ -41,9 +41,9 @@
public BTreeSearchOperatorNodePushable(AbstractTreeIndexOperatorDescriptor
opDesc, IHyracksTaskContext ctx,
int partition, IRecordDescriptorProvider recordDescProvider, int[]
lowKeyFields, int[] highKeyFields,
- boolean lowKeyInclusive, boolean highKeyInclusive, int[]
minFilterFieldIndexes,
+ boolean lowKeyInclusive, boolean highKeyInclusive, boolean
appendFilter, int[] minFilterFieldIndexes,
int[] maxFilterFieldIndexes) throws HyracksDataException {
- super(opDesc, ctx, partition, recordDescProvider,
minFilterFieldIndexes, maxFilterFieldIndexes);
+ super(opDesc, ctx, partition, recordDescProvider, appendFilter,
minFilterFieldIndexes, maxFilterFieldIndexes);
this.lowKeyInclusive = lowKeyInclusive;
this.highKeyInclusive = highKeyInclusive;
if (lowKeyFields != null && lowKeyFields.length > 0) {
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeUpdateSearchOperatorNodePushable.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeUpdateSearchOperatorNodePushable.java
index 7b81585..023bc81 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeUpdateSearchOperatorNodePushable.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeUpdateSearchOperatorNodePushable.java
@@ -39,7 +39,7 @@
int partition, IRecordDescriptorProvider recordDescProvider, int[]
lowKeyFields, int[] highKeyFields,
boolean lowKeyInclusive, boolean highKeyInclusive, ITupleUpdater
tupleUpdater) throws HyracksDataException {
super(opDesc, ctx, partition, recordDescProvider, lowKeyFields,
highKeyFields, lowKeyInclusive,
- highKeyInclusive, null, null);
+ highKeyInclusive, false, null, null);
this.tupleUpdater = tupleUpdater;
}
@@ -68,8 +68,7 @@
dos.write(tuple.getFieldData(i), tuple.getFieldStart(i),
tuple.getFieldLength(i));
tb.addFieldEndOffset();
}
- FrameUtils.appendToWriter(writer, appender,
tb.getFieldEndOffsets(), tb.getByteArray(), 0,
- tb.getSize());
+ FrameUtils.appendToWriter(writer, appender,
tb.getFieldEndOffsets(), tb.getByteArray(), 0, tb.getSize());
}
}
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeCountingSearchCursor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeCountingSearchCursor.java
index a02b492..4e1da71 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeCountingSearchCursor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeCountingSearchCursor.java
@@ -234,6 +234,16 @@
}
@Override
+ public ITupleReference getFilterMinTuple() {
+ return null;
+ }
+
+ @Override
+ public ITupleReference getFilterMaxTuple() {
+ return null;
+ }
+
+ @Override
public ICachedPage getPage() {
return page;
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeRangeSearchCursor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeRangeSearchCursor.java
index 5452604..4e82858 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeRangeSearchCursor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeRangeSearchCursor.java
@@ -103,6 +103,16 @@
}
@Override
+ public ITupleReference getFilterMinTuple() {
+ return null;
+ }
+
+ @Override
+ public ITupleReference getFilterMaxTuple() {
+ return null;
+ }
+
+ @Override
public ICachedPage getPage() {
return page;
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/test/java/org/apache/hyracks/storage/am/btree/test/FramewriterTest.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/test/java/org/apache/hyracks/storage/am/btree/test/FramewriterTest.java
index 75b2fdd..fa8b39b 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/test/java/org/apache/hyracks/storage/am/btree/test/FramewriterTest.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/test/java/org/apache/hyracks/storage/am/btree/test/FramewriterTest.java
@@ -285,7 +285,7 @@
for (IRecordDescriptorProvider recordDescProvider :
recordDescProviders) {
for (IHyracksTaskContext ctx : ctxs) {
BTreeSearchOperatorNodePushable writer = new
BTreeSearchOperatorNodePushable(opDesc, ctx, partition,
- recordDescProvider, keys, keys, lowKeyInclusive,
highKeyInclusive, keys, keys);
+ recordDescProvider, keys, keys, lowKeyInclusive,
highKeyInclusive, false, keys, keys);
writers.add(writer);
}
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/IIndexCursor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/IIndexCursor.java
index 2b5f3f6..5264f9e 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/IIndexCursor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/IIndexCursor.java
@@ -67,4 +67,15 @@
* @return the tuple pointed to by the cursor
*/
ITupleReference getTuple();
+
+ /**
+ * @return the min tuple of the current index's filter
+ */
+ ITupleReference getFilterMinTuple();
+
+ /**
+ *
+ * @return the max tuple of the current index's filter
+ */
+ ITupleReference getFilterMaxTuple();
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/ITreeIndexOperatorDescriptor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/ITreeIndexOperatorDescriptor.java
deleted file mode 100644
index 0a41e47..0000000
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/ITreeIndexOperatorDescriptor.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.common.dataflow;
-
-import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
-import org.apache.hyracks.api.dataflow.value.ITypeTraits;
-import org.apache.hyracks.storage.am.common.api.ITupleFilterFactory;
-
-public interface ITreeIndexOperatorDescriptor extends IIndexOperatorDescriptor
{
- public IBinaryComparatorFactory[] getTreeIndexComparatorFactories();
-
- public ITypeTraits[] getTreeIndexTypeTraits();
-
- public ITupleFilterFactory getTupleFilterFactory();
-}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexDataflowHelper.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexDataflowHelper.java
index c6d4e35..808bdc7 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexDataflowHelper.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexDataflowHelper.java
@@ -69,6 +69,8 @@
protected abstract IIndex createIndexInstance() throws
HyracksDataException;
+ public abstract int getNumFilterFields();
+
@Override
public IIndex getIndexInstance() {
return index;
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
index c089854..91e10c0 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
@@ -71,16 +71,20 @@
protected final int[] maxFilterFieldIndexes;
protected PermutingFrameTupleReference minFilterKey;
protected PermutingFrameTupleReference maxFilterKey;
+ protected final boolean appendIndexFilter;
+ protected ArrayTupleBuilder nonFilterTupleBuild;
+ protected final int numIndexFilterFields;
public IndexSearchOperatorNodePushable(IIndexOperatorDescriptor opDesc,
IHyracksTaskContext ctx, int partition,
- IRecordDescriptorProvider recordDescProvider, int[]
minFilterFieldIndexes, int[] maxFilterFieldIndexes)
- throws HyracksDataException {
+ IRecordDescriptorProvider recordDescProvider, boolean
appendIndexFilter, int[] minFilterFieldIndexes,
+ int[] maxFilterFieldIndexes) throws HyracksDataException {
this.opDesc = opDesc;
this.ctx = ctx;
this.indexHelper =
opDesc.getIndexDataflowHelperFactory().createIndexDataflowHelper(opDesc, ctx,
partition);
this.retainInput = opDesc.getRetainInput();
this.retainMissing = opDesc.getRetainMissing();
- if (this.retainMissing) {
+ this.appendIndexFilter = appendIndexFilter;
+ if (this.retainMissing || this.appendIndexFilter) {
this.nonMatchWriter =
opDesc.getMissingWriterFactory().createMissingWriter();
}
this.inputRecDesc =
recordDescProvider.getInputRecordDescriptor(opDesc.getActivityId(), 0);
@@ -94,6 +98,7 @@
maxFilterKey = new PermutingFrameTupleReference();
maxFilterKey.setFieldPermutation(maxFilterFieldIndexes);
}
+ this.numIndexFilterFields = ((IndexDataflowHelper)
indexHelper).getNumFilterFields();
}
protected abstract ISearchPredicate createSearchPredicate();
@@ -115,17 +120,14 @@
if (retainMissing) {
int fieldCount = getFieldCount();
nonMatchTupleBuild = new ArrayTupleBuilder(fieldCount);
- DataOutput out = nonMatchTupleBuild.getDataOutput();
- for (int i = 0; i < fieldCount; i++) {
- try {
- nonMatchWriter.writeMissing(out);
- } catch (IOException e) {
- e.printStackTrace();
- }
- nonMatchTupleBuild.addFieldEndOffset();
- }
+ buildMissingTuple(fieldCount, nonMatchTupleBuild, nonMatchWriter);
} else {
nonMatchTupleBuild = null;
+ }
+
+ if (appendIndexFilter) {
+ nonFilterTupleBuild = new ArrayTupleBuilder(numIndexFilterFields);
+ buildMissingTuple(numIndexFilterFields, nonFilterTupleBuild,
nonMatchWriter);
}
try {
@@ -159,9 +161,10 @@
}
}
ITupleReference tuple = cursor.getTuple();
- for (int i = 0; i < tuple.getFieldCount(); i++) {
- dos.write(tuple.getFieldData(i), tuple.getFieldStart(i),
tuple.getFieldLength(i));
- tb.addFieldEndOffset();
+ writeTupleToOutput(tuple);
+ if (appendIndexFilter) {
+ writeFilterTupleToOutput(cursor.getFilterMinTuple());
+ writeFilterTupleToOutput(cursor.getFilterMaxTuple());
}
FrameUtils.appendToWriter(writer, appender,
tb.getFieldEndOffsets(), tb.getByteArray(), 0, tb.getSize());
}
@@ -245,4 +248,36 @@
public void fail() throws HyracksDataException {
writer.fail();
}
+
+ private void writeTupleToOutput(ITupleReference tuple) throws IOException {
+ for (int i = 0; i < tuple.getFieldCount(); i++) {
+ dos.write(tuple.getFieldData(i), tuple.getFieldStart(i),
tuple.getFieldLength(i));
+ tb.addFieldEndOffset();
+ }
+ }
+
+ private void writeFilterTupleToOutput(ITupleReference tuple) throws
IOException {
+ if (tuple != null) {
+ writeTupleToOutput(tuple);
+ } else {
+ int[] offsets = nonFilterTupleBuild.getFieldEndOffsets();
+ for (int i = 0; i < offsets.length; i++) {
+ int start = i > 0 ? offsets[i - 1] : 0;
+ tb.addField(nonFilterTupleBuild.getByteArray(), start,
offsets[i]);
+ }
+ }
+ }
+
+ private static void buildMissingTuple(int numFields, ArrayTupleBuilder
nullTuple, IMissingWriter nonMatchWriter) {
+ DataOutput out = nullTuple.getDataOutput();
+ for (int i = 0; i < numFields; i++) {
+ try {
+ nonMatchWriter.writeMissing(out);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ nullTuple.addFieldEndOffset();
+ }
+ }
+
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/TreeIndexDataflowHelper.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/TreeIndexDataflowHelper.java
index 07cab2e..b7a6df9 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/TreeIndexDataflowHelper.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/TreeIndexDataflowHelper.java
@@ -26,6 +26,10 @@
import org.apache.hyracks.storage.am.common.impls.TreeIndexDiskOrderScanCursor;
public abstract class TreeIndexDataflowHelper extends IndexDataflowHelper {
+ @Override
+ public int getNumFilterFields() {
+ return 0;
+ }
public TreeIndexDataflowHelper(IIndexOperatorDescriptor opDesc,
IHyracksTaskContext ctx, int partition,
boolean durable) throws HyracksDataException {
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/TreeIndexDiskOrderScanCursor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/TreeIndexDiskOrderScanCursor.java
index 679ea2f..6bd3e60 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/TreeIndexDiskOrderScanCursor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/TreeIndexDiskOrderScanCursor.java
@@ -20,6 +20,7 @@
package org.apache.hyracks.storage.am.common.impls;
import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
import org.apache.hyracks.storage.am.common.api.ICursorInitialState;
import org.apache.hyracks.storage.am.common.api.ISearchPredicate;
import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
@@ -59,6 +60,16 @@
}
@Override
+ public ITupleReference getFilterMinTuple() {
+ return null;
+ }
+
+ @Override
+ public ITupleReference getFilterMaxTuple() {
+ return null;
+ }
+
+ @Override
public ICachedPage getPage() {
return page;
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
index 99c3e3f..27a030e 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
@@ -33,11 +33,8 @@
import org.apache.hyracks.storage.am.common.api.ISearchPredicate;
import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.*;
import
org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent.LSMComponentType;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMTreeTupleReference;
import
org.apache.hyracks.storage.am.lsm.common.impls.BloomFilterAwareBTreePointSearchCursor;
import org.apache.hyracks.storage.common.buffercache.IBufferCache;
import org.apache.hyracks.storage.common.buffercache.ICachedPage;
@@ -54,6 +51,7 @@
private ILSMHarness lsmHarness;
private boolean nextHasBeenCalled;
private boolean foundTuple;
+ private int foundIn = -1;
private ITupleReference frameTuple;
private List<ILSMComponent> operationalComponents;
@@ -86,6 +84,7 @@
} else {
frameTuple = rangeCursors[i].getTuple();
foundTuple = true;
+ foundIn = i;
return true;
}
}
@@ -107,6 +106,7 @@
frameTuple = rangeCursors[i].getTuple();
foundTuple = true;
searchCallback.complete(predicate.getLowKey());
+ foundIn = i;
return true;
}
} else {
@@ -118,6 +118,7 @@
searchCallback.reconcile(frameTuple);
searchCallback.complete(frameTuple);
foundTuple = true;
+ foundIn = i;
return true;
}
} else {
@@ -228,6 +229,24 @@
}
@Override
+ public ITupleReference getFilterMinTuple() {
+ ILSMComponentFilter filter = getFilter();
+ return filter == null ? null : filter.getMinTuple();
+ }
+
+ @Override
+ public ITupleReference getFilterMaxTuple() {
+ ILSMComponentFilter filter = getFilter();
+ return filter == null ? null : filter.getMaxTuple();
+ }
+
+ private ILSMComponentFilter getFilter() {
+ if(foundTuple){
+ return operationalComponents.get(foundIn).getLSMComponentFilter();
+ }
+ return null;
+ }
+ @Override
public ICachedPage getPage() {
// do nothing
return null;
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeSearchCursor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeSearchCursor.java
index a368ee9..937b659 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeSearchCursor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeSearchCursor.java
@@ -86,6 +86,16 @@
}
@Override
+ public ITupleReference getFilterMinTuple() {
+ return currentCursor.getFilterMinTuple();
+ }
+
+ @Override
+ public ITupleReference getFilterMaxTuple() {
+ return currentCursor.getFilterMaxTuple();
+ }
+
+ @Override
public ICachedPage getPage() {
return currentCursor.getPage();
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySearchCursor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySearchCursor.java
index 768ef27..540f5a7 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySearchCursor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySearchCursor.java
@@ -23,6 +23,7 @@
import org.apache.hyracks.storage.am.common.api.ICursorInitialState;
import org.apache.hyracks.storage.am.common.api.ISearchPredicate;
import org.apache.hyracks.storage.am.common.tuples.PermutingTupleReference;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
public class LSMBTreeWithBuddySearchCursor extends
LSMBTreeWithBuddyAbstractCursor {
@@ -112,6 +113,25 @@
}
@Override
+ public ITupleReference getFilterMinTuple() {
+ ILSMComponentFilter filter = getFilter();
+ return filter == null ? null : filter.getMinTuple();
+ }
+
+ @Override
+ public ITupleReference getFilterMaxTuple() {
+ ILSMComponentFilter filter = getFilter();
+ return filter == null ? null : filter.getMaxTuple();
+ }
+
+ private ILSMComponentFilter getFilter() {
+ if (currentCursor < 0) {
+ return null;
+ }
+ return
operationalComponents.get(currentCursor).getLSMComponentFilter();
+ }
+
+ @Override
public void open(ICursorInitialState initialState, ISearchPredicate
searchPred) throws HyracksDataException {
super.open(initialState, searchPred);
searchNextCursor();
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySortedCursor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySortedCursor.java
index 5e356c4..5e5afec 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySortedCursor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySortedCursor.java
@@ -19,9 +19,11 @@
package org.apache.hyracks.storage.am.lsm.btree.impls;
import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
import org.apache.hyracks.storage.am.common.api.ICursorInitialState;
import org.apache.hyracks.storage.am.common.api.ISearchPredicate;
import org.apache.hyracks.storage.am.common.tuples.PermutingTupleReference;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
public class LSMBTreeWithBuddySortedCursor extends
LSMBTreeWithBuddyAbstractCursor {
@@ -69,6 +71,25 @@
}
@Override
+ public ITupleReference getFilterMinTuple() {
+ ILSMComponentFilter filter = getFilter();
+ return filter == null ? null : filter.getMinTuple();
+ }
+
+ @Override
+ public ITupleReference getFilterMaxTuple() {
+ ILSMComponentFilter filter = getFilter();
+ return filter == null ? null : filter.getMaxTuple();
+ }
+
+ private ILSMComponentFilter getFilter() {
+ if(foundIn < 0){
+ return null;
+ }
+ return operationalComponents.get(foundIn).getLSMComponentFilter();
+ }
+
+ @Override
public boolean hasNext() throws HyracksDataException {
while (!foundNext) {
frameTuple = null;
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/AbstractLSMIndexDataflowHelper.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/AbstractLSMIndexDataflowHelper.java
index f219c12..2f01f27 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/AbstractLSMIndexDataflowHelper.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/AbstractLSMIndexDataflowHelper.java
@@ -25,6 +25,7 @@
import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
import org.apache.hyracks.api.dataflow.value.ITypeTraits;
import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.common.api.IIndex;
import org.apache.hyracks.storage.am.common.dataflow.IIndexOperatorDescriptor;
import org.apache.hyracks.storage.am.common.dataflow.IndexDataflowHelper;
import
org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
@@ -76,4 +77,9 @@
this.filterCmpFactories = filterCmpFactories;
this.filterFields = filterFields;
}
+
+ @Override
+ public int getNumFilterFields() {
+ return filterFields.length;
+ }
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexSearchCursor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexSearchCursor.java
index b8d21e4..58f0c7a 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexSearchCursor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexSearchCursor.java
@@ -28,10 +28,7 @@
import org.apache.hyracks.storage.am.common.api.IIndexCursor;
import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
import org.apache.hyracks.storage.am.common.ophelpers.MultiComparator;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMTreeTupleReference;
+import org.apache.hyracks.storage.am.lsm.common.api.*;
import org.apache.hyracks.storage.common.buffercache.IBufferCache;
import org.apache.hyracks.storage.common.buffercache.ICachedPage;
@@ -169,6 +166,18 @@
return outputElement.getTuple();
}
+ @Override
+ public ITupleReference getFilterMinTuple() {
+ ILSMComponentFilter filter =
operationalComponents.get(outputElement.cursorIndex).getLSMComponentFilter();
+ return filter == null ? null : filter.getMinTuple();
+ }
+
+ @Override
+ public ITupleReference getFilterMaxTuple() {
+ ILSMComponentFilter filter =
operationalComponents.get(outputElement.cursorIndex).getLSMComponentFilter();
+ return filter == null ? null : filter.getMaxTuple();
+ }
+
protected boolean
pushIntoQueueFromCursorAndReplaceThisElement(PriorityQueueElement e) throws
HyracksDataException {
int cursorIndex = e.getCursorIndex();
if (rangeCursors[cursorIndex].hasNext()) {
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/dataflow/LSMInvertedIndexSearchOperatorDescriptor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/dataflow/LSMInvertedIndexSearchOperatorDescriptor.java
index f628e76..f0ebedd 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/dataflow/LSMInvertedIndexSearchOperatorDescriptor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/dataflow/LSMInvertedIndexSearchOperatorDescriptor.java
@@ -47,6 +47,7 @@
private final IInvertedIndexSearchModifierFactory searchModifierFactory;
private final int[] minFilterFieldIndexes;
private final int[] maxFilterFieldIndexes;
+ private final boolean appendFilter;
private final boolean isFullTextSearchQuery;
public
LSMInvertedIndexSearchOperatorDescriptor(IOperatorDescriptorRegistry spec, int
queryField,
@@ -57,7 +58,7 @@
IIndexDataflowHelperFactory btreeDataflowHelperFactory,
IBinaryTokenizerFactory queryTokenizerFactory,
IInvertedIndexSearchModifierFactory searchModifierFactory,
RecordDescriptor recDesc, boolean retainInput,
boolean retainNull, IMissingWriterFactory nullWriterFactory,
- ISearchOperationCallbackFactory searchOpCallbackProvider, int[]
minFilterFieldIndexes,
+ ISearchOperationCallbackFactory searchOpCallbackProvider, boolean
appendFilter, int[] minFilterFieldIndexes,
int[] maxFilterFieldIndexes, IPageManagerFactory
pageManagerFactory, boolean isFullTextSearchQuery) {
super(spec, 1, 1, recDesc, storageManager, fileSplitProvider,
lifecycleManagerProvider, tokenTypeTraits,
tokenComparatorFactories, invListsTypeTraits,
invListComparatorFactories, queryTokenizerFactory,
@@ -69,6 +70,24 @@
this.minFilterFieldIndexes = minFilterFieldIndexes;
this.maxFilterFieldIndexes = maxFilterFieldIndexes;
this.isFullTextSearchQuery = isFullTextSearchQuery;
+ this.appendFilter = appendFilter;
+ }
+
+ public
LSMInvertedIndexSearchOperatorDescriptor(IOperatorDescriptorRegistry spec, int
queryField,
+ IStorageManager storageManager, IFileSplitProvider
fileSplitProvider,
+ IIndexLifecycleManagerProvider lifecycleManagerProvider,
ITypeTraits[] tokenTypeTraits,
+ IBinaryComparatorFactory[] tokenComparatorFactories, ITypeTraits[]
invListsTypeTraits,
+ IBinaryComparatorFactory[] invListComparatorFactories,
+ IIndexDataflowHelperFactory btreeDataflowHelperFactory,
IBinaryTokenizerFactory queryTokenizerFactory,
+ IInvertedIndexSearchModifierFactory searchModifierFactory,
RecordDescriptor recDesc, boolean retainInput,
+ boolean retainNull, IMissingWriterFactory nullWriterFactory,
+ ISearchOperationCallbackFactory searchOpCallbackProvider, int[]
minFilterFieldIndexes,
+ int[] maxFilterFieldIndexes, IPageManagerFactory
pageManagerFactory, boolean isFullTextSearchQuery) {
+ this(spec, queryField, storageManager, fileSplitProvider,
lifecycleManagerProvider, tokenTypeTraits,
+ tokenComparatorFactories, invListsTypeTraits,
invListComparatorFactories, btreeDataflowHelperFactory,
+ queryTokenizerFactory, searchModifierFactory, recDesc,
retainInput, retainNull, nullWriterFactory,
+ searchOpCallbackProvider, false, minFilterFieldIndexes,
maxFilterFieldIndexes, pageManagerFactory,
+ isFullTextSearchQuery);
}
@Override
@@ -76,6 +95,6 @@
IRecordDescriptorProvider recordDescProvider, int partition, int
nPartitions) throws HyracksDataException {
IInvertedIndexSearchModifier searchModifier =
searchModifierFactory.createSearchModifier();
return new LSMInvertedIndexSearchOperatorNodePushable(this, ctx,
partition, recordDescProvider, queryField,
- searchModifier, minFilterFieldIndexes, maxFilterFieldIndexes,
isFullTextSearchQuery);
+ searchModifier, appendFilter, minFilterFieldIndexes,
maxFilterFieldIndexes, isFullTextSearchQuery);
}
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/dataflow/LSMInvertedIndexSearchOperatorNodePushable.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/dataflow/LSMInvertedIndexSearchOperatorNodePushable.java
index 4634c7f..a5dee83 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/dataflow/LSMInvertedIndexSearchOperatorNodePushable.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/dataflow/LSMInvertedIndexSearchOperatorNodePushable.java
@@ -40,10 +40,9 @@
public LSMInvertedIndexSearchOperatorNodePushable(IIndexOperatorDescriptor
opDesc, IHyracksTaskContext ctx,
int partition, IRecordDescriptorProvider recordDescProvider, int
queryFieldIndex,
- IInvertedIndexSearchModifier searchModifier, int[]
minFilterFieldIndexes, int[] maxFilterFieldIndexes,
- boolean isFullTextSearchQuery)
- throws HyracksDataException {
- super(opDesc, ctx, partition, recordDescProvider,
minFilterFieldIndexes, maxFilterFieldIndexes);
+ IInvertedIndexSearchModifier searchModifier, boolean appendFilter,
int[] minFilterFieldIndexes,
+ int[] maxFilterFieldIndexes, boolean isFullTextSearchQuery) throws
HyracksDataException {
+ super(opDesc, ctx, partition, recordDescProvider, appendFilter,
minFilterFieldIndexes, maxFilterFieldIndexes);
this.searchModifier = searchModifier;
this.queryFieldIndex = queryFieldIndex;
this.isFullTextSearchQuery = isFullTextSearchQuery;
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexSearchCursor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexSearchCursor.java
index 9352fbb..a48c892 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexSearchCursor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexSearchCursor.java
@@ -32,6 +32,7 @@
import org.apache.hyracks.storage.am.common.ophelpers.MultiComparator;
import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
import
org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent.LSMComponentType;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness;
import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
import
org.apache.hyracks.storage.am.lsm.common.impls.BloomFilterAwareBTreePointSearchCursor;
@@ -190,4 +191,23 @@
public ITupleReference getTuple() {
return currentCursor.getTuple();
}
+
+ @Override
+ public ITupleReference getFilterMinTuple() {
+ ILSMComponentFilter filter = getComponentFilter();
+ return filter == null ? null : filter.getMinTuple();
+ }
+
+ @Override
+ public ITupleReference getFilterMaxTuple() {
+ ILSMComponentFilter filter = getComponentFilter();
+ return filter == null ? null : filter.getMaxTuple();
+ }
+
+ private ILSMComponentFilter getComponentFilter() {
+ if(accessorIndex < 0){
+ return null;
+ }
+ return
operationalComponents.get(accessorIndex).getLSMComponentFilter();
+ }
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexRangeSearchCursor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexRangeSearchCursor.java
index 4a74833..4340dec 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexRangeSearchCursor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexRangeSearchCursor.java
@@ -130,4 +130,14 @@
public ITupleReference getTuple() {
return concatTuple;
}
+
+ @Override
+ public ITupleReference getFilterMinTuple() {
+ return null;
+ }
+
+ @Override
+ public ITupleReference getFilterMaxTuple() {
+ return null;
+ }
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexSearchCursor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexSearchCursor.java
index 12dd319..1b6d492 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexSearchCursor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexSearchCursor.java
@@ -94,6 +94,16 @@
}
@Override
+ public ITupleReference getFilterMinTuple() {
+ return null;
+ }
+
+ @Override
+ public ITupleReference getFilterMaxTuple() {
+ return null;
+ }
+
+ @Override
public void reset() {
currentBufferIndex = 0;
tupleIndex = 0;
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSearchCursor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSearchCursor.java
index 08458d4..b04c2fd 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSearchCursor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSearchCursor.java
@@ -24,6 +24,8 @@
import org.apache.hyracks.storage.am.common.api.ICursorInitialState;
import org.apache.hyracks.storage.am.common.api.ISearchPredicate;
import org.apache.hyracks.storage.am.common.tuples.PermutingTupleReference;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
public class LSMRTreeSearchCursor extends LSMRTreeAbstractCursor {
@@ -63,6 +65,22 @@
}
}
+ @Override
+ public ITupleReference getFilterMinTuple() {
+ ILSMComponentFilter filter = getFilter();
+ return filter == null ? null : filter.getMinTuple();
+ }
+
+ @Override
+ public ITupleReference getFilterMaxTuple() {
+ ILSMComponentFilter filter = getFilter();
+ return filter == null ? null : filter.getMaxTuple();
+ }
+
+ private ILSMComponentFilter getFilter() {
+ return foundNext ?
operationalComponents.get(currentCursor).getLSMComponentFilter() : null;
+ }
+
private void searchNextCursor() throws HyracksDataException {
if (currentCursor < numberOfTrees) {
rtreeCursors[currentCursor].reset();
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSortedCursor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSortedCursor.java
index c536712..8252d14 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSortedCursor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSortedCursor.java
@@ -22,9 +22,11 @@
import org.apache.hyracks.api.dataflow.value.ILinearizeComparator;
import org.apache.hyracks.api.dataflow.value.ILinearizeComparatorFactory;
import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
import org.apache.hyracks.storage.am.common.api.ICursorInitialState;
import org.apache.hyracks.storage.am.common.api.ISearchPredicate;
import org.apache.hyracks.storage.am.common.tuples.PermutingTupleReference;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
public class LSMRTreeSortedCursor extends LSMRTreeAbstractCursor {
@@ -70,6 +72,21 @@
}
@Override
+ public ITupleReference getFilterMinTuple() {
+ ILSMComponentFilter filter = getFilter();
+ return filter == null ? null : filter.getMinTuple();
+ }
+
+ @Override
+ public ITupleReference getFilterMaxTuple() {
+ ILSMComponentFilter filter = getFilter();
+ return filter == null ? null : filter.getMaxTuple();
+ }
+
+ private ILSMComponentFilter getFilter() {
+ return foundIn < 0 ? null :
operationalComponents.get(foundIn).getLSMComponentFilter();
+ }
+ @Override
public boolean hasNext() throws HyracksDataException {
while (!foundNext) {
frameTuple = null;
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesFlushCursor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesFlushCursor.java
index d606f77..f2be5a0 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesFlushCursor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesFlushCursor.java
@@ -145,6 +145,16 @@
}
@Override
+ public ITupleReference getFilterMinTuple() {
+ return null;
+ }
+
+ @Override
+ public ITupleReference getFilterMaxTuple() {
+ return null;
+ }
+
+ @Override
public ICachedPage getPage() {
return null;
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/TreeTupleSorter.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/TreeTupleSorter.java
index 70b1141..4f894e5 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/TreeTupleSorter.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/TreeTupleSorter.java
@@ -96,6 +96,16 @@
return frameTuple1;
}
+ @Override
+ public ITupleReference getFilterMinTuple() {
+ return null;
+ }
+
+ @Override
+ public ITupleReference getFilterMaxTuple() {
+ return null;
+ }
+
public void insertTupleEntry(int pageId, int tupleOffset) {
if (numTuples * 2 == tPointers.length) {
int[] newData = new int[tPointers.length + ARRAY_GROWTH];
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/dataflow/RTreeSearchOperatorDescriptor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/dataflow/RTreeSearchOperatorDescriptor.java
index fad00ca..85639ad 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/dataflow/RTreeSearchOperatorDescriptor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/dataflow/RTreeSearchOperatorDescriptor.java
@@ -45,6 +45,25 @@
protected int[] keyFields; // fields in input tuple to be used as keys
protected final int[] minFilterFieldIndexes;
protected final int[] maxFilterFieldIndexes;
+ protected final boolean appendFilter;
+
+ public RTreeSearchOperatorDescriptor(IOperatorDescriptorRegistry spec,
RecordDescriptor recDesc,
+ IStorageManager storageManager, IIndexLifecycleManagerProvider
lifecycleManagerProvider,
+ IFileSplitProvider fileSplitProvider, ITypeTraits[] typeTraits,
+ IBinaryComparatorFactory[] comparatorFactories, int[] keyFields,
+ IIndexDataflowHelperFactory dataflowHelperFactory, boolean
retainInput, boolean retainNull,
+ IMissingWriterFactory nullWriterFactory,
ISearchOperationCallbackFactory searchOpCallbackFactory,
+ boolean appendFilter, int[] minFilterFieldIndexes, int[]
maxFilterFieldIndexes,
+ IPageManagerFactory pageManagerFactory) {
+ super(spec, 1, 1, recDesc, storageManager, lifecycleManagerProvider,
fileSplitProvider, typeTraits,
+ comparatorFactories, null, dataflowHelperFactory, null,
retainInput, retainNull, nullWriterFactory,
+ NoOpLocalResourceFactoryProvider.INSTANCE,
searchOpCallbackFactory,
+ NoOpOperationCallbackFactory.INSTANCE, pageManagerFactory);
+ this.keyFields = keyFields;
+ this.minFilterFieldIndexes = minFilterFieldIndexes;
+ this.maxFilterFieldIndexes = maxFilterFieldIndexes;
+ this.appendFilter = appendFilter;
+ }
public RTreeSearchOperatorDescriptor(IOperatorDescriptorRegistry spec,
RecordDescriptor recDesc,
IStorageManager storageManager, IIndexLifecycleManagerProvider
lifecycleManagerProvider,
@@ -53,19 +72,15 @@
IIndexDataflowHelperFactory dataflowHelperFactory, boolean
retainInput, boolean retainNull,
IMissingWriterFactory nullWriterFactory,
ISearchOperationCallbackFactory searchOpCallbackFactory,
int[] minFilterFieldIndexes, int[] maxFilterFieldIndexes,
IPageManagerFactory pageManagerFactory) {
- super(spec, 1, 1, recDesc, storageManager, lifecycleManagerProvider,
fileSplitProvider, typeTraits,
- comparatorFactories, null, dataflowHelperFactory, null,
retainInput, retainNull, nullWriterFactory,
- NoOpLocalResourceFactoryProvider.INSTANCE,
searchOpCallbackFactory,
- NoOpOperationCallbackFactory.INSTANCE, pageManagerFactory);
- this.keyFields = keyFields;
- this.minFilterFieldIndexes = minFilterFieldIndexes;
- this.maxFilterFieldIndexes = maxFilterFieldIndexes;
+ this(spec, recDesc, storageManager, lifecycleManagerProvider,
fileSplitProvider, typeTraits,
+ comparatorFactories, keyFields, dataflowHelperFactory,
retainInput, retainNull, nullWriterFactory,
+ searchOpCallbackFactory, false, minFilterFieldIndexes,
maxFilterFieldIndexes, pageManagerFactory);
}
@Override
public IOperatorNodePushable createPushRuntime(final IHyracksTaskContext
ctx,
IRecordDescriptorProvider recordDescProvider, int partition, int
nPartitions) throws HyracksDataException {
- return new RTreeSearchOperatorNodePushable(this, ctx, partition,
recordDescProvider, keyFields,
+ return new RTreeSearchOperatorNodePushable(this, ctx, partition,
recordDescProvider, keyFields, appendFilter,
minFilterFieldIndexes, maxFilterFieldIndexes);
}
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/dataflow/RTreeSearchOperatorNodePushable.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/dataflow/RTreeSearchOperatorNodePushable.java
index 1dc31b1..d0d77d9 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/dataflow/RTreeSearchOperatorNodePushable.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/dataflow/RTreeSearchOperatorNodePushable.java
@@ -36,9 +36,9 @@
protected MultiComparator cmp;
public RTreeSearchOperatorNodePushable(AbstractTreeIndexOperatorDescriptor
opDesc, IHyracksTaskContext ctx,
- int partition, IRecordDescriptorProvider recordDescProvider, int[]
keyFields, int[] minFilterFieldIndexes,
- int[] maxFilterFieldIndexes) throws HyracksDataException {
- super(opDesc, ctx, partition, recordDescProvider,
minFilterFieldIndexes, maxFilterFieldIndexes);
+ int partition, IRecordDescriptorProvider recordDescProvider, int[]
keyFields, boolean appendFilter,
+ int[] minFilterFieldIndexes, int[] maxFilterFieldIndexes) throws
HyracksDataException {
+ super(opDesc, ctx, partition, recordDescProvider, appendFilter,
minFilterFieldIndexes, maxFilterFieldIndexes);
if (keyFields != null && keyFields.length > 0) {
searchKey = new PermutingFrameTupleReference();
searchKey.setFieldPermutation(keyFields);
@@ -67,6 +67,6 @@
@Override
protected int getFieldCount() {
- return ((ITreeIndex)index).getFieldCount();
+ return ((ITreeIndex) index).getFieldCount();
}
}
diff --git
a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTreeSearchCursor.java
b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTreeSearchCursor.java
index 5ee8700..218d34d 100644
---
a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTreeSearchCursor.java
+++
b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTreeSearchCursor.java
@@ -79,6 +79,16 @@
return frameTuple;
}
+ @Override
+ public ITupleReference getFilterMinTuple() {
+ return null;
+ }
+
+ @Override
+ public ITupleReference getFilterMaxTuple() {
+ return null;
+ }
+
public int getTupleOffset() {
return leafFrame.getTupleOffset(currentTupleIndex);
}
--
To view, visit https://asterix-gerrit.ics.uci.edu/1720
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I287f1dbd230aa649f1350114abf0a1d47e2bb53c
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Jianfeng Jia <[email protected]>