use of io.confluent.ksql.GenericKey in project ksql by confluentinc.
the class KsMaterializedWindowTableIQv2 method get.
public KsMaterializedQueryResult<WindowedRow> get(final int partition, final Range<Instant> windowStartBounds, final Range<Instant> windowEndBounds, final Optional<Position> position) {
try {
final Instant lower = calculateLowerBound(windowStartBounds, windowEndBounds);
final Instant upper = calculateUpperBound(windowStartBounds, windowEndBounds);
final WindowRangeQuery<GenericKey, ValueAndTimestamp<GenericRow>> query = WindowRangeQuery.withWindowStartRange(lower, upper);
StateQueryRequest<KeyValueIterator<Windowed<GenericKey>, ValueAndTimestamp<GenericRow>>> request = inStore(stateStore.getStateStoreName()).withQuery(query);
if (position.isPresent()) {
request = request.withPositionBound(PositionBound.at(position.get()));
}
final StateQueryResult<KeyValueIterator<Windowed<GenericKey>, ValueAndTimestamp<GenericRow>>> result = stateStore.getKafkaStreams().query(request);
final QueryResult<KeyValueIterator<Windowed<GenericKey>, ValueAndTimestamp<GenericRow>>> queryResult = result.getPartitionResults().get(partition);
if (queryResult.isFailure()) {
throw failedQueryException(queryResult);
}
final KeyValueIterator<Windowed<GenericKey>, ValueAndTimestamp<GenericRow>> iterator = queryResult.getResult();
return KsMaterializedQueryResult.rowIteratorWithPosition(Streams.stream(IteratorUtil.onComplete(iterator, iterator::close)).map(next -> {
final Instant windowStart = next.key.window().startTime();
if (!windowStartBounds.contains(windowStart)) {
return null;
}
final Instant windowEnd = next.key.window().endTime();
if (!windowEndBounds.contains(windowEnd)) {
return null;
}
final TimeWindow window = new TimeWindow(windowStart.toEpochMilli(), windowEnd.toEpochMilli());
final WindowedRow row = WindowedRow.of(stateStore.schema(), new Windowed<>(next.key.key(), window), next.value.value(), next.value.timestamp());
return row;
}).filter(Objects::nonNull).iterator(), queryResult.getPosition());
} catch (final NotUpToBoundException | MaterializationException e) {
throw e;
} catch (final Exception e) {
throw new MaterializationException("Failed to get value from materialized table", e);
}
}
use of io.confluent.ksql.GenericKey in project ksql by confluentinc.
the class KsqlMaterialization method getIntermediateRow.
/*
Today, we are unconditionally adding the extra fields to windowed rows.
We should decide if we need these additional fields for the
Windowed Rows case and remove them if possible.
*/
public static GenericRow getIntermediateRow(final TableRow row) {
final GenericKey key = row.key();
final GenericRow value = row.value();
final List<?> keyFields = key.values();
value.ensureAdditionalCapacity(// ROWTIME
1 + // all the keys
keyFields.size() + // windows
row.window().map(w -> 2).orElse(0));
value.append(row.rowTime());
value.appendAll(keyFields);
row.window().ifPresent(window -> {
value.append(window.start().toEpochMilli());
value.append(window.end().toEpochMilli());
});
return value;
}
use of io.confluent.ksql.GenericKey in project ksql by confluentinc.
the class StreamGroupByBuilderBase method build.
public KGroupedStreamHolder build(final KStreamHolder<GenericKey> stream, final StreamGroupByKey step) {
final LogicalSchema sourceSchema = stream.getSchema();
final QueryContext queryContext = step.getProperties().getQueryContext();
final Formats formats = step.getInternalFormats();
final Grouped<GenericKey, GenericRow> grouped = buildGrouped(formats, sourceSchema, queryContext, buildContext, groupedFactory);
return KGroupedStreamHolder.of(stream.getStream().groupByKey(grouped), stream.getSchema());
}
use of io.confluent.ksql.GenericKey in project ksql by confluentinc.
the class StreamGroupByBuilderBase method build.
public <K> KGroupedStreamHolder build(final KStreamHolder<K> stream, final QueryContext queryContext, final Formats formats, final List<Expression> groupByExpressions) {
final LogicalSchema sourceSchema = stream.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 Grouped<GenericKey, GenericRow> grouped = buildGrouped(formats, params.getSchema(), queryContext, buildContext, groupedFactory);
final KGroupedStream<GenericKey, GenericRow> groupedStream = stream.getStream().filter((k, v) -> v != null).groupBy((k, v) -> params.getMapper().apply(v), grouped);
return KGroupedStreamHolder.of(groupedStream, params.getSchema());
}
use of io.confluent.ksql.GenericKey in project ksql by confluentinc.
the class WindowStoreCacheBypass method fetchUncached.
/*
This method is used for single key lookups. It is invoked by the fetch method
*/
private static WindowStoreIterator<ValueAndTimestamp<GenericRow>> fetchUncached(final ReadOnlyWindowStore<GenericKey, ValueAndTimestamp<GenericRow>> windowStore, final GenericKey key, final Instant lower, final Instant upper) {
if (!(windowStore instanceof MeteredWindowStore)) {
throw new IllegalStateException("Expecting a MeteredWindowStore");
}
final StateSerdes<GenericKey, ValueAndTimestamp<GenericRow>> serdes = getSerdes(windowStore);
final WindowStore<Bytes, byte[]> wrapped = getInnermostStore(windowStore);
final Bytes rawKey = Bytes.wrap(serdes.rawKey(key));
final WindowStoreIterator<byte[]> fetch = wrapped.fetch(rawKey, lower, upper);
return new DeserializingIterator(fetch, serdes);
}
Aggregations