You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by el...@apache.org on 2016/05/20 19:43:59 UTC

[1/3] calcite git commit: [CALCITE-1235] Fully push down limit+offset in Cassandra

Repository: calcite
Updated Branches:
  refs/heads/branch-avatica-1.8 d58bf9150 -> e934f1576


[CALCITE-1235] Fully push down limit+offset in Cassandra

Close apache/calcite#229


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

Branch: refs/heads/branch-avatica-1.8
Commit: 4c89dce303f8760e10bde3ab2b387780ae059e31
Parents: d58bf91
Author: Michael Mior <mi...@gmail.com>
Authored: Fri May 20 09:08:54 2016 +0300
Committer: Michael Mior <mi...@gmail.com>
Committed: Fri May 20 09:19:43 2016 +0300

----------------------------------------------------------------------
 .../adapter/cassandra/CassandraLimit.java       | 71 ++++++++++++++++++++
 .../adapter/cassandra/CassandraMethod.java      |  2 +-
 .../calcite/adapter/cassandra/CassandraRel.java |  7 +-
 .../adapter/cassandra/CassandraRules.java       | 39 +++++++++--
 .../adapter/cassandra/CassandraSort.java        | 20 ++----
 .../adapter/cassandra/CassandraTable.java       | 20 ++++--
 .../CassandraToEnumerableConverter.java         | 11 +--
 .../apache/calcite/test/CassandraAdapterIT.java | 32 +++++++--
 8 files changed, 161 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/4c89dce3/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraLimit.java
