You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by xx...@apache.org on 2022/12/13 10:25:09 UTC

[kylin] 02/25: KYLIN-5331 Fix query behavior of querying incremental build segments when filter condition is always false

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

xxyu pushed a commit to branch kylin5
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit b9891b1395314606b6e36b653d4742f86fd3d57b
Author: Dorris Zhang <ru...@kyligence.io>
AuthorDate: Tue Oct 11 18:06:26 2022 +0800

    KYLIN-5331 Fix query behavior of querying incremental build segments when filter condition is always false
---
 .../main/java/org/apache/kylin/metadata/query/QueryMetrics.java    | 6 ++++--
 .../src/main/java/org/apache/kylin/storage/StorageContext.java     | 4 ++++
 .../src/main/java/org/apache/kylin/query/relnode/OLAPContext.java  | 7 +++++--
 .../java/org/apache/kylin/query/routing/RealizationPruner.java     | 2 ++
 4 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/core-metadata/src/main/java/org/apache/kylin/metadata/query/QueryMetrics.java b/src/core-metadata/src/main/java/org/apache/kylin/metadata/query/QueryMetrics.java
index e1e410940f..c9c8900282 100644
--- a/src/core-metadata/src/main/java/org/apache/kylin/metadata/query/QueryMetrics.java
+++ b/src/core-metadata/src/main/java/org/apache/kylin/metadata/query/QueryMetrics.java
@@ -39,6 +39,7 @@ public class QueryMetrics extends SchedulerEventNotifier {
     protected static final KapConfig kapConfig = KapConfig.getInstanceFromEnv();
     public static final String UNKNOWN = "Unknown";
 
+    public static final String FILTER_CONFLICT = "Filter Conflict";
     public static final String AGG_INDEX = "Agg Index";
     public static final String TABLE_INDEX = "Table Index";
     public static final String TABLE_SNAPSHOT = "Table Snapshot";
@@ -110,7 +111,7 @@ public class QueryMetrics extends SchedulerEventNotifier {
     }
 
     public boolean isSecondStorage() {
-        for (RealizationMetrics metrics: getRealizationMetrics()) {
+        for (RealizationMetrics metrics : getRealizationMetrics()) {
             if (metrics.isSecondStorage)
                 return true;
         }
@@ -143,7 +144,8 @@ public class QueryMetrics extends SchedulerEventNotifier {
         protected List<String> snapshots;
 
         // For serialize
-        public RealizationMetrics() {}
+        public RealizationMetrics() {
+        }
 
         public RealizationMetrics(String layoutId, String indexType, String modelId, List<String> snapshots) {
             this.layoutId = layoutId;
diff --git a/src/core-storage/src/main/java/org/apache/kylin/storage/StorageContext.java b/src/core-storage/src/main/java/org/apache/kylin/storage/StorageContext.java
index 1131674a89..f826d0de9b 100644
--- a/src/core-storage/src/main/java/org/apache/kylin/storage/StorageContext.java
+++ b/src/core-storage/src/main/java/org/apache/kylin/storage/StorageContext.java
@@ -54,6 +54,10 @@ public class StorageContext {
     @Setter
     private NLayoutCandidate candidate;
 
+    @Getter
+    @Setter
+    private boolean isFilterCondAlwaysFalse;
+
     public NLayoutCandidate getCandidate() {
         if (isBatchCandidateEmpty() && !isStreamCandidateEmpty()) {
             return streamingCandidate;
diff --git a/src/query-common/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java b/src/query-common/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java
index 6359b3d012..609f937d57 100644
--- a/src/query-common/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java
+++ b/src/query-common/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java
@@ -238,7 +238,9 @@ public class OLAPContext {
 
             final String realizationType;
             Set<String> tableSets = Sets.newHashSet();
-            if (ctx.storageContext.isEmptyLayout()) {
+            if (ctx.storageContext.isEmptyLayout() && ctx.storageContext.isFilterCondAlwaysFalse()) {
+                realizationType = QueryMetrics.FILTER_CONFLICT;
+            } else if (ctx.storageContext.isEmptyLayout()) {
                 realizationType = null;
             } else if (ctx.storageContext.isUseSnapshot()) {
                 realizationType = QueryMetrics.TABLE_SNAPSHOT;
@@ -292,7 +294,8 @@ public class OLAPContext {
                 realizationType, ctx.storageContext.isPartialMatchModel(), snapshots);
         realization.setSecondStorage(
                 QueryContext.current().getSecondStorageUsageMap().getOrDefault(realization.getLayoutId(), false));
-        realization.setRecommendSecondStorage(recommendSecondStorage(ctx.realization.getProject(), modelId, realizationType));
+        realization.setRecommendSecondStorage(
+                recommendSecondStorage(ctx.realization.getProject(), modelId, realizationType));
         return realization;
     }
 
diff --git a/src/query-common/src/main/java/org/apache/kylin/query/routing/RealizationPruner.java b/src/query-common/src/main/java/org/apache/kylin/query/routing/RealizationPruner.java
index 80b180487c..ff086f3b08 100644
--- a/src/query-common/src/main/java/org/apache/kylin/query/routing/RealizationPruner.java
+++ b/src/query-common/src/main/java/org/apache/kylin/query/routing/RealizationPruner.java
@@ -91,6 +91,7 @@ public class RealizationPruner {
             SqlKind.LESS_THAN, SqlKind.LESS_THAN_OR_EQUAL, //
             SqlKind.IN, SqlKind.NOT_IN, //
             SqlKind.EQUALS, SqlKind.NOT_EQUALS);
+
     private RealizationPruner() {
     }
 
@@ -145,6 +146,7 @@ public class RealizationPruner {
         // sql filter condition is always false
         if (simplifiedSqlFilter.isAlwaysFalse()) {
             log.info("SQL filter condition is always false, pruning all ready segments");
+            olapContext.storageContext.setFilterCondAlwaysFalse(true);
             return selectedSegments;
         }
         // sql filter condition is always true