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 2017/04/01 20:36:01 UTC

[09/51] [partial] calcite-avatica git commit: [CALCITE-1717] Remove Calcite code and lift avatica

http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpreterRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpreterRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpreterRule.java
deleted file mode 100644
index 99996fa..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpreterRule.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.enumerable;
-
-import org.apache.calcite.interpreter.BindableConvention;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.convert.ConverterRule;
-
-/**
- * Planner rule that converts {@link org.apache.calcite.interpreter.BindableRel}
- * to {@link org.apache.calcite.adapter.enumerable.EnumerableRel} by creating
- * an {@link org.apache.calcite.adapter.enumerable.EnumerableInterpreter}.
- */
-public class EnumerableInterpreterRule extends ConverterRule {
-  public static final EnumerableInterpreterRule INSTANCE =
-      new EnumerableInterpreterRule();
-
-  private EnumerableInterpreterRule() {
-    super(RelNode.class, BindableConvention.INSTANCE,
-        EnumerableConvention.INSTANCE, "EnumerableInterpreterRule");
-  }
-
-  //~ Methods ----------------------------------------------------------------
-
-  @Override public RelNode convert(RelNode rel) {
-    return EnumerableInterpreter.create(rel, 0.5d);
-  }
-}
-
-// End EnumerableInterpreterRule.java

http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableIntersect.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableIntersect.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableIntersect.java
deleted file mode 100644
index 8462f65..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableIntersect.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * 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.enumerable;
-
-import org.apache.calcite.linq4j.Ord;
-import org.apache.calcite.linq4j.tree.BlockBuilder;
-import org.apache.calcite.linq4j.tree.Expression;
-import org.apache.calcite.linq4j.tree.Expressions;
-import org.apache.calcite.plan.RelOptCluster;
-import org.apache.calcite.plan.RelTraitSet;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.core.Intersect;
-import org.apache.calcite.util.BuiltInMethod;
-
-import java.util.List;
-
-/** Implementation of {@link org.apache.calcite.rel.core.Intersect} in
- * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}. */
-public class EnumerableIntersect extends Intersect implements EnumerableRel {
-  public EnumerableIntersect(RelOptCluster cluster, RelTraitSet traitSet,
-      List<RelNode> inputs, boolean all) {
-    super(cluster, traitSet, inputs, all);
-    assert !all;
-  }
-
-  public EnumerableIntersect copy(RelTraitSet traitSet, List<RelNode> inputs,
-      boolean all) {
-    return new EnumerableIntersect(getCluster(), traitSet, inputs, all);
-  }
-
-  public Result implement(EnumerableRelImplementor implementor, Prefer pref) {
-    final BlockBuilder builder = new BlockBuilder();
-    Expression intersectExp = null;
-    for (Ord<RelNode> ord : Ord.zip(inputs)) {
-      EnumerableRel input = (EnumerableRel) ord.e;
-      final Result result = implementor.visitChild(this, ord.i, input, pref);
-      Expression childExp =
-          builder.append(
-              "child" + ord.i,
-              result.block);
-
-      if (intersectExp == null) {
-        intersectExp = childExp;
-      } else {
-        intersectExp =
-            Expressions.call(intersectExp,
-                BuiltInMethod.INTERSECT.method,
-                Expressions.list(childExp)
-                    .appendIfNotNull(result.physType.comparer()));
-      }
-
-      // Once the first input has chosen its format, ask for the same for
-      // other inputs.
-      pref = pref.of(result.format);
-    }
-
-    builder.add(intersectExp);
-    final PhysType physType =
-        PhysTypeImpl.of(
-            implementor.getTypeFactory(),
-            getRowType(),
-            pref.prefer(JavaRowFormat.CUSTOM));
-    return implementor.result(physType, builder.toBlock());
-  }
-}
-
-// End EnumerableIntersect.java

http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableIntersectRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableIntersectRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableIntersectRule.java
deleted file mode 100644
index f906d47..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableIntersectRule.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.enumerable;
-
-import org.apache.calcite.plan.Convention;
-import org.apache.calcite.plan.RelTraitSet;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.convert.ConverterRule;
-import org.apache.calcite.rel.logical.LogicalIntersect;
-
-/**
- * Rule to convert a
- * {@link org.apache.calcite.rel.logical.LogicalIntersect} to an
- * {@link EnumerableIntersect}.
- */
-class EnumerableIntersectRule extends ConverterRule {
-  EnumerableIntersectRule() {
-    super(LogicalIntersect.class, Convention.NONE,
-        EnumerableConvention.INSTANCE, "EnumerableIntersectRule");
-  }
-
-  public RelNode convert(RelNode rel) {
-    final LogicalIntersect intersect = (LogicalIntersect) rel;
-    if (intersect.all) {
-      return null; // INTERSECT ALL not implemented
-    }
-    final EnumerableConvention out = EnumerableConvention.INSTANCE;
-    final RelTraitSet traitSet = intersect.getTraitSet().replace(out);
-    return new EnumerableIntersect(rel.getCluster(), traitSet,
-        convertList(intersect.getInputs(), out), false);
-  }
-}
-
-// End EnumerableIntersectRule.java

