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 2016/06/15 16:39:31 UTC

[3/5] calcite git commit: [CALCITE-1278] CalciteSignature's ColumnMetaData info for DELETE should be same as INSERT

[CALCITE-1278] CalciteSignature's ColumnMetaData info for DELETE should be same as INSERT


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

Branch: refs/heads/master
Commit: 76616379a8018679230930c4f8d16c51ecb35c59
Parents: 0404349
Author: maryannxue <ma...@gmail.com>
Authored: Tue Jun 14 15:07:20 2016 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Tue Jun 14 18:02:59 2016 -0700

----------------------------------------------------------------------
 .../enumerable/EnumerableTableModify.java       | 30 ++++++++++--
 .../org/apache/calcite/plan/RelOptUtil.java     |  1 +
 .../calcite/prepare/CalcitePrepareImpl.java     | 22 +++++----
 .../org/apache/calcite/util/BuiltInMethod.java  |  1 +
 .../calcite/test/JdbcFrontLinqBackTest.java     | 23 +++++++++
 .../java/org/apache/calcite/test/JdbcTest.java  | 50 +++++++++++++++++++-
 .../calcite/linq4j/DefaultEnumerable.java       |  4 ++
 .../calcite/linq4j/EnumerableDefaults.java      | 10 ++++
 .../calcite/linq4j/ExtendedEnumerable.java      |  7 ++-
 9 files changed, 131 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/76616379/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModify.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModify.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModify.java
index c40678e..adcd417 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModify.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModify.java
@@ -31,6 +31,7 @@ import org.apache.calcite.rel.core.TableModify;
 import org.apache.calcite.schema.ModifiableTable;
 import org.apache.calcite.util.BuiltInMethod;
 
+import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -121,20 +122,39 @@ public class EnumerableTableModify extends TableModify
     } else {
       convertedChildExp = childExp;
     }
