This is an automated email from the ASF dual-hosted git repository. mblow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit c8542b55f04eb69ab4d6286f7a7147341d9cfeb8 Author: Ali Alsuliman <[email protected]> AuthorDate: Tue Oct 21 14:40:49 2025 -0700 [ASTERIXDB-3650][COMP] Ignore sample indexes when checking for secondary indexes - user model changes: no - storage format changes: no - interface changes: no Details: Currently DatasetUtil.hasSecondaries, does not account for sample indexes, which will lead to lookup in LSMPrimaryUpsertOperatorNodePushable. Ext-ref: MB-68717 Change-Id: I65ca9c74192d14bbaecf8a306902e4cecf1337d2 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20410 Tested-by: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Reviewed-by: Ali Alsuliman <[email protected]> --- .../apache/asterix/optimizer/rules/PushFieldAccessRule.java | 13 +------------ .../single-collection-queries.7.plan | 8 ++++---- .../apache/asterix/metadata/declared/MetadataProvider.java | 8 ++++++++ .../java/org/apache/asterix/metadata/utils/DatasetUtil.java | 6 +++--- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushFieldAccessRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushFieldAccessRule.java index 31f2511667..7356bd82d9 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushFieldAccessRule.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushFieldAccessRule.java @@ -33,7 +33,6 @@ import org.apache.asterix.metadata.declared.DataSource; import org.apache.asterix.metadata.declared.DataSourceId; import org.apache.asterix.metadata.declared.MetadataProvider; import org.apache.asterix.metadata.entities.Dataset; -import org.apache.asterix.metadata.entities.Index; import org.apache.asterix.metadata.utils.DatasetUtil; import org.apache.asterix.om.base.AInt32; import org.apache.asterix.om.base.AString; @@ -152,17 +151,7 @@ public class PushFieldAccessRule implements IAlgebraicRewriteRule { } } - List<Index> datasetIndexes = - mp.getDatasetIndexes(dataset.getDatabaseName(), dataset.getDataverseName(), dataset.getDatasetName()); - boolean hasSecondaryIndex = false; - for (Index index : datasetIndexes) { - if (index.isSecondaryIndex()) { - hasSecondaryIndex = true; - break; - } - } - - return hasSecondaryIndex; + return mp.hasSecondaryIndexes(dataset); } private boolean tryingToPushThroughSelectionWithSameDataSource(AssignOperator access, AbstractLogicalOperator op2) { diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.7.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.7.plan index cd177f77b9..5754b6d01e 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.7.plan +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/cardinality-estimation/single-collection-queries/single-collection-queries.7.plan @@ -26,10 +26,10 @@ distribute result [$$51] [cardinality: 136.0, doc-size: 0.0, op-cost: 0.0, total -- EXTERNAL_GROUP_BY[$$52] |PARTITIONED| exchange [cardinality: 1321.89, doc-size: 0.0, op-cost: 0.0, total-cost: 6005.0] -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - select (and(gt($$53, 1), gt($$54, 4))) project: [$$52] [cardinality: 1321.89, doc-size: 0.0, op-cost: 0.0, total-cost: 6005.0] - -- STREAM_SELECT |PARTITIONED| - assign [$$52] <- [$$l.getField(1)] project: [$$53, $$54, $$52] [cardinality: 1321.89, doc-size: 0.0, op-cost: 0.0, total-cost: 6005.0] - -- ASSIGN |PARTITIONED| + assign [$$52] <- [$$l.getField(1)] project: [$$52] [cardinality: 1321.89, doc-size: 0.0, op-cost: 0.0, total-cost: 6005.0] + -- ASSIGN |PARTITIONED| + select (and(gt($$53, 1), gt($$54, 4))) project: [$$l] [cardinality: 1321.89, doc-size: 0.0, op-cost: 0.0, total-cost: 6005.0] + -- STREAM_SELECT |PARTITIONED| exchange [cardinality: 1321.89, doc-size: 0.0, op-cost: 0.0, total-cost: 6005.0] -- ONE_TO_ONE_EXCHANGE |PARTITIONED| unnest-map [$$53, $$54, $$l] <- index-search("LineItem", 0, "Default", "tpch", "LineItem", false, false, 2, $$60, $$61, 0, true, true, false) [cardinality: 1321.89, doc-size: 0.0, op-cost: 0.0, total-cost: 6005.0] 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 b0291375b2..8ab2f2aa52 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 @@ -1918,6 +1918,14 @@ public class MetadataProvider implements IMetadataProvider<DataSourceId, String> .filter(idx -> idx.isSecondaryIndex() && !idx.isSampleIndex()).collect(Collectors.toList()); } + /** + * Returns true if the dataset has any (non-samples) secondary index. + */ + public boolean hasSecondaryIndexes(Dataset ds) throws AlgebricksException { + return getDatasetIndexes(ds.getDatabaseName(), ds.getDataverseName(), ds.getDatasetName()).stream() + .anyMatch(idx -> idx.isSecondaryIndex() && !idx.isSampleIndex()); + } + public LockList getLocks() { return locks; } diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java index 55f42599ca..c39395b094 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java @@ -484,9 +484,9 @@ public class DatasetUtil { primaryKeyFields[i] = i; pkFields[i] = fieldPermutation[i]; } - boolean hasSecondaries = metadataProvider - .getDatasetIndexes(dataset.getDatabaseName(), dataset.getDataverseName(), dataset.getDatasetName()) - .size() > 1; + + boolean hasSecondaries = metadataProvider.hasSecondaryIndexes(dataset); + IStorageComponentProvider storageComponentProvider = metadataProvider.getStorageComponentProvider(); IModificationOperationCallbackFactory modificationCallbackFactory = dataset.getModificationCallbackFactory( storageComponentProvider, primaryIndex, IndexOperation.UPSERT, primaryKeyFields);
