public override void Process(K key, V value) { if (key == null || value == null) { log.LogWarning($"Skipping record due to null key or value. key=[{key}] value=[{value}] topic=[{Context.Topic}] partition=[{Context.Partition}] offset=[{Context.Offset}]"); droppedRecordsSensor.Record(); return; } long inputRecordTimestamp = Context.Timestamp; long timeFrom = Math.Max(0L, inputRecordTimestamp - beforeMs); long timeTo = Math.Max(0L, inputRecordTimestamp + afterMs); bool needOuterJoin = outer; using (var enumerator = window.Fetch(key, timeFrom, timeTo)) { while (enumerator.MoveNext()) { needOuterJoin = false; var otherRecord = enumerator.Current; Forward(key, joiner.Apply(value, otherRecord.Value.Value), Math.Max(inputRecordTimestamp, otherRecord.Value.Key)); } } if (needOuterJoin) { Forward(key, joiner.Apply(value, default)); } }
public ValueAndTimestamp <VR> Get(K key) { ValueAndTimestamp <V1> valueAndTimestamp1 = iKTableValueGetter1.Get(key); if (valueAndTimestamp1 != null) { ValueAndTimestamp <V2> valueAndTimestamp2 = iKTableValueGetter2.Get(key); long resultTimestamp; if (valueAndTimestamp2 != null) { resultTimestamp = Math.Max(valueAndTimestamp1.Timestamp, valueAndTimestamp2.Timestamp); } else { resultTimestamp = valueAndTimestamp1.Timestamp; } return(ValueAndTimestamp <VR> .Make( joiner.Apply(valueAndTimestamp1.Value, valueAndTimestamp2 != null ? valueAndTimestamp2.Value : default), resultTimestamp)); } else { return(null); } }
public override void Process(K1 key, V1 value) { // If the key or value is null we don't need to proceed if (key == null || value == null) { log.Warn($"Skipping record due to null key or value. key=[{key}] value=[{value}] topic=[{Context.Topic}] partition=[{Context.Partition}] offset=[{Context.Offset}]"); return; } else { K2 mappedKey = mapper.Apply(key, value); V2 value2 = mappedKey == null ? null : ValueAndTimestamp.GetValueOrNull(valueGetter.Get(mappedKey)); if (leftJoin || value2 != null) { Forward(key, joiner.Apply(value, value2)); } } }
public ValueAndTimestamp <VR> Get(K key) { ValueAndTimestamp <V1> valueAndTimestamp1 = iKTableValueGetter1.Get(key); ValueAndTimestamp <V2> valueAndTimestamp2 = iKTableValueGetter2.Get(key); VR newValue = default; V1 value1 = valueAndTimestamp1 == null ? default : valueAndTimestamp1.Value; long ts1 = valueAndTimestamp1 == null ? -1 : valueAndTimestamp1.Timestamp; V2 value2 = valueAndTimestamp2 == null ? default : valueAndTimestamp2.Value; long ts2 = valueAndTimestamp2 == null ? -1 : valueAndTimestamp2.Timestamp; if (value1 != null || value2 != null) { newValue = joiner.Apply(value1, value2); } return(ValueAndTimestamp <VR> .Make(newValue, Math.Max(ts1, ts2))); }
public ValueAndTimestamp <VR> Get(K key) { ValueAndTimestamp <V1> valueAndTimestamp1 = iKTableValueGetter1.Get(key); if (valueAndTimestamp1 != null) { ValueAndTimestamp <V2> valueAndTimestamp2 = iKTableValueGetter2.Get(key); if (valueAndTimestamp2 != null) { return(ValueAndTimestamp <VR> .Make( joiner.Apply(valueAndTimestamp1.Value, valueAndTimestamp2.Value), Math.Max(valueAndTimestamp1.Timestamp, valueAndTimestamp2.Timestamp))); } else { return(null); } } else { return(null); } }
public static IValueJoiner <V2, V1, VR> Reverse <V1, V2, VR>(this IValueJoiner <V1, V2, VR> joiner) { return(new WrappedValueJoiner <V2, V1, VR>((v2, v1) => joiner.Apply(v1, v2))); }