+    final Method method;
+    switch (getOperation()) {
+    case INSERT:
+      method = BuiltInMethod.INTO.method;
+      break;
+    case DELETE:
+      method = BuiltInMethod.REMOVE_ALL.method;
+      break;
+    default:
+      throw new AssertionError(getOperation());
+    }
     builder.add(
         Expressions.statement(
             Expressions.call(
-                convertedChildExp, "into", collectionParameter)));
+                convertedChildExp, method, collectionParameter)));
+    final Expression updatedCountParameter =
+        builder.append(
+            "updatedCount",
+            Expressions.call(collectionParameter, "size"),
+            false);
     builder.add(
         Expressions.return_(
             null,
             Expressions.call(
                 BuiltInMethod.SINGLETON_ENUMERABLE.method,
                 Expressions.convert_(
-                    Expressions.subtract(
-                        Expressions.call(
-                            collectionParameter, "size"),
-                        countParameter),
+                    Expressions.condition(
+                        Expressions.greaterThanOrEqual(
+                            updatedCountParameter, countParameter),
+                        Expressions.subtract(
+                            updatedCountParameter, countParameter),
+                        Expressions.subtract(
+                            countParameter, updatedCountParameter)),
                     long.class))));
     final PhysType physType =
         PhysTypeImpl.of(

http://git-wip-us.apache.org/repos/asf/calcite/blob/76616379/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java b/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
index 60e9cb7..d9d2a63 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java
@@ -1730,6 +1730,7 @@ public abstract class RelOptUtil {
       RelDataTypeFactory typeFactory) {
     switch (kind) {
     case INSERT:
+    case DELETE:
       return typeFactory.createStructType(
           ImmutableList.of(
               Pair.of(AvaticaConnection.ROWCOUNT_COLUMN_NAME,

http://git-wip-us.apache.org/repos/asf/calcite/blob/76616379/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java b/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java
index bd53b7b..60a76bb 100644
--- a/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java
+++ b/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java
@@ -632,24 +632,27 @@ public class CalcitePrepareImpl implements CalcitePrepare {
   }
 
   /**
-   * Routine to figure out the StatementType and defaults to SELECT
-   * As CASE increases the default may change
-   * @param kind a SqlKind
-   * @return Meta.StatementType*/
+   * Deduces the broad type of statement.
+   * Currently returns SELECT for most statement types, but this may change.
+   *
+   * @param kind Kind of statement
+   */
   private Meta.StatementType getStatementType(SqlKind kind) {
     switch (kind) {
     case INSERT:
-      return Meta.StatementType.INSERT;
+    case DELETE:
+      return Meta.StatementType.IS_DML;
     default:
       return Meta.StatementType.SELECT;
     }
   }
 
   /**
-   * Routine to figure out the StatementType if call does not have sql
-   * defaults to SELECT
-   * @param preparedResult An objecet returned from prepareQueryable or prepareRel
-   * @return Meta.StatementType*/
+   * Deduces the broad type of statement for a prepare result.
+   * Currently returns SELECT for most statement types, but this may change.
+   *
+   * @param preparedResult Prepare result
+   */
   private Meta.StatementType getStatementType(Prepare.PreparedResult preparedResult) {
     if (preparedResult.isDml()) {
       return Meta.StatementType.IS_DML;
@@ -725,6 +728,7 @@ public class CalcitePrepareImpl implements CalcitePrepare {
           sqlNode, Object.class, validator, true);
       switch (sqlNode.getKind()) {
       case INSERT:
+      case DELETE:
       case EXPLAIN:
         // FIXME: getValidatedNodeType is wrong for DML
         x = RelOptUtil.createDmlRowType(sqlNode.getKind(), typeFactory);

http://git-wip-us.apache.org/repos/asf/calcite/blob/76616379/core/src/main/java/org/apache/calcite/util/BuiltInMethod.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/BuiltInMethod.java b/core/src/main/java/org/apache/calcite/util/BuiltInMethod.java
index 6a17843..9850c9f 100644
--- a/core/src/main/java/org/apache/calcite/util/BuiltInMethod.java
+++ b/core/src/main/java/org/apache/calcite/util/BuiltInMethod.java
@@ -115,6 +115,7 @@ public enum BuiltInMethod {
   AS_QUERYABLE(Enumerable.class, "asQueryable"),
   ABSTRACT_ENUMERABLE_CTOR(AbstractEnumerable.class),
   INTO(ExtendedEnumerable.class, "into", Collection.class),
+  REMOVE_ALL(ExtendedEnumerable.class, "removeAll", Collection.class),
   SCHEMA_GET_SUB_SCHEMA(Schema.class, "getSubSchema", String.class),
   SCHEMA_GET_TABLE(Schema.class, "getTable", String.class),
   SCHEMA_PLUS_UNWRAP(SchemaPlus.class, "unwrap", Class.class),

http://git-wip-us.apache.org/repos/asf/calcite/blob/76616379/core/src/test/java/org/apache/calcite/test/JdbcFrontLinqBackTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/JdbcFrontLinqBackTest.java b/core/src/test/java/org/apache/calcite/test/JdbcFrontLinqBackTest.java
index 58c7783..8a2171a 100644
--- a/core/src/test/java/org/apache/calcite/test/JdbcFrontLinqBackTest.java
+++ b/core/src/test/java/org/apache/calcite/test/JdbcFrontLinqBackTest.java
@@ -274,6 +274,29 @@ public class JdbcFrontLinqBackTest {
             "empid=1; deptno=0; name=foo; salary=10.0; commission=null");
   }
 
+  @Test public void testDelete() {
+    final List<JdbcTest.Employee> employees = new ArrayList<>();
+    CalciteAssert.AssertThat with = mutable(employees);
+    with.query("select * from \"foo\".\"bar\"")
+        .returnsUnordered(
+            "empid=0; deptno=0; name=first; salary=0.0; commission=null");
+    with.query("insert into \"foo\".\"bar\" select * from \"hr\".\"emps\"")
+        .updates(4);
+    with.query("select count(*) as c from \"foo\".\"bar\"")
+        .returnsUnordered("C=5");
+    final String deleteSql = "delete from \"foo\".\"bar\" "
+        + "where \"deptno\" = 10";
+    with.query(deleteSql)
+        .updates(3);
+    final String sql = "select \"name\", count(*) as c\n"
+        + "from \"foo\".\"bar\"\n"
+        + "group by \"name\"";
+    with.query(sql)
+        .returnsUnordered(
+            "name=Eric; C=1",
+            "name=first; C=1");
+  }
+
   /**
    * Creates the post processor routine to be applied against a Connection.
    *

http://git-wip-us.apache.org/repos/asf/calcite/blob/76616379/core/src/test/java/org/apache/calcite/test/JdbcTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/JdbcTest.java b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
index e8aec78..fc2c396 100644
--- a/core/src/test/java/org/apache/calcite/test/JdbcTest.java
+++ b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
@@ -128,6 +128,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
+import java.util.Objects;
 import java.util.Properties;
 import java.util.Set;
 import java.util.TimeZone;
@@ -6479,10 +6480,16 @@ public class JdbcTest {
       this.commission = commission;
     }
 
-    public String toString() {
+    @Override public String toString() {
       return "Employee [empid: " + empid + ", deptno: " + deptno
           + ", name: " + name + "]";
     }
+
+    @Override public boolean equals(Object obj) {
+      return obj == this
+          || obj instanceof Employee
+          && empid == ((Employee) obj).empid;
+    }
   }
 
   public static class Department {
@@ -6501,10 +6508,16 @@ public class JdbcTest {
       this.location = location;
     }
 
-    public String toString() {
+    @Override public String toString() {
       return "Department [deptno: " + deptno + ", name: " + name
           + ", employees: " + employees + ", location: " + location + "]";
     }
+
+    @Override public boolean equals(Object obj) {
+      return obj == this
+          || obj instanceof Department
+          && deptno == ((Department) obj).deptno;
+    }
   }
 
   public static class Location {
@@ -6519,6 +6532,13 @@ public class JdbcTest {
     @Override public String toString() {
       return "Location [x: " + x + ", y: " + y + "]";
     }
+
+    @Override public boolean equals(Object obj) {
+      return obj == this
+          || obj instanceof Location
+          && x == ((Location) obj).x
+          && y == ((Location) obj).y;
+    }
   }
 
   public static class Dependent {
@@ -6533,6 +6553,13 @@ public class JdbcTest {
     @Override public String toString() {
       return "Dependent [empid: " + empid + ", name: " + name + "]";
     }
+
+    @Override public boolean equals(Object obj) {
+      return obj == this
+          || obj instanceof Dependent
+          && empid == ((Dependent) obj).empid
+          && Objects.equals(name, ((Dependent) obj).name);
+    }
   }
 
   public static class FoodmartSchema {
@@ -6557,6 +6584,12 @@ public class JdbcTest {
       this.EMPNO = EMPNO;
       this.DEPTNO = DEPTNO;
     }
+
+    @Override public boolean equals(Object obj) {
+      return obj == this
+          || obj instanceof LingualEmp
+          && EMPNO == ((LingualEmp) obj).EMPNO;
+    }
   }
 
   public static class FoodmartJdbcSchema extends JdbcSchema {
@@ -6574,6 +6607,12 @@ public class JdbcTest {
     public Customer(int customer_id) {
       this.customer_id = customer_id;
     }
+
+    @Override public boolean equals(Object obj) {
+      return obj == this
+          || obj instanceof Customer
+          && customer_id == ((Customer) obj).customer_id;
+    }
   }
 
   public static class SalesFact {
@@ -6584,6 +6623,13 @@ public class JdbcTest {
       this.cust_id = cust_id;
       this.prod_id = prod_id;
     }
+
+    @Override public boolean equals(Object obj) {
+      return obj == this
+          || obj instanceof SalesFact
+          && cust_id == ((SalesFact) obj).cust_id
+          && prod_id == ((SalesFact) obj).prod_id;
+    }
   }
 
   //CHECKSTYLE: ON

http://git-wip-us.apache.org/repos/asf/calcite/blob/76616379/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java
----------------------------------------------------------------------
diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java
index e3c8916..146c175 100644
--- a/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java
+++ b/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java
@@ -343,6 +343,10 @@ public abstract class DefaultEnumerable<T> implements OrderedEnumerable<T> {
     return EnumerableDefaults.into(getThis(), sink);
   }
 
+  public <C extends Collection<? super T>> C removeAll(C sink) {
+    return EnumerableDefaults.remove(getThis(), sink);
+  }
+
   public <TInner, TKey, TResult> Enumerable<TResult> join(
       Enumerable<TInner> inner, Function1<T, TKey> outerKeySelector,
       Function1<TInner, TKey> innerKeySelector,

http://git-wip-us.apache.org/repos/asf/calcite/blob/76616379/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java
----------------------------------------------------------------------
diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java
index dc3ef03..e715cdb 100644
--- a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java
+++ b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java
@@ -2902,6 +2902,7 @@ public abstract class EnumerableDefaults {
             source, (Class) Object.class, null, null);
   }
 
+  /** Default implementation of {@link ExtendedEnumerable#into(Collection)}. */
   public static <T, C extends Collection<? super T>> C into(
       Enumerable<T> source, C sink) {
     try (Enumerator<T> enumerator = source.enumerator()) {
@@ -2913,6 +2914,15 @@ public abstract class EnumerableDefaults {
     return sink;
   }
 
+  /** Default implementation of {@link ExtendedEnumerable#removeAll(Collection)}. */
+  public static <T, C extends Collection<? super T>> C remove(
+      Enumerable<T> source, C sink) {
+    List<T> tempList = new ArrayList<>();
+    source.into(tempList);
+    sink.removeAll(tempList);
+    return sink;
+  }
+
   /** Enumerable that implements take-while. */
   static class TakeWhileEnumerator<TSource> implements Enumerator<TSource> {
     private final Enumerator<TSource> enumerator;

http://git-wip-us.apache.org/repos/asf/calcite/blob/76616379/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java
----------------------------------------------------------------------
diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java
index 316a289..626901e 100644
--- a/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java
+++ b/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java
@@ -480,11 +480,16 @@ public interface ExtendedEnumerable<TSource> {
       EqualityComparer<TSource> comparer);
 
   /**
-   * Copies the contents of the sequence into a collection.
+   * Copies the contents of this sequence into a collection.
    */
   <C extends Collection<? super TSource>> C into(C sink);
 
   /**
+   * Removes the contents of this sequence from a collection.
+   */
+  <C extends Collection<? super TSource>> C removeAll(C sink);
+
+  /**
    * Correlates the elements of two sequences based on
    * matching keys. The default equality comparer is used to compare
    * keys.