http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableJoin.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableJoin.java
deleted file mode 100644
index cfd00a4..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableJoin.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * 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.enumerable;
-
-import org.apache.calcite.linq4j.tree.BlockBuilder;
-import org.apache.calcite.linq4j.tree.Expression;
-import org.apache.calcite.linq4j.tree.Expressions;
-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.InvalidRelException;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.RelNodes;
-import org.apache.calcite.rel.core.CorrelationId;
-import org.apache.calcite.rel.core.EquiJoin;
-import org.apache.calcite.rel.core.JoinInfo;
-import org.apache.calcite.rel.core.JoinRelType;
-import org.apache.calcite.rel.metadata.RelMetadataQuery;
-import org.apache.calcite.rex.RexNode;
-import org.apache.calcite.util.BuiltInMethod;
-import org.apache.calcite.util.ImmutableIntList;
-import org.apache.calcite.util.Util;
-
-import com.google.common.collect.ImmutableList;
-
-import java.util.Set;
-
-/** Implementation of {@link org.apache.calcite.rel.core.Join} in
- * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}. */
-public class EnumerableJoin extends EquiJoin implements EnumerableRel {
-  /** Creates an EnumerableJoin.
-   *
-   * <p>Use {@link #create} unless you know what you're doing. */
-  protected EnumerableJoin(
-      RelOptCluster cluster,
-      RelTraitSet traits,
-      RelNode left,
-      RelNode right,
-      RexNode condition,
-      ImmutableIntList leftKeys,
-      ImmutableIntList rightKeys,
-      Set<CorrelationId> variablesSet,
-      JoinRelType joinType)
-      throws InvalidRelException {
-    super(
-        cluster,
-        traits,
-        left,
-        right,
-        condition,
-        leftKeys,
-        rightKeys,
-        variablesSet,
-        joinType);
-  }
-
-  @Deprecated // to be removed before 2.0
-  protected EnumerableJoin(RelOptCluster cluster, RelTraitSet traits,
-      RelNode left, RelNode right, RexNode condition, ImmutableIntList leftKeys,
-      ImmutableIntList rightKeys, JoinRelType joinType,
-      Set<String> variablesStopped) throws InvalidRelException {
-    this(cluster, traits, left, right, condition, leftKeys, rightKeys,
-        CorrelationId.setOf(variablesStopped), joinType);
-  }
-
-  /** Creates an EnumerableJoin. */
-  public static EnumerableJoin create(
-      RelNode left,
-      RelNode right,
-      RexNode condition,
-      ImmutableIntList leftKeys,
-      ImmutableIntList rightKeys,
-      Set<CorrelationId> variablesSet,
-      JoinRelType joinType)
-      throws InvalidRelException {
-    final RelOptCluster cluster = left.getCluster();
-    final RelTraitSet traitSet =
-        cluster.traitSetOf(EnumerableConvention.INSTANCE);
-    return new EnumerableJoin(cluster, traitSet, left, right, condition,
-        leftKeys, rightKeys, variablesSet, joinType);
-  }
-
-  @Deprecated // to be removed before 2.0
-  public static EnumerableJoin create(
-      RelNode left,
-      RelNode right,
-      RexNode condition,
-      ImmutableIntList leftKeys,
-      ImmutableIntList rightKeys,
-      JoinRelType joinType,
-      Set<String> variablesStopped)
-      throws InvalidRelException {
-    return create(left, right, condition, leftKeys, rightKeys,
-        CorrelationId.setOf(variablesStopped), joinType);
-  }
-
-  @Override public EnumerableJoin copy(RelTraitSet traitSet, RexNode condition,
-      RelNode left, RelNode right, JoinRelType joinType,
-      boolean semiJoinDone) {
-    final JoinInfo joinInfo = JoinInfo.of(left, right, condition);
-    assert joinInfo.isEqui();
-    try {
-      return new EnumerableJoin(getCluster(), traitSet, left, right,
-          condition, joinInfo.leftKeys, joinInfo.rightKeys, variablesSet,
-          joinType);
-    } catch (InvalidRelException e) {
-      // Semantic error not possible. Must be a bug. Convert to
-      // internal error.
-      throw new AssertionError(e);
-    }
-  }
-
-  @Override public RelOptCost computeSelfCost(RelOptPlanner planner,
-      RelMetadataQuery mq) {
-    double rowCount = mq.getRowCount(this);
-
-    // Joins can be flipped, and for many algorithms, both versions are viable
-    // and have the same cost. To make the results stable between versions of
-    // the planner, make one of the versions slightly more expensive.
-    switch (joinType) {
-    case RIGHT:
-      rowCount = addEpsilon(rowCount);
-      break;
-    default:
-      if (RelNodes.COMPARATOR.compare(left, right) > 0) {
-        rowCount = addEpsilon(rowCount);
-      }
-    }
-
-    // Cheaper if the smaller number of rows is coming from the LHS.
-    // Model this by adding L log L to the cost.
-    final double rightRowCount = right.estimateRowCount(mq);
-    final double leftRowCount = left.estimateRowCount(mq);
-    if (Double.isInfinite(leftRowCount)) {
-      rowCount = leftRowCount;
-    } else {
-      rowCount += Util.nLogN(leftRowCount);
-    }
-    if (Double.isInfinite(rightRowCount)) {
-      rowCount = rightRowCount;
-    } else {
-      rowCount += rightRowCount;
-    }
-    return planner.getCostFactory().makeCost(rowCount, 0, 0);
-  }
-
-  private double addEpsilon(double d) {
-    assert d >= 0d;
-    final double d0 = d;
-    if (d < 10) {
-      // For small d, adding 1 would change the value significantly.
-      d *= 1.001d;
-      if (d != d0) {
-        return d;
-      }
-    }
-    // For medium d, add 1. Keeps integral values integral.
-    ++d;
-    if (d != d0) {
-      return d;
-    }
-    // For large d, adding 1 might not change the value. Add .1%.
-    // If d is NaN, this still will probably not change the value. That's OK.
-    d *= 1.001d;
-    return d;
-  }
-
-  public Result implement(EnumerableRelImplementor implementor, Prefer pref) {
-    BlockBuilder builder = new BlockBuilder();
-    final Result leftResult =
-        implementor.visitChild(this, 0, (EnumerableRel) left, pref);
-    Expression leftExpression =
-        builder.append(
-            "left", leftResult.block);
-    final Result rightResult =
-        implementor.visitChild(this, 1, (EnumerableRel) right, pref);
-    Expression rightExpression =
-        builder.append(
-            "right", rightResult.block);
-    final PhysType physType =
-        PhysTypeImpl.of(
-            implementor.getTypeFactory(), getRowType(), pref.preferArray());
-    final PhysType keyPhysType =
-        leftResult.physType.project(
-            leftKeys, JavaRowFormat.LIST);
-    return implementor.result(
-        physType,
-        builder.append(
-            Expressions.call(
-                leftExpression,
-                BuiltInMethod.JOIN.method,
-                Expressions.list(
-                    rightExpression,
-                    leftResult.physType.generateAccessor(leftKeys),
-                    rightResult.physType.generateAccessor(rightKeys),
-                    EnumUtils.joinSelector(joinType,
-                        physType,
-                        ImmutableList.of(
-                            leftResult.physType, rightResult.physType)))
-                    .append(
-                        Util.first(keyPhysType.comparer(),
-                            Expressions.constant(null)))
-                    .append(
-                        Expressions.constant(joinType.generatesNullsOnLeft()))
-                    .append(
-                        Expressions.constant(
-                            joinType.generatesNullsOnRight())))).toBlock());
-  }
-
-}
-
-// End EnumerableJoin.java

http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableJoinRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableJoinRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableJoinRule.java
deleted file mode 100644
index 375568b..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableJoinRule.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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.enumerable;
-
-import org.apache.calcite.plan.Convention;
-import org.apache.calcite.plan.RelOptCluster;
-import org.apache.calcite.plan.RelTraitSet;
-import org.apache.calcite.rel.InvalidRelException;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.convert.ConverterRule;
-import org.apache.calcite.rel.core.JoinInfo;
-import org.apache.calcite.rel.core.JoinRelType;
-import org.apache.calcite.rel.logical.LogicalJoin;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/** Planner rule that converts a
- * {@link org.apache.calcite.rel.logical.LogicalJoin} relational expression
- * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}. */
-class EnumerableJoinRule extends ConverterRule {
-  EnumerableJoinRule() {
-    super(
-        LogicalJoin.class,
-        Convention.NONE,
-        EnumerableConvention.INSTANCE,
-        "EnumerableJoinRule");
-  }
-
-  @Override public RelNode convert(RelNode rel) {
-    LogicalJoin join = (LogicalJoin) rel;
-    List<RelNode> newInputs = new ArrayList<>();
-    for (RelNode input : join.getInputs()) {
-      if (!(input.getConvention() instanceof EnumerableConvention)) {
-        input =
-            convert(
-                input,
-                input.getTraitSet()
-                    .replace(EnumerableConvention.INSTANCE));
-      }
-      newInputs.add(input);
-    }
-    final RelOptCluster cluster = join.getCluster();
-    final RelTraitSet traitSet =
-        join.getTraitSet().replace(EnumerableConvention.INSTANCE);
-    final RelNode left = newInputs.get(0);
-    final RelNode right = newInputs.get(1);
-    final JoinInfo info = JoinInfo.of(left, right, join.getCondition());
-    if (!info.isEqui() && join.getJoinType() != JoinRelType.INNER) {
-      // EnumerableJoinRel only supports equi-join. We can put a filter on top
-      // if it is an inner join.
-      try {
-        return new EnumerableThetaJoin(cluster, traitSet, left, right,
-            join.getCondition(), join.getVariablesSet(), join.getJoinType());
-      } catch (InvalidRelException e) {
-        EnumerableRules.LOGGER.debug(e.toString());
-        return null;
-      }
-    }
-    RelNode newRel;
-    try {
-      newRel = new EnumerableJoin(
-          cluster,
-          join.getTraitSet().replace(EnumerableConvention.INSTANCE),
-          left,
-          right,
-          info.getEquiCondition(left, right, cluster.getRexBuilder()),
-          info.leftKeys,
-          info.rightKeys,
-          join.getVariablesSet(),
-          join.getJoinType());
-    } catch (InvalidRelException e) {
-      EnumerableRules.LOGGER.debug(e.toString());
-      return null;
-    }
-    if (!info.isEqui()) {
-      newRel = new EnumerableFilter(cluster, newRel.getTraitSet(),
-          newRel, info.getRemaining(cluster.getRexBuilder()));
-    }
-    return newRel;
-  }
-}
-
-// End EnumerableJoinRule.java

