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 57b733a7fcfa5fad5ac3bd8667fb1aa6d68b42cd Author: Pengfei Zhan <dethr...@gmail.com> AuthorDate: Sat May 13 16:07:38 2023 +0800 KYLIN-5633 [FOLLOW UP] match partial segments with high data integrity works between models --- .../apache/kylin/metadata/realization/CapabilityResult.java | 5 +++++ .../main/java/org/apache/kylin/query/routing/Candidate.java | 4 ++++ .../kylin/query/routing/DataflowCapabilityChecker.java | 3 +++ .../java/org/apache/kylin/query/routing/QueryRouter.java | 1 + .../org/apache/kylin/query/routing/CandidateSortTest.java | 11 +++++++++++ .../org/apache/kylin/query/routing/CandidateTestUtils.java | 13 +++++++++++++ 6 files changed, 37 insertions(+) diff --git a/src/core-metadata/src/main/java/org/apache/kylin/metadata/realization/CapabilityResult.java b/src/core-metadata/src/main/java/org/apache/kylin/metadata/realization/CapabilityResult.java index e21586ec04..f9b4b966b1 100644 --- a/src/core-metadata/src/main/java/org/apache/kylin/metadata/realization/CapabilityResult.java +++ b/src/core-metadata/src/main/java/org/apache/kylin/metadata/realization/CapabilityResult.java @@ -71,6 +71,11 @@ public class CapabilityResult { */ private boolean isVacant; + /** + * Match partial segments. + */ + private boolean isPartialResult; + /** * Marker objects to indicate all special features * (dimension-as-measure, topN etc.) that have influenced the capability check. diff --git a/src/query-common/src/main/java/org/apache/kylin/query/routing/Candidate.java b/src/query-common/src/main/java/org/apache/kylin/query/routing/Candidate.java index 47813efe9a..12f37cd8c4 100644 --- a/src/query-common/src/main/java/org/apache/kylin/query/routing/Candidate.java +++ b/src/query-common/src/main/java/org/apache/kylin/query/routing/Candidate.java @@ -138,6 +138,10 @@ public class Candidate { return Comparator.comparingInt(c -> c.getRealization().getCost()); } + public static Comparator<Candidate> partialResultSorter() { + return Comparator.comparing(c -> c.getCapability().isPartialResult()); + } + public static Comparator<Candidate> realizationCapabilityCostSorter() { return Comparator.comparingDouble(c -> c.getCapability().getCost()); } diff --git a/src/query-common/src/main/java/org/apache/kylin/query/routing/DataflowCapabilityChecker.java b/src/query-common/src/main/java/org/apache/kylin/query/routing/DataflowCapabilityChecker.java index 28a9f94010..f099544160 100644 --- a/src/query-common/src/main/java/org/apache/kylin/query/routing/DataflowCapabilityChecker.java +++ b/src/query-common/src/main/java/org/apache/kylin/query/routing/DataflowCapabilityChecker.java @@ -86,6 +86,9 @@ public class DataflowCapabilityChecker { log.debug("select the layout candidate with high data integrity."); candidateAndInfluence = QueryLayoutChooser.selectHighIntegrityCandidate(dataflow, prunedSegments, digest); + if (candidateAndInfluence != null) { + result.setPartialResult(true); + } } if (candidateAndInfluence != null) { chosenCandidate = candidateAndInfluence; diff --git a/src/query-common/src/main/java/org/apache/kylin/query/routing/QueryRouter.java b/src/query-common/src/main/java/org/apache/kylin/query/routing/QueryRouter.java index 153da8540b..6ac0c81af5 100644 --- a/src/query-common/src/main/java/org/apache/kylin/query/routing/QueryRouter.java +++ b/src/query-common/src/main/java/org/apache/kylin/query/routing/QueryRouter.java @@ -101,6 +101,7 @@ public class QueryRouter { } sorters.add(Candidate.modelPrioritySorter()); sorters.add(Candidate.realizationCostSorter()); + sorters.add(Candidate.partialResultSorter()); sorters.add(Candidate.realizationCapabilityCostSorter()); sorters.add(Candidate.modelUuidSorter()); } diff --git a/src/query/src/test/java/org/apache/kylin/query/routing/CandidateSortTest.java b/src/query/src/test/java/org/apache/kylin/query/routing/CandidateSortTest.java index 472d7abf83..78cf5845b3 100644 --- a/src/query/src/test/java/org/apache/kylin/query/routing/CandidateSortTest.java +++ b/src/query/src/test/java/org/apache/kylin/query/routing/CandidateSortTest.java @@ -95,6 +95,17 @@ class CandidateSortTest { assertSortResult(c1, comparator, Lists.newArrayList(c1, c2)); } + @Test + void partialResultSorter() { + Candidate c1 = CandidateTestUtils.mockCandidate("model0001", "modelA", 2, false); + Candidate c2 = CandidateTestUtils.mockCandidate("model0002", "modelB", 2, true); + Candidate c3 = CandidateTestUtils.mockCandidate("model0003", "modelC", 1, false); + Comparator<Candidate> comparator = Candidate.partialResultSorter(); + assertSortResult(c1, comparator, Lists.newArrayList(c1, c2)); + assertSortResult(c3, comparator, Lists.newArrayList(c2, c3)); + assertSortResult(c1, comparator, Lists.newArrayList(c1, c3)); + } + @Test void realizationCapabilityCostSorter() { Candidate c1 = CandidateTestUtils.mockCandidate("model0001", "modelA", 1, 1); diff --git a/src/query/src/test/java/org/apache/kylin/query/routing/CandidateTestUtils.java b/src/query/src/test/java/org/apache/kylin/query/routing/CandidateTestUtils.java index 341a5a8686..6c6660e606 100644 --- a/src/query/src/test/java/org/apache/kylin/query/routing/CandidateTestUtils.java +++ b/src/query/src/test/java/org/apache/kylin/query/routing/CandidateTestUtils.java @@ -49,6 +49,19 @@ public class CandidateTestUtils { return candidate; } + static Candidate mockCandidate(String modelId, String modelName, double candidateCost, boolean partialResult) { + IRealization realization = mockRealization(modelId, modelName, 1); + OLAPContext olapContext = mockOlapContext(); + val candidate = new Candidate(realization, olapContext, Maps.newHashMap()); + val cap = new CapabilityResult(); + cap.setSelectedCandidate(() -> candidateCost); + cap.setCost(cap.getSelectedCandidate().getCost()); + cap.setLayoutUnmatchedColsSize(0); + cap.setPartialResult(partialResult); + candidate.setCapability(cap); + return candidate; + } + static OLAPContext mockOlapContext() { return new OLAPContext(-1); }