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/07/13 22:49:05 UTC

[4/4] calcite git commit: Util.filter replaces Guava Iterables.filter

Util.filter replaces Guava Iterables.filter


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

Branch: refs/heads/master
Commit: f5cef16066a8f13f906eed495f62b6c12cc1648d
Parents: 4402f91
Author: Julian Hyde <jh...@apache.org>
Authored: Thu Jul 12 12:17:58 2018 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Fri Jul 13 14:21:43 2018 -0700

----------------------------------------------------------------------
 .../calcite/plan/AbstractRelOptPlanner.java     |  4 +-
 .../calcite/rel/logical/LogicalWindow.java      |  4 +-
 .../java/org/apache/calcite/rex/RexUtil.java    |  2 +-
 .../sql/type/SqlTypeExplicitPrecedenceList.java |  6 +--
 .../main/java/org/apache/calcite/util/Util.java | 50 ++++++++++++++++++++
 .../java/org/apache/calcite/util/UtilTest.java  | 46 ++++++++++++++++++
 6 files changed, 103 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/f5cef160/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java b/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
index 06306d5..9eab16e 100644
--- a/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
+++ b/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
@@ -22,9 +22,9 @@ import org.apache.calcite.rel.metadata.RelMetadataProvider;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rex.RexExecutor;
 import org.apache.calcite.util.CancelFlag;
+import org.apache.calcite.util.Util;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
 
 import java.util.Arrays;
 import java.util.HashMap;
@@ -415,7 +415,7 @@ public abstract class AbstractRelOptPlanner implements RelOptPlanner {
   /** Returns sub-classes of relational expression. */
   public Iterable<Class<? extends RelNode>> subClasses(
       final Class<? extends RelNode> clazz) {
-    return Iterables.filter(classes, clazz::isAssignableFrom);
+    return Util.filter(classes, clazz::isAssignableFrom);
   }
 }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/f5cef160/core/src/main/java/org/apache/calcite/rel/logical/LogicalWindow.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalWindow.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalWindow.java
index f03cc2f..db5b856 100644
--- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalWindow.java
+++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalWindow.java
@@ -37,8 +37,8 @@ import org.apache.calcite.tools.RelBuilder;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.Litmus;
 import org.apache.calcite.util.Pair;
+import org.apache.calcite.util.Util;
 
-import com.google.common.collect.Iterables;
 import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Multimap;
