Search in sources :

Example 6 with PlanInfo

use of io.confluent.ksql.execution.plan.PlanInfo in project ksql by confluentinc.

the class SourceBuilderV1 method buildKTable.

@Override
<K> KTable<K, GenericRow> buildKTable(final SourceStep<?> streamSource, final RuntimeBuildContext buildContext, final Consumed<K, GenericRow> consumed, final Function<K, Collection<?>> keyGenerator, final Materialized<K, GenericRow, KeyValueStore<Bytes, byte[]>> materialized, final Serde<GenericRow> valueSerde, final String stateStoreName, final PlanInfo planInfo) {
    validateNotUsingOldExecutionStepWithNewQueries(streamSource);
    final boolean forceChangelog = streamSource instanceof TableSourceV1 && ((TableSourceV1) streamSource).isForceChangelog();
    final KTable<K, GenericRow> table;
    if (!forceChangelog) {
        final String changelogTopic = changelogTopic(buildContext, stateStoreName);
        final Callback onFailure = getRegisterCallback(buildContext, streamSource.getFormats().getValueFormat());
        table = buildContext.getStreamsBuilder().table(streamSource.getTopicName(), consumed.withValueSerde(StaticTopicSerde.wrap(changelogTopic, valueSerde, onFailure)), materialized);
    } else {
        final KTable<K, GenericRow> source = buildContext.getStreamsBuilder().table(streamSource.getTopicName(), consumed);
        final boolean forceMaterialization = !planInfo.isRepartitionedInPlan(streamSource);
        if (forceMaterialization) {
            // add this identity mapValues call to prevent the source-changelog
            // optimization in kafka streams - we don't want this optimization to
            // be enabled because we cannot require symmetric serialization between
            // producer and KSQL (see https://issues.apache.org/jira/browse/KAFKA-10179
            // and https://github.com/confluentinc/ksql/issues/5673 for more details)
            table = source.mapValues(row -> row, materialized);
        } else {
            // if we know this table source is repartitioned later in the topology,
            // we do not need to force a materialization at this source step since the
            // re-partitioned topic will be used for any subsequent state stores, in lieu
            // of the original source topic, thus avoiding the issues above.
            // See https://github.com/confluentinc/ksql/issues/6650
            table = source.mapValues(row -> row);
        }
    }
    return table.transformValues(new AddKeyAndPseudoColumns<>(keyGenerator, streamSource.getPseudoColumnVersion(), streamSource.getSourceSchema().headers()));
}
Also used : GenericRow(io.confluent.ksql.GenericRow) SourceBuilderUtils.getRegisterCallback(io.confluent.ksql.execution.streams.SourceBuilderUtils.getRegisterCallback) PhysicalSchema(io.confluent.ksql.schema.ksql.PhysicalSchema) PlanInfo(io.confluent.ksql.execution.plan.PlanInfo) SourceBuilderUtils.getKeySerde(io.confluent.ksql.execution.streams.SourceBuilderUtils.getKeySerde) SourceBuilderUtils.getWindowedKeySerde(io.confluent.ksql.execution.streams.SourceBuilderUtils.getWindowedKeySerde) SourceBuilderUtils.buildSourceConsumed(io.confluent.ksql.execution.streams.SourceBuilderUtils.buildSourceConsumed) SourceBuilderUtils.getPhysicalSchema(io.confluent.ksql.execution.streams.SourceBuilderUtils.getPhysicalSchema) MaterializationInfo(io.confluent.ksql.execution.materialization.MaterializationInfo) AutoOffsetReset(org.apache.kafka.streams.Topology.AutoOffsetReset) KStream(org.apache.kafka.streams.kstream.KStream) Function(java.util.function.Function) WindowInfo(io.confluent.ksql.serde.WindowInfo) AddKeyAndPseudoColumns(io.confluent.ksql.execution.streams.SourceBuilderUtils.AddKeyAndPseudoColumns) KTableHolder(io.confluent.ksql.execution.plan.KTableHolder) SourceStep(io.confluent.ksql.execution.plan.SourceStep) SourceBuilderUtils.getValueSerde(io.confluent.ksql.execution.streams.SourceBuilderUtils.getValueSerde) Windowed(org.apache.kafka.streams.kstream.Windowed) Serde(org.apache.kafka.common.serialization.Serde) SourceBuilderUtils.changelogTopic(io.confluent.ksql.execution.streams.SourceBuilderUtils.changelogTopic) KeyValueStore(org.apache.kafka.streams.state.KeyValueStore) StaticTopicSerde(io.confluent.ksql.serde.StaticTopicSerde) KTable(org.apache.kafka.streams.kstream.KTable) RuntimeBuildContext(io.confluent.ksql.execution.runtime.RuntimeBuildContext) SourceBuilderUtils.buildSchema(io.confluent.ksql.execution.streams.SourceBuilderUtils.buildSchema) SourceBuilderUtils.windowedKeyGenerator(io.confluent.ksql.execution.streams.SourceBuilderUtils.windowedKeyGenerator) Consumed(org.apache.kafka.streams.kstream.Consumed) Collection(java.util.Collection) SourceBuilderUtils.tableChangeLogOpName(io.confluent.ksql.execution.streams.SourceBuilderUtils.tableChangeLogOpName) ExecutionKeyFactory(io.confluent.ksql.execution.plan.ExecutionKeyFactory) LogicalSchema(io.confluent.ksql.schema.ksql.LogicalSchema) StreamSource(io.confluent.ksql.execution.plan.StreamSource) Bytes(org.apache.kafka.common.utils.Bytes) KStreamHolder(io.confluent.ksql.execution.plan.KStreamHolder) WindowedStreamSource(io.confluent.ksql.execution.plan.WindowedStreamSource) TableSourceV1(io.confluent.ksql.execution.plan.TableSourceV1) WindowedTableSource(io.confluent.ksql.execution.plan.WindowedTableSource) GenericRow(io.confluent.ksql.GenericRow) Callback(io.confluent.ksql.serde.StaticTopicSerde.Callback) Materialized(org.apache.kafka.streams.kstream.Materialized) KsqlException(io.confluent.ksql.util.KsqlException) GenericKey(io.confluent.ksql.GenericKey) TableSourceV1(io.confluent.ksql.execution.plan.TableSourceV1) SourceBuilderUtils.getRegisterCallback(io.confluent.ksql.execution.streams.SourceBuilderUtils.getRegisterCallback) Callback(io.confluent.ksql.serde.StaticTopicSerde.Callback)

