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 <ruixuan.zh...@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