@@ -345,7 +345,7 @@ public final class LogicalWindow extends Window {
     // Look up or create a window.
     RelCollation orderKeys = getCollation(
         Lists.newArrayList(
-            Iterables.filter(aggWindow.orderKeys,
+            Util.filter(aggWindow.orderKeys,
                 rexFieldCollation ->
                     // If ORDER BY references constant (i.e. RexInputRef),
                     // then we can ignore such ORDER BY key.

http://git-wip-us.apache.org/repos/asf/calcite/blob/f5cef160/core/src/main/java/org/apache/calcite/rex/RexUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rex/RexUtil.java b/core/src/main/java/org/apache/calcite/rex/RexUtil.java
index 29e63f1..5c69573 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexUtil.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexUtil.java
@@ -1855,7 +1855,7 @@ public class RexUtil {
     case EQUALS:
       final RexCall call = (RexCall) e;
       if (call.getOperands().get(1) instanceof RexLiteral) {
-        notTerms = Iterables.filter(notTerms,
+        notTerms = Util.filter(notTerms,
             e2 -> {
               switch (e2.getKind()) {
               case EQUALS:

http://git-wip-us.apache.org/repos/asf/calcite/blob/f5cef160/core/src/main/java/org/apache/calcite/sql/type/SqlTypeExplicitPrecedenceList.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeExplicitPrecedenceList.java b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeExplicitPrecedenceList.java
index 539f058..d8eabdd 100644
--- a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeExplicitPrecedenceList.java
+++ b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeExplicitPrecedenceList.java
@@ -22,14 +22,13 @@ import org.apache.calcite.util.Glossary;
 import org.apache.calcite.util.ImmutableNullableList;
 import org.apache.calcite.util.Util;
 
-import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
 
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * SqlTypeExplicitPrecedenceList implements the
@@ -60,8 +59,7 @@ public class SqlTypeExplicitPrecedenceList
           SqlTypeName.DOUBLE);
 
   private static final List<SqlTypeName> COMPACT_NUMERIC_TYPES =
-      ImmutableList.copyOf(
-          Iterables.filter(NUMERIC_TYPES, Predicates.notNull()));
+      ImmutableList.copyOf(Util.filter(NUMERIC_TYPES, Objects::nonNull));
 
   /**
    * Map from SqlTypeName to corresponding precedence list.

http://git-wip-us.apache.org/repos/asf/calcite/blob/f5cef160/core/src/main/java/org/apache/calcite/util/Util.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/Util.java b/core/src/main/java/org/apache/calcite/util/Util.java
index b90bbbd..1139643 100644
--- a/core/src/main/java/org/apache/calcite/util/Util.java
+++ b/core/src/main/java/org/apache/calcite/util/Util.java
@@ -95,6 +95,7 @@ import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.TimeZone;
 import java.util.function.Function;
+import java.util.function.Predicate;
 import java.util.jar.JarFile;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -2369,6 +2370,18 @@ public class Util {
     }
   }
 
+  /** Filters an iterable. */
+  public static <E> Iterable<E> filter(Iterable<E> iterable,
+      Predicate<E> predicate) {
+    return () -> filter(iterable.iterator(), predicate);
+  }
+
+  /** Filters an iterator. */
+  public static <E> Iterator<E> filter(Iterator<E> iterator,
+      Predicate<E> predicate) {
+    return new FilteringIterator<>(iterator, predicate);
+  }
+
   //~ Inner Classes ----------------------------------------------------------
 
   /**
@@ -2447,6 +2460,43 @@ public class Util {
       super(list, function);
     }
   }
+
+  /** Iterator that applies a predicate to each element.
+   *
+   * @param <T> Element type */
+  private static class FilteringIterator<T> implements Iterator<T> {
+    private static final Object DUMMY = new Object();
+    final Iterator<? extends T> iterator;
+    private final Predicate<T> predicate;
+    T current;
+
+    FilteringIterator(Iterator<? extends T> iterator,
+        Predicate<T> predicate) {
+      this.iterator = iterator;
+      this.predicate = predicate;
+      current = moveNext();
+    }
+
+    public boolean hasNext() {
+      return current != DUMMY;
+    }
+
+    public T next() {
+      final T t = this.current;
+      current = moveNext();
+      return t;
+    }
+
+    protected T moveNext() {
+      while (iterator.hasNext()) {
+        T t = iterator.next();
+        if (predicate.test(t)) {
+          return t;
+        }
+      }
+      return (T) DUMMY;
+    }
+  }
 }
 
 // End Util.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/f5cef160/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 e9159a9..fa649c8 100644
--- a/core/src/test/java/org/apache/calcite/util/UtilTest.java
+++ b/core/src/test/java/org/apache/calcite/util/UtilTest.java
@@ -43,8 +43,10 @@ import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.primitives.Ints;
 
+import org.hamcrest.Description;
 import org.hamcrest.Matcher;
 import org.hamcrest.StringDescription;
+import org.hamcrest.TypeSafeMatcher;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -73,6 +75,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.NavigableSet;
+import java.util.Objects;
 import java.util.Properties;
 import java.util.Random;
 import java.util.RandomAccess;
@@ -2175,6 +2178,49 @@ public class UtilTest {
         not(instanceOf(RandomAccess.class)));
   }
 
+  /** Tests {@link Util#filter(Iterable, java.util.function.Predicate)}. */
+  @Test public void testFilter() {
+    final List<String> beatles =
+        Arrays.asList("John", "Paul", "George", "Ringo");
+    final List<String> empty = Collections.emptyList();
+    final List<String> nullBeatles =
+        Arrays.asList("John", "Paul", null, "Ringo");
+    assertThat(Util.filter(beatles, s -> s.length() == 4),
+        isIterable(Arrays.asList("John", "Paul")));
+    assertThat(Util.filter(empty, s -> s.length() == 4), isIterable(empty));
+    assertThat(Util.filter(empty, s -> false), isIterable(empty));
+    assertThat(Util.filter(empty, s -> true), isIterable(empty));
+    assertThat(Util.filter(beatles, s -> false), isIterable(empty));
+    assertThat(Util.filter(beatles, s -> true), isIterable(beatles));
+    assertThat(Util.filter(nullBeatles, s -> false), isIterable(empty));
+    assertThat(Util.filter(nullBeatles, s -> true), isIterable(nullBeatles));
+    assertThat(Util.filter(nullBeatles, Objects::isNull),
+        isIterable(Collections.singletonList(null)));
+    assertThat(Util.filter(nullBeatles, Objects::nonNull),
+        isIterable(Arrays.asList("John", "Paul", "Ringo")));
+  }
+
+  private static <E> Matcher<Iterable<E>> isIterable(final Iterable<E> iterable) {
+    final List<E> list = toList(iterable);
+    return new TypeSafeMatcher<Iterable<E>>() {
+      protected boolean matchesSafely(Iterable<E> iterable) {
+        return list.equals(toList(iterable));
+      }
+
+      public void describeTo(Description description) {
+        description.appendText("is iterable ").appendValue(list);
+      }
+    };
+  }
+
+  private static <E> List<E> toList(Iterable<E> iterable) {
+    final List<E> list = new ArrayList<>();
+    for (E e : iterable) {
+      list.add(e);
+    }
+    return list;
+  }
+
   static String mismatchDescription(Matcher m, Object item) {
     final StringDescription d = new StringDescription();
     m.describeMismatch(item, d);