// multiMap.clear(); // allows gc
// source = Linq4j.asEnumerable(list);
}
public Result implement(EnumerableRelImplementor implementor, Prefer pref) {
final JavaTypeFactory typeFactory = implementor.getTypeFactory();
final EnumerableRel child = (EnumerableRel) getChild();
final BlockBuilder builder = new BlockBuilder();
final Result result = implementor.visitChild(this, 0, child, pref);
Expression source_ = builder.append("source", result.block);
final List<Expression> translatedConstants =
new ArrayList<Expression>(constants.size());
for (RexLiteral constant : constants) {
translatedConstants.add(RexToLixTranslator.translateLiteral(
constant, constant.getType(),
typeFactory,
RexImpTable.NullAs.NULL));
}
PhysType inputPhysType = result.physType;
ParameterExpression prevStart =
Expressions.parameter(int.class, builder.newName("prevStart"));
ParameterExpression prevEnd =
Expressions.parameter(int.class, builder.newName("prevEnd"));
builder.add(Expressions.declare(0, prevStart, null));
builder.add(Expressions.declare(0, prevEnd, null));
for (int windowIdx = 0; windowIdx < windows.size(); windowIdx++) {
Window window = windows.get(windowIdx);
// Comparator:
// final Comparator<JdbcTest.Employee> comparator =
// new Comparator<JdbcTest.Employee>() {
// public int compare(JdbcTest.Employee o1,
// JdbcTest.Employee o2) {
// return Integer.compare(o1.empid, o2.empid);
// }
// };
final Expression comparator_ =
builder.append(
"comparator",
inputPhysType.generateComparator(
window.collation()));
Pair<Expression, Expression> partitionIterator =
getPartitionIterator(builder, source_, inputPhysType, window,
comparator_);
final Expression collectionExpr = partitionIterator.left;
final Expression iterator_ = partitionIterator.right;
List<AggImpState> aggs = new ArrayList<AggImpState>();
List<AggregateCall> aggregateCalls = window.getAggregateCalls(this);
for (int aggIdx = 0; aggIdx < aggregateCalls.size(); aggIdx++) {
AggregateCall call = aggregateCalls.get(aggIdx);
aggs.add(new AggImpState(aggIdx, call, true));
}
// The output from this stage is the input plus the aggregate functions.
final RelDataTypeFactory.FieldInfoBuilder typeBuilder =
typeFactory.builder();
typeBuilder.addAll(inputPhysType.getRowType().getFieldList());
for (AggImpState agg : aggs) {
typeBuilder.add(agg.call.name, agg.call.type);
}
RelDataType outputRowType = typeBuilder.build();