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);

Reply via email to