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

Reply via email to