/** * Creates a {@link TableScanFactory} that uses a * {@link org.apache.calcite.plan.RelOptTable.ViewExpander} to handle * {@link TranslatableTable} instances, and falls back to a default * factory for other tables. * * @param viewExpander View expander * @param tableScanFactory Factory for non-translatable tables * @return Table scan factory */ @Nonnull public static TableScanFactory expandingScanFactory( @Nonnull RelOptTable.ViewExpander viewExpander, @Nonnull TableScanFactory tableScanFactory) { return (cluster, table) -> { final TranslatableTable translatableTable = table.unwrap(TranslatableTable.class); if (translatableTable != null) { final RelOptTable.ToRelContext toRelContext = ViewExpanders.toRelContext(viewExpander, cluster); return translatableTable.toRel(toRelContext, table); } return tableScanFactory.createScan(cluster, table); }; }
private boolean isDiffDbFromEachOther(TranslatableTable left, TranslatableTable right) { return ! left.getBaseName().toLowerCase().equals(right.getBaseName().toLowerCase()); }
public RelDataType validateImpl(RelDataType targetRowType) { validator.inferUnknownTypes(validator.unknownType, scope, call); final RelDataType type = validator.deriveTypeImpl(scope, call); final SqlOperator operator = call.getOperator(); final SqlCallBinding callBinding = new SqlCallBinding(validator, scope, call); if (operator instanceof SqlUserDefinedTableFunction) { assert type.getSqlTypeName() == SqlTypeName.CURSOR : "User-defined table function should have CURSOR type, not " + type; final SqlUserDefinedTableFunction udf = (SqlUserDefinedTableFunction) operator; return udf.getRowType(validator.typeFactory, callBinding.operands()); } else if (operator instanceof SqlUserDefinedTableMacro) { assert type.getSqlTypeName() == SqlTypeName.CURSOR : "User-defined table macro should have CURSOR type, not " + type; final SqlUserDefinedTableMacro udf = (SqlUserDefinedTableMacro) operator; return udf.getTable(validator.typeFactory, callBinding.operands()) .getRowType(validator.typeFactory); } return type; }
public RelDataType validateImpl(RelDataType targetRowType) { validator.inferUnknownTypes(validator.unknownType, scope, call); final RelDataType type = validator.deriveTypeImpl(scope, call); final SqlOperator operator = call.getOperator(); final SqlCallBinding callBinding = new SqlCallBinding(validator, scope, call); if (operator instanceof SqlUserDefinedTableFunction) { assert type.getSqlTypeName() == SqlTypeName.CURSOR : "User-defined table function should have CURSOR type, not " + type; final SqlUserDefinedTableFunction udf = (SqlUserDefinedTableFunction) operator; return udf.getRowType(validator.typeFactory, callBinding.operands()); } else if (operator instanceof SqlUserDefinedTableMacro) { assert type.getSqlTypeName() == SqlTypeName.CURSOR : "User-defined table macro should have CURSOR type, not " + type; final SqlUserDefinedTableMacro udf = (SqlUserDefinedTableMacro) operator; return udf.getTable(validator.typeFactory, callBinding.operands()) .getRowType(validator.typeFactory); } return type; }
final TranslatableTable table = udf.getTable(typeFactory, callBinding.operands()); final RelDataType rowType = table.getRowType(typeFactory); RelOptTable relOptTable = RelOptTableImpl.create(null, rowType, table, udf.getNameAsId().names);
@Override public RelNode visit(TableScan scan) { final RelOptTable table = scan.getTable(); final TranslatableTable translatableTable = table.unwrap(TranslatableTable.class); if (translatableTable != null) { return translatableTable.toRel(context, table); } return super.visit(scan); } });
final TranslatableTable table = udf.getTable(typeFactory, callBinding.operands()); final RelDataType rowType = table.getRowType(typeFactory); RelOptTable relOptTable = RelOptTableImpl.create(null, rowType, table, udf.getNameAsId().names);
@Override public RelNode toRel(RelOptTable.ToRelContext context, RelOptTable relOptTable) { final CalciteSchema.TableEntry tableEntry = MaterializationService.instance().checkValid(key); if (tableEntry != null) { Table materializeTable = tableEntry.getTable(); if (materializeTable instanceof TranslatableTable) { TranslatableTable table = (TranslatableTable) materializeTable; return table.toRel(context, relOptTable); } } return super.toRel(context, relOptTable); }
final TranslatableTable table = udf.getTable(typeFactory, callBinding.operands()); final RelDataType rowType = table.getRowType(typeFactory); RelOptTable relOptTable = RelOptTableImpl.create(null, rowType, table, udf.getNameAsId().names);
@Override public RelNode toRel(RelOptTable.ToRelContext context, RelOptTable relOptTable) { final CalciteSchema.TableEntry tableEntry = MaterializationService.instance().checkValid(key); if (tableEntry != null) { Table materializeTable = tableEntry.getTable(); if (materializeTable instanceof TranslatableTable) { TranslatableTable table = (TranslatableTable) materializeTable; return table.toRel(context, relOptTable); } } return super.toRel(context, relOptTable); }
final TranslatableTable table = udf.getTable(typeFactory, callBinding.operands()); final RelDataType rowType = table.getRowType(typeFactory); RelOptTable relOptTable = RelOptTableImpl.create(null, rowType, table, udf.getNameAsId().names);
RelNode toRel(Queryable<T> queryable) { if (queryable instanceof QueryableDefaults.Replayable) { //noinspection unchecked ((QueryableDefaults.Replayable) queryable).replay(this); return rel; } if (queryable instanceof AbstractTableQueryable) { final AbstractTableQueryable tableQueryable = (AbstractTableQueryable) queryable; final QueryableTable table = tableQueryable.table; final CalciteSchema.TableEntry tableEntry = CalciteSchema.from(tableQueryable.schema) .add(tableQueryable.tableName, tableQueryable.table); final RelOptTableImpl relOptTable = RelOptTableImpl.create(null, table.getRowType(translator.typeFactory), tableEntry, null); if (table instanceof TranslatableTable) { return ((TranslatableTable) table).toRel(translator, relOptTable); } else { return LogicalTableScan.create(translator.cluster, relOptTable); } } return translator.translate(queryable.getExpression()); }
RelNode toRel(Queryable<T> queryable) { if (queryable instanceof QueryableDefaults.Replayable) { //noinspection unchecked ((QueryableDefaults.Replayable) queryable).replay(this); return rel; } if (queryable instanceof AbstractTableQueryable) { final AbstractTableQueryable tableQueryable = (AbstractTableQueryable) queryable; final QueryableTable table = tableQueryable.table; final CalciteSchema.TableEntry tableEntry = CalciteSchema.from(tableQueryable.schema) .add(tableQueryable.tableName, tableQueryable.table); final RelOptTableImpl relOptTable = RelOptTableImpl.create(null, table.getRowType(translator.typeFactory), tableEntry, null); if (table instanceof TranslatableTable) { return ((TranslatableTable) table).toRel(translator.toRelContext(), relOptTable); } else { return LogicalTableScan.create(translator.cluster, relOptTable); } } return translator.translate(queryable.getExpression()); }
return ((TranslatableTable) table).toRel(context, this);
return ((TranslatableTable) table).toRel(context, this);