http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimit.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimit.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimit.java
deleted file mode 100644
index 827944f..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimit.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * 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.enumerable;
-
-import org.apache.calcite.linq4j.tree.BlockBuilder;
-import org.apache.calcite.linq4j.tree.Expression;
-import org.apache.calcite.linq4j.tree.Expressions;
-import org.apache.calcite.plan.RelOptCluster;
-import org.apache.calcite.plan.RelTraitSet;
-import org.apache.calcite.rel.RelCollation;
-import org.apache.calcite.rel.RelCollationTraitDef;
-import org.apache.calcite.rel.RelDistribution;
-import org.apache.calcite.rel.RelDistributionTraitDef;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.RelWriter;
-import org.apache.calcite.rel.SingleRel;
-import org.apache.calcite.rel.metadata.RelMdCollation;
-import org.apache.calcite.rel.metadata.RelMdDistribution;
-import org.apache.calcite.rel.metadata.RelMetadataQuery;
-import org.apache.calcite.rex.RexLiteral;
-import org.apache.calcite.rex.RexNode;
-import org.apache.calcite.util.BuiltInMethod;
-
-import com.google.common.base.Supplier;
-
-import java.util.List;
-
-/** Relational expression that applies a limit and/or offset to its input. */
-public class EnumerableLimit extends SingleRel implements EnumerableRel {
-  public final RexNode offset;
-  public final RexNode fetch;
-
-  /** Creates an EnumerableLimit.
-   *
-   * <p>Use {@link #create} unless you know what you're doing. */
-  public EnumerableLimit(
-      RelOptCluster cluster,
-      RelTraitSet traitSet,
-      RelNode input,
-      RexNode offset,
-      RexNode fetch) {
-    super(cluster, traitSet, input);
-    this.offset = offset;
-    this.fetch = fetch;
-    assert getConvention() instanceof EnumerableConvention;
-    assert getConvention() == input.getConvention();
-  }
-
-  /** Creates an EnumerableLimit. */
-  public static EnumerableLimit create(final RelNode input, RexNode offset,
-      RexNode fetch) {
-    final RelOptCluster cluster = input.getCluster();
-    final RelMetadataQuery mq = RelMetadataQuery.instance();
-    final RelTraitSet traitSet =
-        cluster.traitSetOf(EnumerableConvention.INSTANCE)
-            .replaceIfs(
-                RelCollationTraitDef.INSTANCE,
-                new Supplier<List<RelCollation>>() {
-                  public List<RelCollation> get() {
-                    return RelMdCollation.limit(mq, input);
-                  }
-                })
-            .replaceIf(RelDistributionTraitDef.INSTANCE,
-                new Supplier<RelDistribution>() {
-                  public RelDistribution get() {
-                    return RelMdDistribution.limit(mq, input);
-                  }
-                });
-    return new EnumerableLimit(cluster, traitSet, input, offset, fetch);
-  }
-
-  @Override public EnumerableLimit copy(
-      RelTraitSet traitSet,
-      List<RelNode> newInputs) {
-    return new EnumerableLimit(
-        getCluster(),
-        traitSet,
-        sole(newInputs),
-        offset,
-        fetch);
-  }
-
-  @Override public RelWriter explainTerms(RelWriter pw) {
-    return super.explainTerms(pw)
-        .itemIf("offset", offset, offset != null)
-        .itemIf("fetch", fetch, fetch != null);
-  }
-
-  public Result implement(EnumerableRelImplementor implementor, Prefer pref) {
-    final BlockBuilder builder = new BlockBuilder();
-    final EnumerableRel child = (EnumerableRel) getInput();
-    final Result result = implementor.visitChild(this, 0, child, pref);
-    final PhysType physType =
-        PhysTypeImpl.of(
-            implementor.getTypeFactory(),
-            getRowType(),
-            result.format);
-
-    Expression v = builder.append("child", result.block);
-    if (offset != null) {
-      v = builder.append(
-          "offset",
-          Expressions.call(
-              v,
-              BuiltInMethod.SKIP.method,
-              Expressions.constant(RexLiteral.intValue(offset))));
-    }
-    if (fetch != null) {
-      v = builder.append(
-          "fetch",
-          Expressions.call(
-              v,
-              BuiltInMethod.TAKE.method,
-              Expressions.constant(RexLiteral.intValue(fetch))));
-    }
-
-    builder.add(
-        Expressions.return_(
-            null,
-            v));
-    return implementor.result(physType, builder.toBlock());
-  }
-}
-
-// End EnumerableLimit.java

http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimitRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimitRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimitRule.java
deleted file mode 100644
index 4f8ab10..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimitRule.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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.enumerable;
-
-import org.apache.calcite.plan.RelOptRule;
-import org.apache.calcite.plan.RelOptRuleCall;
-import org.apache.calcite.plan.RelTraitSet;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.core.Sort;
-
-/**
- * Rule to convert an {@link org.apache.calcite.rel.core.Sort} that has
- * {@code offset} or {@code fetch} set to an
- * {@link EnumerableLimit}
- * on top of a "pure" {@code Sort} that has no offset or fetch.
- */
-class EnumerableLimitRule extends RelOptRule {
-  EnumerableLimitRule() {
-    super(
-        operand(Sort.class, any()),
-        "EnumerableLimitRule");
-  }
-
-  @Override public void onMatch(RelOptRuleCall call) {
-    final Sort sort = call.rel(0);
-    if (sort.offset == null && sort.fetch == null) {
-      return;
-    }
-    final RelTraitSet traitSet =
-        sort.getTraitSet().replace(EnumerableConvention.INSTANCE);
-    RelNode input = sort.getInput();
-    if (!sort.getCollation().getFieldCollations().isEmpty()) {
-      // Create a sort with the same sort key, but no offset or fetch.
-      input = sort.copy(
-          sort.getTraitSet(),
-          input,
-          sort.getCollation(),
-          null,
-          null);
-    }
-    RelNode x = convert(
-        input,
-        input.getTraitSet().replace(EnumerableConvention.INSTANCE));
-    call.transformTo(
-        new EnumerableLimit(
-            sort.getCluster(),
-            traitSet,
-            x,
-            sort.offset,
-            sort.fetch));
-  }
-}
-
-// End EnumerableLimitRule.java

