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:02 UTC
[10/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/EnumUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumUtils.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumUtils.java
deleted file mode 100644
index 60408c6..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumUtils.java
+++ /dev/null
@@ -1,269 +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.Ord;
-import org.apache.calcite.linq4j.function.Function2;
-import org.apache.calcite.linq4j.tree.BlockStatement;
-import org.apache.calcite.linq4j.tree.ConstantUntypedNull;
-import org.apache.calcite.linq4j.tree.Expression;
-import org.apache.calcite.linq4j.tree.Expressions;
-import org.apache.calcite.linq4j.tree.MethodDeclaration;
-import org.apache.calcite.linq4j.tree.ParameterExpression;
-import org.apache.calcite.linq4j.tree.Primitive;
-import org.apache.calcite.rel.core.JoinRelType;
-import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.rel.type.RelDataTypeField;
-import org.apache.calcite.rex.RexNode;
-import org.apache.calcite.util.BuiltInMethod;
-
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Type;
-import java.util.AbstractList;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Utilities for generating programs in the Enumerable (functional)
- * style.
- */
-public class EnumUtils {
-
- private static final Function<RexNode, Type> REX_TO_INTERNAL_TYPE =
- new Function<RexNode, Type>() {
- public Type apply(RexNode node) {
- return toInternal(node.getType());
- }
- };
-
- private EnumUtils() {}
-
- static final boolean BRIDGE_METHODS = true;
-
- static final List<ParameterExpression> NO_PARAMS =
- ImmutableList.of();
-
- static final List<Expression> NO_EXPRS =
- ImmutableList.of();
-
- public static final List<String> LEFT_RIGHT =
- ImmutableList.of("left", "right");
-
- /** Declares a method that overrides another method. */
- public static MethodDeclaration overridingMethodDecl(Method method,
- Iterable<ParameterExpression> parameters,
- BlockStatement body) {
- return Expressions.methodDecl(
- method.getModifiers() & ~Modifier.ABSTRACT,
- method.getReturnType(),
- method.getName(),
- parameters,
- body);
- }
-
- static Type javaClass(
- JavaTypeFactory typeFactory, RelDataType type) {
- final Type clazz = typeFactory.getJavaClass(type);
- return clazz instanceof Class ? clazz : Object[].class;
- }
-
- static Class javaRowClass(
- JavaTypeFactory typeFactory, RelDataType type) {
- if (type.isStruct() && type.getFieldCount() == 1) {
- type = type.getFieldList().get(0).getType();
- }
- final Type clazz = typeFactory.getJavaClass(type);
- return clazz instanceof Class ? (Class) clazz : Object[].class;
- }
-
- static List<Type> fieldTypes(
- final JavaTypeFactory typeFactory,
- final List<? extends RelDataType> inputTypes) {
- return new AbstractList<Type>() {
- public Type get(int index) {
- return EnumUtils.javaClass(typeFactory, inputTypes.get(index));
- }
- public int size() {
- return inputTypes.size();
- }
- };
- }
-
- static List<RelDataType> fieldRowTypes(
- final RelDataType inputRowType,
- final List<? extends RexNode> extraInputs,
- final List<Integer> argList) {
- final List<RelDataTypeField> inputFields = inputRowType.getFieldList();
- return new AbstractList<RelDataType>() {
- public RelDataType get(int index) {
- final int arg = argList.get(index);
- return arg < inputFields.size()
- ? inputFields.get(arg).getType()
- : extraInputs.get(arg - inputFields.size()).getType();
- }
- public int size() {
- return argList.size();
- }
- };
- }
-
- static Expression joinSelector(JoinRelType joinType, PhysType physType,
- List<PhysType> inputPhysTypes) {
- // A parameter for each input.
- final List<ParameterExpression> parameters = new ArrayList<>();
-
- // Generate all fields.
- final List<Expression> expressions = new ArrayList<>();
- final int outputFieldCount = physType.getRowType().getFieldCount();
- for (Ord<PhysType> ord : Ord.zip(inputPhysTypes)) {
- final PhysType inputPhysType =
- ord.e.makeNullable(joinType.generatesNullsOn(ord.i));
- // If input item is just a primitive, we do not generate specialized
- // primitive apply override since it won't be called anyway
- // Function<T> always operates on boxed arguments
- final ParameterExpression parameter =
- Expressions.parameter(Primitive.box(inputPhysType.getJavaRowType()),
- EnumUtils.LEFT_RIGHT.get(ord.i));
- parameters.add(parameter);
- if (expressions.size() == outputFieldCount) {
- // For instance, if semi-join needs to return just the left inputs
- break;
- }
- final int fieldCount = inputPhysType.getRowType().getFieldCount();
- for (int i = 0; i < fieldCount; i++) {
- Expression expression =
- inputPhysType.fieldReference(parameter, i,
- physType.getJavaFieldType(expressions.size()));
- if (joinType.generatesNullsOn(ord.i)) {
- expression =
- Expressions.condition(
- Expressions.equal(parameter, Expressions.constant(null)),
- Expressions.constant(null),
- expression);
- }
- expressions.add(expression);
- }
- }
- return Expressions.lambda(
- Function2.class,
- physType.record(expressions),
- parameters);
- }
-
- /** Converts from internal representation to JDBC representation used by
- * arguments of user-defined functions. For example, converts date values from
- * {@code int} to {@link java.sql.Date}. */
- static Expression fromInternal(Expression e, Class<?> targetType) {
- if (e == ConstantUntypedNull.INSTANCE) {
- return e;
- }
- if (!(e.getType() instanceof Class)) {
- return e;
- }
- if (targetType.isAssignableFrom((Class) e.getType())) {
- return e;
- }
- if (targetType == java.sql.Date.class) {
- return Expressions.call(BuiltInMethod.INTERNAL_TO_DATE.method, e);
- }
- if (targetType == java.sql.Time.class) {
- return Expressions.call(BuiltInMethod.INTERNAL_TO_TIME.method, e);
- }
- if (targetType == java.sql.Timestamp.class) {
- return Expressions.call(BuiltInMethod.INTERNAL_TO_TIMESTAMP.method, e);
- }
- if (Primitive.is(e.type)
- && Primitive.isBox(targetType)) {
- // E.g. e is "int", target is "Long", generate "(long) e".
- return Expressions.convert_(e,
- Primitive.ofBox(targetType).primitiveClass);
- }
- return e;
- }
-
- static List<Expression> fromInternal(Class<?>[] targetTypes,
- List<Expression> expressions) {
- final List<Expression> list = new ArrayList<>();
- for (int i = 0; i < expressions.size(); i++) {
- list.add(fromInternal(expressions.get(i), targetTypes[i]));
- }
- return list;
- }
-
- static Type fromInternal(Type type) {
- if (type == java.sql.Date.class || type == java.sql.Time.class) {
- return int.class;
- }
- if (type == java.sql.Timestamp.class) {
- return long.class;
- }
- return type;
- }
-
- static Type toInternal(RelDataType type) {
- switch (type.getSqlTypeName()) {
- case DATE:
- case TIME:
- return type.isNullable() ? Integer.class : int.class;
- case TIMESTAMP:
- return type.isNullable() ? Long.class : long.class;
- default:
- return null; // we don't care; use the default storage type
- }
- }
-
- static List<Type> internalTypes(List<? extends RexNode> operandList) {
- return Lists.transform(operandList, REX_TO_INTERNAL_TYPE);
- }
-
- static Expression enforce(final Type storageType,
- final Expression e) {
- if (storageType != null && e.type != storageType) {
- if (e.type == java.sql.Date.class) {
- if (storageType == int.class) {
- return Expressions.call(BuiltInMethod.DATE_TO_INT.method, e);
- }
- if (storageType == Integer.class) {
- return Expressions.call(BuiltInMethod.DATE_TO_INT_OPTIONAL.method, e);
- }
- } else if (e.type == java.sql.Time.class) {
- if (storageType == int.class) {
- return Expressions.call(BuiltInMethod.TIME_TO_INT.method, e);
- }
- if (storageType == Integer.class) {
- return Expressions.call(BuiltInMethod.TIME_TO_INT_OPTIONAL.method, e);
- }
- } else if (e.type == java.sql.Timestamp.class) {
- if (storageType == long.class) {
- return Expressions.call(BuiltInMethod.TIMESTAMP_TO_LONG.method, e);
- }
- if (storageType == Long.class) {
- return Expressions.call(BuiltInMethod.TIMESTAMP_TO_LONG_OPTIONAL.method, e);
- }
- }
- }
- return e;
- }
-}
-
-// End EnumUtils.java
http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregate.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregate.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregate.java
deleted file mode 100644
index c6b74e2..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregate.java
+++ /dev/null
@@ -1,468 +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.enumerable.impl.AggAddContextImpl;
-import org.apache.calcite.adapter.enumerable.impl.AggResultContextImpl;
-import org.apache.calcite.adapter.java.JavaTypeFactory;
-import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
-import org.apache.calcite.linq4j.Ord;
-import org.apache.calcite.linq4j.function.Function0;
-import org.apache.calcite.linq4j.function.Function1;
-import org.apache.calcite.linq4j.function.Function2;
-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.RelTraitSet;
-import org.apache.calcite.prepare.CalcitePrepareImpl;
-import org.apache.calcite.rel.InvalidRelException;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.core.Aggregate;
-import org.apache.calcite.rel.core.AggregateCall;
-import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.rel.type.RelDataTypeField;
-import org.apache.calcite.rex.RexInputRef;
-import org.apache.calcite.rex.RexNode;
-import org.apache.calcite.sql.SqlAggFunction;
-import org.apache.calcite.util.BuiltInMethod;
-import org.apache.calcite.util.ImmutableBitSet;
-import org.apache.calcite.util.Pair;
-import org.apache.calcite.util.Util;
-
-import com.google.common.collect.Lists;
-
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/** Implementation of {@link org.apache.calcite.rel.core.Aggregate} in
- * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}. */
-public class EnumerableAggregate extends Aggregate implements EnumerableRel {
- public EnumerableAggregate(
- RelOptCluster cluster,
- RelTraitSet traitSet,
- RelNode child,
- boolean indicator,
- ImmutableBitSet groupSet,
- List<ImmutableBitSet> groupSets,
- List<AggregateCall> aggCalls)
- throws InvalidRelException {
- super(cluster, traitSet, child, indicator, groupSet, groupSets, aggCalls);
- assert getConvention() instanceof EnumerableConvention;
-
- for (AggregateCall aggCall : aggCalls) {
- if (aggCall.isDistinct()) {
- throw new InvalidRelException(
- "distinct aggregation not supported");
- }
- AggImplementor implementor2 =
- RexImpTable.INSTANCE.get(aggCall.getAggregation(), false);
- if (implementor2 == null) {
- throw new InvalidRelException(
- "aggregation " + aggCall.getAggregation() + " not supported");
- }
- }
- }
-
- @Override public EnumerableAggregate copy(RelTraitSet traitSet, RelNode input,
- boolean indicator, ImmutableBitSet groupSet,
- List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
- try {
- return new EnumerableAggregate(getCluster(), traitSet, input, indicator,
- groupSet, groupSets, aggCalls);
- } catch (InvalidRelException e) {
- // Semantic error not possible. Must be a bug. Convert to
- // internal error.
- throw new AssertionError(e);
- }
- }
-
- public Result implement(EnumerableRelImplementor implementor, Prefer pref) {
- final JavaTypeFactory typeFactory = implementor.getTypeFactory();
- final BlockBuilder builder = new BlockBuilder();
- final EnumerableRel child = (EnumerableRel) getInput();
- final Result result = implementor.visitChild(this, 0, child, pref);
- Expression childExp =
- builder.append(
- "child",
- result.block);
- final RelDataType inputRowType = getInput().getRowType();
-
- final PhysType physType =
- PhysTypeImpl.of(
- typeFactory, getRowType(), pref.preferCustom());
-
- // final Enumerable<Employee> child = <<child adapter>>;
- // Function1<Employee, Integer> keySelector =
- // new Function1<Employee, Integer>() {
- // public Integer apply(Employee a0) {
- // return a0.deptno;
- // }
- // };
- // Function1<Employee, Object[]> accumulatorInitializer =
- // new Function1<Employee, Object[]>() {
- // public Object[] apply(Employee a0) {
- // return new Object[] {0, 0};
- // }
- // };
- // Function2<Object[], Employee, Object[]> accumulatorAdder =
- // new Function2<Object[], Employee, Object[]>() {
- // public Object[] apply(Object[] a1, Employee a0) {
- // a1[0] = ((Integer) a1[0]) + 1;
- // a1[1] = ((Integer) a1[1]) + a0.salary;
- // return a1;
- // }
- // };
- // Function2<Integer, Object[], Object[]> resultSelector =
- // new Function2<Integer, Object[], Object[]>() {
- // public Object[] apply(Integer a0, Object[] a1) {
- // return new Object[] { a0, a1[0], a1[1] };
- // }
- // };
- // return childEnumerable
- // .groupBy(
- // keySelector, accumulatorInitializer, accumulatorAdder,
- // resultSelector);
- //
- // or, if key has 0 columns,
- //
- // return childEnumerable
- // .aggregate(
- // accumulatorInitializer.apply(),
- // accumulatorAdder,
- // resultSelector);
- //
- // with a slightly different resultSelector; or if there are no aggregate
- // functions
- //
- // final Enumerable<Employee> child = <<child adapter>>;
- // Function1<Employee, Integer> keySelector =
- // new Function1<Employee, Integer>() {
- // public Integer apply(Employee a0) {
- // return a0.deptno;
- // }
- // };
- // EqualityComparer<Employee> equalityComparer =
- // new EqualityComparer<Employee>() {
- // boolean equal(Employee a0, Employee a1) {
- // return a0.deptno;
- // }
- // };
- // return child
- // .distinct(equalityComparer);
-
- final PhysType inputPhysType = result.physType;
-
- ParameterExpression parameter =
- Expressions.parameter(inputPhysType.getJavaRowType(), "a0");
-
- final PhysType keyPhysType =
- inputPhysType.project(groupSet.asList(), getGroupType() != Group.SIMPLE,
- JavaRowFormat.LIST);
- final int groupCount = getGroupCount();
- final int indicatorCount = getIndicatorCount();
-
- final List<AggImpState> aggs = new ArrayList<>(aggCalls.size());
- for (Ord<AggregateCall> call : Ord.zip(aggCalls)) {
- aggs.add(new AggImpState(call.i, call.e, false));
- }
-
- // Function0<Object[]> accumulatorInitializer =
- // new Function0<Object[]>() {
- // public Object[] apply() {
- // return new Object[] {0, 0};
- // }
- // };
- final List<Expression> initExpressions = new ArrayList<>();
- final BlockBuilder initBlock = new BlockBuilder();
-
- final List<Type> aggStateTypes = new ArrayList<>();
- for (final AggImpState agg : aggs) {
- agg.context =
- new AggContext() {
- public SqlAggFunction aggregation() {
- return agg.call.getAggregation();
- }
-
- public RelDataType returnRelType() {
- return agg.call.type;
- }
-
- public Type returnType() {
- return EnumUtils.javaClass(typeFactory, returnRelType());
- }
-
- public List<? extends RelDataType> parameterRelTypes() {
- return EnumUtils.fieldRowTypes(inputRowType, null,
- agg.call.getArgList());
- }
-
- public List<? extends Type> parameterTypes() {
- return EnumUtils.fieldTypes(typeFactory,
- parameterRelTypes());
- }
- };
- List<Type> state =
- agg.implementor.getStateType(agg.context);
-
- if (state.isEmpty()) {
- continue;
- }
-
- aggStateTypes.addAll(state);
-
- final List<Expression> decls = new ArrayList<>(state.size());
- for (int i = 0; i < state.size(); i++) {
- String aggName = "a" + agg.aggIdx;
- if (CalcitePrepareImpl.DEBUG) {
- aggName = Util.toJavaId(agg.call.getAggregation().getName(), 0)
- .substring("ID$0$".length()) + aggName;
- }
- Type type = state.get(i);
- ParameterExpression pe =
- Expressions.parameter(type,
- initBlock.newName(aggName + "s" + i));
- initBlock.add(Expressions.declare(0, pe, null));
- decls.add(pe);
- }
- agg.state = decls;
- initExpressions.addAll(decls);
- agg.implementor.implementReset(agg.context,
- new AggResultContextImpl(initBlock, decls));
- }
-
- final PhysType accPhysType =
- PhysTypeImpl.of(
- typeFactory,
- typeFactory.createSyntheticType(aggStateTypes));
-
-
- if (accPhysType.getJavaRowType() instanceof JavaTypeFactoryImpl.SyntheticRecordType) {
- // We have to initialize the SyntheticRecordType instance this way, to avoid using
- // class constructor with too many parameters.
- JavaTypeFactoryImpl.SyntheticRecordType synType =
- (JavaTypeFactoryImpl.SyntheticRecordType) accPhysType.getJavaRowType();
- final ParameterExpression record0_ =
- Expressions.parameter(accPhysType.getJavaRowType(), "record0");
- initBlock.add(Expressions.declare(0, record0_, null));
- initBlock.add(
- Expressions.statement(
- Expressions.assign(
- record0_,
- Expressions.new_(accPhysType.getJavaRowType()))));
- List<Types.RecordField> fieldList = synType.getRecordFields();
- for (int i = 0; i < initExpressions.size(); i++) {
- Expression right = initExpressions.get(i);
- initBlock.add(
- Expressions.statement(
- Expressions.assign(
- Expressions.field(
- record0_,
- fieldList.get(i)),
- right)));
- }
- initBlock.add(record0_);
- } else {
- initBlock.add(accPhysType.record(initExpressions));
- }
-
- final Expression accumulatorInitializer =
- builder.append(
- "accumulatorInitializer",
- Expressions.lambda(
- Function0.class,
- initBlock.toBlock()));
-
- // Function2<Object[], Employee, Object[]> accumulatorAdder =
- // new Function2<Object[], Employee, Object[]>() {
- // public Object[] apply(Object[] acc, Employee in) {
- // acc[0] = ((Integer) acc[0]) + 1;
- // acc[1] = ((Integer) acc[1]) + in.salary;
- // return acc;
- // }
- // };
- final BlockBuilder builder2 = new BlockBuilder();
- final ParameterExpression inParameter =
- Expressions.parameter(inputPhysType.getJavaRowType(), "in");
- final ParameterExpression acc_ =
- Expressions.parameter(accPhysType.getJavaRowType(), "acc");
- for (int i = 0, stateOffset = 0; i < aggs.size(); i++) {
- final AggImpState agg = aggs.get(i);
-
- final int stateSize = agg.state.size();
- final List<Expression> accumulator = new ArrayList<>(stateSize);
- for (int j = 0; j < stateSize; j++) {
- accumulator.add(accPhysType.fieldReference(acc_, j + stateOffset));
- }
- agg.state = accumulator;
-
- stateOffset += stateSize;
-
- AggAddContext addContext =
- new AggAddContextImpl(builder2, accumulator) {
- public List<RexNode> rexArguments() {
- List<RelDataTypeField> inputTypes =
- inputPhysType.getRowType().getFieldList();
- List<RexNode> args = new ArrayList<>();
- for (int index : agg.call.getArgList()) {
- args.add(RexInputRef.of(index, inputTypes));
- }
- return args;
- }
-
- public RexNode rexFilterArgument() {
- return agg.call.filterArg < 0
- ? null
- : RexInputRef.of(agg.call.filterArg,
- inputPhysType.getRowType());
- }
-
- public RexToLixTranslator rowTranslator() {
- return RexToLixTranslator.forAggregation(typeFactory,
- currentBlock(),
- new RexToLixTranslator.InputGetterImpl(
- Collections.singletonList(
- Pair.of((Expression) inParameter, inputPhysType))))
- .setNullable(currentNullables());
- }
- };
-
- agg.implementor.implementAdd(agg.context, addContext);
- }
- builder2.add(acc_);
- final Expression accumulatorAdder =
- builder.append(
- "accumulatorAdder",
- Expressions.lambda(
- Function2.class,
- builder2.toBlock(),
- acc_,
- inParameter));
-
- // Function2<Integer, Object[], Object[]> resultSelector =
- // new Function2<Integer, Object[], Object[]>() {
- // public Object[] apply(Integer key, Object[] acc) {
- // return new Object[] { key, acc[0], acc[1] };
- // }
- // };
- final BlockBuilder resultBlock = new BlockBuilder();
- final List<Expression> results = Expressions.list();
- final ParameterExpression key_;
- if (groupCount == 0) {
- key_ = null;
- } else {
- final Type keyType = keyPhysType.getJavaRowType();
- key_ = Expressions.parameter(keyType, "key");
- for (int j = 0; j < groupCount + indicatorCount; j++) {
- results.add(
- keyPhysType.fieldReference(key_, j));
- }
- }
- for (final AggImpState agg : aggs) {
- results.add(
- agg.implementor.implementResult(agg.context,
- new AggResultContextImpl(resultBlock, agg.state)));
- }
- resultBlock.add(physType.record(results));
- if (getGroupType() != Group.SIMPLE) {
- final List<Expression> list = Lists.newArrayList();
- for (ImmutableBitSet set : groupSets) {
- list.add(
- inputPhysType.generateSelector(parameter, groupSet.asList(),
- set.asList(), keyPhysType.getFormat()));
- }
- final Expression keySelectors_ =
- builder.append("keySelectors",
- Expressions.call(BuiltInMethod.ARRAYS_AS_LIST.method,
- list));
- final Expression resultSelector =
- builder.append("resultSelector",
- Expressions.lambda(Function2.class,
- resultBlock.toBlock(),
- key_,
- acc_));
- builder.add(
- Expressions.return_(null,
- Expressions.call(
- BuiltInMethod.GROUP_BY_MULTIPLE.method,
- Expressions.list(childExp,
- keySelectors_,
- accumulatorInitializer,
- accumulatorAdder,
- resultSelector)
- .appendIfNotNull(keyPhysType.comparer()))));
- } else if (groupCount == 0) {
- final Expression resultSelector =
- builder.append(
- "resultSelector",
- Expressions.lambda(
- Function1.class,
- resultBlock.toBlock(),
- acc_));
- builder.add(
- Expressions.return_(
- null,
- Expressions.call(
- BuiltInMethod.SINGLETON_ENUMERABLE.method,
- Expressions.call(
- childExp,
- BuiltInMethod.AGGREGATE.method,
- Expressions.call(accumulatorInitializer, "apply"),
- accumulatorAdder,
- resultSelector))));
- } else if (aggCalls.isEmpty()
- && groupSet.equals(
- ImmutableBitSet.range(child.getRowType().getFieldCount()))) {
- builder.add(
- Expressions.return_(
- null,
- Expressions.call(
- inputPhysType.convertTo(childExp, physType),
- BuiltInMethod.DISTINCT.method,
- Expressions.<Expression>list()
- .appendIfNotNull(physType.comparer()))));
- } else {
- final Expression keySelector_ =
- builder.append("keySelector",
- inputPhysType.generateSelector(parameter,
- groupSet.asList(),
- keyPhysType.getFormat()));
- final Expression resultSelector_ =
- builder.append("resultSelector",
- Expressions.lambda(Function2.class,
- resultBlock.toBlock(),
- key_,
- acc_));
- builder.add(
- Expressions.return_(null,
- Expressions.call(childExp,
- BuiltInMethod.GROUP_BY2.method,
- Expressions.list(keySelector_,
- accumulatorInitializer,
- accumulatorAdder,
- resultSelector_)
- .appendIfNotNull(keyPhysType.comparer()))));
- }
- return implementor.result(physType, builder.toBlock());
- }
-}
-
-// End EnumerableAggregate.java
http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java
deleted file mode 100644
index e29b9fc..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java
+++ /dev/null
@@ -1,56 +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.InvalidRelException;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.convert.ConverterRule;
-import org.apache.calcite.rel.logical.LogicalAggregate;
-
-/**
- * Rule to convert a {@link org.apache.calcite.rel.logical.LogicalAggregate}
- * to an {@link EnumerableAggregate}.
- */
-class EnumerableAggregateRule extends ConverterRule {
- EnumerableAggregateRule() {
- super(LogicalAggregate.class, Convention.NONE,
- EnumerableConvention.INSTANCE, "EnumerableAggregateRule");
- }
-
- public RelNode convert(RelNode rel) {
- final LogicalAggregate agg = (LogicalAggregate) rel;
- final RelTraitSet traitSet =
- agg.getTraitSet().replace(EnumerableConvention.INSTANCE);
- try {
- return new EnumerableAggregate(
- rel.getCluster(),
- traitSet,
- convert(agg.getInput(), EnumerableConvention.INSTANCE),
- agg.indicator,
- agg.getGroupSet(),
- agg.getGroupSets(),
- agg.getAggCallList());
- } catch (InvalidRelException e) {
- EnumerableRules.LOGGER.debug(e.toString());
- return null;
- }
- }
-}
-
-// End EnumerableAggregateRule.java
http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBindable.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBindable.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBindable.java
deleted file mode 100644
index 2ad069e..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBindable.java
+++ /dev/null
@@ -1,102 +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.interpreter.BindableConvention;
-import org.apache.calcite.interpreter.BindableRel;
-import org.apache.calcite.interpreter.Node;
-import org.apache.calcite.interpreter.Row;
-import org.apache.calcite.interpreter.Sink;
-import org.apache.calcite.linq4j.Enumerable;
-import org.apache.calcite.linq4j.Enumerator;
-import org.apache.calcite.plan.ConventionTraitDef;
-import org.apache.calcite.plan.RelOptCluster;
-import org.apache.calcite.plan.RelTraitSet;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.convert.ConverterImpl;
-import org.apache.calcite.rel.convert.ConverterRule;
-import org.apache.calcite.runtime.ArrayBindable;
-import org.apache.calcite.runtime.Bindable;
-
-import com.google.common.collect.ImmutableMap;
-
-import java.util.List;
-
-/**
- * Relational expression that converts an enumerable input to interpretable
- * calling convention.
- *
- * @see org.apache.calcite.adapter.enumerable.EnumerableConvention
- * @see org.apache.calcite.interpreter.BindableConvention
- */
-public class EnumerableBindable extends ConverterImpl implements BindableRel {
- protected EnumerableBindable(RelOptCluster cluster, RelNode input) {
- super(cluster, ConventionTraitDef.INSTANCE,
- cluster.traitSetOf(BindableConvention.INSTANCE), input);
- }
-
- @Override public EnumerableBindable copy(RelTraitSet traitSet,
- List<RelNode> inputs) {
- return new EnumerableBindable(getCluster(), sole(inputs));
- }
-
- public Class<Object[]> getElementType() {
- return Object[].class;
- }
-
- public Enumerable<Object[]> bind(DataContext dataContext) {
- final ImmutableMap<String, Object> map = ImmutableMap.of();
- final Bindable bindable = EnumerableInterpretable.toBindable(map, null,
- (EnumerableRel) getInput(), EnumerableRel.Prefer.ARRAY);
- final ArrayBindable arrayBindable = EnumerableInterpretable.box(bindable);
- return arrayBindable.bind(dataContext);
- }
-
- public Node implement(final InterpreterImplementor implementor) {
- return new Node() {
- public void run() throws InterruptedException {
- final Sink sink =
- implementor.relSinks.get(EnumerableBindable.this).get(0);
- final Enumerable<Object[]> enumerable = bind(implementor.dataContext);
- final Enumerator<Object[]> enumerator = enumerable.enumerator();
- while (enumerator.moveNext()) {
- sink.send(Row.asCopy(enumerator.current()));
- }
- }
- };
- }
-
- /**
- * Rule that converts any enumerable relational expression to bindable.
- */
- public static class EnumerableToBindableConverterRule extends ConverterRule {
- public static final EnumerableToBindableConverterRule INSTANCE =
- new EnumerableToBindableConverterRule();
-
- private EnumerableToBindableConverterRule() {
- super(EnumerableRel.class, EnumerableConvention.INSTANCE,
- BindableConvention.INSTANCE, "EnumerableToBindableConverterRule");
- }
-
- @Override public RelNode convert(RelNode rel) {
- return new EnumerableBindable(rel.getCluster(), rel);
- }
- }
-}
-
-// End EnumerableBindable.java
http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalc.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalc.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalc.java
deleted file mode 100644
index a23dcfe..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalc.java
+++ /dev/null
@@ -1,274 +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.adapter.java.JavaTypeFactory;
-import org.apache.calcite.linq4j.Enumerator;
-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.Expression;
-import org.apache.calcite.linq4j.tree.Expressions;
-import org.apache.calcite.linq4j.tree.MemberDeclaration;
-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.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.core.Calc;
-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.RexBuilder;
-import org.apache.calcite.rex.RexProgram;
-import org.apache.calcite.rex.RexSimplify;
-import org.apache.calcite.rex.RexUtil;
-import org.apache.calcite.util.BuiltInMethod;
-import org.apache.calcite.util.Pair;
-import org.apache.calcite.util.Util;
-
-import com.google.common.base.Supplier;
-import com.google.common.collect.ImmutableList;
-
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Type;
-import java.util.Collections;
-import java.util.List;
-
-import static org.apache.calcite.adapter.enumerable.EnumUtils.BRIDGE_METHODS;
-import static org.apache.calcite.adapter.enumerable.EnumUtils.NO_EXPRS;
-import static org.apache.calcite.adapter.enumerable.EnumUtils.NO_PARAMS;
-
-/** Implementation of {@link org.apache.calcite.rel.core.Calc} in
- * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}. */
-public class EnumerableCalc extends Calc implements EnumerableRel {
- /**
- * Creates an EnumerableCalc.
- *
- * <p>Use {@link #create} unless you know what you're doing.
- */
- public EnumerableCalc(RelOptCluster cluster,
- RelTraitSet traitSet,
- RelNode input,
- RexProgram program) {
- super(cluster, traitSet, input, program);
- assert getConvention() instanceof EnumerableConvention;
- assert !program.containsAggs();
- }
-
- @Deprecated // to be removed before 2.0
- public EnumerableCalc(
- RelOptCluster cluster,
- RelTraitSet traitSet,
- RelNode input,
- RexProgram program,
- List<RelCollation> collationList) {
- this(cluster, traitSet, input, program);
- Util.discard(collationList);
- }
-
- /** Creates an EnumerableCalc. */
- public static EnumerableCalc create(final RelNode input,
- final RexProgram program) {
- 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.calc(mq, input, program);
- }
- })
- .replaceIf(RelDistributionTraitDef.INSTANCE,
- new Supplier<RelDistribution>() {
- public RelDistribution get() {
- return RelMdDistribution.calc(mq, input, program);
- }
- });
- return new EnumerableCalc(cluster, traitSet, input, program);
- }
-
- @Override public EnumerableCalc copy(RelTraitSet traitSet, RelNode child,
- RexProgram program) {
- // we do not need to copy program; it is immutable
- return new EnumerableCalc(getCluster(), traitSet, child, program);
- }
-
- public Result implement(EnumerableRelImplementor implementor, Prefer pref) {
- final JavaTypeFactory typeFactory = implementor.getTypeFactory();
- final BlockBuilder builder = new BlockBuilder();
- final EnumerableRel child = (EnumerableRel) getInput();
-
- final Result result =
- implementor.visitChild(this, 0, child, pref);
-
- final PhysType physType =
- PhysTypeImpl.of(
- typeFactory, getRowType(), pref.prefer(result.format));
-
- // final Enumerable<Employee> inputEnumerable = <<child adapter>>;
- // return new Enumerable<IntString>() {
- // Enumerator<IntString> enumerator() {
- // return new Enumerator<IntString>() {
- // public void reset() {
- // ...
- Type outputJavaType = physType.getJavaRowType();
- final Type enumeratorType =
- Types.of(
- Enumerator.class, outputJavaType);
- Type inputJavaType = result.physType.getJavaRowType();
- ParameterExpression inputEnumerator =
- Expressions.parameter(
- Types.of(
- Enumerator.class, inputJavaType),
- "inputEnumerator");
- Expression input =
- RexToLixTranslator.convert(
- Expressions.call(
- inputEnumerator,
- BuiltInMethod.ENUMERATOR_CURRENT.method),
- inputJavaType);
-
- final RexBuilder rexBuilder = getCluster().getRexBuilder();
- final RexSimplify simplify =
- new RexSimplify(rexBuilder, false, RexUtil.EXECUTOR);
- final RexProgram program = this.program.normalize(rexBuilder, simplify);
-
- BlockStatement moveNextBody;
- if (program.getCondition() == null) {
- moveNextBody =
- Blocks.toFunctionBlock(
- Expressions.call(
- inputEnumerator,
- BuiltInMethod.ENUMERATOR_MOVE_NEXT.method));
- } else {
- final BlockBuilder builder2 = new BlockBuilder();
- Expression condition =
- RexToLixTranslator.translateCondition(
- program,
- typeFactory,
- builder2,
- new RexToLixTranslator.InputGetterImpl(
- Collections.singletonList(
- Pair.of(input, result.physType))),
- implementor.allCorrelateVariables);
- builder2.add(
- Expressions.ifThen(
- condition,
- Expressions.return_(
- null, Expressions.constant(true))));
- moveNextBody =
- Expressions.block(
- Expressions.while_(
- Expressions.call(
- inputEnumerator,
- BuiltInMethod.ENUMERATOR_MOVE_NEXT.method),
- builder2.toBlock()),
- Expressions.return_(
- null,
- Expressions.constant(false)));
- }
-
- final BlockBuilder builder3 = new BlockBuilder();
- List<Expression> expressions =
- RexToLixTranslator.translateProjects(
- program,
- typeFactory,
- builder3,
- physType,
- DataContext.ROOT,
- new RexToLixTranslator.InputGetterImpl(
- Collections.singletonList(
- Pair.of(input, result.physType))),
- implementor.allCorrelateVariables);
- builder3.add(
- Expressions.return_(
- null, physType.record(expressions)));
- BlockStatement currentBody =
- builder3.toBlock();
-
- final Expression inputEnumerable =
- builder.append(
- "inputEnumerable", result.block, false);
- final Expression body =
- Expressions.new_(
- enumeratorType,
- NO_EXPRS,
- Expressions.list(
- Expressions.fieldDecl(
- Modifier.PUBLIC
- | Modifier.FINAL,
- inputEnumerator,
- Expressions.call(
- inputEnumerable,
- BuiltInMethod.ENUMERABLE_ENUMERATOR.method)),
- EnumUtils.overridingMethodDecl(
- BuiltInMethod.ENUMERATOR_RESET.method,
- NO_PARAMS,
- Blocks.toFunctionBlock(
- Expressions.call(
- inputEnumerator,
- BuiltInMethod.ENUMERATOR_RESET.method))),
- EnumUtils.overridingMethodDecl(
- BuiltInMethod.ENUMERATOR_MOVE_NEXT.method,
- NO_PARAMS,
- moveNextBody),
- EnumUtils.overridingMethodDecl(
- BuiltInMethod.ENUMERATOR_CLOSE.method,
- NO_PARAMS,
- Blocks.toFunctionBlock(
- Expressions.call(
- inputEnumerator,
- BuiltInMethod.ENUMERATOR_CLOSE.method))),
- Expressions.methodDecl(
- Modifier.PUBLIC,
- BRIDGE_METHODS
- ? Object.class
- : outputJavaType,
- "current",
- NO_PARAMS,
- currentBody)));
- builder.add(
- Expressions.return_(
- null,
- Expressions.new_(
- BuiltInMethod.ABSTRACT_ENUMERABLE_CTOR.constructor,
- // TODO: generics
- // Collections.singletonList(inputRowType),
- NO_EXPRS,
- ImmutableList.<MemberDeclaration>of(
- Expressions.methodDecl(
- Modifier.PUBLIC,
- enumeratorType,
- BuiltInMethod.ENUMERABLE_ENUMERATOR.method.getName(),
- NO_PARAMS,
- Blocks.toFunctionBlock(body))))));
- return implementor.result(physType, builder.toBlock());
- }
-
- public RexProgram getProgram() {
- return program;
- }
-}
-
-// End EnumerableCalc.java
http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalcRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalcRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalcRule.java
deleted file mode 100644
index b94ff57..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalcRule.java
+++ /dev/null
@@ -1,47 +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.LogicalCalc;
-
-/**
- * Rule to convert a {@link org.apache.calcite.rel.logical.LogicalCalc} to an
- * {@link EnumerableCalc}.
- */
-class EnumerableCalcRule extends ConverterRule {
- EnumerableCalcRule() {
- // The predicate ensures that if there's a multiset, FarragoMultisetSplitter
- // will work on it first.
- super(LogicalCalc.class, RelOptUtil.CALC_PREDICATE, Convention.NONE,
- EnumerableConvention.INSTANCE, "EnumerableCalcRule");
- }
-
- public RelNode convert(RelNode rel) {
- final LogicalCalc calc = (LogicalCalc) rel;
- final RelNode input = calc.getInput();
- return EnumerableCalc.create(
- convert(input,
- input.getTraitSet().replace(EnumerableConvention.INSTANCE)),
- calc.getProgram());
- }
-}
-
-// End EnumerableCalcRule.java
http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCollect.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCollect.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCollect.java
deleted file mode 100644
index 59c2776..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCollect.java
+++ /dev/null
@@ -1,71 +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.RelNode;
-import org.apache.calcite.rel.core.Collect;
-import org.apache.calcite.util.BuiltInMethod;
-
-/** Implementation of {@link org.apache.calcite.rel.core.Collect} in
- * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}. */
-public class EnumerableCollect extends Collect implements EnumerableRel {
- public EnumerableCollect(RelOptCluster cluster, RelTraitSet traitSet,
- RelNode child, String fieldName) {
- super(cluster, traitSet, child, fieldName);
- assert getConvention() instanceof EnumerableConvention;
- assert getConvention() == child.getConvention();
- }
-
- @Override public EnumerableCollect copy(RelTraitSet traitSet,
- RelNode newInput) {
- return new EnumerableCollect(getCluster(), traitSet, newInput, fieldName);
- }
-
- 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, Prefer.ARRAY);
- final PhysType physType =
- PhysTypeImpl.of(
- implementor.getTypeFactory(),
- getRowType(),
- JavaRowFormat.LIST);
-
- // final Enumerable<Employee> child = <<child adapter>>;
- // final List<Employee> list = child.toList();
- Expression child_ =
- builder.append(
- "child", result.block);
- Expression list_ =
- builder.append("list",
- Expressions.call(child_,
- BuiltInMethod.ENUMERABLE_TO_LIST.method));
-
- builder.add(
- Expressions.return_(null,
- Expressions.call(
- BuiltInMethod.SINGLETON_ENUMERABLE.method, list_)));
- return implementor.result(physType, builder.toBlock());
- }
-}
-
-// End EnumerableCollect.java
http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCollectRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCollectRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCollectRule.java
deleted file mode 100644
index 4ab49b4..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCollectRule.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.core.Collect;
-
-/**
- * Rule to convert an {@link org.apache.calcite.rel.core.Collect} to an
- * {@link EnumerableCollect}.
- */
-class EnumerableCollectRule extends ConverterRule {
- EnumerableCollectRule() {
- super(Collect.class, Convention.NONE, EnumerableConvention.INSTANCE,
- "EnumerableCollectRule");
- }
-
- public RelNode convert(RelNode rel) {
- final Collect collect = (Collect) rel;
- final RelTraitSet traitSet =
- collect.getTraitSet().replace(EnumerableConvention.INSTANCE);
- final RelNode input = collect.getInput();
- return new EnumerableCollect(
- rel.getCluster(),
- traitSet,
- convert(input,
- input.getTraitSet().replace(EnumerableConvention.INSTANCE)),
- collect.getFieldName());
- }
-}
-
-// End EnumerableCollectRule.java
http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableConvention.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableConvention.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableConvention.java
deleted file mode 100644
index ab3976f..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableConvention.java
+++ /dev/null
@@ -1,69 +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.ConventionTraitDef;
-import org.apache.calcite.plan.RelOptPlanner;
-import org.apache.calcite.plan.RelTrait;
-import org.apache.calcite.plan.RelTraitDef;
-import org.apache.calcite.plan.RelTraitSet;
-
-/**
- * Family of calling conventions that return results as an
- * {@link org.apache.calcite.linq4j.Enumerable}.
- */
-public enum EnumerableConvention implements Convention {
- INSTANCE;
-
- /** Cost of an enumerable node versus implementing an equivalent node in a
- * "typical" calling convention. */
- public static final double COST_MULTIPLIER = 1.0d;
-
- @Override public String toString() {
- return getName();
- }
-
- public Class getInterface() {
- return EnumerableRel.class;
- }
-
- public String getName() {
- return "ENUMERABLE";
- }
-
- public RelTraitDef getTraitDef() {
- return ConventionTraitDef.INSTANCE;
- }
-
- public boolean satisfies(RelTrait trait) {
- return this == trait;
- }
-
- public void register(RelOptPlanner planner) {}
-
- public boolean canConvertConvention(Convention toConvention) {
- return false;
- }
-
- public boolean useAbstractConvertersForConversion(RelTraitSet fromTraits,
- RelTraitSet toTraits) {
- return false;
- }
-}
-
-// End EnumerableConvention.java
http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelate.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelate.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelate.java
deleted file mode 100644
index 6085520..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelate.java
+++ /dev/null
@@ -1,117 +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.linq4j.tree.ParameterExpression;
-import org.apache.calcite.linq4j.tree.Primitive;
-import org.apache.calcite.plan.RelOptCluster;
-import org.apache.calcite.plan.RelTraitSet;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.core.Correlate;
-import org.apache.calcite.rel.core.CorrelationId;
-import org.apache.calcite.rel.core.JoinRelType;
-import org.apache.calcite.sql.SemiJoinType;
-import org.apache.calcite.util.BuiltInMethod;
-import org.apache.calcite.util.ImmutableBitSet;
-
-import com.google.common.collect.ImmutableList;
-
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Type;
-
-/** Implementation of {@link org.apache.calcite.rel.core.Correlate} in
- * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}. */
-public class EnumerableCorrelate extends Correlate
- implements EnumerableRel {
-
- public EnumerableCorrelate(RelOptCluster cluster, RelTraitSet traits,
- RelNode left, RelNode right,
- CorrelationId correlationId,
- ImmutableBitSet requiredColumns, SemiJoinType joinType) {
- super(cluster, traits, left, right, correlationId, requiredColumns,
- joinType);
- }
-
- @Override public EnumerableCorrelate copy(RelTraitSet traitSet,
- RelNode left, RelNode right, CorrelationId correlationId,
- ImmutableBitSet requiredColumns, SemiJoinType joinType) {
- return new EnumerableCorrelate(getCluster(),
- traitSet, left, right, correlationId, requiredColumns, joinType);
- }
-
- public Result implement(EnumerableRelImplementor implementor,
- Prefer pref) {
- final BlockBuilder builder = new BlockBuilder();
- final Result leftResult =
- implementor.visitChild(this, 0, (EnumerableRel) left, pref);
- Expression leftExpression =
- builder.append(
- "left", leftResult.block);
-
- final BlockBuilder corrBlock = new BlockBuilder();
- Type corrVarType = leftResult.physType.getJavaRowType();
- ParameterExpression corrRef; // correlate to be used in inner loop
- ParameterExpression corrArg; // argument to correlate lambda (must be boxed)
- if (!Primitive.is(corrVarType)) {
- corrArg =
- Expressions.parameter(Modifier.FINAL,
- corrVarType, getCorrelVariable());
- corrRef = corrArg;
- } else {
- corrArg =
- Expressions.parameter(Modifier.FINAL,
- Primitive.box(corrVarType), "$box" + getCorrelVariable());
- corrRef = (ParameterExpression) corrBlock.append(getCorrelVariable(),
- Expressions.unbox(corrArg));
- }
-
- implementor.registerCorrelVariable(getCorrelVariable(), corrRef,
- corrBlock, leftResult.physType);
-
- final Result rightResult =
- implementor.visitChild(this, 1, (EnumerableRel) right, pref);
-
- implementor.clearCorrelVariable(getCorrelVariable());
-
- corrBlock.add(rightResult.block);
-
- final PhysType physType =
- PhysTypeImpl.of(
- implementor.getTypeFactory(),
- getRowType(),
- pref.prefer(JavaRowFormat.CUSTOM));
-
- Expression selector =
- EnumUtils.joinSelector(
- joinType.returnsJustFirstInput() ? joinType.toJoinType()
- : JoinRelType.INNER, physType,
- ImmutableList.of(leftResult.physType, rightResult.physType));
-
- builder.append(
- Expressions.call(leftExpression, BuiltInMethod.CORRELATE_JOIN.method,
- Expressions.constant(joinType.toLinq4j()),
- Expressions.lambda(corrBlock.toBlock(), corrArg),
- selector));
-
- return implementor.result(physType, builder.toBlock());
- }
-}
-
-// End EnumerableCorrelate.java
http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelateRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelateRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelateRule.java
deleted file mode 100644
index eb08a27..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelateRule.java
+++ /dev/null
@@ -1,51 +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.LogicalCorrelate;
-
-/**
- * Implementation of nested loops over enumerable inputs.
- */
-public class EnumerableCorrelateRule extends ConverterRule {
- EnumerableCorrelateRule() {
- super(LogicalCorrelate.class, Convention.NONE,
- EnumerableConvention.INSTANCE, "EnumerableCorrelateRule");
- }
-
- public RelNode convert(RelNode rel) {
- final LogicalCorrelate c = (LogicalCorrelate) rel;
- final RelTraitSet traitSet =
- c.getTraitSet().replace(EnumerableConvention.INSTANCE);
- return new EnumerableCorrelate(
- rel.getCluster(),
- traitSet,
- convert(c.getLeft(), c.getLeft().getTraitSet()
- .replace(EnumerableConvention.INSTANCE)),
- convert(c.getRight(), c.getRight().getTraitSet()
- .replace(EnumerableConvention.INSTANCE)),
- c.getCorrelationId(),
- c.getRequiredColumns(),
- c.getJoinType());
- }
-}
-
-// End EnumerableCorrelateRule.java
http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilter.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilter.java
deleted file mode 100644
index 894ff16..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilter.java
+++ /dev/null
@@ -1,87 +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.RelDistribution;
-import org.apache.calcite.rel.RelDistributionTraitDef;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.core.Filter;
-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.RexNode;
-
-import com.google.common.base.Supplier;
-
-import java.util.List;
-
-/** Implementation of {@link org.apache.calcite.rel.core.Filter} in
- * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}. */
-public class EnumerableFilter
- extends Filter
- implements EnumerableRel {
- /** Creates an EnumerableFilter.
- *
- * <p>Use {@link #create} unless you know what you're doing. */
- public EnumerableFilter(
- RelOptCluster cluster,
- RelTraitSet traitSet,
- RelNode child,
- RexNode condition) {
- super(cluster, traitSet, child, condition);
- assert getConvention() instanceof EnumerableConvention;
- }
-
- /** Creates an EnumerableFilter. */
- public static EnumerableFilter create(final RelNode input,
- RexNode condition) {
- 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.filter(mq, input);
- }
- })
- .replaceIf(RelDistributionTraitDef.INSTANCE,
- new Supplier<RelDistribution>() {
- public RelDistribution get() {
- return RelMdDistribution.filter(mq, input);
- }
- });
- return new EnumerableFilter(cluster, traitSet, input, condition);
- }
-
- public EnumerableFilter copy(RelTraitSet traitSet, RelNode input,
- RexNode condition) {
- return new EnumerableFilter(getCluster(), traitSet, input, condition);
- }
-
- public Result implement(EnumerableRelImplementor implementor, Prefer pref) {
- // EnumerableCalc is always better
- throw new UnsupportedOperationException();
- }
-}
-
-// End EnumerableFilter.java
http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterRule.java
deleted file mode 100644
index 51fcdd4..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterRule.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.LogicalFilter;
-
-/**
- * Rule to convert a {@link org.apache.calcite.rel.logical.LogicalFilter} to an
- * {@link EnumerableFilter}.
- */
-class EnumerableFilterRule extends ConverterRule {
- EnumerableFilterRule() {
- super(LogicalFilter.class, RelOptUtil.FILTER_PREDICATE, Convention.NONE,
- EnumerableConvention.INSTANCE, "EnumerableFilterRule");
- }
-
- public RelNode convert(RelNode rel) {
- final LogicalFilter filter = (LogicalFilter) rel;
- return new EnumerableFilter(rel.getCluster(),
- rel.getTraitSet().replace(EnumerableConvention.INSTANCE),
- convert(filter.getInput(),
- filter.getInput().getTraitSet()
- .replace(EnumerableConvention.INSTANCE)),
- filter.getCondition());
- }
-}
-
-// End EnumerableFilterRule.java
http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterToCalcRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterToCalcRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterToCalcRule.java
deleted file mode 100644
index 9a61124..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterToCalcRule.java
+++ /dev/null
@@ -1,52 +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.rel.type.RelDataType;
-import org.apache.calcite.rex.RexBuilder;
-import org.apache.calcite.rex.RexProgram;
-import org.apache.calcite.rex.RexProgramBuilder;
-
-/** Variant of {@link org.apache.calcite.rel.rules.FilterToCalcRule} for
- * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}. */
-public class EnumerableFilterToCalcRule extends RelOptRule {
- EnumerableFilterToCalcRule() {
- super(operand(EnumerableFilter.class, any()));
- }
-
- public void onMatch(RelOptRuleCall call) {
- final EnumerableFilter filter = call.rel(0);
- final RelNode input = filter.getInput();
-
- // Create a program containing a filter.
- final RexBuilder rexBuilder = filter.getCluster().getRexBuilder();
- final RelDataType inputRowType = input.getRowType();
- final RexProgramBuilder programBuilder =
- new RexProgramBuilder(inputRowType, rexBuilder);
- programBuilder.addIdentity();
- programBuilder.addCondition(filter.getCondition());
- final RexProgram program = programBuilder.getProgram();
-
- final EnumerableCalc calc = EnumerableCalc.create(input, program);
- call.transformTo(calc);
- }
-}
-
-// End EnumerableFilterToCalcRule.java
http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpretable.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpretable.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpretable.java
deleted file mode 100644
index 19d5f2a..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpretable.java
+++ /dev/null
@@ -1,205 +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.avatica.Helper;
-import org.apache.calcite.interpreter.InterpretableConvention;
-import org.apache.calcite.interpreter.InterpretableRel;
-import org.apache.calcite.interpreter.Interpreter;
-import org.apache.calcite.interpreter.Node;
-import org.apache.calcite.interpreter.Row;
-import org.apache.calcite.interpreter.Sink;
-import org.apache.calcite.jdbc.CalcitePrepare;
-import org.apache.calcite.linq4j.AbstractEnumerable;
-import org.apache.calcite.linq4j.Enumerable;
-import org.apache.calcite.linq4j.Enumerator;
-import org.apache.calcite.linq4j.tree.ClassDeclaration;
-import org.apache.calcite.linq4j.tree.Expressions;
-import org.apache.calcite.plan.ConventionTraitDef;
-import org.apache.calcite.plan.RelOptCluster;
-import org.apache.calcite.plan.RelTraitSet;
-import org.apache.calcite.prepare.CalcitePrepareImpl;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.convert.ConverterImpl;
-import org.apache.calcite.runtime.ArrayBindable;
-import org.apache.calcite.runtime.Bindable;
-import org.apache.calcite.runtime.Hook;
-import org.apache.calcite.runtime.Typed;
-import org.apache.calcite.runtime.Utilities;
-import org.apache.calcite.util.Util;
-
-import org.codehaus.commons.compiler.CompileException;
-import org.codehaus.commons.compiler.CompilerFactoryFactory;
-import org.codehaus.commons.compiler.IClassBodyEvaluator;
-import org.codehaus.commons.compiler.ICompilerFactory;
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Relational expression that converts an enumerable input to interpretable
- * calling convention.
- *
- * @see EnumerableConvention
- * @see org.apache.calcite.interpreter.BindableConvention
- */
-public class EnumerableInterpretable extends ConverterImpl
- implements InterpretableRel {
- protected EnumerableInterpretable(RelOptCluster cluster, RelNode input) {
- super(cluster, ConventionTraitDef.INSTANCE,
- cluster.traitSetOf(InterpretableConvention.INSTANCE), input);
- }
-
- @Override public EnumerableInterpretable copy(RelTraitSet traitSet,
- List<RelNode> inputs) {
- return new EnumerableInterpretable(getCluster(), sole(inputs));
- }
-
- public Node implement(final InterpreterImplementor implementor) {
- final Bindable bindable = toBindable(implementor.internalParameters,
- implementor.spark, (EnumerableRel) getInput(),
- EnumerableRel.Prefer.ARRAY);
- final ArrayBindable arrayBindable = box(bindable);
- final Enumerable<Object[]> enumerable =
- arrayBindable.bind(implementor.dataContext);
- return new EnumerableNode(enumerable, implementor.interpreter, this);
- }
-
- public static Bindable toBindable(Map<String, Object> parameters,
- CalcitePrepare.SparkHandler spark, EnumerableRel rel,
- EnumerableRel.Prefer prefer) {
- EnumerableRelImplementor relImplementor =
- new EnumerableRelImplementor(rel.getCluster().getRexBuilder(),
- parameters);
-
- final ClassDeclaration expr = relImplementor.implementRoot(rel, prefer);
- String s = Expressions.toString(expr.memberDeclarations, "\n", false);
-
- if (CalcitePrepareImpl.DEBUG) {
- Util.debugCode(System.out, s);
- }
-
- Hook.JAVA_PLAN.run(s);
-
- try {
- if (spark != null && spark.enabled()) {
- return spark.compile(expr, s);
- } else {
- return getBindable(expr, s, rel.getRowType().getFieldCount());
- }
- } catch (Exception e) {
- throw Helper.INSTANCE.wrap("Error while compiling generated Java code:\n"
- + s, e);
- }
- }
-
- static ArrayBindable getArrayBindable(ClassDeclaration expr, String s,
- int fieldCount) throws CompileException, IOException {
- Bindable bindable = getBindable(expr, s, fieldCount);
- return box(bindable);
- }
-
- static Bindable getBindable(ClassDeclaration expr, String s, int fieldCount)
- throws CompileException, IOException {
- ICompilerFactory compilerFactory;
- try {
- compilerFactory = CompilerFactoryFactory.getDefaultCompilerFactory();
- } catch (Exception e) {
- throw new IllegalStateException(
- "Unable to instantiate java compiler", e);
- }
- IClassBodyEvaluator cbe = compilerFactory.newClassBodyEvaluator();
- cbe.setClassName(expr.name);
- cbe.setExtendedClass(Utilities.class);
- cbe.setImplementedInterfaces(
- fieldCount == 1
- ? new Class[] {Bindable.class, Typed.class}
- : new Class[] {ArrayBindable.class});
- cbe.setParentClassLoader(EnumerableInterpretable.class.getClassLoader());
- if (CalcitePrepareImpl.DEBUG) {
- // Add line numbers to the generated janino class
- cbe.setDebuggingInformation(true, true, true);
- }
- return (Bindable) cbe.createInstance(new StringReader(s));
- }
-
- /** Converts a bindable over scalar values into an array bindable, with each
- * row as an array of 1 element. */
- static ArrayBindable box(final Bindable bindable) {
- if (bindable instanceof ArrayBindable) {
- return (ArrayBindable) bindable;
- }
- return new ArrayBindable() {
- public Class<Object[]> getElementType() {
- return Object[].class;
- }
-
- public Enumerable<Object[]> bind(DataContext dataContext) {
- final Enumerable<?> enumerable = bindable.bind(dataContext);
- return new AbstractEnumerable<Object[]>() {
- public Enumerator<Object[]> enumerator() {
- final Enumerator<?> enumerator = enumerable.enumerator();
- return new Enumerator<Object[]>() {
- public Object[] current() {
- return new Object[] {enumerator.current()};
- }
-
- public boolean moveNext() {
- return enumerator.moveNext();
- }
-
- public void reset() {
- enumerator.reset();
- }
-
- public void close() {
- enumerator.close();
- }
- };
- }
- };
- }
- };
- }
-
- /** Interpreter node that reads from an {@link Enumerable}.
- *
- * <p>From the interpreter's perspective, it is a leaf node. */
- private static class EnumerableNode implements Node {
- private final Enumerable<Object[]> enumerable;
- private final Sink sink;
-
- public EnumerableNode(Enumerable<Object[]> enumerable,
- Interpreter interpreter, EnumerableInterpretable rel) {
- this.enumerable = enumerable;
- this.sink = interpreter.sink(rel);
- }
-
- public void run() throws InterruptedException {
- final Enumerator<Object[]> enumerator = enumerable.enumerator();
- while (enumerator.moveNext()) {
- Object[] values = enumerator.current();
- sink.send(Row.of(values));
- }
- }
- }
-}
-
-// End EnumerableInterpretable.java
http://git-wip-us.apache.org/repos/asf/calcite-avatica/blob/fc7b26c8/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpreter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpreter.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpreter.java
deleted file mode 100644
index 1c53483..0000000
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpreter.java
+++ /dev/null
@@ -1,104 +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.interpreter.Interpreter;
-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.RelNode;
-import org.apache.calcite.rel.SingleRel;
-import org.apache.calcite.rel.metadata.RelMetadataQuery;
-import org.apache.calcite.util.BuiltInMethod;
-
-import java.util.List;
-
-/** Relational expression that executes its children using an interpreter.
- *
- * <p>Although quite a few kinds of {@link org.apache.calcite.rel.RelNode} can
- * be interpreted, this is only created by default for
- * {@link org.apache.calcite.schema.FilterableTable} and
- * {@link org.apache.calcite.schema.ProjectableFilterableTable}.
- */
-public class EnumerableInterpreter extends SingleRel
- implements EnumerableRel {
- private final double factor;
-
- /**
- * Creates an EnumerableInterpreter.
- *
- * <p>Use {@link #create} unless you know what you're doing.
- *
- * @param cluster Cluster
- * @param traitSet Traits
- * @param input Input relation
- * @param factor Cost multiply factor
- */
- public EnumerableInterpreter(RelOptCluster cluster, RelTraitSet traitSet,
- RelNode input, double factor) {
- super(cluster, traitSet, input);
- assert getConvention() instanceof EnumerableConvention;
- this.factor = factor;
- }
-
- /**
- * Creates an EnumerableInterpreter.
- *
- * @param input Input relation
- * @param factor Cost multiply factor
- */
- public static EnumerableInterpreter create(RelNode input, double factor) {
- final RelTraitSet traitSet = input.getTraitSet()
- .replace(EnumerableConvention.INSTANCE);
- return new EnumerableInterpreter(input.getCluster(), traitSet, input,
- factor);
- }
-
- @Override public RelOptCost computeSelfCost(RelOptPlanner planner,
- RelMetadataQuery mq) {
- return super.computeSelfCost(planner, mq).multiplyBy(factor);
- }
-
- @Override public RelNode copy(RelTraitSet traitSet, List<RelNode> inputs) {
- return new EnumerableInterpreter(getCluster(), traitSet, sole(inputs),
- factor);
- }
-
- public Result implement(EnumerableRelImplementor implementor, Prefer pref) {
- final JavaTypeFactory typeFactory = implementor.getTypeFactory();
- final BlockBuilder builder = new BlockBuilder();
- final PhysType physType =
- PhysTypeImpl.of(typeFactory, getRowType(), JavaRowFormat.ARRAY);
- final Expression interpreter_ = builder.append("interpreter",
- Expressions.new_(Interpreter.class,
- implementor.getRootExpression(),
- implementor.stash(getInput(), RelNode.class)));
- final Expression sliced_ =
- getRowType().getFieldCount() == 1
- ? Expressions.call(BuiltInMethod.SLICE0.method, interpreter_)
- : interpreter_;
- builder.add(sliced_);
- return implementor.result(physType, builder.toBlock());
- }
-}
-
-// End EnumerableInterpreter.java