----------------------------------------------------------------------
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraLimit.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraLimit.java
new file mode 100644
index 0000000..cca7e19
--- /dev/null
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraLimit.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.calcite.adapter.cassandra;
+
+import org.apache.calcite.plan.RelOptCluster;
+import org.apache.calcite.plan.RelOptCost;
+import org.apache.calcite.plan.RelOptPlanner;
+import org.apache.calcite.plan.RelTraitSet;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.RelWriter;
+import org.apache.calcite.rel.SingleRel;
+import org.apache.calcite.rel.metadata.RelMetadataQuery;
+import org.apache.calcite.rex.RexLiteral;
+import org.apache.calcite.rex.RexNode;
+
+import java.util.List;
+
+/**
+ * Implementation of limits in Cassandra.
+ */
+public class CassandraLimit extends SingleRel implements CassandraRel {
+  public final RexNode offset;
+  public final RexNode fetch;
+
+  public CassandraLimit(RelOptCluster cluster, RelTraitSet traitSet,
+      RelNode input, RexNode offset, RexNode fetch) {
+    super(cluster, traitSet, input);
+    this.offset = offset;
+    this.fetch = fetch;
+    assert getConvention() == input.getConvention();
+  }
+
+  @Override public RelOptCost computeSelfCost(RelOptPlanner planner,
+      RelMetadataQuery mq) {
+    // We do this so we get the limit for free
+    return planner.getCostFactory().makeZeroCost();
+  }
+
+  @Override public CassandraLimit copy(RelTraitSet traitSet, List<RelNode> newInputs) {
+    return new CassandraLimit(getCluster(), traitSet, sole(newInputs), offset, fetch);
+  }
+
+  public void implement(Implementor implementor) {
+    implementor.visitChild(0, getInput());
+    if (offset != null) { implementor.offset = RexLiteral.intValue(offset); }
+    if (fetch != null) { implementor.fetch = RexLiteral.intValue(fetch); }
+  }
+
+  public RelWriter explainTerms(RelWriter pw) {
+    super.explainTerms(pw);
+    pw.itemIf("offset", offset, offset != null);
+    pw.itemIf("fetch", fetch, fetch != null);
+    return pw;
+  }
+}
+
+// End CassandraLimit.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/4c89dce3/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraMethod.java
----------------------------------------------------------------------
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraMethod.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraMethod.java
index c7d0973..b2035e5 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraMethod.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraMethod.java
@@ -28,7 +28,7 @@ import java.util.List;
  */
 public enum CassandraMethod {
   CASSANDRA_QUERYABLE_QUERY(CassandraTable.CassandraQueryable.class, "query",
-      List.class, List.class, List.class, List.class, String.class);
+      List.class, List.class, List.class, List.class, Integer.class, Integer.class);
 
   public final Method method;
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/4c89dce3/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRel.java
----------------------------------------------------------------------
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRel.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRel.java
index 0191fd0..b74919d 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRel.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRel.java
@@ -39,7 +39,8 @@ public interface CassandraRel extends RelNode {
   class Implementor {
     final Map<String, String> selectFields = new LinkedHashMap<String, String>();
     final List<String> whereClause = new ArrayList<String>();
-    String limitValue = null;
+    int offset = 0;
+    int fetch = -1;
     final List<String> order = new ArrayList<String>();
 
     RelOptTable table;
@@ -63,10 +64,6 @@ public interface CassandraRel extends RelNode {
       order.addAll(newOrder);
     }
 
-    public void setLimit(String limit) {
-      limitValue = limit;
-    }
-
     public void visitChild(int ordinal, RelNode input) {
       assert ordinal == 0;
       ((CassandraRel) input).implement(this);

http://git-wip-us.apache.org/repos/asf/calcite/blob/4c89dce3/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java
----------------------------------------------------------------------
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java
index 0e0bcb2..d67532d 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java
@@ -16,6 +16,7 @@
  */
 package org.apache.calcite.adapter.cassandra;
 
+import org.apache.calcite.adapter.enumerable.EnumerableLimit;
 import org.apache.calcite.adapter.java.JavaTypeFactory;
 import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelOptRule;
@@ -59,7 +60,8 @@ public class CassandraRules {
   public static final RelOptRule[] RULES = {
     CassandraFilterRule.INSTANCE,
     CassandraProjectRule.INSTANCE,
-    CassandraSortRule.INSTANCE
+    CassandraSortRule.INSTANCE,
+    CassandraLimitRule.INSTANCE
   };
 
   static List<String> cassandraFieldNames(final RelDataType rowType) {
@@ -277,8 +279,8 @@ public class CassandraRules {
     private static final Predicate<Sort> SORT_PREDICATE =
         new Predicate<Sort>() {
           public boolean apply(Sort input) {
-            // CQL has no support for offsets
-            return input.offset == null;
+            // Limits are handled by CassandraLimit
+            return input.offset == null && input.fetch == null;
           }
         };
     private static final Predicate<CassandraFilter> FILTER_PREDICATE =
@@ -304,7 +306,7 @@ public class CassandraRules {
               .replace(sort.getCollation());
       return new CassandraSort(sort.getCluster(), traitSet,
           convert(sort.getInput(), traitSet.replace(RelCollations.EMPTY)),
-          sort.getCollation(), filter.getImplicitCollation(), sort.fetch);
+          sort.getCollation());
     }
 
     public boolean matches(RelOptRuleCall call) {
@@ -383,6 +385,35 @@ public class CassandraRules {
       }
     }
   }
+
+  /**
+   * Rule to convert a {@link org.apache.calcite.adapter.enumerable.EnumerableLimit} to a
+   * {@link CassandraLimit}.
+   */
+  private static class CassandraLimitRule extends RelOptRule {
+    private static final CassandraLimitRule INSTANCE = new CassandraLimitRule();
+
+    private CassandraLimitRule() {
+      super(operand(EnumerableLimit.class, operand(CassandraToEnumerableConverter.class, any())),
+        "CassandraLimitRule");
+    }
+
+    public RelNode convert(EnumerableLimit limit) {
+      final RelTraitSet traitSet =
+          limit.getTraitSet().replace(CassandraRel.CONVENTION);
+      return new CassandraLimit(limit.getCluster(), traitSet,
+        convert(limit.getInput(), CassandraRel.CONVENTION), limit.offset, limit.fetch);
+    }
+
+    /** @see org.apache.calcite.rel.convert.ConverterRule */
+    public void onMatch(RelOptRuleCall call) {
+      final EnumerableLimit limit = call.rel(0);
+      final RelNode converted = convert(limit);
+      if (converted != null) {
+        call.transformTo(converted);
+      }
+    }
+  }
 }
 
 // End CassandraRules.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/4c89dce3/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraSort.java
----------------------------------------------------------------------
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraSort.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraSort.java
index 61d7b31..8487815 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraSort.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraSort.java
@@ -26,7 +26,6 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.Sort;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rel.type.RelDataTypeField;
-import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.rex.RexNode;
 
 import java.util.ArrayList;
@@ -37,13 +36,9 @@ import java.util.List;
  * relational expression in Cassandra.
  */
 public class CassandraSort extends Sort implements CassandraRel {
-  private final RelCollation implicitCollation;
-
   public CassandraSort(RelOptCluster cluster, RelTraitSet traitSet,
-      RelNode child, RelCollation collation, RelCollation implicitCollation, RexNode fetch) {
-    super(cluster, traitSet, child, collation, null, fetch);
-
-    this.implicitCollation = implicitCollation;
+      RelNode child, RelCollation collation) {
+    super(cluster, traitSet, child, collation, null, null);
 
     assert getConvention() == CassandraRel.CONVENTION;
     assert getConvention() == child.getConvention();
@@ -54,18 +49,14 @@ public class CassandraSort extends Sort implements CassandraRel {
     RelOptCost cost = super.computeSelfCost(planner, mq);
     if (!collation.getFieldCollations().isEmpty()) {
       return cost.multiplyBy(0.05);
-    } else if (fetch == null) {
-      return cost;
     } else {
-      // We do this so we get the limit for free
-      return planner.getCostFactory().makeZeroCost();
+      return cost;
     }
   }
 
   @Override public Sort copy(RelTraitSet traitSet, RelNode input,
       RelCollation newCollation, RexNode offset, RexNode fetch) {
-    return new CassandraSort(getCluster(), traitSet, input, collation, implicitCollation,
-        fetch);
+    return new CassandraSort(getCluster(), traitSet, input, collation);
   }
 
   public void implement(Implementor implementor) {
@@ -88,9 +79,6 @@ public class CassandraSort extends Sort implements CassandraRel {
 
       implementor.addOrder(fieldOrder);
     }
-    if (fetch != null) {
-      implementor.setLimit(((RexLiteral) fetch).getValue().toString());
-    }
   }
 }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/4c89dce3/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTable.java
----------------------------------------------------------------------
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTable.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTable.java
index 1ff5502..ec2a636 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTable.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTable.java
@@ -99,7 +99,7 @@ public class CassandraTable extends AbstractQueryableTable
   public Enumerable<Object> query(final Session session) {
     return query(session, Collections.<Map.Entry<String, Class>>emptyList(),
         Collections.<Map.Entry<String, String>>emptyList(),
-        Collections.<String>emptyList(), Collections.<String>emptyList(), null);
+        Collections.<String>emptyList(), Collections.<String>emptyList(), 0, -1);
   }
 
   /** Executes a CQL query on the underlying table.
@@ -111,7 +111,7 @@ public class CassandraTable extends AbstractQueryableTable
    */
   public Enumerable<Object> query(final Session session, List<Map.Entry<String, Class>> fields,
         final List<Map.Entry<String, String>> selectFields, List<String> predicates,
-        List<String> order, String limit) {
+        List<String> order, final Integer offset, final Integer fetch) {
     // Build the type of the resulting row based on the provided fields
     final RelDataTypeFactory typeFactory =
         new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
@@ -181,7 +181,10 @@ public class CassandraTable extends AbstractQueryableTable
     if (!order.isEmpty()) {
       queryBuilder.append(Util.toString(order, " ORDER BY ", ", ", ""));
     }
-    if (limit != null) {
+
+    int limit = offset;
+    if (fetch >= 0) { limit += fetch; }
+    if (limit > 0) {
       queryBuilder.append(" LIMIT " + limit);
     }
     queryBuilder.append(" ALLOW FILTERING");
@@ -190,7 +193,12 @@ public class CassandraTable extends AbstractQueryableTable
     return new AbstractEnumerable<Object>() {
       public Enumerator<Object> enumerator() {
         final ResultSet results = session.execute(query);
-        return new CassandraEnumerator(results, resultRowType);
+        // Skip results until we get to the right offset
+        int skip = 0;
+        Enumerator<Object> enumerator = new CassandraEnumerator(results, resultRowType);
+        while (skip < offset && enumerator.moveNext()) { skip++; }
+
+        return enumerator;
       }
     };
   }
@@ -238,9 +246,9 @@ public class CassandraTable extends AbstractQueryableTable
     @SuppressWarnings("UnusedDeclaration")
     public Enumerable<Object> query(List<Map.Entry<String, Class>> fields,
         List<Map.Entry<String, String>> selectFields, List<String> predicates,
-        List<String> order, String limit) {
+        List<String> order, Integer offset, Integer fetch) {
       return getTable().query(getSession(), fields, selectFields, predicates,
-          order, limit);
+          order, offset, fetch);
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/calcite/blob/4c89dce3/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraToEnumerableConverter.java
----------------------------------------------------------------------
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraToEnumerableConverter.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraToEnumerableConverter.java
index 31bfdcc..66db1ff 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraToEnumerableConverter.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraToEnumerableConverter.java
@@ -112,14 +112,17 @@ public class CassandraToEnumerableConverter
     final Expression order =
         list.append("order",
             constantArrayList(cassandraImplementor.order, String.class));
-    final Expression limit =
-        list.append("limit",
-            Expressions.constant(cassandraImplementor.limitValue));
+    final Expression offset =
+        list.append("offset",
+            Expressions.constant(cassandraImplementor.offset));
+    final Expression fetch =
+        list.append("fetch",
+            Expressions.constant(cassandraImplementor.fetch));
     Expression enumerable =
         list.append("enumerable",
             Expressions.call(table,
                 CassandraMethod.CASSANDRA_QUERYABLE_QUERY.method, fields,
-                selectFields, predicates, order, limit));
+                selectFields, predicates, order, offset, fetch));
     if (CalcitePrepareImpl.DEBUG) {
       System.out.println("Cassandra: " + predicates);
     }

http://git-wip-us.apache.org/repos/asf/calcite/blob/4c89dce3/cassandra/src/test/java/org/apache/calcite/test/CassandraAdapterIT.java
----------------------------------------------------------------------
diff --git a/cassandra/src/test/java/org/apache/calcite/test/CassandraAdapterIT.java b/cassandra/src/test/java/org/apache/calcite/test/CassandraAdapterIT.java
index a2c132e..f1e87ff 100644
--- a/cassandra/src/test/java/org/apache/calcite/test/CassandraAdapterIT.java
+++ b/cassandra/src/test/java/org/apache/calcite/test/CassandraAdapterIT.java
@@ -103,11 +103,12 @@ public class CassandraAdapterIT {
     CalciteAssert.that()
         .enable(enabled())
         .with(TWISSANDRA)
-        .query("select \"tweet_id\" from \"userline\" where \"username\" = '!PUBLIC!' limit 1")
-        .returns("tweet_id=f3c329de-d05b-11e5-b58b-90e2ba530b12\n")
+        .query("select \"tweet_id\" from \"userline\" where \"username\" = '!PUBLIC!' limit 2")
+        .returns("tweet_id=f3c329de-d05b-11e5-b58b-90e2ba530b12\n"
+               + "tweet_id=f3dbb03a-d05b-11e5-b58b-90e2ba530b12\n")
         .explainContains("PLAN=CassandraToEnumerableConverter\n"
-                + "  CassandraProject(tweet_id=[$2])\n"
-                + "    CassandraSort(fetch=[1])\n"
+                + "  CassandraLimit(fetch=[2])\n"
+                + "    CassandraProject(tweet_id=[$2])\n"
                 + "      CassandraFilter(condition=[=(CAST($0):VARCHAR(8) CHARACTER SET \"ISO-8859-1\" COLLATE \"ISO-8859-1$en_US$primary\", '!PUBLIC!')])\n");
   }
 
@@ -133,7 +134,28 @@ public class CassandraAdapterIT {
         .enable(enabled())
         .with(TWISSANDRA)
         .query("select \"tweet_id\" from \"userline\" where \"username\" = '!PUBLIC!' limit 8")
-        .explainContains("CassandraSort(fetch=[8])\n");
+        .explainContains("CassandraLimit(fetch=[8])\n");
+  }
+
+  @Test public void testSortLimit() {
+    CalciteAssert.that()
+        .enable(enabled())
+        .with(TWISSANDRA)
+        .query("select * from \"userline\" where \"username\"='!PUBLIC!' "
+             + "order by \"time\" desc limit 10")
+        .explainContains("  CassandraLimit(fetch=[10])\n"
+                       + "    CassandraSort(sort0=[$1], dir0=[DESC])");
+  }
+
+  @Test public void testSortOffset() {
+    CalciteAssert.that()
+        .enable(enabled())
+        .with(TWISSANDRA)
+        .query("select \"tweet_id\" from \"userline\" where "
+             + "\"username\"='!PUBLIC!' limit 2 offset 1")
+        .explainContains("CassandraLimit(offset=[1], fetch=[2])")
+        .returns("tweet_id=f3dbb03a-d05b-11e5-b58b-90e2ba530b12\n"
+               + "tweet_id=f3e4182e-d05b-11e5-b58b-90e2ba530b12\n");
   }
 
   @Test public void testMaterializedView() {


[3/3] calcite git commit: [maven-release-plugin] prepare release calcite-avatica-1.8.0-rc0

Posted by el...@apache.org.
[maven-release-plugin] prepare release calcite-avatica-1.8.0-rc0


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

Branch: refs/heads/branch-avatica-1.8
Commit: e934f15768822db584e774c8098e2ca8029f16f7
Parents: 10e8c79
Author: Josh Elser <el...@apache.org>
Authored: Fri May 20 15:43:56 2016 -0400
Committer: Josh Elser <el...@apache.org>
Committed: Fri May 20 15:43:56 2016 -0400

----------------------------------------------------------------------
 avatica/core/pom.xml                       | 2 +-
 avatica/metrics-dropwizardmetrics3/pom.xml | 2 +-
 avatica/metrics/pom.xml                    | 2 +-
 avatica/noop-driver/pom.xml                | 2 +-
 avatica/pom.xml                            | 4 ++--
 avatica/server/pom.xml                     | 2 +-
 avatica/standalone-server/pom.xml          | 2 +-
 avatica/tck/pom.xml                        | 2 +-
 8 files changed, 9 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/e934f157/avatica/core/pom.xml
----------------------------------------------------------------------
diff --git a/avatica/core/pom.xml b/avatica/core/pom.xml
index 349fbaf..bcf9356 100644
--- a/avatica/core/pom.xml
+++ b/avatica/core/pom.xml
@@ -20,7 +20,7 @@ limitations under the License.
   <parent>
     <groupId>org.apache.calcite.avatica</groupId>
     <artifactId>avatica-parent</artifactId>
-    <version>1.8.0-SNAPSHOT</version>
+    <version>1.8.0</version>
   </parent>
 
   <artifactId>avatica</artifactId>

http://git-wip-us.apache.org/repos/asf/calcite/blob/e934f157/avatica/metrics-dropwizardmetrics3/pom.xml
----------------------------------------------------------------------
diff --git a/avatica/metrics-dropwizardmetrics3/pom.xml b/avatica/metrics-dropwizardmetrics3/pom.xml
index 52e59e7..e8e761d 100644
--- a/avatica/metrics-dropwizardmetrics3/pom.xml
+++ b/avatica/metrics-dropwizardmetrics3/pom.xml
@@ -20,7 +20,7 @@ limitations under the License.
   <parent>
     <groupId>org.apache.calcite.avatica</groupId>
     <artifactId>avatica-parent</artifactId>
-    <version>1.8.0-SNAPSHOT</version>
+    <version>1.8.0</version>
   </parent>
 
   <artifactId>avatica-metrics-dropwizardmetrics3</artifactId>

http://git-wip-us.apache.org/repos/asf/calcite/blob/e934f157/avatica/metrics/pom.xml
----------------------------------------------------------------------
diff --git a/avatica/metrics/pom.xml b/avatica/metrics/pom.xml
index c371ed2..f9b3841 100644
--- a/avatica/metrics/pom.xml
+++ b/avatica/metrics/pom.xml
@@ -20,7 +20,7 @@ limitations under the License.
   <parent>
     <groupId>org.apache.calcite.avatica</groupId>
     <artifactId>avatica-parent</artifactId>
-    <version>1.8.0-SNAPSHOT</version>
+    <version>1.8.0</version>
   </parent>
 
   <artifactId>avatica-metrics</artifactId>

http://git-wip-us.apache.org/repos/asf/calcite/blob/e934f157/avatica/noop-driver/pom.xml
----------------------------------------------------------------------
diff --git a/avatica/noop-driver/pom.xml b/avatica/noop-driver/pom.xml
index 2a6bc0b..b1d88a8 100644
--- a/avatica/noop-driver/pom.xml
+++ b/avatica/noop-driver/pom.xml
@@ -20,7 +20,7 @@ limitations under the License.
   <parent>
     <groupId>org.apache.calcite.avatica</groupId>
     <artifactId>avatica-parent</artifactId>
-    <version>1.8.0-SNAPSHOT</version>
+    <version>1.8.0</version>
   </parent>
 
   <artifactId>avatica-noop-driver</artifactId>

http://git-wip-us.apache.org/repos/asf/calcite/blob/e934f157/avatica/pom.xml
----------------------------------------------------------------------
diff --git a/avatica/pom.xml b/avatica/pom.xml
index 6613681..1c8e55e 100644
--- a/avatica/pom.xml
+++ b/avatica/pom.xml
@@ -29,7 +29,7 @@ limitations under the License.
   <groupId>org.apache.calcite.avatica</groupId>
   <artifactId>avatica-parent</artifactId>
   <packaging>pom</packaging>
-  <version>1.8.0-SNAPSHOT</version>
+  <version>1.8.0</version>
 
   <!-- More project information. -->
   <name>Apache Calcite Avatica Project</name>
@@ -104,7 +104,7 @@ limitations under the License.
     <connection>scm:git:https://git-wip-us.apache.org/repos/asf/calcite.git</connection>
     <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/calcite.git</developerConnection>
     <url>https://github.com/apache/calcite</url>
-    <tag>HEAD</tag>
+    <tag>calcite-avatica-1.8.0-rc0</tag>
   </scm>
 
   <modules>

http://git-wip-us.apache.org/repos/asf/calcite/blob/e934f157/avatica/server/pom.xml
----------------------------------------------------------------------
diff --git a/avatica/server/pom.xml b/avatica/server/pom.xml
index d24aaf2..243ffa2 100644
--- a/avatica/server/pom.xml
+++ b/avatica/server/pom.xml
@@ -20,7 +20,7 @@ limitations under the License.
   <parent>
     <groupId>org.apache.calcite.avatica</groupId>
     <artifactId>avatica-parent</artifactId>
-    <version>1.8.0-SNAPSHOT</version>
+    <version>1.8.0</version>
   </parent>
 
   <artifactId>avatica-server</artifactId>

http://git-wip-us.apache.org/repos/asf/calcite/blob/e934f157/avatica/standalone-server/pom.xml
----------------------------------------------------------------------
diff --git a/avatica/standalone-server/pom.xml b/avatica/standalone-server/pom.xml
index 3925a23..b08a6c4 100644
--- a/avatica/standalone-server/pom.xml
+++ b/avatica/standalone-server/pom.xml
@@ -20,7 +20,7 @@ limitations under the License.
   <parent>
     <groupId>org.apache.calcite.avatica</groupId>
     <artifactId>avatica-parent</artifactId>
-    <version>1.8.0-SNAPSHOT</version>
+    <version>1.8.0</version>
   </parent>
   <artifactId>avatica-standalone-server</artifactId>
   <name>Avatica Standalone Server</name>

http://git-wip-us.apache.org/repos/asf/calcite/blob/e934f157/avatica/tck/pom.xml
----------------------------------------------------------------------
diff --git a/avatica/tck/pom.xml b/avatica/tck/pom.xml
index 0ddf1de..11601df 100644
--- a/avatica/tck/pom.xml
+++ b/avatica/tck/pom.xml
@@ -20,7 +20,7 @@ limitations under the License.
   <parent>
     <groupId>org.apache.calcite.avatica</groupId>
     <artifactId>avatica-parent</artifactId>
-    <version>1.8.0-SNAPSHOT</version>
+    <version>1.8.0</version>
   </parent>
 
   <artifactId>avatica-tck</artifactId>


[2/3] calcite git commit: [CALCITE-1251] Release notes for Apache Calcite Avatica 1.8.0

Posted by el...@apache.org.
[CALCITE-1251] Release notes for Apache Calcite Avatica 1.8.0


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

Branch: refs/heads/branch-avatica-1.8
Commit: 10e8c79c63ade367d8354596d23d78945a3100ed
Parents: 4c89dce
Author: Josh Elser <el...@apache.org>
Authored: Fri May 20 15:40:01 2016 -0400
Committer: Josh Elser <el...@apache.org>
Committed: Fri May 20 15:40:01 2016 -0400

----------------------------------------------------------------------
 avatica/site/_docs/history.md | 63 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 63 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/10e8c79c/avatica/site/_docs/history.md
----------------------------------------------------------------------
diff --git a/avatica/site/_docs/history.md b/avatica/site/_docs/history.md
index ae7bd64..1661929 100644
--- a/avatica/site/_docs/history.md
+++ b/avatica/site/_docs/history.md
@@ -28,6 +28,69 @@ For a full list of releases, see
 Downloads are available on the
 [downloads page]({{ site.baseurl }}/downloads/).
 
+## <a href="https://github.com/apache/calcite/releases/tag/calcite-avatica-1.8.0">1.8.0</a> / 2016-05-20
+{: #v1-8-0}
+
+Apache Calcite Avatica 1.8.0 continues the focus on compatibility with previous
+versions while also adding support for authentication between Avatica client and server.
+Performance, notably on the write-path, is also major area of improvement
+in this release, increasing as much as two to three times over previous versions
+with the addition of new API support. The documentation for both users and developers
+continues to receive improvements.
+
+Authentication is a major theme of this release, providing multiple layers of
+additional authentication mechanisms over previous versions. In these earlier
+versions, the only authentication provided by Avatica was achieved via the JDBC URL's
+standard user and password options. These have always been passed directly into
+the backend database's authentication system, but not all databases provide username
+and password based authentication systems. [CALCITE-1173](https://issues.apache.org/jira/browse/CALCITE-1173)
+adds Avatica-level authentication over [HTTP Basic](https://en.wikipedia.org/wiki/Basic_access_authentication)
+and [HTTP Digest](https://en.wikipedia.org/wiki/Digest_access_authentication)
+authentication mechanisms. These are provided specifically for the case when
+Avatica is used with a database that _does not already_ provide its own authentication
+implementation.
+
+Some systems rely on [Kerberos](http://web.mit.edu/kerberos/) for strong, centrally-
+managed authentication. [CALCITE-1159](https://issues.apache.org/jira/browse/CALCITE-1159)
+introduces Kerberos-based authentication for clients via [SPNEGO](https://en.wikipedia.org/wiki/SPNEGO).
+The Avatica server can be configured to only allow clients with a valid Kerberos ticket,
+optionally, also passing this information to the backend database to implement
+basic "impersonation" (where the Avatica server issues requests on behalf of the end user).
+
+Building on top of the work done in Avatica-1.7.0 in [CALCITE-1091](https://issues.apache.org/jira/browse/CALCITE-1091),
+this release also contains [CALCITE-1128](https://issues.apache.org/jira/browse/CALCITE-1128) which
+implements the batch-oriented JDBC APIs on `Statement`. Through careful inspection, it
+was observed that the overall performance of Avatica clients in 100% write workloads was
+dominated by the cost of the HTTP calls. By leveraging the `Statement#addBatch()`
+and `Statement#executeBatch()` API calls, clients can efficiently batch multiple updates
+in a single HTTP call. In testing this over the previous single HTTP call per update with
+[Apache Phoenix](https://phoenix.apache.org), it was observed that performance increased by
+two to three times, bringing Avatica's performance on par with the Phoenix "native" driver.
+
+Returning back to compatibility, a new component appears in this release which is designed to
+test versions of Avatica against each other. [CALCITE-1190](https://issues.apache.org/jira/browse/CALCITE-1190)
+introduces a "Technology Compatibility Kit" (TCK) which automates the testing of one version
+of Avatica against other versions. To further ease this testing, a runnable JAR to launch
+an HSQLDB instance and an Avatica server also makes it debut with these changes. This TCK
+makes it much easier to run tests of newer clients against older servers and vice versa.
+Validating the backwards compatibility that is being built is extremely important to be
+confident in the guarantees being provided to users.
+
+Finally, a number of bugs are also fixed in the Protocol Buffer wire API. Some of these
+include [CALCITE-1113](https://issues.apache.org/jira/browse/CALCITE-1113) and
+[CALCITE-1103](https://issues.apache.org/jira/browse/CALCITE-1103) which fix how certain
+numbers are serialized, [CALITE-1243](https://issues.apache.org/jira/browse/CALCITE-1243)
+which corrects some fields in Protocol Buffer messages which were incorrectly marked
+as unsigned integers instead of signed integers, and [CALCITE-1209](https://issues.apache.org/jira/browse/CALCITE-1209)
+which removes incorrect parsing of binary fields as Base64-encoded strings. All of
+these issues are fixed in a backwards-compatible manner and should have no additional negative
+impact on older clients (older clients will not break, but they may continue to return
+incorrect data for certain numbers).
+
+For users of the Avatica driver, a new [client reference page]({{ base_url }}/avatica/docs/client_reference.html)
+is added which details the options that are available in the Avatica JDBC Driver's URL.
+The wire API documentation for Protocol Buffers continues to receive updates as the API continues to evolve.
+
 ## <a href="https://github.com/apache/calcite/releases/tag/calcite-avatica-1.7.1">1.7.1</a> / 2016-03-18
 {: #v1-7-1}