Example 7 with PlanInfo

use of io.confluent.ksql.execution.plan.PlanInfo in project ksql by confluentinc.

the class EngineExecutor method planQuery.

private ExecutorPlans planQuery(final ConfiguredStatement<?> statement, final Query query, final Optional<Sink> sink, final Optional<String> withQueryId, final MetaStore metaStore) {
    final QueryEngine queryEngine = engineContext.createQueryEngine(serviceContext);
    final KsqlConfig ksqlConfig = config.getConfig(true);
    final OutputNode outputNode = QueryEngine.buildQueryLogicalPlan(query, sink, metaStore, ksqlConfig, getRowpartitionRowoffsetEnabled(ksqlConfig, statement.getSessionConfig().getOverrides()), statement.getStatementText());
    final LogicalPlanNode logicalPlan = new LogicalPlanNode(statement.getStatementText(), Optional.of(outputNode));
    final QueryId queryId = QueryIdUtil.buildId(statement.getStatement(), engineContext, engineContext.idGenerator(), outputNode, ksqlConfig.getBoolean(KsqlConfig.KSQL_CREATE_OR_REPLACE_ENABLED), withQueryId);
    if (withQueryId.isPresent() && engineContext.getQueryRegistry().getPersistentQuery(queryId).isPresent()) {
        throw new KsqlException(String.format("Query ID '%s' already exists.", queryId));
    }
    final Optional<PersistentQueryMetadata> persistentQueryMetadata = engineContext.getQueryRegistry().getPersistentQuery(queryId);
    final Optional<PlanInfo> oldPlanInfo;
    if (persistentQueryMetadata.isPresent()) {
        final ExecutionStep<?> oldPlan = persistentQueryMetadata.get().getPhysicalPlan();
        oldPlanInfo = Optional.of(oldPlan.extractPlanInfo(new PlanInfoExtractor()));
    } else {
        oldPlanInfo = Optional.empty();
    }
    final PhysicalPlan physicalPlan = queryEngine.buildPhysicalPlan(logicalPlan, config, metaStore, queryId, oldPlanInfo);
    return new ExecutorPlans(logicalPlan, physicalPlan);
}
Also used : PlanInfo(io.confluent.ksql.execution.plan.PlanInfo) KsqlBareOutputNode(io.confluent.ksql.planner.plan.KsqlBareOutputNode) KsqlStructuredDataOutputNode(io.confluent.ksql.planner.plan.KsqlStructuredDataOutputNode) OutputNode(io.confluent.ksql.planner.plan.OutputNode) PushPhysicalPlan(io.confluent.ksql.physical.scalablepush.PushPhysicalPlan) PhysicalPlan(io.confluent.ksql.physical.PhysicalPlan) PullPhysicalPlan(io.confluent.ksql.physical.pull.PullPhysicalPlan) QueryId(io.confluent.ksql.query.QueryId) KsqlConfig(io.confluent.ksql.util.KsqlConfig) LogicalPlanNode(io.confluent.ksql.planner.LogicalPlanNode) KsqlException(io.confluent.ksql.util.KsqlException) PlanInfoExtractor(io.confluent.ksql.execution.plan.PlanInfoExtractor) PersistentQueryMetadata(io.confluent.ksql.util.PersistentQueryMetadata)

