use of io.confluent.ksql.execution.plan.Formats in project ksql by confluentinc.
the class EngineExecutor method sourceTablePlan.
@SuppressFBWarnings(value = "NP_NULL_PARAM_DEREF_NONVIRTUAL")
private KsqlPlan sourceTablePlan(final ConfiguredStatement<?> statement) {
final CreateTable createTable = (CreateTable) statement.getStatement();
final CreateTableCommand ddlCommand = (CreateTableCommand) engineContext.createDdlCommand(statement.getStatementText(), (ExecutableDdlStatement) statement.getStatement(), config);
final Relation from = new AliasedRelation(new Table(createTable.getName()), createTable.getName());
// Only VALUE or HEADER columns must be selected from the source table. When running a
// pull query, the keys are added if selecting all columns.
final Select select = new Select(createTable.getElements().stream().filter(column -> !column.getConstraints().isKey() && !column.getConstraints().isPrimaryKey()).map(column -> new SingleColumn(new UnqualifiedColumnReferenceExp(column.getName()), Optional.of(column.getName()))).collect(Collectors.toList()));
// Source table need to keep emitting changes so every new record is materialized for
// pull query availability.
final RefinementInfo refinementInfo = RefinementInfo.of(OutputRefinement.CHANGES);
// This is a plan for a `select * from <source-table> emit changes` statement,
// without a sink topic to write the results. The query is just made to materialize the
// source table.
final Query query = new Query(Optional.empty(), select, from, Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.of(refinementInfo), false, OptionalInt.empty());
// The source table does not exist in the current metastore, so a temporary metastore that
// contains only the source table is created here. This metastore is used later to create
// ExecutorsPlan.
final MutableMetaStore tempMetastore = new MetaStoreImpl(new InternalFunctionRegistry());
final Formats formats = ddlCommand.getFormats();
tempMetastore.putSource(new KsqlTable<>(statement.getStatementText(), createTable.getName(), ddlCommand.getSchema(), Optional.empty(), false, new KsqlTopic(ddlCommand.getTopicName(), KeyFormat.of(formats.getKeyFormat(), formats.getKeyFeatures(), Optional.empty()), ValueFormat.of(formats.getValueFormat(), formats.getValueFeatures())), true), false);
final ExecutorPlans plans = planQuery(statement, query, Optional.empty(), Optional.empty(), tempMetastore);
final KsqlBareOutputNode outputNode = (KsqlBareOutputNode) plans.logicalPlan.getNode().get();
final QueryPlan queryPlan = new QueryPlan(getSourceNames(outputNode), Optional.empty(), plans.physicalPlan.getPhysicalPlan(), plans.physicalPlan.getQueryId(), getApplicationId(plans.physicalPlan.getQueryId(), getSourceNames(outputNode)));
engineContext.createQueryValidator().validateQuery(config, plans.physicalPlan, engineContext.getQueryRegistry().getAllLiveQueries());
return KsqlPlan.queryPlanCurrent(statement.getStatementText(), Optional.of(ddlCommand), queryPlan);
}
use of io.confluent.ksql.execution.plan.Formats in project ksql by confluentinc.
the class CreateSourceFactory method buildFormats.
private Formats buildFormats(final SourceName name, final LogicalSchema schema, final CreateSourceProperties props, final KsqlConfig ksqlConfig) {
final FormatInfo keyFormat = SourcePropertiesUtil.getKeyFormat(props, name);
final FormatInfo valueFormat = SourcePropertiesUtil.getValueFormat(props);
final SerdeFeatures keyFeatures = keySerdeFeaturesSupplier.build(schema, FormatFactory.of(keyFormat), SerdeFeatures.of(), ksqlConfig);
final SerdeFeatures valFeatures = valueSerdeFeaturesSupplier.build(schema, FormatFactory.of(valueFormat), props.getValueSerdeFeatures(), ksqlConfig);
final Formats formats = Formats.of(keyFormat, valueFormat, keyFeatures, valFeatures);
validateSerdesCanHandleSchemas(ksqlConfig, schema, formats);
return formats;
}
use of io.confluent.ksql.execution.plan.Formats in project ksql by confluentinc.
the class TableGroupByBuilderBase method build.
public <K> KGroupedTableHolder build(final KTableHolder<K> table, final QueryContext queryContext, final Formats formats, final List<Expression> groupByExpressions) {
final LogicalSchema sourceSchema = table.getSchema();
final List<CompiledExpression> groupBy = CodeGenRunner.compileExpressions(groupByExpressions.stream(), "Group By", sourceSchema, buildContext.getKsqlConfig(), buildContext.getFunctionRegistry());
final ProcessingLogger logger = buildContext.getProcessingLogger(queryContext);
final GroupByParams params = paramsFactory.build(sourceSchema, groupBy, logger);
final PhysicalSchema physicalSchema = PhysicalSchema.from(params.getSchema(), formats.getKeyFeatures(), formats.getValueFeatures());
final Serde<GenericKey> keySerde = buildContext.buildKeySerde(formats.getKeyFormat(), physicalSchema, queryContext);
final Serde<GenericRow> valSerde = buildContext.buildValueSerde(formats.getValueFormat(), physicalSchema, queryContext);
final Grouped<GenericKey, GenericRow> grouped = groupedFactory.create(StreamsUtil.buildOpName(queryContext), keySerde, valSerde);
final KGroupedTable<GenericKey, GenericRow> groupedTable = table.getTable().filter((k, v) -> v != null).groupBy(new TableKeyValueMapper<>(params.getMapper()), grouped);
return KGroupedTableHolder.of(groupedTable, params.getSchema());
}
use of io.confluent.ksql.execution.plan.Formats in project ksql by confluentinc.
the class TableSelectBuilder method build.
@SuppressWarnings("unchecked")
public static <K> KTableHolder<K> build(final KTableHolder<K> table, final TableSelect<K> step, final RuntimeBuildContext buildContext, final Optional<Formats> formats, final MaterializedFactory materializedFactory) {
final LogicalSchema sourceSchema = table.getSchema();
final QueryContext queryContext = step.getProperties().getQueryContext();
final Selection<K> selection = Selection.of(sourceSchema, step.getKeyColumnNames(), step.getSelectExpressions(), buildContext.getKsqlConfig(), buildContext.getFunctionRegistry());
final SelectValueMapper<K> selectMapper = selection.getMapper();
final ProcessingLogger logger = buildContext.getProcessingLogger(queryContext);
final Named selectName = Named.as(StreamsUtil.buildOpName(queryContext));
final Optional<MaterializationInfo.Builder> matBuilder = table.getMaterializationBuilder();
final boolean forceMaterialize = !matBuilder.isPresent();
final Serde<K> keySerde;
final Serde<GenericRow> valSerde;
if (formats.isPresent()) {
final Formats materializationFormat = formats.get();
final PhysicalSchema physicalSchema = PhysicalSchema.from(selection.getSchema(), materializationFormat.getKeyFeatures(), materializationFormat.getValueFeatures());
keySerde = (Serde<K>) buildContext.buildKeySerde(materializationFormat.getKeyFormat(), physicalSchema, queryContext);
valSerde = buildContext.buildValueSerde(materializationFormat.getValueFormat(), physicalSchema, queryContext);
if (forceMaterialize) {
final Stacker stacker = Stacker.of(step.getProperties().getQueryContext());
final String stateStoreName = StreamsUtil.buildOpName(stacker.push(PROJECT_OP).getQueryContext());
final Materialized<K, GenericRow, KeyValueStore<Bytes, byte[]>> materialized = materializedFactory.create(keySerde, valSerde, stateStoreName);
final KTable<K, GenericRow> transFormedTable = table.getTable().transformValues(() -> new KsTransformer<>(selectMapper.getTransformer(logger)), materialized);
return KTableHolder.materialized(transFormedTable, selection.getSchema(), table.getExecutionKeyFactory(), MaterializationInfo.builder(stateStoreName, selection.getSchema()));
}
} else {
keySerde = null;
valSerde = null;
}
final KTable<K, GenericRow> transFormedTable = table.getTable().transformValues(() -> new KsTransformer<>(selectMapper.getTransformer(logger)), Materialized.with(keySerde, valSerde), selectName);
final Optional<MaterializationInfo.Builder> materialization = matBuilder.map(b -> b.map(pl -> (KsqlTransformer<Object, GenericRow>) selectMapper.getTransformer(pl), selection.getSchema(), queryContext));
return table.withTable(transFormedTable, selection.getSchema()).withMaterialization(materialization);
}
use of io.confluent.ksql.execution.plan.Formats in project ksql by confluentinc.
the class SchemaKStream method leftJoin.
public SchemaKStream<K> leftJoin(final SchemaKTable<K> schemaKTable, final ColumnName keyColName, final FormatInfo leftValueFormat, final Stacker contextStacker) {
throwOnJoinKeyFormatsMismatch(schemaKTable);
final Formats fmts = InternalFormats.of(keyFormat, leftValueFormat);
final StreamTableJoin<K> step = ExecutionStepFactory.streamTableJoin(contextStacker, JoinType.LEFT, keyColName, fmts, sourceStep, schemaKTable.getSourceTableStep());
return new SchemaKStream<>(step, resolveSchema(step, schemaKTable), keyFormat, ksqlConfig, functionRegistry);
}
Aggregations