in piglet/src/main/java/org/apache/calcite/piglet/Handler.java [53:173]
public Handler handle(Ast.Node node) {
final RelNode input;
final List<RexNode> rexNodes;
switch (node.op) {
case LOAD:
final Ast.LoadStmt load = (Ast.LoadStmt) node;
builder.scan((String) load.name.value);
register(load.target.value);
return this;
case VALUES:
final Ast.ValuesStmt values = (Ast.ValuesStmt) node;
final RelDataType rowType = toType(values.schema);
builder.values(tuples(values, rowType), rowType);
register(values.target.value);
return this;
case FOREACH:
final Ast.ForeachStmt foreach = (Ast.ForeachStmt) node;
builder.clear();
input = map.get(foreach.source.value);
builder.push(input);
rexNodes = new ArrayList<>();
for (Ast.Node exp : foreach.expList) {
rexNodes.add(toRex(exp));
}
builder.project(rexNodes);
register(foreach.target.value);
return this;
case FOREACH_NESTED:
final Ast.ForeachNestedStmt foreachNested = (Ast.ForeachNestedStmt) node;
builder.clear();
input = map.get(foreachNested.source.value);
builder.push(input);
System.out.println(input.getRowType());
for (RelDataTypeField field : input.getRowType().getFieldList()) {
switch (field.getType().getSqlTypeName()) {
case ARRAY:
System.out.println(field);
break;
default:
break;
}
}
for (Ast.Stmt stmt : foreachNested.nestedStmtList) {
handle(stmt);
}
rexNodes = new ArrayList<>();
for (Ast.Node exp : foreachNested.expList) {
rexNodes.add(toRex(exp));
}
builder.project(rexNodes);
register(foreachNested.target.value);
return this;
case FILTER:
final Ast.FilterStmt filter = (Ast.FilterStmt) node;
builder.clear();
input = map.get(filter.source.value);
builder.push(input);
final RexNode rexNode = toRex(filter.condition);
builder.filter(rexNode);
register(filter.target.value);
return this;
case DISTINCT:
final Ast.DistinctStmt distinct = (Ast.DistinctStmt) node;
builder.clear();
input = map.get(distinct.source.value);
builder.push(input);
builder.distinct(null, -1);
register(distinct.target.value);
return this;
case ORDER:
final Ast.OrderStmt order = (Ast.OrderStmt) node;
builder.clear();
input = map.get(order.source.value);
builder.push(input);
final List<RexNode> nodes = new ArrayList<>();
for (Pair<Ast.Identifier, Ast.Direction> field : order.fields) {
toSortRex(nodes, field);
}
builder.sort(nodes);
register(order.target.value);
return this;
case LIMIT:
final Ast.LimitStmt limit = (Ast.LimitStmt) node;
builder.clear();
input = map.get(limit.source.value);
final int count = ((Number) limit.count.value).intValue();
builder.push(input);
builder.limit(0, count);
register(limit.target.value);
return this;
case GROUP:
final Ast.GroupStmt group = (Ast.GroupStmt) node;
builder.clear();
input = map.get(group.source.value);
builder.push(input).as(group.source.value);
final List<RelBuilder.GroupKey> groupKeys = new ArrayList<>();
final List<RexNode> keys = new ArrayList<>();
if (group.keys != null) {
for (Ast.Node key : group.keys) {
keys.add(toRex(key));
}
}
groupKeys.add(builder.groupKey(keys));
builder.group(PigRelBuilder.GroupOption.COLLECTED, null, -1, groupKeys);
register(group.target.value);
return this;
case PROGRAM:
final Ast.Program program = (Ast.Program) node;
for (Ast.Stmt stmt : program.stmtList) {
handle(stmt);
}
return this;
case DUMP:
final Ast.DumpStmt dump = (Ast.DumpStmt) node;
final RelNode relNode = map.get(dump.relation.value);
dump(relNode);
return this; // nothing to do; contains no algebra
default:
throw new AssertionError("unknown operation " + node.op);
}
}