http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java
deleted file mode 100644
index 95d6239..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * 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.enumerable;
-
-import org.apache.calcite.adapter.java.JavaTypeFactory;
-import org.apache.calcite.linq4j.tree.BlockBuilder;
-import org.apache.calcite.linq4j.tree.Expression;
-import org.apache.calcite.linq4j.tree.Expressions;
-import org.apache.calcite.linq4j.tree.ParameterExpression;
-import org.apache.calcite.linq4j.tree.Types;
-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.InvalidRelException;
-import org.apache.calcite.rel.RelCollation;
-import org.apache.calcite.rel.RelCollationTraitDef;
-import org.apache.calcite.rel.RelCollations;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.core.CorrelationId;
-import org.apache.calcite.rel.core.EquiJoin;
-import org.apache.calcite.rel.core.JoinInfo;
-import org.apache.calcite.rel.core.JoinRelType;
-import org.apache.calcite.rel.metadata.RelMdCollation;
-import org.apache.calcite.rel.metadata.RelMetadataQuery;
-import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.rex.RexLiteral;
-import org.apache.calcite.rex.RexNode;
-import org.apache.calcite.util.BuiltInMethod;
-import org.apache.calcite.util.ImmutableIntList;
-import org.apache.calcite.util.Pair;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-/** Implementation of {@link org.apache.calcite.rel.core.Join} in
- * {@link EnumerableConvention enumerable calling convention} using
- * a merge algorithm. */
-public class EnumerableMergeJoin extends EquiJoin implements EnumerableRel {
-  EnumerableMergeJoin(
-      RelOptCluster cluster,
-      RelTraitSet traits,
-      RelNode left,
-      RelNode right,
-      RexNode condition,
-      ImmutableIntList leftKeys,
-      ImmutableIntList rightKeys,
-      Set<CorrelationId> variablesSet,
-      JoinRelType joinType)
-      throws InvalidRelException {
-    super(cluster, traits, left, right, condition, leftKeys, rightKeys,
-        variablesSet, joinType);
-    final List<RelCollation> collations =
-        traits.getTraits(RelCollationTraitDef.INSTANCE);
-    assert collations == null || RelCollations.contains(collations, leftKeys);
-  }
-
-  @Deprecated // to be removed before 2.0
-  EnumerableMergeJoin(RelOptCluster cluster, RelTraitSet traits, RelNode left,
-      RelNode right, RexNode condition, ImmutableIntList leftKeys,
-      ImmutableIntList rightKeys, JoinRelType joinType,
-      Set<String> variablesStopped) throws InvalidRelException {
-    this(cluster, traits, left, right, condition, leftKeys, rightKeys,
-        CorrelationId.setOf(variablesStopped), joinType);
-  }
-
-  public static EnumerableMergeJoin create(RelNode left, RelNode right,
-      RexLiteral condition, ImmutableIntList leftKeys,
-      ImmutableIntList rightKeys, JoinRelType joinType)
-      throws InvalidRelException {
-    final RelOptCluster cluster = right.getCluster();
-    RelTraitSet traitSet = cluster.traitSet();
-    if (traitSet.isEnabled(RelCollationTraitDef.INSTANCE)) {
-      final RelMetadataQuery mq = RelMetadataQuery.instance();
-      final List<RelCollation> collations =
-          RelMdCollation.mergeJoin(mq, left, right, leftKeys, rightKeys);
-      traitSet = traitSet.replace(collations);
-    }
-    return new EnumerableMergeJoin(cluster, traitSet, left, right, condition,
-        leftKeys, rightKeys, ImmutableSet.<CorrelationId>of(), joinType);
-  }
-
-  @Override public EnumerableMergeJoin copy(RelTraitSet traitSet,
-      RexNode condition, RelNode left, RelNode right, JoinRelType joinType,
-      boolean semiJoinDone) {
-    final JoinInfo joinInfo = JoinInfo.of(left, right, condition);
-    assert joinInfo.isEqui();
-    try {
-      return new EnumerableMergeJoin(getCluster(), traitSet, left, right,
-          condition, joinInfo.leftKeys, joinInfo.rightKeys, variablesSet,
-          joinType);
-    } catch (InvalidRelException e) {
-      // Semantic error not possible. Must be a bug. Convert to
-      // internal error.
-      throw new AssertionError(e);
-    }
-  }
-
-  @Override public RelOptCost computeSelfCost(RelOptPlanner planner,
-      RelMetadataQuery mq) {
-    // We assume that the inputs are sorted. The price of sorting them has
-    // already been paid. The cost of the join is therefore proportional to the
-    // input and output size.
-    final double rightRowCount = right.estimateRowCount(mq);
-    final double leftRowCount = left.estimateRowCount(mq);
-    final double rowCount = mq.getRowCount(this);
-    final double d = leftRowCount + rightRowCount + rowCount;
-    return planner.getCostFactory().makeCost(d, 0, 0);
-  }
-
-  public Result implement(EnumerableRelImplementor implementor, Prefer pref) {
-    BlockBuilder builder = new BlockBuilder();
-    final Result leftResult =
-        implementor.visitChild(this, 0, (EnumerableRel) left, pref);
-    final Expression leftExpression =
-        builder.append("left", leftResult.block);
-    final ParameterExpression left_ =
-        Expressions.parameter(leftResult.physType.getJavaRowType(), "left");
-    final Result rightResult =
-        implementor.visitChild(this, 1, (EnumerableRel) right, pref);
-    final Expression rightExpression =
-        builder.append("right", rightResult.block);
-    final ParameterExpression right_ =
-        Expressions.parameter(rightResult.physType.getJavaRowType(), "right");
-    final JavaTypeFactory typeFactory = implementor.getTypeFactory();
-    final PhysType physType =
-        PhysTypeImpl.of(typeFactory, getRowType(), pref.preferArray());
-    final List<Expression> leftExpressions = new ArrayList<>();
-    final List<Expression> rightExpressions = new ArrayList<>();
-    for (Pair<Integer, Integer> pair : Pair.zip(leftKeys, rightKeys)) {
-      final RelDataType keyType =
-          typeFactory.leastRestrictive(
-              ImmutableList.of(
-                  left.getRowType().getFieldList().get(pair.left).getType(),
-                  right.getRowType().getFieldList().get(pair.right).getType()));
-      final Type keyClass = typeFactory.getJavaClass(keyType);
-      leftExpressions.add(
-         Types.castIfNecessary(keyClass,
-             leftResult.physType.fieldReference(left_, pair.left)));
-      rightExpressions.add(
-         Types.castIfNecessary(keyClass,
-             rightResult.physType.fieldReference(right_, pair.right)));
-    }
-    final PhysType leftKeyPhysType =
-        leftResult.physType.project(leftKeys, JavaRowFormat.LIST);
-    final PhysType rightKeyPhysType =
-        rightResult.physType.project(rightKeys, JavaRowFormat.LIST);
-    return implementor.result(
-        physType,
-        builder.append(
-            Expressions.call(
-                BuiltInMethod.MERGE_JOIN.method,
-                Expressions.list(
-                    leftExpression,
-                    rightExpression,
-                    Expressions.lambda(
-                        leftKeyPhysType.record(leftExpressions), left_),
-                    Expressions.lambda(
-                        rightKeyPhysType.record(rightExpressions), right_),
-                    EnumUtils.joinSelector(joinType,
-                        physType,
-                        ImmutableList.of(
-                            leftResult.physType, rightResult.physType)),
-                    Expressions.constant(
-                        joinType.generatesNullsOnLeft()),
-                    Expressions.constant(
-                        joinType.generatesNullsOnRight())))).toBlock());
-  }
-}
-
-// End EnumerableMergeJoin.java

http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java
deleted file mode 100644
index 222111c..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * 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.enumerable;
-
-import org.apache.calcite.linq4j.Ord;
-import org.apache.calcite.plan.Convention;
-import org.apache.calcite.plan.RelOptCluster;
-import org.apache.calcite.plan.RelTraitSet;
-import org.apache.calcite.rel.InvalidRelException;
-import org.apache.calcite.rel.RelCollation;
-import org.apache.calcite.rel.RelCollations;
-import org.apache.calcite.rel.RelFieldCollation;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.convert.ConverterRule;
-import org.apache.calcite.rel.core.JoinInfo;
-import org.apache.calcite.rel.core.JoinRelType;
-import org.apache.calcite.rel.logical.LogicalJoin;
-
-import com.google.common.collect.Lists;
-
-import java.util.List;
-
-/** Planner rule that converts a
- * {@link org.apache.calcite.rel.logical.LogicalJoin} relational expression
- * {@link EnumerableConvention enumerable calling convention}.
- *
- * @see org.apache.calcite.adapter.enumerable.EnumerableJoinRule
- */
-class EnumerableMergeJoinRule extends ConverterRule {
-  EnumerableMergeJoinRule() {
-    super(LogicalJoin.class,
-        Convention.NONE,
-        EnumerableConvention.INSTANCE,
-        "EnumerableMergeJoinRule");
-  }
-
-  @Override public RelNode convert(RelNode rel) {
-    LogicalJoin join = (LogicalJoin) rel;
-    final JoinInfo info =
-        JoinInfo.of(join.getLeft(), join.getRight(), join.getCondition());
-    if (join.getJoinType() != JoinRelType.INNER) {
-      // EnumerableMergeJoin only supports inner join.
-      // (It supports non-equi join, using a post-filter; see below.)
-      return null;
-    }
-    if (info.pairs().size() == 0) {
-      // EnumerableMergeJoin CAN support cartesian join, but disable it for now.
-      return null;
-    }
-    final List<RelNode> newInputs = Lists.newArrayList();
-    final List<RelCollation> collations = Lists.newArrayList();
-    int offset = 0;
-    for (Ord<RelNode> ord : Ord.zip(join.getInputs())) {
-      RelTraitSet traits = ord.e.getTraitSet()
-          .replace(EnumerableConvention.INSTANCE);
-      if (!info.pairs().isEmpty()) {
-        final List<RelFieldCollation> fieldCollations = Lists.newArrayList();
-        for (int key : info.keys().get(ord.i)) {
-          fieldCollations.add(
-              new RelFieldCollation(key,
-                  RelFieldCollation.Direction.ASCENDING,
-                  RelFieldCollation.NullDirection.LAST));
-        }
-        final RelCollation collation = RelCollations.of(fieldCollations);
-        collations.add(RelCollations.shift(collation, offset));
-        traits = traits.replace(collation);
-      }
-      newInputs.add(convert(ord.e, traits));
-      offset += ord.e.getRowType().getFieldCount();
-    }
-    final RelNode left = newInputs.get(0);
-    final RelNode right = newInputs.get(1);
-    final RelOptCluster cluster = join.getCluster();
-    RelNode newRel;
-    try {
-      RelTraitSet traits = join.getTraitSet()
-          .replace(EnumerableConvention.INSTANCE);
-      if (!collations.isEmpty()) {
-        traits = traits.replace(collations);
-      }
-      newRel = new EnumerableMergeJoin(cluster,
-          traits,
-          left,
-          right,
-          info.getEquiCondition(left, right, cluster.getRexBuilder()),
-          info.leftKeys,
-          info.rightKeys,
-          join.getVariablesSet(),
-          join.getJoinType());
-    } catch (InvalidRelException e) {
-      EnumerableRules.LOGGER.debug(e.toString());
-      return null;
-    }
-    if (!info.isEqui()) {
-      newRel = new EnumerableFilter(cluster, newRel.getTraitSet(),
-          newRel, info.getRemaining(cluster.getRexBuilder()));
-    }
-    return newRel;
-  }
-}
-
-// End EnumerableMergeJoinRule.java

