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