You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2018/08/20 05:52:20 UTC

[2/2] calcite git commit: [CALCITE-2480] NameSet.contains wrongly returns false when element in set is upper-case and seek is lower-case

[CALCITE-2480] NameSet.contains wrongly returns false when element in set is upper-case and seek is lower-case

Implement toString, hashCode and equals for NameSet, NameMap and
NameMultimap; and add tests.

Fix some cosmetic issues in other code, such as missing newline at end
of file.


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/6d6421c8
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/6d6421c8
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/6d6421c8

Branch: refs/heads/master
Commit: 6d6421c8a4e0c578bfff736c4690c1c6f47572dd
Parents: 5c592b7
Author: Julian Hyde <jh...@apache.org>
Authored: Sun Aug 19 11:13:48 2018 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Sun Aug 19 16:22:36 2018 -0700

----------------------------------------------------------------------
 cassandra/src/test/resources/cassandra.yaml     |  4 +-
 cassandra/src/test/resources/logback-test.xml   |  2 +-
 .../java/org/apache/calcite/util/NameMap.java   | 14 +++++
 .../org/apache/calcite/util/NameMultimap.java   | 14 +++++
 .../java/org/apache/calcite/util/NameSet.java   | 26 +++++++-
 .../rel2sql/RelToSqlConverterStructsTest.java   |  1 +
 .../org/apache/calcite/test/HepPlannerTest.java |  1 -
 .../calcite/test/RexProgramBuilderBase.java     |  8 ++-
 .../calcite/test/SqlToRelConverterTest.java     |  2 +-
 .../java/org/apache/calcite/util/UtilTest.java  | 65 +++++++++++++++++---
 .../calcite/test/SqlToRelConverterTest.xml      |  6 +-
 11 files changed, 123 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/6d6421c8/cassandra/src/test/resources/cassandra.yaml
----------------------------------------------------------------------
diff --git a/cassandra/src/test/resources/cassandra.yaml b/cassandra/src/test/resources/cassandra.yaml
index 1f3f74a..51fe441 100644
--- a/cassandra/src/test/resources/cassandra.yaml
+++ b/cassandra/src/test/resources/cassandra.yaml
@@ -597,4 +597,6 @@ encryption_options:
     # protocol: TLS
     # algorithm: SunX509
     # store_type: JKS
-    # cipher_suites: [TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA]
\ No newline at end of file
+    # cipher_suites: [TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA]
+
+# End cassandra.yaml

http://git-wip-us.apache.org/repos/asf/calcite/blob/6d6421c8/cassandra/src/test/resources/logback-test.xml
----------------------------------------------------------------------
diff --git a/cassandra/src/test/resources/logback-test.xml b/cassandra/src/test/resources/logback-test.xml
index edfc5b0..e469832 100644
--- a/cassandra/src/test/resources/logback-test.xml
+++ b/cassandra/src/test/resources/logback-test.xml
@@ -29,4 +29,4 @@ limitations under the License.
     <appender-ref ref="STDOUT" />
   </root>
 
-</configuration>
\ No newline at end of file
+</configuration>

http://git-wip-us.apache.org/repos/asf/calcite/blob/6d6421c8/core/src/main/java/org/apache/calcite/util/NameMap.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/NameMap.java b/core/src/main/java/org/apache/calcite/util/NameMap.java
index 3a34d51..cd138ea 100644
--- a/core/src/main/java/org/apache/calcite/util/NameMap.java
+++ b/core/src/main/java/org/apache/calcite/util/NameMap.java
@@ -45,6 +45,20 @@ public class NameMap<V> {
     this(new TreeMap<String, V>(COMPARATOR));
   }
 