http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMinus.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMinus.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMinus.java
deleted file mode 100644
index 7ed4edb..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMinus.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * 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.enumerable;
-
-import org.apache.calcite.linq4j.Ord;
-import org.apache.calcite.linq4j.tree.BlockBuilder;
-import org.apache.calcite.linq4j.tree.Expression;
-import org.apache.calcite.linq4j.tree.Expressions;
-import org.apache.calcite.plan.RelOptCluster;
-import org.apache.calcite.plan.RelTraitSet;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.core.Minus;
-import org.apache.calcite.util.BuiltInMethod;
-
-import java.util.List;
-
-/** Implementation of {@link org.apache.calcite.rel.core.Minus} in
- * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}. */
-public class EnumerableMinus extends Minus implements EnumerableRel {
-  public EnumerableMinus(RelOptCluster cluster, RelTraitSet traitSet,
-      List<RelNode> inputs, boolean all) {
-    super(cluster, traitSet, inputs, all);
-    assert !all;
-  }
-
-  public EnumerableMinus copy(RelTraitSet traitSet, List<RelNode> inputs,
-      boolean all) {
-    return new EnumerableMinus(getCluster(), traitSet, inputs, all);
-  }
-
-  public Result implement(EnumerableRelImplementor implementor, Prefer pref) {
-    final BlockBuilder builder = new BlockBuilder();
-    Expression minusExp = null;
-    for (Ord<RelNode> ord : Ord.zip(inputs)) {
-      EnumerableRel input = (EnumerableRel) ord.e;
-      final Result result = implementor.visitChild(this, ord.i, input, pref);
-      Expression childExp =
-          builder.append(
-              "child" + ord.i,
-              result.block);
-
-      if (minusExp == null) {
-        minusExp = childExp;
-      } else {
-        minusExp =
-            Expressions.call(minusExp,
-                BuiltInMethod.EXCEPT.method,
-                Expressions.list(childExp)
-                    .appendIfNotNull(result.physType.comparer()));
-      }
-
-      // Once the first input has chosen its format, ask for the same for
-      // other inputs.
-      pref = pref.of(result.format);
-    }
-
-    builder.add(minusExp);
-    final PhysType physType =
-        PhysTypeImpl.of(
-            implementor.getTypeFactory(),
-            getRowType(),
-            pref.prefer(JavaRowFormat.CUSTOM));
-    return implementor.result(physType, builder.toBlock());
-  }
-}
-
-// End EnumerableMinus.java

http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMinusRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMinusRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMinusRule.java
deleted file mode 100644
index 4cbf263..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMinusRule.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.enumerable;
-
-import org.apache.calcite.plan.Convention;
-import org.apache.calcite.plan.RelTraitSet;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.convert.ConverterRule;
-import org.apache.calcite.rel.logical.LogicalMinus;
-
-/**
- * Rule to convert an {@link org.apache.calcite.rel.logical.LogicalMinus} to an
- * {@link EnumerableMinus}.
- */
-class EnumerableMinusRule extends ConverterRule {
-  EnumerableMinusRule() {
-    super(LogicalMinus.class, Convention.NONE, EnumerableConvention.INSTANCE,
-        "EnumerableMinusRule");
-  }
-
-  public RelNode convert(RelNode rel) {
-    final LogicalMinus minus = (LogicalMinus) rel;
-    if (minus.all) {
-      return null; // EXCEPT ALL not implemented
-    }
-    final EnumerableConvention out = EnumerableConvention.INSTANCE;
-    final RelTraitSet traitSet =
-        rel.getTraitSet().replace(
-            EnumerableConvention.INSTANCE);
-    return new EnumerableMinus(rel.getCluster(), traitSet,
-        convertList(minus.getInputs(), out), false);
-  }
-}
-
-// End EnumerableMinusRule.java

http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java
deleted file mode 100644
index fa2b48b..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * 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.enumerable;
-
-import org.apache.calcite.plan.RelOptCluster;
-import org.apache.calcite.plan.RelTraitSet;
-import org.apache.calcite.rel.RelCollation;
-import org.apache.calcite.rel.RelCollationTraitDef;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.core.Project;
-import org.apache.calcite.rel.metadata.RelMdCollation;
-import org.apache.calcite.rel.metadata.RelMetadataQuery;
-import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.rex.RexNode;
-import org.apache.calcite.util.Util;
-
-import com.google.common.base.Supplier;
-
-import java.util.List;
-
-/** Implementation of {@link org.apache.calcite.rel.core.Project} in
- * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}. */
-public class EnumerableProject extends Project implements EnumerableRel {
-  /**
-   * Creates an EnumerableProject.
-   *
-   * <p>Use {@link #create} unless you know what you're doing.
-   *
-   * @param cluster  Cluster this relational expression belongs to
-   * @param traitSet Traits of this relational expression
-   * @param input    Input relational expression
-   * @param projects List of expressions for the input columns
-   * @param rowType  Output row type
-   */
-  public EnumerableProject(
-      RelOptCluster cluster,
-      RelTraitSet traitSet,
-      RelNode input,
-      List<? extends RexNode> projects,
-      RelDataType rowType) {
-    super(cluster, traitSet, input, projects, rowType);
-    assert getConvention() instanceof EnumerableConvention;
-  }
-
-  @Deprecated // to be removed before 2.0
-  public EnumerableProject(RelOptCluster cluster, RelTraitSet traitSet,
-      RelNode input, List<? extends RexNode> projects, RelDataType rowType,
-      int flags) {
-    this(cluster, traitSet, input, projects, rowType);
-    Util.discard(flags);
-  }
-
-  /** Creates an EnumerableProject, specifying row type rather than field
-   * names. */
-  public static EnumerableProject create(final RelNode input,
-      final List<? extends RexNode> projects, RelDataType rowType) {
-    final RelOptCluster cluster = input.getCluster();
-    final RelMetadataQuery mq = RelMetadataQuery.instance();
-    final RelTraitSet traitSet =
-        cluster.traitSet().replace(EnumerableConvention.INSTANCE)
-            .replaceIfs(RelCollationTraitDef.INSTANCE,
-                new Supplier<List<RelCollation>>() {
-                  public List<RelCollation> get() {
-                    return RelMdCollation.project(mq, input, projects);
-                  }
-                });
-    return new EnumerableProject(cluster, traitSet, input, projects, rowType);
-  }
-
-  public EnumerableProject copy(RelTraitSet traitSet, RelNode input,
-      List<RexNode> projects, RelDataType rowType) {
-    return new EnumerableProject(getCluster(), traitSet, input,
-        projects, rowType);
-  }
-
-  public Result implement(EnumerableRelImplementor implementor, Prefer pref) {
-    // EnumerableCalcRel is always better
-    throw new UnsupportedOperationException();
-  }
-}
-
-// End EnumerableProject.java

