You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by ni...@apache.org on 2020/01/16 07:57:00 UTC

[kylin] branch master updated: KYLIN-4327 TOPN Comparator may violate its general contract

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 29bea9d  KYLIN-4327 TOPN Comparator may violate its general contract
29bea9d is described below

commit 29bea9d71a830cf198dab390f7180c2131efd7d3
Author: Yifei.Wu <va...@gmail.com>
AuthorDate: Mon Jan 6 11:28:47 2020 +0800

    KYLIN-4327 TOPN Comparator may violate its general contract
---
 .../org/apache/kylin/measure/topn/TopNCounter.java |  8 ++--
 .../kylin/measure/topn/TopNCounterBasicTest.java   | 47 ++++++++++++++++++++++
 2 files changed, 51 insertions(+), 4 deletions(-)

diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/topn/TopNCounter.java b/core-metadata/src/main/java/org/apache/kylin/measure/topn/TopNCounter.java
index 8037eac..754fd55 100644
--- a/core-metadata/src/main/java/org/apache/kylin/measure/topn/TopNCounter.java
+++ b/core-metadata/src/main/java/org/apache/kylin/measure/topn/TopNCounter.java
@@ -238,18 +238,18 @@ public class TopNCounter<T> implements Iterable<Counter<T>>, java.io.Serializabl
         }
     }
 
-    private static final Comparator ASC_COMPARATOR = new Comparator<Counter>() {
+    static final Comparator ASC_COMPARATOR = new Comparator<Counter>() {
         @Override
         public int compare(Counter o1, Counter o2) {
-            return o1.getCount() > o2.getCount() ? 1 : o1.getCount() == o2.getCount() ? 0 : -1;
+            return Double.compare(o1.getCount(), o2.getCount());
         }
 
     };
 
-    private static final Comparator DESC_COMPARATOR = new Comparator<Counter>() {
+    static final Comparator DESC_COMPARATOR = new Comparator<Counter>() {
         @Override
         public int compare(Counter o1, Counter o2) {
-            return o1.getCount() > o2.getCount() ? -1 : o1.getCount() == o2.getCount() ? 0 : 1;
+            return Double.compare(o2.getCount(), o1.getCount());
         }
 
     };
diff --git a/core-metadata/src/test/java/org/apache/kylin/measure/topn/TopNCounterBasicTest.java b/core-metadata/src/test/java/org/apache/kylin/measure/topn/TopNCounterBasicTest.java
index 9d034fe..506ecf3 100644
--- a/core-metadata/src/test/java/org/apache/kylin/measure/topn/TopNCounterBasicTest.java
+++ b/core-metadata/src/test/java/org/apache/kylin/measure/topn/TopNCounterBasicTest.java
@@ -24,8 +24,11 @@ import static org.junit.Assert.assertTrue;
 import java.util.Arrays;
 import java.util.List;
 
+import org.junit.Assert;
 import org.junit.Test;
 
+import com.google.common.collect.Lists;
+
 public class TopNCounterBasicTest {
 
     @Test
@@ -130,4 +133,48 @@ public class TopNCounterBasicTest {
         }
 
     }
+
+    @Test
+    public void testComparatorSymmetry() {
+        List<Counter> counters = Lists.newArrayList(new Counter<>("item", 0d), new Counter<>("item", 0d),
+                new Counter<>("item", 0d), new Counter<>("item", 0d), new Counter<>("item", 0d),
+                new Counter<>("item", 0d), new Counter<>("item", 0d), new Counter<>("item", 3d),
+                new Counter<>("item", 0d), new Counter<>("item", 0d), new Counter<>("item", 0d),
+                new Counter<>("item", 0d), new Counter<>("item", 0d), new Counter<>("item", 0d),
+                new Counter<>("item", 0d), new Counter<>("item", 0d), new Counter<>("item", 0d),
+                new Counter<>("item", 0d), new Counter<>("item", 0d), new Counter<>("item", 0d),
+                new Counter<>("item", 0d), new Counter<>("item", 0d), new Counter<>("item", 0d),
+                new Counter<>("item", 0d), new Counter<>("item", 0d), new Counter<>("item", 0d),
+                new Counter<>("item", 0d), new Counter<>("item", 0d), new Counter<>("item", 0d),
+                new Counter<>("item", 0d), new Counter<>("item", 0d), new Counter<>("item", 0d),
+                new Counter<>("item", 0d), new Counter<>("item", 1d), new Counter<>("item", 1d),
+                new Counter<>("item", 0d), new Counter<>("item", 0d), new Counter<>("item", 1d),
+                new Counter<>("item", 0d), new Counter<>("item", 1d), new Counter<>("item", 0d),
+                new Counter<>("item", 0d), new Counter<>("item", 0d), new Counter<>("item", 0d),
+                new Counter<>("item", 1d), new Counter<>("item", 0d), new Counter<>("item", 0d),
+                new Counter<>("item", 1d), new Counter<>("item", 0d), new Counter<>("item", 0d),
+                new Counter<>("item", 0d), new Counter<>("item", 2d), new Counter<>("item", 1d),
+                new Counter<>("item", 0d), new Counter<>("item", 0d), new Counter<>("item", 0d),
+                new Counter<>("item", 2d), new Counter<>("item", 4d), new Counter<>("item", 0d),
+                new Counter<>("item", 3d));
+        counters.sort(TopNCounter.ASC_COMPARATOR);
+        List<Double> expectedCounts = Lists.newArrayList(0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d,
+                0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d,
+                0d, 0d, 0d, 0d, 0d, 0d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 2d, 2d, 3d, 3d, 4d);
+        List<Double> originCounts = Lists.newArrayList();
+        counters.stream().forEach(counter -> {
+            originCounts.add(counter.getCount());
+        });
+        Assert.assertArrayEquals(expectedCounts.toArray(), originCounts.toArray());
+
+        counters.sort(TopNCounter.DESC_COMPARATOR);
+        List<Double> expectedDescCounts = Lists.newArrayList(4d, 3d, 3d, 2d, 2d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 0d, 0d, 0d,
+                0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d,
+                0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d);
+        List<Double> originDescCounts = Lists.newArrayList();
+        counters.stream().forEach(counter -> {
+            originDescCounts.add(counter.getCount());
+        });
+        Assert.assertArrayEquals(expectedDescCounts.toArray(), originDescCounts.toArray());
+    }
 }