+  @Override public String toString() {
+    return map.toString();
+  }
+
+  @Override public int hashCode() {
+    return map.hashCode();
+  }
+
+  @Override public boolean equals(Object obj) {
+    return this == obj
+        || obj instanceof NameMap
+        && map.equals(((NameMap) obj).map);
+  }
+
   /** Creates a NameMap that is an immutable copy of a given map. */
   public static <V> NameMap immutableCopyOf(Map<String, V> names) {
     return new NameMap<>(ImmutableSortedMap.copyOf(names, COMPARATOR));

http://git-wip-us.apache.org/repos/asf/calcite/blob/6d6421c8/core/src/main/java/org/apache/calcite/util/NameMultimap.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/NameMultimap.java b/core/src/main/java/org/apache/calcite/util/NameMultimap.java
index ecab012..a535809 100644
--- a/core/src/main/java/org/apache/calcite/util/NameMultimap.java
+++ b/core/src/main/java/org/apache/calcite/util/NameMultimap.java
@@ -48,6 +48,20 @@ public class NameMultimap<V> {
     this(new TreeMap<String, List<V>>(COMPARATOR));
   }
 
+  @Override public String toString() {
+    return map.toString();
+  }
+
+  @Override public int hashCode() {
+    return map.hashCode();
+  }
+
+  @Override public boolean equals(Object obj) {
+    return this == obj
+        || obj instanceof NameMultimap
+        && map.equals(((NameMultimap) obj).map);
+  }
+
   /** Adds an entry to this multimap. */
   public void put(String name, V v) {
     List<V> list = map.computeIfAbsent(name, k -> new ArrayList<>());

http://git-wip-us.apache.org/repos/asf/calcite/blob/6d6421c8/core/src/main/java/org/apache/calcite/util/NameSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/NameSet.java b/core/src/main/java/org/apache/calcite/util/NameSet.java
index 22b7da0..3f78d18 100644
--- a/core/src/main/java/org/apache/calcite/util/NameSet.java
+++ b/core/src/main/java/org/apache/calcite/util/NameSet.java
@@ -60,6 +60,20 @@ public class NameSet {
     return new NameSet(ImmutableSortedSet.copyOf(NameSet.COMPARATOR, names));
   }
 
+  @Override public String toString() {
+    return names.toString();
+  }
+
+  @Override public int hashCode() {
+    return names.hashCode();
+  }
+
+  @Override public boolean equals(Object obj) {
+    return this == obj
+        || obj instanceof NameSet
+        && names.equals(((NameSet) obj).names);
+  }
+
   public void add(String name) {
     names.add(name);
   }
@@ -87,9 +101,15 @@ public class NameSet {
       return true;
     }
     if (!caseSensitive) {
-      final String s = names.ceiling(name.toLowerCase(Locale.ROOT));
-      return s != null
-          && s.equalsIgnoreCase(name);
+      final String lowerName = name.toLowerCase(Locale.ROOT);
+      final String ceiling = names.ceiling(lowerName);
+      if (ceiling != null && ceiling.equalsIgnoreCase(name)) {
+        return true;
+      }
+      final String floor = names.floor(lowerName);
+      if (floor != null && floor.equalsIgnoreCase(name)) {
+        return true;
+      }
     }
     return false;
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/6d6421c8/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterStructsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterStructsTest.java b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterStructsTest.java
index aef7993..a2ca141 100644
--- a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterStructsTest.java
+++ b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterStructsTest.java
@@ -203,4 +203,5 @@ public class RelToSqlConverterStructsTest {
     sql(query).ok(expected);
   }
 }
+
 // End RelToSqlConverterStructsTest.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/6d6421c8/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java b/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java
index dff2486..dea4c16 100644
--- a/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java
+++ b/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java
@@ -42,7 +42,6 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
-
 /**
  * HepPlannerTest is a unit test for {@link HepPlanner}. See
  * {@link RelOptRulesTest} for an explanation of how to add tests; the tests in

http://git-wip-us.apache.org/repos/asf/calcite/blob/6d6421c8/core/src/test/java/org/apache/calcite/test/RexProgramBuilderBase.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/RexProgramBuilderBase.java b/core/src/test/java/org/apache/calcite/test/RexProgramBuilderBase.java
index 6b74e9a..b018109 100644
--- a/core/src/test/java/org/apache/calcite/test/RexProgramBuilderBase.java
+++ b/core/src/test/java/org/apache/calcite/test/RexProgramBuilderBase.java
@@ -382,10 +382,12 @@ public abstract class RexProgramBuilderBase {
   /**
    * Generates input ref with given type and index.
    *
-   * Prefer {@link #vBool()}, {@link #vInt()} and so on.
+   * <p>Prefer {@link #vBool()}, {@link #vInt()} and so on.
+   *
+   * <p>The problem with "input refs" is {@code input(tInt(), 0).toString()}
+   * yields {@code $0}, so the type of the expression is not printed, and it
+   * makes it hard to analyze the expressions.
    *
-   * The problem with "input refs" is {@code input(tInt(), 0).toString()} yields {@code $0},
-   * so the type of the expression is not printed, and it makes it hard to analyze the expressions.
    * @param type desired type of the node
    * @param arg argument index (0-based)
    * @return input ref with given type and index

http://git-wip-us.apache.org/repos/asf/calcite/blob/6d6421c8/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
index b62438a..aba2274 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -2521,7 +2521,7 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
     sql(sql3).with(getTesterWithDynamicTable()).ok();
   }
 
-  @Test public void testStarDynamicSchemaUnnestNestedSubquery() {
+  @Test public void testStarDynamicSchemaUnnestNestedSubQuery() {
     String sql3 = "select t2.c1\n"
         + "from (select * from SALES.CUSTOMER) as t1,\n"
         + "unnest(t1.fake_col) as t2(c1)";

http://git-wip-us.apache.org/repos/asf/calcite/blob/6d6421c8/core/src/test/java/org/apache/calcite/util/UtilTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/util/UtilTest.java b/core/src/test/java/org/apache/calcite/util/UtilTest.java
index fa649c8..5c21892 100644
--- a/core/src/test/java/org/apache/calcite/util/UtilTest.java
+++ b/core/src/test/java/org/apache/calcite/util/UtilTest.java
@@ -2000,12 +2000,30 @@ public class UtilTest {
     assertThat(Iterables.size(names.iterable()), is(1));
     names.add("Baz");
     names.add("Abcde");
+    names.add("WOMBAT");
     names.add("Zymurgy");
-    assertThat(Iterables.size(names.iterable()), is(4));
+    assertThat(names.toString(), is("[Abcde, Baz, baz, WOMBAT, Zymurgy]"));
+    assertThat(Iterables.size(names.iterable()), is(5));
     assertThat(names.range("baz", false).size(), is(2));
     assertThat(names.range("baz", true).size(), is(1));
     assertThat(names.range("BAZ", true).size(), is(0));
     assertThat(names.range("Baz", true).size(), is(1));
+    assertThat(names.contains("baz", true), is(true));
+    assertThat(names.contains("baz", false), is(true));
+    assertThat(names.contains("BAZ", true), is(false));
+    assertThat(names.contains("BAZ", false), is(true));
+    assertThat(names.contains("abcde", true), is(false));
+    assertThat(names.contains("abcde", false), is(true));
+    assertThat(names.contains("ABCDE", true), is(false));
+    assertThat(names.contains("ABCDE", false), is(true));
+    assertThat(names.contains("wombat", true), is(false));
+    assertThat(names.contains("wombat", false), is(true));
+    assertThat(names.contains("womBat", true), is(false));
+    assertThat(names.contains("womBat", false), is(true));
+    assertThat(names.contains("WOMBAT", true), is(true));
+    assertThat(names.contains("WOMBAT", false), is(true));
+    assertThat(names.contains("zyMurgy", true), is(false));
+    assertThat(names.contains("zyMurgy", false), is(true));
   }
 
   /** Unit test for {@link org.apache.calcite.util.NameMap}. */
@@ -2039,14 +2057,30 @@ public class UtilTest {
     assertThat(map.map().size(), is(1));
     map.put("Baz", 1);
     map.put("Abcde", 2);
+    map.put("WOMBAT", 4);
     map.put("Zymurgy", 3);
-    assertThat(map.map().size(), is(4));
-    assertThat(map.map().entrySet().size(), is(4));
-    assertThat(map.map().keySet().size(), is(4));
+    assertThat(map.toString(),
+        is("{Abcde=2, Baz=1, baz=0, WOMBAT=4, Zymurgy=3}"));
+    assertThat(map.map().size(), is(5));
+    assertThat(map.map().entrySet().size(), is(5));
+    assertThat(map.map().keySet().size(), is(5));
     assertThat(map.range("baz", false).size(), is(2));
     assertThat(map.range("baz", true).size(), is(1));
     assertThat(map.range("BAZ", true).size(), is(0));
     assertThat(map.range("Baz", true).size(), is(1));
+    assertThat(map.containsKey("baz", true), is(true));
+    assertThat(map.containsKey("baz", false), is(true));
+    assertThat(map.containsKey("BAZ", true), is(false));
+    assertThat(map.containsKey("BAZ", false), is(true));
+    assertThat(map.containsKey("abcde", true), is(false));
+    assertThat(map.containsKey("abcde", false), is(true));
+    assertThat(map.containsKey("ABCDE", true), is(false));
+    assertThat(map.containsKey("ABCDE", false), is(true));
+    assertThat(map.containsKey("wombat", true), is(false));
+    assertThat(map.containsKey("wombat", false), is(true));
+    assertThat(map.containsKey("womBat", false), is(true));
+    assertThat(map.containsKey("zyMurgy", true), is(false));
+    assertThat(map.containsKey("zyMurgy", false), is(true));
   }
 
   /** Unit test for {@link org.apache.calcite.util.NameMultimap}. */
@@ -2082,14 +2116,31 @@ public class UtilTest {
     assertThat(map.map().size(), is(2));
     map.put("Baz", 1);
     map.put("Abcde", 2);
+    map.put("WOMBAT", 4);
     map.put("Zymurgy", 3);
-    assertThat(map.map().size(), is(5));
-    assertThat(map.map().entrySet().size(), is(5));
-    assertThat(map.map().keySet().size(), is(5));
+    final String expected = "{Abcde=[2], BAz=[0], Baz=[1], baz=[0, 0],"
+        + " WOMBAT=[4], Zymurgy=[3]}";
+    assertThat(map.toString(), is(expected));
+    assertThat(map.map().size(), is(6));
+    assertThat(map.map().entrySet().size(), is(6));
+    assertThat(map.map().keySet().size(), is(6));
     assertThat(map.range("baz", false).size(), is(4));
     assertThat(map.range("baz", true).size(), is(2));
     assertThat(map.range("BAZ", true).size(), is(0));
     assertThat(map.range("Baz", true).size(), is(1));
+    assertThat(map.containsKey("baz", true), is(true));
+    assertThat(map.containsKey("baz", false), is(true));
+    assertThat(map.containsKey("BAZ", true), is(false));
+    assertThat(map.containsKey("BAZ", false), is(true));
+    assertThat(map.containsKey("abcde", true), is(false));
+    assertThat(map.containsKey("abcde", false), is(true));
+    assertThat(map.containsKey("ABCDE", true), is(false));
+    assertThat(map.containsKey("ABCDE", false), is(true));
+    assertThat(map.containsKey("wombat", true), is(false));
+    assertThat(map.containsKey("wombat", false), is(true));
+    assertThat(map.containsKey("womBat", false), is(true));
+    assertThat(map.containsKey("zyMurgy", true), is(false));
+    assertThat(map.containsKey("zyMurgy", false), is(true));
   }
 
   @Test public void testNlsStringClone() {

http://git-wip-us.apache.org/repos/asf/calcite/blob/6d6421c8/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
index 0867b8d..7e87d88 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -5292,10 +5292,10 @@ LogicalProject(**=[$1], $unnest=[$2])
 ]]>
         </Resource>
     </TestCase>
-    <TestCase name="testStarDynamicSchemaUnnestNestedSubquery">
+    <TestCase name="testStarDynamicSchemaUnnestNestedSubQuery">
         <Resource name="sql">
-            <![CDATA[select t2.c1
-            from (select * from SALES.CUSTOMER) as t1, unnest(t1.fake_col) as t2(c1)]]>
+            <![CDATA[select t2.c1 from (select * from SALES.CUSTOMER)
+            as t1, unnest(t1.fake_col) as t2(c1)]]>
         </Resource>
         <Resource name="plan">
             <![CDATA[