http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectRule.java
deleted file mode 100644
index 3f998da..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectRule.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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.enumerable;
-
-import org.apache.calcite.plan.Convention;
-import org.apache.calcite.plan.RelOptUtil;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.convert.ConverterRule;
-import org.apache.calcite.rel.logical.LogicalProject;
-
-/**
- * Rule to convert a {@link org.apache.calcite.rel.logical.LogicalProject} to an
- * {@link EnumerableProject}.
- */
-class EnumerableProjectRule extends ConverterRule {
-  EnumerableProjectRule() {
-    super(LogicalProject.class, RelOptUtil.PROJECT_PREDICATE, Convention.NONE,
-        EnumerableConvention.INSTANCE, "EnumerableProjectRule");
-  }
-
-  public RelNode convert(RelNode rel) {
-    final LogicalProject project = (LogicalProject) rel;
-    return EnumerableProject.create(
-        convert(project.getInput(),
-            project.getInput().getTraitSet()
-                .replace(EnumerableConvention.INSTANCE)),
-        project.getProjects(),
-        project.getRowType());
-  }
-}
-
-// End EnumerableProjectRule.java

http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectToCalcRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectToCalcRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectToCalcRule.java
deleted file mode 100644
index 2e1a4a8..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectToCalcRule.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.enumerable;
-
-import org.apache.calcite.plan.RelOptRule;
-import org.apache.calcite.plan.RelOptRuleCall;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rex.RexProgram;
-
-/** Variant of {@link org.apache.calcite.rel.rules.ProjectToCalcRule} for
- * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}. */
-public class EnumerableProjectToCalcRule extends RelOptRule {
-  EnumerableProjectToCalcRule() {
-    super(operand(EnumerableProject.class, any()));
-  }
-
-  public void onMatch(RelOptRuleCall call) {
-    final EnumerableProject project = call.rel(0);
-    final RelNode input = project.getInput();
-    final RexProgram program =
-        RexProgram.create(input.getRowType(),
-            project.getProjects(),
-            null,
-            project.getRowType(),
-            project.getCluster().getRexBuilder());
-    final EnumerableCalc calc = EnumerableCalc.create(input, program);
-    call.transformTo(calc);
-  }
-}
-
-// End EnumerableProjectToCalcRule.java

http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRel.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRel.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRel.java
deleted file mode 100644
index 5f9b7d3..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRel.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * 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.enumerable;
-
-import org.apache.calcite.linq4j.tree.BlockStatement;
-import org.apache.calcite.plan.RelOptCluster;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.core.RelFactories;
-import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.rex.RexNode;
-import org.apache.calcite.rex.RexUtil;
-import org.apache.calcite.sql.validate.SqlValidatorUtil;
-
-import java.util.List;
-
-/**
- * A relational expression of one of the
- * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention} calling
- * conventions.
- */
-public interface EnumerableRel
-    extends RelNode {
-  RelFactories.FilterFactory FILTER_FACTORY =
-      new RelFactories.FilterFactory() {
-        public RelNode createFilter(RelNode child, RexNode condition) {
-          return EnumerableFilter.create(child, condition);
-        }
-      };
-
-  RelFactories.ProjectFactory PROJECT_FACTORY =
-      new RelFactories.ProjectFactory() {
-        public RelNode createProject(RelNode child,
-            List<? extends RexNode> projects, List<String> fieldNames) {
-          final RelOptCluster cluster = child.getCluster();
-          final RelDataType rowType =
-              RexUtil.createStructType(cluster.getTypeFactory(), projects,
-                  fieldNames, SqlValidatorUtil.F_SUGGESTER);
-          return EnumerableProject.create(child, projects, rowType);
-        }
-      };
-
-  //~ Methods ----------------------------------------------------------------
-
-  /**
-   * Creates a plan for this expression according to a calling convention.
-   *
-   * @param implementor Implementor
-   * @param pref Preferred representation for rows in result expression
-   * @return Plan for this expression according to a calling convention
-   */
-  Result implement(EnumerableRelImplementor implementor, Prefer pref);
-
-  /** Preferred physical type. */
-  enum Prefer {
-    /** Records must be represented as arrays. */
-    ARRAY,
-    /** Consumer would prefer that records are represented as arrays, but can
-     * accommodate records represented as objects. */
-    ARRAY_NICE,
-    /** Records must be represented as objects. */
-    CUSTOM,
-    /** Consumer would prefer that records are represented as objects, but can
-     * accommodate records represented as arrays. */
-    CUSTOM_NICE,
-    /** Consumer has no preferred representation. */
-    ANY;
-
-    public JavaRowFormat preferCustom() {
-      return prefer(JavaRowFormat.CUSTOM);
-    }
-
-    public JavaRowFormat preferArray() {
-      return prefer(JavaRowFormat.ARRAY);
-    }
-
-    public JavaRowFormat prefer(JavaRowFormat format) {
-      switch (this) {
-      case CUSTOM:
-        return JavaRowFormat.CUSTOM;
-      case ARRAY:
-        return JavaRowFormat.ARRAY;
-      default:
-        return format;
-      }
-    }
-
-    public Prefer of(JavaRowFormat format) {
-      switch (format) {
-      case ARRAY:
-        return ARRAY;
-      default:
-        return CUSTOM;
-      }
-    }
-  }
-
-  /** Result of implementing an enumerable relational expression by generating
-   * Java code. */
-  class Result {
-    public final BlockStatement block;
-
-    /**
-     * Describes the Java type returned by this relational expression, and the
-     * mapping between it and the fields of the logical row type.
-     */
-    public final PhysType physType;
-    public final JavaRowFormat format;
-
-    public Result(BlockStatement block, PhysType physType,
-        JavaRowFormat format) {
-      this.block = block;
-      this.physType = physType;
-      this.format = format;
-    }
-  }
-}
-
-// End EnumerableRel.java