Example 8 with PlanInfo

use of io.confluent.ksql.execution.plan.PlanInfo in project ksql by confluentinc.

the class SourceBuilderV1Test method givenDownstreamRepartition.

private static PlanInfo givenDownstreamRepartition(final ExecutionStep<?> sourceStep) {
    final PlanInfo mockPlanInfo = mock(PlanInfo.class);
    when(mockPlanInfo.isRepartitionedInPlan(sourceStep)).thenReturn(true);
    return mockPlanInfo;
}
Also used : PlanInfo(io.confluent.ksql.execution.plan.PlanInfo)

Example 9 with PlanInfo

use of io.confluent.ksql.execution.plan.PlanInfo in project ksql by confluentinc.

the class SourceBuilderTest method shouldApplyCorrectTransformationsToSourceTableWithDownstreamRepartition.

@Test
@SuppressWarnings("unchecked")
public void shouldApplyCorrectTransformationsToSourceTableWithDownstreamRepartition() {
    // Given:
    givenUnwindowedSourceTable();
    final PlanInfo planInfo = givenDownstreamRepartition(tableSource);
    // When:
    final KTableHolder<GenericKey> builtKTable = tableSource.build(planBuilder, planInfo);
    // Then:
    assertThat(builtKTable.getTable(), is(kTable));
    final InOrder validator = inOrder(streamsBuilder, kTable);
    validator.verify(streamsBuilder).table(eq(TOPIC_NAME), eq(consumed));
    validator.verify(kTable, times(2)).transformValues(any(ValueTransformerWithKeySupplier.class));
    verify(consumedFactory).create(keySerde, valueSerde);
    verify(consumed).withTimestampExtractor(any());
    verify(consumed).withOffsetResetPolicy(AutoOffsetReset.EARLIEST);
    verify(kTable, never()).mapValues(any(ValueMapper.class), any(Materialized.class));
}
Also used : PlanInfo(io.confluent.ksql.execution.plan.PlanInfo) InOrder(org.mockito.InOrder) ValueMapper(org.apache.kafka.streams.kstream.ValueMapper) GenericKey(io.confluent.ksql.GenericKey) Materialized(org.apache.kafka.streams.kstream.Materialized) ValueTransformerWithKeySupplier(org.apache.kafka.streams.kstream.ValueTransformerWithKeySupplier) Test(org.junit.Test)

Example 10 with PlanInfo

use of io.confluent.ksql.execution.plan.PlanInfo in project ksql by confluentinc.

the class PlanInfoExtractorTest method shouldExtractSourceWithRepartition.

@Test
public void shouldExtractSourceWithRepartition() {
    // When:
    final PlanInfo planInfo = streamSourceRepartitioned.extractPlanInfo(planInfoExtractor);
    // Then:
    assertThat(planInfo.isRepartitionedInPlan(streamSource), is(true));
}
Also used : PlanInfo(io.confluent.ksql.execution.plan.PlanInfo) Test(org.junit.Test)

Aggregations

PlanInfo (io.confluent.ksql.execution.plan.PlanInfo)11 Test (org.junit.Test)7 GenericKey (io.confluent.ksql.GenericKey)3 Materialized (org.apache.kafka.streams.kstream.Materialized)3 KsqlException (io.confluent.ksql.util.KsqlException)2 GenericRow (io.confluent.ksql.GenericRow)1 MaterializationInfo (io.confluent.ksql.execution.materialization.MaterializationInfo)1 ExecutionKeyFactory (io.confluent.ksql.execution.plan.ExecutionKeyFactory)1 KStreamHolder (io.confluent.ksql.execution.plan.KStreamHolder)1 KTableHolder (io.confluent.ksql.execution.plan.KTableHolder)1 PlanInfoExtractor (io.confluent.ksql.execution.plan.PlanInfoExtractor)1 SourceStep (io.confluent.ksql.execution.plan.SourceStep)1 StreamSource (io.confluent.ksql.execution.plan.StreamSource)1 TableSourceV1 (io.confluent.ksql.execution.plan.TableSourceV1)1 WindowedStreamSource (io.confluent.ksql.execution.plan.WindowedStreamSource)1 WindowedTableSource (io.confluent.ksql.execution.plan.WindowedTableSource)1 RuntimeBuildContext (io.confluent.ksql.execution.runtime.RuntimeBuildContext)1 AddKeyAndPseudoColumns (io.confluent.ksql.execution.streams.SourceBuilderUtils.AddKeyAndPseudoColumns)1 SourceBuilderUtils.buildSchema (io.confluent.ksql.execution.streams.SourceBuilderUtils.buildSchema)1 SourceBuilderUtils.buildSourceConsumed (io.confluent.ksql.execution.streams.SourceBuilderUtils.buildSourceConsumed)1