This is an automated email from the ASF dual-hosted git repository.

alsuliman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git


The following commit(s) were added to refs/heads/master by this push:
     new afb22b3a8a [ASTERIXDB-3144][HYR][RT] Make sampling job support 
multiple partitions
afb22b3a8a is described below

commit afb22b3a8ae323fd84f163f62a5b828f802277a6
Author: Ali Alsuliman <[email protected]>
AuthorDate: Fri May 5 12:09:47 2023 -0700

    [ASTERIXDB-3144][HYR][RT] Make sampling job support multiple partitions
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    This patch changes the sampling job to support
    operating on multiple partitions. This is a step towards
    achieving compute/storage separation.
    
    Change-Id: If9abc68402adfe47ddeb5f1b1499e3414369f506
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17511
    Reviewed-by: Ali Alsuliman <[email protected]>
    Reviewed-by: Murtadha Hubail <[email protected]>
    Integration-Tests: Jenkins <[email protected]>
    Tested-by: Jenkins <[email protected]>
---
 asterixdb/asterix-app/pom.xml                      |  6 +++
 .../asterix/app/translator/QueryTranslator.java    |  2 +-
 .../asterix/app/bootstrap/TestNodeController.java  | 17 ++----
 .../storage/IndexDropOperatorNodePushableTest.java | 10 ++--
 .../metadata/declared/MetadataProvider.java        | 22 ++------
 .../metadata/utils/SampleOperationsHelper.java     | 53 ++++++++++--------
 .../DatasetStreamStatsOperatorDescriptor.java      | 63 +++++++++++++---------
 .../hyracks/api/job/profiling/IndexStats.java      |  3 ++
 .../hyracks-integration-tests/pom.xml              |  7 +++
 .../tests/am/btree/AbstractBTreeOperatorTest.java  | 16 +++---
 ...tterTuplesSecondaryIndexSearchOperatorTest.java |  4 +-
 .../tests/am/rtree/AbstractRTreeOperatorTest.java  | 16 +++---
 .../RTreeSecondaryIndexInsertOperatorTest.java     |  4 +-
 .../rtree/RTreeSecondaryIndexScanOperatorTest.java |  4 +-
 .../RTreeSecondaryIndexSearchOperatorTest.java     |  4 +-
 .../ApplicationDeploymentAPIIntegrationTest.java   |  2 +-
 .../integration/JobStatusAPIIntegrationTest.java   |  2 +-
 .../tests/integration/NodesAPIIntegrationTest.java |  2 +-
 .../StaticResourcesAPIIntegrationTest.java         |  2 +-
 .../hyracks/hyracks-storage-am-btree/pom.xml       |  7 +++
 .../dataflow/BTreeSearchOperatorNodePushable.java  | 13 -----
 .../storage/am/btree/test/FramewriterTest.java     |  7 ++-
 .../org/apache/hyracks/test/support/TestUtils.java |  8 ---
 .../java/org/apache/hyracks/util}/TestUtil.java    | 24 ++++++---
 24 files changed, 153 insertions(+), 145 deletions(-)

diff --git a/asterixdb/asterix-app/pom.xml b/asterixdb/asterix-app/pom.xml
index a3518852d0..8e32fa2275 100644
--- a/asterixdb/asterix-app/pom.xml
+++ b/asterixdb/asterix-app/pom.xml
@@ -657,6 +657,12 @@
       <groupId>org.apache.hyracks</groupId>
       <artifactId>hyracks-util</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.hyracks</groupId>