http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelImplementor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelImplementor.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelImplementor.java
deleted file mode 100644
index 6e9033c..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelImplementor.java
+++ /dev/null
@@ -1,535 +0,0 @@
-/*
- * 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.enumerable;
-
-import org.apache.calcite.DataContext;
-import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
-import org.apache.calcite.linq4j.Enumerable;
-import org.apache.calcite.linq4j.function.Function1;
-import org.apache.calcite.linq4j.tree.BlockBuilder;
-import org.apache.calcite.linq4j.tree.BlockStatement;
-import org.apache.calcite.linq4j.tree.Blocks;
-import org.apache.calcite.linq4j.tree.ClassDeclaration;
-import org.apache.calcite.linq4j.tree.ConditionalStatement;
-import org.apache.calcite.linq4j.tree.ConstantExpression;
-import org.apache.calcite.linq4j.tree.Expression;
-import org.apache.calcite.linq4j.tree.Expressions;
-import org.apache.calcite.linq4j.tree.MemberDeclaration;
-import org.apache.calcite.linq4j.tree.MethodCallExpression;
-import org.apache.calcite.linq4j.tree.NewArrayExpression;
-import org.apache.calcite.linq4j.tree.NewExpression;
-import org.apache.calcite.linq4j.tree.ParameterExpression;
-import org.apache.calcite.linq4j.tree.Primitive;
-import org.apache.calcite.linq4j.tree.Statement;
-import org.apache.calcite.linq4j.tree.Types;
-import org.apache.calcite.linq4j.tree.VisitorImpl;
-import org.apache.calcite.rex.RexBuilder;
-import org.apache.calcite.runtime.Bindable;
-import org.apache.calcite.util.BuiltInMethod;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Maps;
-
-import java.io.Serializable;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Subclass of {@link org.apache.calcite.plan.RelImplementor} for relational
- * operators of {@link EnumerableConvention} calling convention.
- */
-public class EnumerableRelImplementor extends JavaRelImplementor {
-  /** Maximum number of arguments to a constructor. See
-   * <a href="https://issues.apache.org/jira/browse/CALCITE-1097">[CALCITE-1097]
-   * Exception when executing query with too many aggregation columns</a> for
-   * details. */
-  private static final int MAX_CONSTRUCTOR_ARG_COUNT = 10;
-
-  public final Map<String, Object> map;
-  private final Map<String, RexToLixTranslator.InputGetter> corrVars =
-      Maps.newHashMap();
-  private final Map<Object, ParameterExpression> stashedParameters =
-      Maps.newIdentityHashMap();
-
-  protected final Function1<String, RexToLixTranslator.InputGetter>
-  allCorrelateVariables =
-    new Function1<String, RexToLixTranslator.InputGetter>() {
-      public RexToLixTranslator.InputGetter apply(String name) {
-        return getCorrelVariableGetter(name);
-      }
-    };
-
-  public EnumerableRelImplementor(RexBuilder rexBuilder,
-      Map<String, Object> internalParameters) {
-    super(rexBuilder);
-    this.map = internalParameters;
-  }
-
-  public EnumerableRel.Result visitChild(
-      EnumerableRel parent,
-      int ordinal,
-      EnumerableRel child,
-      EnumerableRel.Prefer prefer) {
-    if (parent != null) {
-      assert child == parent.getInputs().get(ordinal);
-    }
-    return child.implement(this, prefer);
-  }
-
-  public ClassDeclaration implementRoot(EnumerableRel rootRel,
-      EnumerableRel.Prefer prefer) {
-    final EnumerableRel.Result result = rootRel.implement(this, prefer);
-    final List<MemberDeclaration> memberDeclarations = new ArrayList<>();
-    new TypeRegistrar(memberDeclarations).go(result);
-
-    // The following is a workaround to
-    // http://jira.codehaus.org/browse/JANINO-169. Otherwise we'd remove the
-    // member variable, rename the "root0" parameter as "root", and reference it
-    // directly from inner classes.
-    final ParameterExpression root0_ =
-        Expressions.parameter(Modifier.FINAL, DataContext.class, "root0");
-
-    // This creates the following code
-    // final Integer v1stashed = (Integer) root.get("v1stashed")
-    // It is convenient for passing non-literal "compile-time" constants
-    final Collection<Statement> stashed =
-        Collections2.transform(stashedParameters.values(),
-            new Function<ParameterExpression, Statement>() {
-              public Statement apply(ParameterExpression input) {
-                return Expressions.declare(Modifier.FINAL, input,
-                    Expressions.convert_(
-                        Expressions.call(DataContext.ROOT,
-                            BuiltInMethod.DATA_CONTEXT_GET.method,
-                            Expressions.constant(input.name)),
-                        input.type));
-              }
-            });
-
-    final BlockStatement block = Expressions.block(
-        Iterables.concat(
-            ImmutableList.of(
-                Expressions.statement(
-                    Expressions.assign(DataContext.ROOT, root0_))),
-            stashed,
-            result.block.statements));
-    memberDeclarations.add(
-        Expressions.fieldDecl(0, DataContext.ROOT, null));
-
-    memberDeclarations.add(
-        Expressions.methodDecl(
-            Modifier.PUBLIC,
-            Enumerable.class,
-            BuiltInMethod.BINDABLE_BIND.method.getName(),
-            Expressions.list(root0_),
-            block));
-    memberDeclarations.add(
-        Expressions.methodDecl(Modifier.PUBLIC, Class.class,
-            BuiltInMethod.TYPED_GET_ELEMENT_TYPE.method.getName(),
-            Collections.<ParameterExpression>emptyList(),
-            Blocks.toFunctionBlock(
-                Expressions.return_(null,
-                    Expressions.constant(result.physType.getJavaRowType())))));
-    return Expressions.classDecl(Modifier.PUBLIC,
-        "Baz",
-        null,
-        Collections.<Type>singletonList(Bindable.class),
-        memberDeclarations);
-  }
-
-  private ClassDeclaration classDecl(
-      JavaTypeFactoryImpl.SyntheticRecordType type) {
-    ClassDeclaration classDeclaration =
-        Expressions.classDecl(
-            Modifier.PUBLIC | Modifier.STATIC,
-            type.getName(),
-            null,
-            ImmutableList.<Type>of(Serializable.class),
-            new ArrayList<MemberDeclaration>());
-
-    // For each field:
-    //   public T0 f0;
-    //   ...
-    for (Types.RecordField field : type.getRecordFields()) {
-      classDeclaration.memberDeclarations.add(
-          Expressions.fieldDecl(
-              field.getModifiers(),
-              Expressions.parameter(
-                  field.getType(), field.getName()),
-              null));
-    }
-
-    // Constructor:
-    //   Foo(T0 f0, ...) { this.f0 = f0; ... }
-    final BlockBuilder blockBuilder = new BlockBuilder();
-    final List<ParameterExpression> parameters = new ArrayList<>();
-    final ParameterExpression thisParameter =
-        Expressions.parameter(type, "this");
-
-    // Here a constructor without parameter is used because the generated
-    // code could cause error if number of fields is too large.
-    classDeclaration.memberDeclarations.add(
-        Expressions.constructorDecl(
-            Modifier.PUBLIC,
-            type,
-            parameters,
-            blockBuilder.toBlock()));
-
-    // equals method():
-    //   public boolean equals(Object o) {
-    //       if (this == o) return true;
-    //       if (!(o instanceof MyClass)) return false;
-    //       final MyClass that = (MyClass) o;
-    //       return this.f0 == that.f0
-    //         && equal(this.f1, that.f1)
-    //         ...
-    //   }
-    final BlockBuilder blockBuilder2 = new BlockBuilder();
-    final ParameterExpression thatParameter =
-        Expressions.parameter(type, "that");
-    final ParameterExpression oParameter =
-        Expressions.parameter(Object.class, "o");
-    blockBuilder2.add(
-        Expressions.ifThen(
-            Expressions.equal(thisParameter, oParameter),
-            Expressions.return_(null, Expressions.constant(true))));
-    blockBuilder2.add(
-        Expressions.ifThen(
-            Expressions.not(
-                Expressions.typeIs(oParameter, type)),
-            Expressions.return_(null, Expressions.constant(false))));
-    blockBuilder2.add(
-        Expressions.declare(
-            Modifier.FINAL,
-            thatParameter,
-            Expressions.convert_(oParameter, type)));
-    final List<Expression> conditions = new ArrayList<>();
-    for (Types.RecordField field : type.getRecordFields()) {
-      conditions.add(
-          Primitive.is(field.getType())
-              ? Expressions.equal(
-                  Expressions.field(thisParameter, field.getName()),
-                  Expressions.field(thatParameter, field.getName()))
-              : Expressions.call(BuiltInMethod.OBJECTS_EQUAL.method,
-                  Expressions.field(thisParameter, field.getName()),
-                  Expressions.field(thatParameter, field.getName())));
-    }
-    blockBuilder2.add(
-        Expressions.return_(null, Expressions.foldAnd(conditions)));
-    classDeclaration.memberDeclarations.add(
-        Expressions.methodDecl(
-            Modifier.PUBLIC,
-            boolean.class,
-            "equals",
-            Collections.singletonList(oParameter),
-            blockBuilder2.toBlock()));
-
-    // hashCode method:
-    //   public int hashCode() {
-    //     int h = 0;
-    //     h = hash(h, f0);
-    //     ...
-    //     return h;
-    //   }
-    final BlockBuilder blockBuilder3 = new BlockBuilder();
-    final ParameterExpression hParameter =
-        Expressions.parameter(int.class, "h");
-    final ConstantExpression constantZero =
-        Expressions.constant(0);
-    blockBuilder3.add(
-        Expressions.declare(0, hParameter, constantZero));
-    for (Types.RecordField field : type.getRecordFields()) {
-      final Method method = BuiltInMethod.HASH.method;
-      blockBuilder3.add(
-          Expressions.statement(
-              Expressions.assign(
-                  hParameter,
-                  Expressions.call(
-                      method.getDeclaringClass(),
-                      method.getName(),
-                      ImmutableList.of(
-                          hParameter,
-                          Expressions.field(thisParameter, field))))));
-    }
-    blockBuilder3.add(
-        Expressions.return_(null, hParameter));
-    classDeclaration.memberDeclarations.add(
-        Expressions.methodDecl(
-            Modifier.PUBLIC,
-            int.class,
-            "hashCode",
-            Collections.<ParameterExpression>emptyList(),
-            blockBuilder3.toBlock()));
-
-    // compareTo method:
-    //   public int compareTo(MyClass that) {
-    //     int c;
-    //     c = compare(this.f0, that.f0);
-    //     if (c != 0) return c;
-    //     ...
-    //     return 0;
-    //   }
-    final BlockBuilder blockBuilder4 = new BlockBuilder();
-    final ParameterExpression cParameter =
-        Expressions.parameter(int.class, "c");
-    final int mod = type.getRecordFields().size() == 1 ? Modifier.FINAL : 0;
-    blockBuilder4.add(
-        Expressions.declare(mod, cParameter, null));
-    final ConditionalStatement conditionalStatement =
-        Expressions.ifThen(
-            Expressions.notEqual(cParameter, constantZero),
-            Expressions.return_(null, cParameter));
-    for (Types.RecordField field : type.getRecordFields()) {
-      MethodCallExpression compareCall;
-      try {
-        final Method method = (field.nullable()
-            ? BuiltInMethod.COMPARE_NULLS_LAST
-            : BuiltInMethod.COMPARE).method;
-        compareCall = Expressions.call(method.getDeclaringClass(),
-            method.getName(),
-            Expressions.field(thisParameter, field),
-            Expressions.field(thatParameter, field));
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof NoSuchMethodException) {
-          // Just ignore the field in compareTo
-          // "create synthetic record class" blindly creates compareTo for
-          // all the fields, however not all the records will actually be used
-          // as sorting keys (e.g. temporary state for aggregate calculation).
-          // In those cases it is fine if we skip the problematic fields.
-          continue;
-        }
-        throw e;
-      }
-      blockBuilder4.add(
-          Expressions.statement(
-              Expressions.assign(
-                  cParameter,
-                  compareCall)));
-      blockBuilder4.add(conditionalStatement);
-    }
-    blockBuilder4.add(
-        Expressions.return_(null, constantZero));
-    classDeclaration.memberDeclarations.add(
-        Expressions.methodDecl(
-            Modifier.PUBLIC,
-            int.class,
-            "compareTo",
-            Collections.singletonList(thatParameter),
-            blockBuilder4.toBlock()));
-
-    // toString method:
-    //   public String toString() {
-    //     return "{f0=" + f0
-    //       + ", f1=" + f1
-    //       ...
-    //       + "}";
-    //   }
-    final BlockBuilder blockBuilder5 = new BlockBuilder();
-    Expression expression5 = null;
-    for (Types.RecordField field : type.getRecordFields()) {
-      if (expression5 == null) {
-        expression5 =
-            Expressions.constant("{" + field.getName() + "=");
-      } else {
-        expression5 =
-            Expressions.add(
-                expression5,
-                Expressions.constant(", " + field.getName() + "="));
-      }
-      expression5 =
-          Expressions.add(
-              expression5,
-              Expressions.field(thisParameter, field.getName()));
-    }
-    expression5 =
-        expression5 == null
-            ? Expressions.constant("{}")
-            : Expressions.add(
-                expression5,
-                Expressions.constant("}"));
-    blockBuilder5.add(
-        Expressions.return_(
-            null,
-            expression5));
-    classDeclaration.memberDeclarations.add(
-        Expressions.methodDecl(
-            Modifier.PUBLIC,
-            String.class,
-            "toString",
-            Collections.<ParameterExpression>emptyList(),
-            blockBuilder5.toBlock()));
-
-    return classDeclaration;
-  }
-
-  /**
-   * Stashes a value for the executor. Given values are de-duplicated if
-   * identical (see {@link java.util.IdentityHashMap}).
-   *
-   * <p>For instance, to pass {@code ArrayList} to your method, you can use
-   * {@code Expressions.call(method, implementor.stash(arrayList))}.
-   *
-   * <p>For simple literals (strings, numbers) the result is equivalent to
-   * {@link org.apache.calcite.linq4j.tree.Expressions#constant(Object, java.lang.reflect.Type)}.
-   *
-   * <p>Note: the input value is held in memory as long as the statement
-   * is alive. If you are using just a subset of its content, consider creating
-   * a slimmer holder.
-   *
-   * @param input Value to be stashed
-   * @param clazz Java class type of the value when it is used
-   * @param <T> Java class type of the value when it is used
-   * @return Expression that will represent {@code input} in runtime
-   */
-  public <T> Expression stash(T input, Class<? super T> clazz) {
-    // Well-known final classes that can be used as literals
-    if (input == null
-        || input instanceof String
-        || input instanceof Boolean
-        || input instanceof Byte
-        || input instanceof Short
-        || input instanceof Integer
-        || input instanceof Long
-        || input instanceof Float
-        || input instanceof Double
-        ) {
-      return Expressions.constant(input, clazz);
-    }
-    ParameterExpression cached = stashedParameters.get(input);
-    if (cached != null) {
-      return cached;
-    }
-    // "stashed" avoids name clash since this name will be used as the variable
-    // name at the very start of the method.
-    final String name = "v" + map.size() + "stashed";
-    final ParameterExpression x = Expressions.variable(clazz, name);
-    map.put(name, input);
-    stashedParameters.put(input, x);
-    return x;
-  }
-
-  public void registerCorrelVariable(final String name,
-      final ParameterExpression pe,
-      final BlockBuilder corrBlock, final PhysType physType) {
-    corrVars.put(name, new RexToLixTranslator.InputGetter() {
-      public Expression field(BlockBuilder list, int index, Type storageType) {
-        Expression fieldReference =
-            physType.fieldReference(pe, index, storageType);
-        return corrBlock.append(name + "_" + index, fieldReference);
-      }
-    });
-  }
-
-  public void clearCorrelVariable(String name) {
-    assert corrVars.containsKey(name) : "Correlation variable " + name
-        + " should be defined";
-    corrVars.remove(name);
-  }
-
-  public RexToLixTranslator.InputGetter getCorrelVariableGetter(String name) {
-    assert corrVars.containsKey(name) : "Correlation variable " + name
-        + " should be defined";
-    return corrVars.get(name);
-  }
-
-  public EnumerableRel.Result result(PhysType physType, BlockStatement block) {
-    return new EnumerableRel.Result(
-        block, physType, ((PhysTypeImpl) physType).format);
-  }
-
-  /** Visitor that finds types in an {@link Expression} tree. */
-  private static class TypeFinder extends VisitorImpl<Void> {
-    private final Collection<Type> types;
-
-    TypeFinder(Collection<Type> types) {
-      this.types = types;
-    }
-
-    @Override public Void visit(NewExpression newExpression) {
-      types.add(newExpression.type);
-      return super.visit(newExpression);
-    }
-
-    @Override public Void visit(NewArrayExpression newArrayExpression) {
-      Type type = newArrayExpression.type;
-      for (;;) {
-        final Type componentType = Types.getComponentType(type);
-        if (componentType == null) {
-          break;
-        }
-        type = componentType;
-      }
-      types.add(type);
-      return super.visit(newArrayExpression);
-    }
-
-    @Override public Void visit(ConstantExpression constantExpression) {
-      if (constantExpression.value instanceof Type) {
-        types.add((Type) constantExpression.value);
-      }
-      return super.visit(constantExpression);
-    }
-  }
-
-  /** Adds a declaration of each synthetic type found in a code block. */
-  private class TypeRegistrar {
-    private final List<MemberDeclaration> memberDeclarations;
-    private final Set<Type> seen = new HashSet<>();
-
-    TypeRegistrar(List<MemberDeclaration> memberDeclarations) {
-      this.memberDeclarations = memberDeclarations;
-    }
-
-    private void register(Type type) {
-      if (!seen.add(type)) {
-        return;
-      }
-      if (type instanceof JavaTypeFactoryImpl.SyntheticRecordType) {
-        memberDeclarations.add(
-            classDecl((JavaTypeFactoryImpl.SyntheticRecordType) type));
-      }
-      if (type instanceof ParameterizedType) {
-        for (Type type1 : ((ParameterizedType) type).getActualTypeArguments()) {
-          register(type1);
-        }
-      }
-    }
-
-    public void go(EnumerableRel.Result result) {
-      final Set<Type> types = new LinkedHashSet<>();
-      result.block.accept(new TypeFinder(types));
-      types.add(result.physType.getJavaRowType());
-      for (Type type : types) {
-        register(type);
-      }
-    }
-  }
-}
-
-// End EnumerableRelImplementor.java