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 2015/07/07 19:58:34 UTC

[3/5] incubator-calcite git commit: Add Ord.reverse

Add Ord.reverse


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

Branch: refs/heads/master
Commit: d35df363b4eccc9c6dc85c507b38b3a2334148db
Parents: a76a201
Author: Julian Hyde <jh...@apache.org>
Authored: Tue Jun 30 11:49:59 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Jul 6 20:49:53 2015 -0700

----------------------------------------------------------------------
 .../java/org/apache/calcite/util/UtilTest.java  | 20 ++++++++
 .../java/org/apache/calcite/linq4j/Ord.java     | 49 ++++++++++++++++++--
 2 files changed, 65 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/d35df363/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 2d731a7..92b5c34 100644
--- a/core/src/test/java/org/apache/calcite/util/UtilTest.java
+++ b/core/src/test/java/org/apache/calcite/util/UtilTest.java
@@ -19,6 +19,7 @@ package org.apache.calcite.util;
 import org.apache.calcite.avatica.AvaticaUtils;
 import org.apache.calcite.avatica.util.Spaces;
 import org.apache.calcite.examples.RelBuilderExample;
+import org.apache.calcite.linq4j.Ord;
 import org.apache.calcite.linq4j.function.Function1;
 import org.apache.calcite.runtime.FlatLists;
 import org.apache.calcite.runtime.Resources;
@@ -1381,6 +1382,25 @@ public class UtilTest {
   @Test public void testRelBuilderExample() {
     new RelBuilderExample(false).runAllExamples();
   }
+
+  @Test public void testOrdReverse() {
+    checkOrdReverse(Ord.reverse(Arrays.asList("a", "b", "c")));
+    checkOrdReverse(Ord.reverse("a", "b", "c"));
+    assertThat(Ord.reverse(ImmutableList.<String>of()).iterator().hasNext(),
+        is(false));
+    assertThat(Ord.reverse().iterator().hasNext(), is(false));
+  }
+
+  private void checkOrdReverse(Iterable<Ord<String>> reverse1) {
+    final Iterator<Ord<String>> reverse = reverse1.iterator();
+    assertThat(reverse.hasNext(), is(true));
+    assertThat(reverse.next().i, is(2));
+    assertThat(reverse.hasNext(), is(true));
+    assertThat(reverse.next().e, is("b"));
+    assertThat(reverse.hasNext(), is(true));
+    assertThat(reverse.next().e, is("a"));
+    assertThat(reverse.hasNext(), is(false));
+  }
 }
 
 // End UtilTest.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/d35df363/linq4j/src/main/java/org/apache/calcite/linq4j/Ord.java
----------------------------------------------------------------------
diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/Ord.java b/linq4j/src/main/java/org/apache/calcite/linq4j/Ord.java
index c7eedf5..0ef3df6 100644
--- a/linq4j/src/main/java/org/apache/calcite/linq4j/Ord.java
+++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Ord.java
@@ -16,6 +16,8 @@
  */
 package org.apache.calcite.linq4j;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.AbstractList;
 import java.util.Iterator;
 import java.util.List;
@@ -43,7 +45,7 @@ public class Ord<E> implements Map.Entry<Integer, E> {
    * Creates an Ord.
    */
   public static <E> Ord<E> of(int n, E e) {
-    return new Ord<E>(n, e);
+    return new Ord<>(n, e);
   }
 
   /**
@@ -82,7 +84,7 @@ public class Ord<E> implements Map.Entry<Integer, E> {
    * Returns a numbered list based on an array.
    */
   public static <E> List<Ord<E>> zip(final E[] elements) {
-    return new OrdArrayList<E>(elements);
+    return new OrdArrayList<>(elements);
   }
 
   /**
@@ -90,8 +92,47 @@ public class Ord<E> implements Map.Entry<Integer, E> {
    */
   public static <E> List<Ord<E>> zip(final List<? extends E> elements) {
     return elements instanceof RandomAccess
-        ? new OrdRandomAccessList<E>(elements)
-        : new OrdList<E>(elements);
+        ? new OrdRandomAccessList<>(elements)
+        : new OrdList<>(elements);
+  }
+
+  /**
+   * Iterates over an array in reverse order.
+   *
+   * <p>Given the array ["a", "b", "c"], returns (2, "c") then (1, "b") then
+   * (0, "a").
+   */
+  public static <E> Iterable<Ord<E>> reverse(E... elements) {
+    return reverse(ImmutableList.copyOf(elements));
+  }
+
+  /**
+   * Iterates over a list in reverse order.
+   *
+   * <p>Given the list ["a", "b", "c"], returns (2, "c") then (1, "b") then
+   * (0, "a").
+   */
+  public static <E> Iterable<Ord<E>> reverse(Iterable<? extends E> elements) {
+    final ImmutableList<E> elementList = ImmutableList.copyOf(elements);
+    return new Iterable<Ord<E>>() {
+      public Iterator<Ord<E>> iterator() {
+        return new Iterator<Ord<E>>() {
+          int i = elementList.size() - 1;
+
+          public boolean hasNext() {
+            return i >= 0;
+          }
+
+          public Ord<E> next() {
+            return Ord.of(i, elementList.get(i--));
+          }
+
+          public void remove() {
+            throw new UnsupportedOperationException("remove");
+          }
+        };
+      }
+    };
   }
 
   public Integer getKey() {