@Override public void onMatch(RelOptRuleCall call) { final EnumerableTableScan access = call.rel(0); final RelTraitSet traits = access.getTraitSet().plus(DrillRel.DRILL_LOGICAL); call.transformTo(new DrillScanRel(access.getCluster(), traits, access.getTable())); } }
@Override public RelNode convert(RelNode rel) { LogicalTableScan scan = (LogicalTableScan) rel; final RelOptTable relOptTable = scan.getTable(); final Table table = relOptTable.unwrap(Table.class); if (!EnumerableTableScan.canHandle(table)) { return null; } final Expression expression = relOptTable.getExpression(Object.class); if (expression == null) { return null; } return EnumerableTableScan.create(scan.getCluster(), relOptTable); } }
public static JavaRowFormat deduceFormat(RelOptTable table) { final Class elementType = deduceElementType(table.unwrap(Table.class)); return elementType == Object[].class ? JavaRowFormat.ARRAY : JavaRowFormat.CUSTOM; }
@Override public RelNode copy(RelTraitSet traitSet, List<RelNode> inputs) { return new EnumerableTableScan(getCluster(), traitSet, table, elementType); }
public Result implement(EnumerableRelImplementor implementor, Prefer pref) { // Note that representation is ARRAY. This assumes that the table // returns a Object[] for each record. Actually a Table<T> can // return any type T. And, if it is a JdbcTable, we'd like to be // able to generate alternate accessors that return e.g. synthetic // records {T0 f0; T1 f1; ...} and don't box every primitive value. final PhysType physType = PhysTypeImpl.of( implementor.getTypeFactory(), getRowType(), format()); final Expression expression = getExpression(physType); return implementor.result(physType, Blocks.toBlock(expression)); } }
public RelNode convert(RelNode rel) { final EnumerableTableScan scan = (EnumerableTableScan) rel; return new MockJdbcTableScan(scan.getCluster(), scan.getTable(), (JdbcConvention) getOutConvention()); } }
public RelNode toRel(RelOptTable.ToRelContext context, RelOptTable relOptTable) { return EnumerableTableScan.create(context.getCluster(), relOptTable); } }
private Expression toRows(PhysType physType, Expression expression) { if (physType.getFormat() == JavaRowFormat.SCALAR && Object[].class.isAssignableFrom(elementType) && getRowType().getFieldCount() == 1 && (table.unwrap(ScannableTable.class) != null || table.unwrap(FilterableTable.class) != null || table.unwrap(ProjectableFilterableTable.class) != null)) { return Expressions.call(BuiltInMethod.SLICE0.method, expression); } JavaRowFormat oldFormat = format(); if (physType.getFormat() == oldFormat && !hasCollectionField(rowType)) { return expression; } final ParameterExpression row_ = Expressions.parameter(elementType, "row"); final int fieldCount = table.getRowType().getFieldCount(); List<Expression> expressionList = new ArrayList<>(fieldCount); for (int i = 0; i < fieldCount; i++) { expressionList.add(fieldExpression(row_, i, physType, oldFormat)); } return Expressions.call(expression, BuiltInMethod.SELECT.method, Expressions.lambda(Function1.class, physType.record(expressionList), row_)); }
public void onMatch(RelOptRuleCall call) { EnumerableTableScan rel = call.rel(0); call.transformTo(new PhysTable(rel.getCluster())); } }
/** Creates an EnumerableTableScan. */ public static EnumerableTableScan create(RelOptCluster cluster, RelOptTable relOptTable) { final Table table = relOptTable.unwrap(Table.class); Class elementType = EnumerableTableScan.deduceElementType(table); final RelTraitSet traitSet = cluster.traitSetOf(EnumerableConvention.INSTANCE) .replaceIfs(RelCollationTraitDef.INSTANCE, () -> { if (table != null) { return table.getStatistic().getCollations(); } return ImmutableList.of(); }); return new EnumerableTableScan(cluster, traitSet, relOptTable, elementType); }
private PlannerOp planEnumerableTableScan(EnumerableTableScan scan, RelDataType rowType) { final String tableSpace = scan.getTable().getQualifiedName().get(0); final TableImpl tableImpl = (TableImpl) scan.getTable().unwrap(org.apache.calcite.schema.Table.class ); Table table = tableImpl.tableManager.getTable(); ScanStatement scanStatement = new ScanStatement(tableSpace, table, null); return new TableScanOp(scanStatement); }
/** Creates an EnumerableTableScan. * * <p>Use {@link #create} unless you know what you are doing. */ public EnumerableTableScan(RelOptCluster cluster, RelTraitSet traitSet, RelOptTable table, Class elementType) { super(cluster, traitSet, table); assert getConvention() instanceof EnumerableConvention; this.elementType = elementType; }
final JavaTypeFactory typeFactory = (JavaTypeFactory) getCluster().getTypeFactory(); final JavaRowFormat format = EnumerableTableScan.deduceFormat(table); PhysType physType = PhysTypeImpl.of(typeFactory, table.getRowType(), format);
public RelNode convert(RelNode rel) { final EnumerableTableScan scan = (EnumerableTableScan) rel; return new MockJdbcTableScan(scan.getCluster(), scan.getTable(), (JdbcConvention) getOutConvention()); } }
public RelNode toRel(RelOptTable.ToRelContext context, RelOptTable relOptTable) { return EnumerableTableScan.create(context.getCluster(), relOptTable); }
private Expression toRows(PhysType physType, Expression expression) { if (physType.getFormat() == JavaRowFormat.SCALAR && Object[].class.isAssignableFrom(elementType) && getRowType().getFieldCount() == 1 && (table.unwrap(ScannableTable.class) != null || table.unwrap(FilterableTable.class) != null || table.unwrap(ProjectableFilterableTable.class) != null)) { return Expressions.call(BuiltInMethod.SLICE0.method, expression); } JavaRowFormat oldFormat = format(); if (physType.getFormat() == oldFormat && !hasCollectionField(rowType)) { return expression; } final ParameterExpression row_ = Expressions.parameter(elementType, "row"); final int fieldCount = table.getRowType().getFieldCount(); List<Expression> expressionList = new ArrayList<>(fieldCount); for (int i = 0; i < fieldCount; i++) { expressionList.add(fieldExpression(row_, i, physType, oldFormat)); } return Expressions.call(expression, BuiltInMethod.SELECT.method, Expressions.lambda(Function1.class, physType.record(expressionList), row_)); }
public void onMatch(RelOptRuleCall call) { EnumerableTableScan rel = call.rel(0); call.transformTo(new PhysTable(rel.getCluster())); } }
@Override public RelNode copy(RelTraitSet traitSet, List<RelNode> inputs) { return new EnumerableTableScan(getCluster(), traitSet, table, elementType); }
public Result implement(EnumerableRelImplementor implementor, Prefer pref) { // Note that representation is ARRAY. This assumes that the table // returns a Object[] for each record. Actually a Table<T> can // return any type T. And, if it is a JdbcTable, we'd like to be // able to generate alternate accessors that return e.g. synthetic // records {T0 f0; T1 f1; ...} and don't box every primitive value. final PhysType physType = PhysTypeImpl.of( implementor.getTypeFactory(), getRowType(), format()); final Expression expression = getExpression(physType); return implementor.result(physType, Blocks.toBlock(expression)); } }
/** Creates an EnumerableTableScan. */ public static EnumerableTableScan create(RelOptCluster cluster, RelOptTable relOptTable) { final Table table = relOptTable.unwrap(Table.class); Class elementType = EnumerableTableScan.deduceElementType(table); final RelTraitSet traitSet = cluster.traitSetOf(EnumerableConvention.INSTANCE) .replaceIfs(RelCollationTraitDef.INSTANCE, () -> { if (table != null) { return table.getStatistic().getCollations(); } return ImmutableList.of(); }); return new EnumerableTableScan(cluster, traitSet, relOptTable, elementType); }