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.