use of io.confluent.ksql.execution.streams.SourceBuilderUtils.AddKeyAndPseudoColumns 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()));
}
Aggregations