+      <artifactId>hyracks-util</artifactId>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>args4j</groupId>
       <artifactId>args4j</artifactId>
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index d2fd4be2be..98d93fdc14 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@ -4459,7 +4459,7 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
 
             if (ds.getDatasetType() == DatasetType.INTERNAL) {
                 for (Index index : indexes) {
-                    if (index.isSecondaryIndex()) {
+                    if (index.isSecondaryIndex() && !index.isSampleIndex()) {
                         jobsToExecute.add(
                                 
IndexUtil.buildSecondaryIndexCompactJobSpec(ds, index, metadataProvider, 
sourceLoc));
                     }
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 682b636f7f..d3c708d988 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
@@ -116,6 +116,7 @@ import 
org.apache.hyracks.storage.am.lsm.common.impls.NoMergePolicyFactory;
 import org.apache.hyracks.storage.common.IResourceFactory;
 import org.apache.hyracks.storage.common.IStorageManager;
 import org.apache.hyracks.test.support.TestUtils;
+import org.apache.hyracks.util.TestUtil;
 import org.apache.hyracks.util.file.FileUtil;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -214,7 +215,7 @@ public class TestNodeController {
                 fieldPermutation[i] = i;
             }
             int numPartitions = 
primaryIndexInfo.getFileSplitProvider().getFileSplits().length;
-            int[][] partitionsMap = getPartitionsMap(numPartitions);
+            int[][] partitionsMap = TestUtil.getPartitionsMap(numPartitions);
             IBinaryHashFunctionFactory[] pkHashFunFactories = 
primaryIndexInfo.hashFuncFactories;
             ITuplePartitionerFactory tuplePartitionerFactory = new 
FieldHashPartitionerFactory(
                     primaryIndexInfo.primaryKeyIndexes, pkHashFunFactories, 
numPartitions);
@@ -263,7 +264,7 @@ public class TestNodeController {
             }
 
             int numPartitions = 
primaryIndexInfo.getFileSplitProvider().getFileSplits().length;
-            int[][] partitionsMap = getPartitionsMap(numPartitions);
+            int[][] partitionsMap = TestUtil.getPartitionsMap(numPartitions);
             IBinaryHashFunctionFactory[] pkHashFunFactories = 
primaryIndexInfo.hashFuncFactories;
             ITuplePartitionerFactory tuplePartitionerFactory = new 
FieldHashPartitionerFactory(
                     primaryIndexInfo.primaryKeyIndexes, pkHashFunFactories, 
numPartitions);
@@ -372,7 +373,7 @@ public class TestNodeController {
             IIndexDataflowHelperFactory indexHelperFactory = new 
IndexDataflowHelperFactory(
                     storageComponentProvider.getStorageManager(), 
primaryIndexInfo.getFileSplitProvider());
             int numPartitions = 
primaryIndexInfo.getFileSplitProvider().getFileSplits().length;
-            int[][] partitionsMap = getPartitionsMap(numPartitions);
+            int[][] partitionsMap = TestUtil.getPartitionsMap(numPartitions);
             IBinaryHashFunctionFactory[] pkHashFunFactories = 
primaryIndexInfo.hashFuncFactories;
             ITuplePartitionerFactory tuplePartitionerFactory = new 
FieldHashPartitionerFactory(
                     primaryIndexInfo.primaryKeyIndexes, pkHashFunFactories, 
numPartitions);
@@ -838,7 +839,7 @@ public class TestNodeController {
         IIndexDataflowHelperFactory indexHelperFactory = new 
IndexDataflowHelperFactory(
                 storageComponentProvider.getStorageManager(), 
primaryIndexInfo.getFileSplitProvider());
         int numPartitions = 
primaryIndexInfo.getFileSplitProvider().getFileSplits().length;
-        int[][] partitionsMap = getPartitionsMap(numPartitions);
+        int[][] partitionsMap = TestUtil.getPartitionsMap(numPartitions);
         IBinaryHashFunctionFactory[] pkHashFunFactories = 
primaryIndexInfo.hashFuncFactories;
         ITuplePartitionerFactory tuplePartitionerFactory =
                 new 
FieldHashPartitionerFactory(primaryIndexInfo.primaryKeyIndexes, 
pkHashFunFactories, numPartitions);
@@ -912,12 +913,4 @@ public class TestNodeController {
         }
         return new RecordDescriptor(outputSerDes, outputTypeTraits);
     }
-
-    private static int[][] getPartitionsMap(int numPartitions) {
-        int[][] map = new int[numPartitions][1];
-        for (int i = 0; i < numPartitions; i++) {
-            map[i] = new int[] { i };
-        }
-        return map;
-    }
 }
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
index e1092ddde2..bb529469aa 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
@@ -57,7 +57,7 @@ import 
org.apache.hyracks.storage.am.common.dataflow.IndexDataflowHelperFactory;
 import 
org.apache.hyracks.storage.am.common.dataflow.IndexDropOperatorDescriptor.DropOption;
 import 
org.apache.hyracks.storage.am.common.dataflow.IndexDropOperatorNodePushable;
 import org.apache.hyracks.storage.am.lsm.common.impls.NoMergePolicyFactory;
-import org.apache.hyracks.test.support.TestUtils;
+import org.apache.hyracks.util.TestUtil;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -176,7 +176,7 @@ public class IndexDropOperatorNodePushableTest {
         dataflowHelper.open();
         // try to drop in-use index (should fail)
         IndexDropOperatorNodePushable dropInUseOp = new 
IndexDropOperatorNodePushable(helperFactory,
-                EnumSet.noneOf(DropOption.class), ctx, 0, 
TestUtils.getPartitionsMap(1));
+                EnumSet.noneOf(DropOption.class), ctx, 0, 
TestUtil.getPartitionsMap(1));
         try {
             dropInUseOp.initialize();
         } catch (HyracksDataException e) {
@@ -192,7 +192,7 @@ public class IndexDropOperatorNodePushableTest {
         dropFailed.set(false);
         // drop with option wait for in-use should be successful once the 
index is closed
         final IndexDropOperatorNodePushable dropWithWaitOp = new 
IndexDropOperatorNodePushable(helperFactory,
-                EnumSet.of(DropOption.IF_EXISTS, DropOption.WAIT_ON_IN_USE), 
ctx, 0, TestUtils.getPartitionsMap(1));
+                EnumSet.of(DropOption.IF_EXISTS, DropOption.WAIT_ON_IN_USE), 
ctx, 0, TestUtil.getPartitionsMap(1));
         Thread dropThread = new Thread(() -> {
             try {
                 dropWithWaitOp.initialize();
@@ -216,7 +216,7 @@ public class IndexDropOperatorNodePushableTest {
         dropFailed.set(false);
         // Dropping non-existing index
         IndexDropOperatorNodePushable dropNonExistingOp = new 
IndexDropOperatorNodePushable(helperFactory,
-                EnumSet.noneOf(DropOption.class), ctx, 0, 
TestUtils.getPartitionsMap(1));
+                EnumSet.noneOf(DropOption.class), ctx, 0, 
TestUtil.getPartitionsMap(1));
         try {
             dropNonExistingOp.initialize();
         } catch (HyracksDataException e) {
@@ -232,7 +232,7 @@ public class IndexDropOperatorNodePushableTest {
         // Dropping non-existing index with if exists option should be 
successful
         dropFailed.set(false);
         IndexDropOperatorNodePushable dropNonExistingWithIfExistsOp = new 
IndexDropOperatorNodePushable(helperFactory,
-                EnumSet.of(DropOption.IF_EXISTS), ctx, 0, 
TestUtils.getPartitionsMap(1));
+                EnumSet.of(DropOption.IF_EXISTS), ctx, 0, 
TestUtil.getPartitionsMap(1));
         try {
             dropNonExistingWithIfExistsOp.initialize();
         } catch (HyracksDataException e) {
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
index 0b011d0c0d..3404ace0a5 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
@@ -26,7 +26,6 @@ import java.io.File;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -90,7 +89,6 @@ import org.apache.asterix.metadata.utils.FullTextUtil;
 import org.apache.asterix.metadata.utils.IndexUtil;
 import org.apache.asterix.metadata.utils.MetadataConstants;
 import org.apache.asterix.metadata.utils.MetadataUtil;
-import org.apache.asterix.metadata.utils.SplitsAndConstraintsUtil;
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionExtensionManager;
 import org.apache.asterix.om.functions.IFunctionManager;
@@ -154,7 +152,6 @@ import org.apache.hyracks.api.result.ResultSetId;
 import org.apache.hyracks.data.std.primitive.ShortPointable;
 import 
org.apache.hyracks.dataflow.common.data.marshalling.ShortSerializerDeserializer;
 import 
org.apache.hyracks.dataflow.common.data.partition.FieldHashPartitionerFactory;
-import org.apache.hyracks.dataflow.std.file.IFileSplitProvider;
 import org.apache.hyracks.dataflow.std.result.ResultWriterOperatorDescriptor;
 import 
org.apache.hyracks.storage.am.btree.dataflow.BTreeSearchOperatorDescriptor;
 import 
org.apache.hyracks.storage.am.common.api.IModificationOperationCallbackFactory;
@@ -1796,22 +1793,9 @@ public class MetadataProvider implements 
IMetadataProvider<DataSourceId, String>
         return dataPartitioningProvider.getPartitioningProperties(feed);
     }
 
-    public List<Pair<IFileSplitProvider, String>> 
getSplitProviderOfAllIndexes(Dataset ds) throws AlgebricksException {
-        List<Index> dsIndexes = getDatasetIndexes(ds.getDataverseName(), 
ds.getDatasetName()).stream()
-                .filter(idx -> idx.getIndexType() != IndexType.SAMPLE && 
idx.isSecondaryIndex())
-                .collect(Collectors.toList());
-        if (dsIndexes.isEmpty()) {
-            return Collections.emptyList();
-        }
-        List<String> datasetNodes = findNodes(ds.getNodeGroupName());
-        List<Pair<IFileSplitProvider, String>> indexesSplits =
-                dsIndexes.stream()
-                        .map(idx -> new Pair<>(
-                                
StoragePathUtil.splitProvider(SplitsAndConstraintsUtil.getIndexSplits(
-                                        appCtx.getClusterStateManager(), ds, 
idx.getIndexName(), datasetNodes)),
-                                idx.getIndexName()))
-                        .collect(Collectors.toList());
-        return indexesSplits;
+    public List<Index> getSecondaryIndexes(Dataset ds) throws 
AlgebricksException {
+        return getDatasetIndexes(ds.getDataverseName(), 
ds.getDatasetName()).stream()
+                .filter(idx -> idx.isSecondaryIndex() && 
!idx.isSampleIndex()).collect(Collectors.toList());
     }
 
     public LockList getLocks() {
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SampleOperationsHelper.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SampleOperationsHelper.java
index b6f0e9604c..030895b65d 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SampleOperationsHelper.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SampleOperationsHelper.java
@@ -102,7 +102,7 @@ public class SampleOperationsHelper implements 
ISecondaryIndexOperationsHelper {
 
     private final MetadataProvider metadataProvider;
     private final Dataset dataset;
-    private final Index index;
+    private final Index sampleIdx;
     private final SourceLocation sourceLoc;
 
     private ARecordType itemType;
@@ -115,11 +115,12 @@ public class SampleOperationsHelper implements 
ISecondaryIndexOperationsHelper {
     private Map<String, String> mergePolicyProperties;
     private int groupbyNumFrames;
     private int[][] computeStorageMap;
+    private int numPartitions;
 
-    protected SampleOperationsHelper(Dataset dataset, Index index, 
MetadataProvider metadataProvider,
+    protected SampleOperationsHelper(Dataset dataset, Index sampleIdx, 
MetadataProvider metadataProvider,
             SourceLocation sourceLoc) {
         this.dataset = dataset;
-        this.index = index;
+        this.sampleIdx = sampleIdx;
         this.metadataProvider = metadataProvider;
         this.sourceLoc = sourceLoc;
     }
@@ -135,11 +136,16 @@ public class SampleOperationsHelper implements 
ISecondaryIndexOperationsHelper {
         comparatorFactories = 
dataset.getPrimaryComparatorFactories(metadataProvider, itemType, metaType);
         groupbyNumFrames = getGroupByNumFrames(metadataProvider, sourceLoc);
 
-        PartitioningProperties partitioningProperties =
-                metadataProvider.getPartitioningProperties(dataset, 
index.getIndexName());
-        fileSplitProvider = partitioningProperties.getSpiltsProvider();
-        partitionConstraint = partitioningProperties.getConstraints();
-        computeStorageMap = partitioningProperties.getComputeStorageMap();
+        // make sure to always use the dataset + index to get the partitioning 
properties
+        // this is because in some situations the nodegroup of the passed 
dataset is different from the index
+        // this can happen during a rebalance for example where the dataset 
represents the new target dataset while
+        // the index object information is fetched from the old source dataset
+        PartitioningProperties samplePartitioningProperties =
+                metadataProvider.getPartitioningProperties(dataset, 
sampleIdx.getIndexName());
+        fileSplitProvider = samplePartitioningProperties.getSpiltsProvider();
+        partitionConstraint = samplePartitioningProperties.getConstraints();
+        computeStorageMap = 
samplePartitioningProperties.getComputeStorageMap();
+        numPartitions = samplePartitioningProperties.getNumberOfPartitions();
         Pair<ILSMMergePolicyFactory, Map<String, String>> compactionInfo =
                 DatasetUtil.getMergePolicyFactory(dataset, 
metadataProvider.getMetadataTxnContext());
         mergePolicyFactory = compactionInfo.first;
@@ -150,7 +156,7 @@ public class SampleOperationsHelper implements 
ISecondaryIndexOperationsHelper {
     public JobSpecification buildCreationJobSpec() throws AlgebricksException {
         JobSpecification spec = 
RuntimeUtils.createJobSpecification(metadataProvider.getApplicationContext());
         IStorageComponentProvider storageComponentProvider = 
metadataProvider.getStorageComponentProvider();
-        IResourceFactory resourceFactory = 
dataset.getResourceFactory(metadataProvider, index, itemType, metaType,
+        IResourceFactory resourceFactory = 
dataset.getResourceFactory(metadataProvider, sampleIdx, itemType, metaType,
                 mergePolicyFactory, mergePolicyProperties);
         IIndexBuilderFactory indexBuilderFactory = new 
IndexBuilderFactory(storageComponentProvider.getStorageManager(),
                 fileSplitProvider, resourceFactory, true);
@@ -165,7 +171,7 @@ public class SampleOperationsHelper implements 
ISecondaryIndexOperationsHelper {
 
     @Override
     public JobSpecification buildLoadingJobSpec() throws AlgebricksException {
-        Index.SampleIndexDetails indexDetails = (Index.SampleIndexDetails) 
index.getIndexDetails();
+        Index.SampleIndexDetails indexDetails = (Index.SampleIndexDetails) 
sampleIdx.getIndexDetails();
         int sampleCardinalityTarget = 
indexDetails.getSampleCardinalityTarget();
         long sampleSeed = indexDetails.getSampleSeed();
         IDataFormat format = metadataProvider.getDataFormat();
@@ -189,16 +195,18 @@ public class SampleOperationsHelper implements 
ISecondaryIndexOperationsHelper {
         sourceOp = targetOp;
 
         // primary index scan ----> stream stats op
-        List<Pair<IFileSplitProvider, String>> indexesInfo = 
metadataProvider.getSplitProviderOfAllIndexes(dataset);
-        IndexDataflowHelperFactory[] indexes = new 
IndexDataflowHelperFactory[indexesInfo.size()];
-        String[] names = new String[indexesInfo.size()];
+        List<Index> dsIndexes = metadataProvider.getSecondaryIndexes(dataset);
+        IndexDataflowHelperFactory[] indexes = new 
IndexDataflowHelperFactory[dsIndexes.size()];
+        String[] names = new String[dsIndexes.size()];
         for (int i = 0; i < indexes.length; i++) {
-            Pair<IFileSplitProvider, String> indexInfo = indexesInfo.get(i);
-            indexes[i] = new IndexDataflowHelperFactory(storageMgr, 
indexInfo.first);
-            names[i] = indexInfo.second;
+            Index idx = dsIndexes.get(i);
+            PartitioningProperties idxPartitioningProps =
+                    metadataProvider.getPartitioningProperties(dataset, 
idx.getIndexName());
+            indexes[i] = new IndexDataflowHelperFactory(storageMgr, 
idxPartitioningProps.getSpiltsProvider());
+            names[i] = idx.getIndexName();
         }
-        targetOp =
-                new DatasetStreamStatsOperatorDescriptor(spec, recordDesc, 
DATASET_STATS_OPERATOR_NAME, indexes, names);
+        targetOp = new DatasetStreamStatsOperatorDescriptor(spec, recordDesc, 
DATASET_STATS_OPERATOR_NAME, indexes,
+                names, computeStorageMap);
         spec.connect(new OneToOneConnectorDescriptor(spec), sourceOp, 0, 
targetOp, 0);
         sourceOp = targetOp;
 
@@ -318,18 +326,17 @@ public class SampleOperationsHelper implements 
ISecondaryIndexOperationsHelper {
     protected LSMIndexBulkLoadOperatorDescriptor 
createTreeIndexBulkLoadOp(JobSpecification spec,
             int[] fieldPermutation, IIndexDataflowHelperFactory 
dataflowHelperFactory, float fillFactor,
             long numElementHint) throws AlgebricksException {
-        PartitioningProperties partitioningProperties = 
metadataProvider.getPartitioningProperties(dataset);
         int[] pkFields = new int[dataset.getPrimaryKeys().size()];
         for (int i = 0; i < pkFields.length; i++) {
             pkFields[i] = fieldPermutation[i];
         }
         IBinaryHashFunctionFactory[] pkHashFunFactories = 
dataset.getPrimaryHashFunctionFactories(metadataProvider);
-        ITuplePartitionerFactory partitionerFactory = new 
FieldHashPartitionerFactory(pkFields, pkHashFunFactories,
-                partitioningProperties.getNumberOfPartitions());
+        ITuplePartitionerFactory partitionerFactory =
+                new FieldHashPartitionerFactory(pkFields, pkHashFunFactories, 
numPartitions);
         LSMIndexBulkLoadOperatorDescriptor treeIndexBulkLoadOp = new 
LSMIndexBulkLoadOperatorDescriptor(spec,
                 recordDesc, fieldPermutation, fillFactor, false, 
numElementHint, true, dataflowHelperFactory, null,
                 LSMIndexBulkLoadOperatorDescriptor.BulkLoadUsage.LOAD, 
dataset.getDatasetId(), null, partitionerFactory,
-                partitioningProperties.getComputeStorageMap());
+                computeStorageMap);
         treeIndexBulkLoadOp.setSourceLocation(sourceLoc);
         
AlgebricksPartitionConstraintHelper.setPartitionConstraintInJobSpec(spec, 
treeIndexBulkLoadOp,
                 partitionConstraint);
@@ -339,7 +346,7 @@ public class SampleOperationsHelper implements 
ISecondaryIndexOperationsHelper {
     @Override
     public JobSpecification 
buildDropJobSpec(Set<IndexDropOperatorDescriptor.DropOption> options)
             throws AlgebricksException {
-        return 
SecondaryTreeIndexOperationsHelper.buildDropJobSpecImpl(dataset, index, 
options, metadataProvider,
+        return 
SecondaryTreeIndexOperationsHelper.buildDropJobSpecImpl(dataset, sampleIdx, 
options, metadataProvider,
                 sourceLoc);
     }
 
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/DatasetStreamStatsOperatorDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/DatasetStreamStatsOperatorDescriptor.java
index dce86387e1..f712bdd61e 100644
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/DatasetStreamStatsOperatorDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/DatasetStreamStatsOperatorDescriptor.java
@@ -50,20 +50,21 @@ import 
org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
  */
 public final class DatasetStreamStatsOperatorDescriptor extends 
AbstractSingleActivityOperatorDescriptor {
 
-    private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 2L;
 
     private final String operatorName;
     private final IIndexDataflowHelperFactory[] indexes;
     private final String[] indexesNames;
+    private final int[][] partitionsMap;
 
     public DatasetStreamStatsOperatorDescriptor(IOperatorDescriptorRegistry 
spec, RecordDescriptor rDesc,
-            String operatorName, IIndexDataflowHelperFactory[] indexes, 
String[] indexesNames) {
+            String operatorName, IIndexDataflowHelperFactory[] indexes, 
String[] indexesNames, int[][] partitionsMap) {
         super(spec, 1, 1);
-        //TODO(partitioning)
         outRecDescs[0] = rDesc;
         this.operatorName = operatorName;
         this.indexes = indexes;
         this.indexesNames = indexesNames;
+        this.partitionsMap = partitionsMap;
     }
 
     @Override
@@ -75,7 +76,7 @@ public final class DatasetStreamStatsOperatorDescriptor 
extends AbstractSingleAc
             private FrameTupleAccessor fta;
             private long totalTupleCount;
             private long totalTupleLength;
-            private Map<String, IndexStats> indexStats;
+            private Map<String, IndexStats> indexesStats;
 
             @Override
             public void open() throws HyracksDataException {
@@ -87,27 +88,9 @@ public final class DatasetStreamStatsOperatorDescriptor 
extends AbstractSingleAc
                     coll.add(new OperatorStats(operatorName));
                 }
                 INCServiceContext serviceCtx = 
ctx.getJobletContext().getServiceContext();
-                indexStats = new HashMap<>();
-                for (int i = 0; i < indexes.length; i++) {
-                    IIndexDataflowHelper idxFlowHelper = 
indexes[i].create(serviceCtx, partition);
-                    try {
-                        idxFlowHelper.open();
-                        ILSMIndex indexInstance = (ILSMIndex) 
idxFlowHelper.getIndexInstance();
-                        long numPages = 0;
-                        synchronized (indexInstance.getOperationTracker()) {
-                            for (ILSMDiskComponent component : 
indexInstance.getDiskComponents()) {
-                                long componentSize = 
component.getComponentSize();
-                                if (component instanceof 
AbstractLSMWithBloomFilterDiskComponent) {
-                                    componentSize -= 
((AbstractLSMWithBloomFilterDiskComponent) component)
-                                            
.getBloomFilter().getFileReference().getFile().length();
-                                }
-                                numPages += componentSize / 
indexInstance.getBufferCache().getPageSize();
-                            }
-                        }
-                        indexStats.put(indexesNames[i], new 
IndexStats(indexesNames[i], numPages));
-                    } finally {
-                        idxFlowHelper.close();
-                    }
+                indexesStats = new HashMap<>();
+                if (indexes.length > 0) {
+                    gatherIndexesStats(serviceCtx, partitionsMap[partition]);
                 }
             }
 
@@ -136,7 +119,7 @@ public final class DatasetStreamStatsOperatorDescriptor 
extends AbstractSingleAc
                 IStatsCollector statsCollector = ctx.getStatsCollector();
                 if (statsCollector != null) {
                     IOperatorStats stats = 
statsCollector.getOperatorStats(operatorName);
-                    DatasetStreamStats.update(stats, totalTupleCount, 
totalTupleLength, indexStats);
+                    DatasetStreamStats.update(stats, totalTupleCount, 
totalTupleLength, indexesStats);
                 }
                 writer.close();
             }
@@ -150,6 +133,34 @@ public final class DatasetStreamStatsOperatorDescriptor 
extends AbstractSingleAc
             public String getDisplayName() {
                 return operatorName;
             }
+
+            private void gatherIndexesStats(INCServiceContext srcCtx, int[] 
partitions) throws HyracksDataException {
+                for (int p : partitions) {
+                    for (int i = 0; i < indexes.length; i++) {
+                        IIndexDataflowHelper idxFlowHelper = 
indexes[i].create(srcCtx, p);
+                        try {
+                            idxFlowHelper.open();
+                            ILSMIndex indexInstance = (ILSMIndex) 
idxFlowHelper.getIndexInstance();
+                            long numPages = 0;
+                            synchronized (indexInstance.getOperationTracker()) 
{
+                                for (ILSMDiskComponent component : 
indexInstance.getDiskComponents()) {
+                                    long componentSize = 
component.getComponentSize();
+                                    if (component instanceof 
AbstractLSMWithBloomFilterDiskComponent) {
+                                        componentSize -= 
((AbstractLSMWithBloomFilterDiskComponent) component)
+                                                
.getBloomFilter().getFileReference().getFile().length();
+                                    }
+                                    numPages += componentSize / 
indexInstance.getBufferCache().getPageSize();
+                                }
+                            }
+                            IndexStats indexStats = 
indexesStats.computeIfAbsent(indexesNames[i],
+                                    idxName -> new IndexStats(idxName, 0));
+                            indexStats.updateNumPages(numPages);
+                        } finally {
+                            idxFlowHelper.close();
+                        }
+                    }
+                }
+            }
         };
     }
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/IndexStats.java
 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/IndexStats.java
index 0c471efddb..b6760e1cdd 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/IndexStats.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/profiling/IndexStats.java
@@ -27,6 +27,9 @@ import 
org.apache.hyracks.api.com.job.profiling.counters.Counter;
 import org.apache.hyracks.api.io.IWritable;
 import org.apache.hyracks.api.job.profiling.counters.ICounter;
 
+/**
+ * Currently, this class represents the stats of an index across all the 
partitions. The stats are not per partition.
+ */
 public class IndexStats implements IWritable, Serializable {
 
     private static final long serialVersionUID = 1L;
diff --git 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/pom.xml 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/pom.xml
index 470f413c15..700354e7ab 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/pom.xml
+++ 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/pom.xml
@@ -182,6 +182,13 @@
       <artifactId>hyracks-util</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.hyracks</groupId>
+      <artifactId>hyracks-util</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-api</artifactId>
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 9d51420d6a..d90a212097 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
@@ -72,10 +72,10 @@ import org.apache.hyracks.storage.common.IResourceFactory;
 import org.apache.hyracks.storage.common.IStorageManager;
 import org.apache.hyracks.test.support.TestStorageManager;
 import org.apache.hyracks.test.support.TestStorageManagerComponentHolder;
-import org.apache.hyracks.test.support.TestUtils;
 import org.apache.hyracks.tests.am.common.ITreeIndexOperatorTestHelper;
 import org.apache.hyracks.tests.am.common.TreeOperatorTestHelper;
 import org.apache.hyracks.tests.integration.AbstractIntegrationTest;
+import org.apache.hyracks.util.TestUtil;
 import org.junit.After;
 import org.junit.Before;
 
@@ -121,7 +121,7 @@ public abstract class AbstractBTreeOperatorTest extends 
AbstractIntegrationTest
         IIndexBuilderFactory indexBuilderFactory =
                 new IndexBuilderFactory(storageManager, primarySplitProvider, 
primaryResourceFactory, false);
         IndexCreateOperatorDescriptor primaryCreateOp =
-                new IndexCreateOperatorDescriptor(spec, indexBuilderFactory, 
TestUtils.getPartitionsMap(1));
+                new IndexCreateOperatorDescriptor(spec, indexBuilderFactory, 
TestUtil.getPartitionsMap(1));
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, 
primaryCreateOp, NC1_ID);
         spec.addRoot(primaryCreateOp);
         runTest(spec);
@@ -144,7 +144,7 @@ public abstract class AbstractBTreeOperatorTest extends 
AbstractIntegrationTest
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, sorter, 
NC1_ID);
 
         int[] fieldPermutation = { 0, 1, 2, 4, 5, 7 };
-        int[][] partitionsMap = TestUtils.getPartitionsMap(1);
+        int[][] partitionsMap = TestUtil.getPartitionsMap(1);
         ITuplePartitionerFactory tuplePartitionerFactory = new 
FieldHashPartitionerFactory(primaryKeyFieldPermutation,
                 primaryHashFunFactories, ordersSplits.length);
         TreeIndexBulkLoadOperatorDescriptor primaryBtreeBulkLoad =
@@ -169,7 +169,7 @@ public abstract class AbstractBTreeOperatorTest extends 
AbstractIntegrationTest
         IIndexBuilderFactory indexBuilderFactory =
                 new IndexBuilderFactory(storageManager, 
secondarySplitProvider, secondaryResourceFactory, false);
         IndexCreateOperatorDescriptor secondaryCreateOp =
-                new IndexCreateOperatorDescriptor(spec, indexBuilderFactory, 
TestUtils.getPartitionsMap(1));
+                new IndexCreateOperatorDescriptor(spec, indexBuilderFactory, 
TestUtil.getPartitionsMap(1));
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, 
secondaryCreateOp, NC1_ID);
         spec.addRoot(secondaryCreateOp);
         runTest(spec);
@@ -210,7 +210,7 @@ public abstract class AbstractBTreeOperatorTest extends 
AbstractIntegrationTest
 
         // load secondary index
         int[] fieldPermutation = { 3, 0 };
-        int[][] partitionsMap = TestUtils.getPartitionsMap(1);
+        int[][] partitionsMap = TestUtil.getPartitionsMap(1);
         int numPartitions =
                 Arrays.stream(partitionsMap).map(partitions -> 
partitions.length).mapToInt(Integer::intValue).sum();
         ITuplePartitionerFactory tuplePartitionerFactory2 =
@@ -245,7 +245,7 @@ public abstract class AbstractBTreeOperatorTest extends 
AbstractIntegrationTest
                 new DelimitedDataTupleParserFactory(inputParserFactories, 
'|'), ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, 
ordScanner, NC1_ID);
 
-        int[][] partitionsMap = 
TestUtils.getPartitionsMap(ordersSplits.length);
+        int[][] partitionsMap = TestUtil.getPartitionsMap(ordersSplits.length);
         ITuplePartitionerFactory tuplePartitionerFactory = new 
FieldHashPartitionerFactory(primaryKeyFieldPermutation,
                 primaryHashFunFactories, ordersSplits.length);
 
@@ -283,7 +283,7 @@ public abstract class AbstractBTreeOperatorTest extends 
AbstractIntegrationTest
     protected void destroyPrimaryIndex() throws Exception {
         JobSpecification spec = new JobSpecification();
         IndexDropOperatorDescriptor primaryDropOp =
-                new IndexDropOperatorDescriptor(spec, primaryHelperFactory, 
TestUtils.getPartitionsMap(1));
+                new IndexDropOperatorDescriptor(spec, primaryHelperFactory, 
TestUtil.getPartitionsMap(1));
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, 
primaryDropOp, NC1_ID);
         spec.addRoot(primaryDropOp);
         runTest(spec);
@@ -292,7 +292,7 @@ public abstract class AbstractBTreeOperatorTest extends 
AbstractIntegrationTest
     protected void destroySecondaryIndex() throws Exception {
         JobSpecification spec = new JobSpecification();
         IndexDropOperatorDescriptor secondaryDropOp =
-                new IndexDropOperatorDescriptor(spec, secondaryHelperFactory, 
TestUtils.getPartitionsMap(1));
+                new IndexDropOperatorDescriptor(spec, secondaryHelperFactory, 
TestUtil.getPartitionsMap(1));
         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/lsm/rtree/LSMRTreeWithAntiMatterTuplesSecondaryIndexSearchOperatorTest.java
 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/rtree/LSMRTreeWithAntiMatterTuplesSecondaryIndexSearchOperatorTest.java
index 68e4ac59b7..ae599d4345 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/rtree/LSMRTreeWithAntiMatterTuplesSecondaryIndexSearchOperatorTest.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/rtree/LSMRTreeWithAntiMatterTuplesSecondaryIndexSearchOperatorTest.java
@@ -44,9 +44,9 @@ import 
org.apache.hyracks.storage.am.rtree.dataflow.RTreeSearchOperatorDescripto
 import org.apache.hyracks.storage.am.rtree.frames.RTreePolicyType;
 import org.apache.hyracks.storage.common.IResourceFactory;
 import org.apache.hyracks.test.support.TestStorageManagerComponentHolder;
-import org.apache.hyracks.test.support.TestUtils;
 import org.apache.hyracks.tests.am.common.ITreeIndexOperatorTestHelper;
 import org.apache.hyracks.tests.am.rtree.RTreeSecondaryIndexSearchOperatorTest;
+import org.apache.hyracks.util.TestUtil;
 import org.junit.Test;
 
 public class LSMRTreeWithAntiMatterTuplesSecondaryIndexSearchOperatorTest
@@ -96,7 +96,7 @@ public class 
LSMRTreeWithAntiMatterTuplesSecondaryIndexSearchOperatorTest
         int[] keyFields = { 0, 1, 2, 3 };
         RTreeSearchOperatorDescriptor secondarySearchOp = new 
RTreeSearchOperatorDescriptor(spec,
                 secondaryWithFilterRecDesc, keyFields, true, true, 
secondaryHelperFactory, false, false, null,
-                NoOpOperationCallbackFactory.INSTANCE, null, null, false, 
null, TestUtils.getPartitionsMap(1));
+                NoOpOperationCallbackFactory.INSTANCE, null, null, false, 
null, TestUtil.getPartitionsMap(1));
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, 
secondarySearchOp, NC1_ID);
 
         IFileSplitProvider outSplits = new ConstantFileSplitProvider(new 
FileSplit[] { createFile(nc1) });
diff --git 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/rtree/AbstractRTreeOperatorTest.java
 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/rtree/AbstractRTreeOperatorTest.java
index f1dbe5f16a..1634b2d345 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/rtree/AbstractRTreeOperatorTest.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/rtree/AbstractRTreeOperatorTest.java
@@ -79,9 +79,9 @@ import org.apache.hyracks.storage.common.IResourceFactory;
 import org.apache.hyracks.storage.common.IStorageManager;
 import org.apache.hyracks.test.support.TestStorageManager;
 import org.apache.hyracks.test.support.TestStorageManagerComponentHolder;
-import org.apache.hyracks.test.support.TestUtils;
 import org.apache.hyracks.tests.am.common.ITreeIndexOperatorTestHelper;
 import org.apache.hyracks.tests.integration.AbstractIntegrationTest;
+import org.apache.hyracks.util.TestUtil;
 import org.junit.After;
 import org.junit.Before;
 
@@ -243,7 +243,7 @@ public abstract class AbstractRTreeOperatorTest extends 
AbstractIntegrationTest
         IIndexBuilderFactory indexBuilderFactory =
                 new IndexBuilderFactory(storageManager, primarySplitProvider, 
btreeFactory, false);
         IndexCreateOperatorDescriptor primaryCreateOp =
-                new IndexCreateOperatorDescriptor(spec, indexBuilderFactory, 
TestUtils.getPartitionsMap(1));
+                new IndexCreateOperatorDescriptor(spec, indexBuilderFactory, 
TestUtil.getPartitionsMap(1));
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, 
primaryCreateOp, NC1_ID);
         spec.addRoot(primaryCreateOp);
         runTest(spec);
@@ -280,7 +280,7 @@ public abstract class AbstractRTreeOperatorTest extends 
AbstractIntegrationTest
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, sorter, 
NC1_ID);
 
         int[] fieldPermutation = { 0, 1, 2, 4, 5, 7, 9, 10, 11, 12 };
-        int[][] partitionsMap = TestUtils.getPartitionsMap(1);
+        int[][] partitionsMap = TestUtil.getPartitionsMap(1);
         ITuplePartitionerFactory tuplePartitionerFactory = new 
FieldHashPartitionerFactory(primaryKeyFieldPermutation,
                 primaryHashFunFactories, ordersSplits.length);
         TreeIndexBulkLoadOperatorDescriptor primaryBulkLoad =
@@ -306,7 +306,7 @@ public abstract class AbstractRTreeOperatorTest extends 
AbstractIntegrationTest
         IndexBuilderFactory indexBuilderFactory =
                 new IndexBuilderFactory(storageManager, 
secondarySplitProvider, rtreeFactory, false);
         IndexCreateOperatorDescriptor secondaryCreateOp =
-                new IndexCreateOperatorDescriptor(spec, indexBuilderFactory, 
TestUtils.getPartitionsMap(1));
+                new IndexCreateOperatorDescriptor(spec, indexBuilderFactory, 
TestUtil.getPartitionsMap(1));
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, 
secondaryCreateOp, NC1_ID);
         spec.addRoot(secondaryCreateOp);
         runTest(spec);
@@ -343,7 +343,7 @@ public abstract class AbstractRTreeOperatorTest extends 
AbstractIntegrationTest
         // load secondary index
         int[] fieldPermutation = { 6, 7, 8, 9, 0 };
         int[] pkFields = { 4 };
-        int[][] partitionsMap = TestUtils.getPartitionsMap(1);
+        int[][] partitionsMap = TestUtil.getPartitionsMap(1);
         int numPartitions =
                 Arrays.stream(partitionsMap).map(partitions -> 
partitions.length).mapToInt(Integer::intValue).sum();
         ITuplePartitionerFactory partitionerFactory =
@@ -391,7 +391,7 @@ public abstract class AbstractRTreeOperatorTest extends 
AbstractIntegrationTest
                 ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, 
ordScanner, NC1_ID);
 
-        int[][] partitionsMap = 
TestUtils.getPartitionsMap(ordersSplits.length);
+        int[][] partitionsMap = TestUtil.getPartitionsMap(ordersSplits.length);
         // insert into primary index
         int[] primaryFieldPermutation = { 0, 1, 2, 4, 5, 7, 9, 10, 11, 12 };
         ITuplePartitionerFactory tuplePartitionerFactory = new 
FieldHashPartitionerFactory(primaryKeyFieldPermutation,
@@ -428,7 +428,7 @@ public abstract class AbstractRTreeOperatorTest extends 
AbstractIntegrationTest
     protected void destroyPrimaryIndex() throws Exception {
         JobSpecification spec = new JobSpecification();
         IndexDropOperatorDescriptor primaryDropOp =
-                new IndexDropOperatorDescriptor(spec, primaryHelperFactory, 
TestUtils.getPartitionsMap(1));
+                new IndexDropOperatorDescriptor(spec, primaryHelperFactory, 
TestUtil.getPartitionsMap(1));
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, 
primaryDropOp, NC1_ID);
         spec.addRoot(primaryDropOp);
         runTest(spec);
@@ -437,7 +437,7 @@ public abstract class AbstractRTreeOperatorTest extends 
AbstractIntegrationTest
     protected void destroySecondaryIndex() throws Exception {
         JobSpecification spec = new JobSpecification();
         IndexDropOperatorDescriptor secondaryDropOp =
-                new IndexDropOperatorDescriptor(spec, secondaryHelperFactory, 
TestUtils.getPartitionsMap(1));
+                new IndexDropOperatorDescriptor(spec, secondaryHelperFactory, 
TestUtil.getPartitionsMap(1));
         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/rtree/RTreeSecondaryIndexInsertOperatorTest.java
 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/rtree/RTreeSecondaryIndexInsertOperatorTest.java
index f233417318..516dff6ac1 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/rtree/RTreeSecondaryIndexInsertOperatorTest.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/rtree/RTreeSecondaryIndexInsertOperatorTest.java
@@ -43,7 +43,7 @@ import 
org.apache.hyracks.storage.am.common.impls.NoOpOperationCallbackFactory;
 import 
org.apache.hyracks.storage.am.rtree.dataflow.RTreeSearchOperatorDescriptor;
 import org.apache.hyracks.storage.am.rtree.frames.RTreePolicyType;
 import org.apache.hyracks.storage.common.IResourceFactory;
-import org.apache.hyracks.test.support.TestUtils;
+import org.apache.hyracks.util.TestUtil;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -89,7 +89,7 @@ public class RTreeSecondaryIndexInsertOperatorTest extends 
AbstractRTreeOperator
         int[] keyFields = { 0, 1, 2, 3 };
         RTreeSearchOperatorDescriptor secondarySearchOp = new 
RTreeSearchOperatorDescriptor(spec, secondaryRecDesc,
                 keyFields, true, true, secondaryHelperFactory, false, false, 
null,
-                NoOpOperationCallbackFactory.INSTANCE, null, null, false, 
null, TestUtils.getPartitionsMap(1));
+                NoOpOperationCallbackFactory.INSTANCE, null, null, false, 
null, TestUtil.getPartitionsMap(1));
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, 
secondarySearchOp, NC1_ID);
         // fifth field from the tuples coming from secondary index
         int[] primaryLowKeyFields = { 4 };
diff --git 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/rtree/RTreeSecondaryIndexScanOperatorTest.java
 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/rtree/RTreeSecondaryIndexScanOperatorTest.java
index 2748988fea..b626a01dbc 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/rtree/RTreeSecondaryIndexScanOperatorTest.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/rtree/RTreeSecondaryIndexScanOperatorTest.java
@@ -42,7 +42,7 @@ import 
org.apache.hyracks.storage.am.common.impls.NoOpOperationCallbackFactory;
 import 
org.apache.hyracks.storage.am.rtree.dataflow.RTreeSearchOperatorDescriptor;
 import org.apache.hyracks.storage.am.rtree.frames.RTreePolicyType;
 import org.apache.hyracks.storage.common.IResourceFactory;
-import org.apache.hyracks.test.support.TestUtils;
+import org.apache.hyracks.util.TestUtil;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -87,7 +87,7 @@ public class RTreeSecondaryIndexScanOperatorTest extends 
AbstractRTreeOperatorTe
         int[] keyFields = null;
         RTreeSearchOperatorDescriptor secondarySearchOp = new 
RTreeSearchOperatorDescriptor(spec, secondaryRecDesc,
                 keyFields, true, true, secondaryHelperFactory, false, false, 
null,
-                NoOpOperationCallbackFactory.INSTANCE, null, null, false, 
null, TestUtils.getPartitionsMap(1));
+                NoOpOperationCallbackFactory.INSTANCE, null, null, false, 
null, TestUtil.getPartitionsMap(1));
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, 
secondarySearchOp, NC1_ID);
         IFileSplitProvider outSplits = new ConstantFileSplitProvider(new 
FileSplit[] { createFile(nc1) });
         IOperatorDescriptor printer = new 
PlainFileWriterOperatorDescriptor(spec, outSplits, ",");
diff --git 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/rtree/RTreeSecondaryIndexSearchOperatorTest.java
 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/rtree/RTreeSecondaryIndexSearchOperatorTest.java
index da5de77ccb..cde4667672 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/rtree/RTreeSecondaryIndexSearchOperatorTest.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/rtree/RTreeSecondaryIndexSearchOperatorTest.java
@@ -43,7 +43,7 @@ import 
org.apache.hyracks.storage.am.common.impls.NoOpOperationCallbackFactory;
 import 
org.apache.hyracks.storage.am.rtree.dataflow.RTreeSearchOperatorDescriptor;
 import org.apache.hyracks.storage.am.rtree.frames.RTreePolicyType;
 import org.apache.hyracks.storage.common.IResourceFactory;
-import org.apache.hyracks.test.support.TestUtils;
+import org.apache.hyracks.util.TestUtil;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -87,7 +87,7 @@ public class RTreeSecondaryIndexSearchOperatorTest extends 
AbstractRTreeOperator
         int[] keyFields = { 0, 1, 2, 3 };
         RTreeSearchOperatorDescriptor secondarySearchOp = new 
RTreeSearchOperatorDescriptor(spec, secondaryRecDesc,
                 keyFields, true, true, secondaryHelperFactory, false, false, 
null,
-                NoOpOperationCallbackFactory.INSTANCE, null, null, false, 
null, TestUtils.getPartitionsMap(1));
+                NoOpOperationCallbackFactory.INSTANCE, null, null, false, 
null, TestUtil.getPartitionsMap(1));
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, 
secondarySearchOp, NC1_ID);
         // fifth field from the tuples coming from secondary index
         int[] primaryLowKeyFields = { 4 };
diff --git 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/ApplicationDeploymentAPIIntegrationTest.java
 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/ApplicationDeploymentAPIIntegrationTest.java
index e1300a3c5b..54480d8708 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/ApplicationDeploymentAPIIntegrationTest.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/ApplicationDeploymentAPIIntegrationTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.hyracks.tests.integration;
 
-import static org.apache.hyracks.tests.integration.TestUtil.uri;
+import static org.apache.hyracks.util.TestUtil.uri;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/JobStatusAPIIntegrationTest.java
 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/JobStatusAPIIntegrationTest.java
index f2f80612f9..29428ef15e 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/JobStatusAPIIntegrationTest.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/JobStatusAPIIntegrationTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.hyracks.tests.integration;
 
-import static org.apache.hyracks.tests.integration.TestUtil.httpGetAsObject;
+import static org.apache.hyracks.util.TestUtil.httpGetAsObject;
 
 import java.io.IOException;
 import java.net.URI;
diff --git 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/NodesAPIIntegrationTest.java
 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/NodesAPIIntegrationTest.java
index 9d79d80fbe..dbd7174841 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/NodesAPIIntegrationTest.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/NodesAPIIntegrationTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.hyracks.tests.integration;
 
-import static org.apache.hyracks.tests.integration.TestUtil.httpGetAsObject;
+import static org.apache.hyracks.util.TestUtil.httpGetAsObject;
 
 import java.io.File;
 import java.io.IOException;
diff --git 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/StaticResourcesAPIIntegrationTest.java
 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/StaticResourcesAPIIntegrationTest.java
index 7258b165d1..b4d6bd04d7 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/StaticResourcesAPIIntegrationTest.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/StaticResourcesAPIIntegrationTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.hyracks.tests.integration;
 
-import static org.apache.hyracks.tests.integration.TestUtil.httpGetAsString;
+import static org.apache.hyracks.util.TestUtil.httpGetAsString;
 
 import org.junit.Assert;
 import org.junit.Test;
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/pom.xml 
b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/pom.xml
index 8a08074b23..573656f0dd 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/pom.xml
@@ -117,5 +117,12 @@
       <artifactId>hyracks-util</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.hyracks</groupId>
+      <artifactId>hyracks-util</artifactId>
+      <version>${project.version}</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 </project>
\ No newline at end of file
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 3fd0cf96a2..bc111dc332 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
@@ -32,7 +32,6 @@ import org.apache.hyracks.storage.am.common.api.ITreeIndex;
 import org.apache.hyracks.storage.am.common.api.ITupleFilterFactory;
 import 
org.apache.hyracks.storage.am.common.dataflow.IIndexDataflowHelperFactory;
 import 
org.apache.hyracks.storage.am.common.dataflow.IndexSearchOperatorNodePushable;
-import org.apache.hyracks.storage.am.common.impls.DefaultTupleProjectorFactory;
 import org.apache.hyracks.storage.common.IIndex;
 import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.ISearchPredicate;
@@ -48,18 +47,6 @@ public class BTreeSearchOperatorNodePushable extends 
IndexSearchOperatorNodePush
     protected MultiComparator lowKeySearchCmp;
     protected MultiComparator highKeySearchCmp;
 
-    public BTreeSearchOperatorNodePushable(IHyracksTaskContext ctx, int 
partition, RecordDescriptor inputRecDesc,
-            int[] lowKeyFields, int[] highKeyFields, boolean lowKeyInclusive, 
boolean highKeyInclusive,
-            int[] minFilterFieldIndexes, int[] maxFilterFieldIndexes, 
IIndexDataflowHelperFactory indexHelperFactory,
-            boolean retainInput, boolean retainMissing, IMissingWriterFactory 
nonMatchWriterFactory,
-            ISearchOperationCallbackFactory searchCallbackFactory, boolean 
appendIndexFilter,
-            IMissingWriterFactory nonFilterWriterFactory) throws 
HyracksDataException {
-        this(ctx, partition, inputRecDesc, lowKeyFields, highKeyFields, 
lowKeyInclusive, highKeyInclusive,
-                minFilterFieldIndexes, maxFilterFieldIndexes, 
indexHelperFactory, retainInput, retainMissing,
-                nonMatchWriterFactory, searchCallbackFactory, 
appendIndexFilter, nonFilterWriterFactory, null, -1,
-                false, null, null, DefaultTupleProjectorFactory.INSTANCE, 
null, null);
-    }
-
     public BTreeSearchOperatorNodePushable(IHyracksTaskContext ctx, int 
partition, RecordDescriptor inputRecDesc,
             int[] lowKeyFields, int[] highKeyFields, boolean lowKeyInclusive, 
boolean highKeyInclusive,
             int[] minFilterFieldIndexes, int[] maxFilterFieldIndexes, 
IIndexDataflowHelperFactory indexHelperFactory,
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 a2487d388a..b5c8a4c8b7 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
@@ -53,10 +53,12 @@ import 
org.apache.hyracks.storage.am.common.api.ISearchOperationCallbackFactory;
 import org.apache.hyracks.storage.am.common.api.ITreeIndex;
 import 
org.apache.hyracks.storage.am.common.dataflow.IIndexDataflowHelperFactory;
 import 
org.apache.hyracks.storage.am.common.dataflow.IndexSearchOperatorNodePushable;
+import org.apache.hyracks.storage.am.common.impls.DefaultTupleProjectorFactory;
 import org.apache.hyracks.storage.common.IIndexAccessor;
 import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.MultiComparator;
+import org.apache.hyracks.util.TestUtil;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
@@ -277,7 +279,6 @@ public class FramewriterTest {
     /**
      * @return a list of writers to test. these writers can be of the same 
type but behave differently based on included mocks
      * @throws HyracksDataException
-     * @throws IndexException
      */
     public IFrameWriter[] createWriters() throws HyracksDataException {
         ArrayList<BTreeSearchOperatorNodePushable> writers = new ArrayList<>();
@@ -285,6 +286,7 @@ public class FramewriterTest {
         IRecordDescriptorProvider[] recordDescProviders = 
mockRecDescProviders();
         int partition = 0;
         IHyracksTaskContext[] ctxs = mockIHyracksTaskContext();
+        int[][] partitionsMap = TestUtil.getPartitionsMap(ctxs.length);
         int[] keys = { 0 };
         boolean lowKeyInclusive = true;
         boolean highKeyInclusive = true;
@@ -295,7 +297,8 @@ public class FramewriterTest {
                             recordDescProvider.getInputRecordDescriptor(new 
ActivityId(new OperatorDescriptorId(0), 0),
                                     0),
                             keys, keys, lowKeyInclusive, highKeyInclusive, 
keys, keys, pair.getLeft(), false, false,
-                            null, pair.getRight(), false, null);
+                            null, pair.getRight(), false, null, null, -1, 
false, null, null,
+                            DefaultTupleProjectorFactory.INSTANCE, null, 
partitionsMap);
                     writers.add(writer);
                 }
             }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/TestUtils.java
 
b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/TestUtils.java
index 8ac5dfc5b0..2348a1aca3 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/TestUtils.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/TestUtils.java
@@ -190,12 +190,4 @@ public class TestUtils {
             context.updateLoggers();
         }
     }
-
-    public static int[][] getPartitionsMap(int numPartitions) {
-        int[][] map = new int[numPartitions][1];
-        for (int i = 0; i < numPartitions; i++) {
-            map[i] = new int[] { i };
-        }
-        return map;
-    }
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TestUtil.java
 
b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/TestUtil.java
similarity index 69%
rename from 
hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TestUtil.java
rename to 
hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/TestUtil.java
index 73d985d867..da1c12e605 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TestUtil.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/TestUtil.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.hyracks.tests.integration;
+package org.apache.hyracks.util;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -38,34 +38,42 @@ public class TestUtil {
     private static final String HOST = "127.0.0.1";
     private static final int PORT = 16001;
 
-    static URI uri(String path) throws URISyntaxException {
+    public static URI uri(String path) throws URISyntaxException {
         return new URI("http", null, HOST, PORT, path, null, null);
     }
 
-    static InputStream httpGetAsInputStream(URI uri) throws 
URISyntaxException, IOException {
+    public static InputStream httpGetAsInputStream(URI uri) throws 
URISyntaxException, IOException {
         HttpClient client = HttpClients.createMinimal();
         HttpResponse response = client.execute(new HttpGet(uri));
         return response.getEntity().getContent();
     }
 
-    static String httpGetAsString(String path) throws URISyntaxException, 
IOException {
+    public static String httpGetAsString(String path) throws 
URISyntaxException, IOException {
         return httpGetAsString(uri(path));
     }
 
-    static String httpGetAsString(URI uri) throws URISyntaxException, 
IOException {
+    public static String httpGetAsString(URI uri) throws URISyntaxException, 
IOException {
         InputStream resultStream = httpGetAsInputStream(uri);
         return IOUtils.toString(resultStream, Charset.defaultCharset());
     }
 
-    static ObjectNode getResultAsJson(String resultStr) throws IOException {
+    public static ObjectNode getResultAsJson(String resultStr) throws 
IOException {
         return new ObjectMapper().readValue(resultStr, ObjectNode.class);
     }
 
-    static ObjectNode httpGetAsObject(String path) throws URISyntaxException, 
IOException {
+    public static ObjectNode httpGetAsObject(String path) throws 
URISyntaxException, IOException {
         return getResultAsJson(httpGetAsString(path));
     }
 
-    static ObjectNode httpGetAsObject(URI uri) throws URISyntaxException, 
IOException {
+    public static ObjectNode httpGetAsObject(URI uri) throws 
URISyntaxException, IOException {
         return getResultAsJson(httpGetAsString(uri));
     }
+
+    public static int[][] getPartitionsMap(int numPartitions) {
+        int[][] map = new int[numPartitions][1];
+        for (int i = 0; i < numPartitions; i++) {
+            map[i] = new int[] { i };
+        }
+        return map;
+    }
 }

Reply via email to