Пример #1
0
        private IKStream <K, V>[] DoBranch(string named = null, params Func <K, V, bool>[] predicates)
        {
            var namedInternal = new Named(named);

            if (predicates.Length == 0)
            {
                throw new ArgumentException("branch() requires at least one predicate");
            }

            String branchName = namedInternal.OrElseGenerateWithPrefix(this.builder, BRANCH_NAME);

            String[] childNames = new String[predicates.Length];
            for (int i = 0; i < predicates.Length; i++)
            {
                childNames[i] = namedInternal.SuffixWithOrElseGet($"predicate-{i}", this.builder, BRANCHCHILD_NAME);
            }

            ProcessorParameters <K, V> processorParameters = new ProcessorParameters <K, V>(new KStreamBranch <K, V>(predicates, childNames), branchName);
            ProcessorGraphNode <K, V>  branchNode          = new ProcessorGraphNode <K, V>(branchName, processorParameters);

            this.builder.AddGraphNode(node, branchNode);

            IKStream <K, V>[] branchChildren = new IKStream <K, V> [predicates.Length];
            for (int i = 0; i < predicates.Length; i++)
            {
                ProcessorParameters <K, V> innerProcessorParameters = new ProcessorParameters <K, V>(new PassThrough <K, V>(), childNames[i]);
                ProcessorGraphNode <K, V>  branchChildNode          = new ProcessorGraphNode <K, V>(childNames[i], innerProcessorParameters);

                builder.AddGraphNode(branchNode, branchChildNode);
                branchChildren[i] = new KStream <K, V>(childNames[i], this.keySerdes, this.valueSerdes, setSourceNodes, branchChildNode, builder);
            }

            return(branchChildren);
        }
Пример #2
0
        public IKStream <K, VR> MapValues <VR>(IValueMapperWithKey <K, V, VR> mapper, string named = null)
        {
            if (mapper == null)
            {
                throw new ArgumentNullException($"Mapper function can't be null");
            }

            String name = new Named(named).OrElseGenerateWithPrefix(this.builder, MAPVALUES_NAME);

            ProcessorParameters <K, V> processorParameters    = new ProcessorParameters <K, V>(new KStreamMapValues <K, V, VR>(mapper), name);
            ProcessorGraphNode <K, V>  mapValuesProcessorNode = new ProcessorGraphNode <K, V>(name, processorParameters);

            mapValuesProcessorNode.ValueChangingOperation = true;

            builder.AddGraphNode(this.node, mapValuesProcessorNode);

            // value serde cannot be preserved
            return(new KStream <K, VR>(
                       name,
                       this.keySerdes,
                       null,
                       this.setSourceNodes,
                       mapValuesProcessorNode,
                       builder));
        }
Пример #3
0
        public void Print(Printed <K, V> printed)
        {
            var name = new Named(printed.Name).OrElseGenerateWithPrefix(this.builder, PRINTING_NAME);
            ProcessorParameters <K, V> processorParameters = new ProcessorParameters <K, V>(printed.Build(this.nameNode), name);
            ProcessorGraphNode <K, V>  printNode           = new ProcessorGraphNode <K, V>(name, processorParameters);

            builder.AddGraphNode(node, printNode);
        }
Пример #4
0
        public void Foreach(Action <K, V> action, string named = null)
        {
            String name = new Named(named).OrElseGenerateWithPrefix(this.builder, FOREACH_NAME);
            ProcessorParameters <K, V> processorParameters = new ProcessorParameters <K, V>(new KStreamPeek <K, V>(action, false), name);
            ProcessorGraphNode <K, V>  foreachNode         = new ProcessorGraphNode <K, V>(name, processorParameters);

            this.builder.AddGraphNode(node, foreachNode);
        }
Пример #5
0
        private IKStream <K, V> DoFilter(Func <K, V, bool> predicate, string named, bool not)
        {
            string name = new Named(named).OrElseGenerateWithPrefix(this.builder, FILTER_NAME);
            ProcessorParameters <K, V> processorParameters = new ProcessorParameters <K, V>(new KStreamFilter <K, V>(predicate, not), name);
            ProcessorGraphNode <K, V>  filterProcessorNode = new ProcessorGraphNode <K, V>(name, processorParameters);

            this.builder.AddGraphNode(node, filterProcessorNode);
            return(new KStream <K, V>(name, this.keySerdes, this.valueSerdes, this.setSourceNodes, filterProcessorNode, this.builder));
        }
Пример #6
0
        public void Foreach(Action <K, V> action, string named = null)
        {
            if (action == null)
            {
                throw new ArgumentNullException("Foreach() doesn't allow null action function ");
            }

            String name = new Named(named).OrElseGenerateWithPrefix(this.builder, FOREACH_NAME);
            ProcessorParameters <K, V> processorParameters = new ProcessorParameters <K, V>(new KStreamPeek <K, V>(action, false), name);
            ProcessorGraphNode <K, V>  foreachNode         = new ProcessorGraphNode <K, V>(name, processorParameters);

            this.builder.AddGraphNode(node, foreachNode);
        }
Пример #7
0
        public void Print(Printed <K, V> printed)
        {
            if (printed == null)
            {
                throw new ArgumentNullException("Print() doesn't allow null printed instance");
            }

            var name = new Named(printed.Name).OrElseGenerateWithPrefix(this.builder, PRINTING_NAME);
            ProcessorParameters <K, V> processorParameters = new ProcessorParameters <K, V>(printed.Build(this.nameNode), name);
            ProcessorGraphNode <K, V>  printNode           = new ProcessorGraphNode <K, V>(name, processorParameters);

            builder.AddGraphNode(node, printNode);
        }
Пример #8
0
        public IKStream <KR, VR> FlatMap <KR, VR>(IKeyValueMapper <K, V, IEnumerable <KeyValuePair <KR, VR> > > mapper, string named = null)
        {
            var name = new Named(named).OrElseGenerateWithPrefix(this.builder, FLATMAP_NAME);
            ProcessorParameters <K, V> processorParameters = new ProcessorParameters <K, V>(new KStreamFlatMap <K, V, KR, VR>(mapper), name);
            ProcessorGraphNode <K, V>  flatMapNode         = new ProcessorGraphNode <K, V>(name, processorParameters);

            flatMapNode.KeyChangingOperation = true;

            builder.AddGraphNode(node, flatMapNode);

            // key and value serde cannot be preserved
            return(new KStream <KR, VR>(name, null, null, setSourceNodes, flatMapNode, builder));
        }
Пример #9
0
        private IKStream <K, V> DoFilter(Func <K, V, bool> predicate, string named, bool not)
        {
            if (predicate == null)
            {
                throw new ArgumentNullException($"Filter() doesn't allow null predicate function");
            }

            string name = new Named(named).OrElseGenerateWithPrefix(this.builder, FILTER_NAME);
            ProcessorParameters <K, V> processorParameters = new ProcessorParameters <K, V>(new KStreamFilter <K, V>(predicate, not), name);
            ProcessorGraphNode <K, V>  filterProcessorNode = new ProcessorGraphNode <K, V>(name, processorParameters);

            this.builder.AddGraphNode(node, filterProcessorNode);
            return(new KStream <K, V>(name, this.keySerdes, this.valueSerdes, this.setSourceNodes, filterProcessorNode, this.builder));
        }
Пример #10
0
        public IKStream <K, V> ToStream(string named = null)
        {
            string name = new Named(named).OrElseGenerateWithPrefix(this.builder, TOSTREAM_NAME);

            var p = new WrapperValueMapperWithKey <K, Change <V>, V>((k, v) => v.NewValue);
            IProcessorSupplier <K, Change <V> >  processorMapValues  = new KStreamMapValues <K, Change <V>, V>(p);
            ProcessorParameters <K, Change <V> > processorParameters = new ProcessorParameters <K, Change <V> >(processorMapValues, name);

            ProcessorGraphNode <K, Change <V> > toStreamNode = new ProcessorGraphNode <K, Change <V> >(name, processorParameters);

            builder.AddGraphNode(this.node, toStreamNode);

            // we can inherit parent key and value serde
            return(new KStream <K, V>(name, this.keySerdes, this.valueSerdes, this.setSourceNodes, toStreamNode, builder));
        }
Пример #11
0
        private IKGroupedStream <KR, V> DoGroup <KR>(IKeyValueMapper <K, V, KR> keySelector, Grouped <KR, V> grouped)
        {
            ProcessorGraphNode <K, V> selectKeyMapNode = InternalSelectKey(keySelector, grouped.Named);

            selectKeyMapNode.KeyChangingOperation = true;

            builder.AddGraphNode(this.node, selectKeyMapNode);

            return(new KGroupedStream <KR, V>(
                       selectKeyMapNode.streamGraphNode,
                       grouped,
                       this.setSourceNodes,
                       selectKeyMapNode,
                       builder));
        }
Пример #12
0
        public IKStream <K, V> Peek(Action <K, V> action, string named = null)
        {
            String name = new Named(named).OrElseGenerateWithPrefix(this.builder, PEEK_NAME);
            ProcessorParameters <K, V> processorParameters = new ProcessorParameters <K, V>(new KStreamPeek <K, V>(action, true), name);
            ProcessorGraphNode <K, V>  peekNode            = new ProcessorGraphNode <K, V>(name, processorParameters);

            builder.AddGraphNode(node, peekNode);

            return(new KStream <K, V>(
                       name,
                       keySerdes,
                       valueSerdes,
                       setSourceNodes,
                       peekNode,
                       builder));
        }
Пример #13
0
        public IKStream <KR, V> SelectKey <KR>(IKeyValueMapper <K, V, KR> mapper, string named = null)
        {
            ProcessorGraphNode <K, V> selectKeyProcessorNode = InternalSelectKey(mapper, named);

            selectKeyProcessorNode.KeyChangingOperation = true;

            builder.AddGraphNode(node, selectKeyProcessorNode);

            // key serde cannot be preserved
            return(new KStream <KR, V>(
                       selectKeyProcessorNode.streamGraphNode,
                       null,
                       valueSerdes,
                       setSourceNodes,
                       selectKeyProcessorNode,
                       builder));
        }
        public void WriteTopologyTest()
        {
            var builder = new InternalTopologyBuilder();
            List <StreamGraphNode> nodes = new List <StreamGraphNode>();

            RootNode root   = new RootNode();
            var      source = new StreamSourceNode <string, string>(
                "topic",
                "source-01",
                new Stream.Internal.ConsumedInternal <string, string>("source-01", new StringSerDes(),
                                                                      new StringSerDes(), null));

            root.AppendChild(source);
            nodes.Add(source);

            var filterParameters =
                new ProcessorParameters <string, string>(
                    new KStreamFilter <string, string>((k, v) => true, false), "filter-02");
            var filter = new ProcessorGraphNode <string, string>("filter-02", filterParameters);

            source.AppendChild(filter);
            nodes.Add(filter);

            var to = new StreamSinkNode <string, string>(
                new StaticTopicNameExtractor <string, string>("topic2"), "to-03",
                new Stream.Internal.Produced <string, string>(
                    new StringSerDes(),
                    new StringSerDes())
                );

            filter.AppendChild(to);
            nodes.Add(to);

            builder.BuildTopology(root, nodes);

            Assert.IsTrue(root.AllParentsWrittenToTopology);
            Assert.IsTrue(source.AllParentsWrittenToTopology);
            Assert.IsTrue(filter.AllParentsWrittenToTopology);
            Assert.IsTrue(to.AllParentsWrittenToTopology);

            var topology = builder.BuildTopology();

            Assert.IsTrue(topology.SourceOperators.ContainsKey("topic"));
            Assert.IsTrue(topology.ProcessorOperators.ContainsKey("filter-02"));
            Assert.IsTrue(topology.SinkOperators.ContainsKey("topic2"));
        }
Пример #15
0
        public IKStream <K, VR> FlatMapValues <VR>(IValueMapperWithKey <K, V, IEnumerable <VR> > mapper, string named = null)
        {
            var name = new Named(named).OrElseGenerateWithPrefix(this.builder, FLATMAPVALUES_NAME);

            ProcessorParameters <K, V> processorParameters = new ProcessorParameters <K, V>(new KStreamFlatMapValues <K, V, VR>(mapper), name);
            ProcessorGraphNode <K, V>  flatMapValuesNode   = new ProcessorGraphNode <K, V>(name, processorParameters);

            flatMapValuesNode.ValueChangingOperation = true;

            builder.AddGraphNode(this.node, flatMapValuesNode);

            // value serde cannot be preserved
            return(new KStream <K, VR>(
                       name,
                       this.keySerdes,
                       null,
                       this.setSourceNodes,
                       flatMapValuesNode,
                       builder));
        }
Пример #16
0
        private IKGroupedStream <KR, V> DoGroup <KR>(IKeyValueMapper <K, V, KR> keySelector, Grouped <KR, V> grouped)
        {
            if (keySelector == null)
            {
                throw new ArgumentNullException("GroupBy() doesn't allow null selector function");
            }

            ProcessorGraphNode <K, V> selectKeyMapNode = InternalSelectKey(keySelector, grouped.Named);

            selectKeyMapNode.KeyChangingOperation = true;

            builder.AddGraphNode(this.node, selectKeyMapNode);

            return(new KGroupedStream <KR, V>(
                       selectKeyMapNode.streamGraphNode,
                       grouped,
                       this.setSourceNodes,
                       selectKeyMapNode,
                       builder));
        }
Пример #17
0
        public IKStream <KR, V> SelectKey <KR>(IKeyValueMapper <K, V, KR> mapper, string named = null)
        {
            if (mapper == null)
            {
                throw new ArgumentNullException("SelectKey() doesn't allow null mapper function");
            }


            ProcessorGraphNode <K, V> selectKeyProcessorNode = InternalSelectKey(mapper, named);

            selectKeyProcessorNode.KeyChangingOperation = true;

            builder.AddGraphNode(node, selectKeyProcessorNode);

            // key serde cannot be preserved
            return(new KStream <KR, V>(
                       selectKeyProcessorNode.streamGraphNode,
                       null,
                       valueSerdes,
                       setSourceNodes,
                       selectKeyProcessorNode,
                       builder));
        }
Пример #18
0
        public IKStream <KR, VR> Map <KR, VR>(IKeyValueMapper <K, V, KeyValuePair <KR, VR> > mapper, string named = null)
        {
            if (mapper == null)
            {
                throw new ArgumentNullException($"Map() doesn't allow null mapper function");
            }

            string name = new Named(named).OrElseGenerateWithPrefix(this.builder, MAP_NAME);
            ProcessorParameters <K, V> processorParameters = new ProcessorParameters <K, V>(new KStreamMap <K, V, KR, VR>(mapper), name);
            ProcessorGraphNode <K, V>  mapProcessorNode    = new ProcessorGraphNode <K, V>(name, processorParameters);

            mapProcessorNode.KeyChangingOperation = true;

            builder.AddGraphNode(node, mapProcessorNode);

            // key and value serde cannot be preserved
            return(new KStream <KR, VR>(
                       name,
                       null,
                       null,
                       setSourceNodes,
                       mapProcessorNode,
                       builder));
        }
Пример #19
0
        public KStream <K, VR> Join <K, V, V0, VR>(
            KStream <K, V> joinLeft,
            KStream <K, V0> joinRight,
            IValueJoiner <V, V0, VR> joiner,
            JoinWindowOptions windows,
            StreamJoinProps <K, V, V0> joined)
        {
            var named           = new Named(joined.Name);
            var joinLeftSuffix  = rightOuter ? "-outer-this-join" : "-this-join";
            var joinRightSuffix = leftOuter ? "-outer-other-join" : "-other-join";

            var leftWindowStreamProcessorName  = named.SuffixWithOrElseGet("-this-windowed", builder, KStream.WINDOWED_NAME);
            var rightWindowStreamProcessorName = named.SuffixWithOrElseGet("-other-windowed", builder, KStream.WINDOWED_NAME);

            var joinLeftGeneratedName  = rightOuter ? builder.NewProcessorName(KStream.OUTERTHIS_NAME) : builder.NewProcessorName(KStream.JOINTHIS_NAME);
            var joinRightGeneratedName = leftOuter ? builder.NewProcessorName(KStream.OUTEROTHER_NAME) : builder.NewProcessorName(KStream.JOINOTHER_NAME);

            var joinLeftName  = named.SuffixWithOrElseGet(joinLeftSuffix, joinLeftGeneratedName);
            var joinRightName = named.SuffixWithOrElseGet(joinRightSuffix, joinRightGeneratedName);

            var joinMergeName = named.SuffixWithOrElseGet("-merge", builder, KStream.MERGE_NAME);

            StreamGraphNode leftStreamsGraphNode      = joinLeft.Node;
            StreamGraphNode rightStreamsGraphNode     = joinRight.Node;
            var             userProvidedBaseStoreName = joined.StoreName;

            var leftStoreSupplier  = joined.LeftStoreSupplier;
            var rightStoreSupplier = joined.RightStoreSupplier;

            StoreBuilder <WindowStore <K, V> >  leftWindowStore;
            StoreBuilder <WindowStore <K, V0> > rightWindowStore;

            AssertUniqueStoreNames(leftStoreSupplier, rightStoreSupplier);

            if (leftStoreSupplier == null)
            {
                var thisJoinStoreName = userProvidedBaseStoreName == null ? joinLeftGeneratedName : userProvidedBaseStoreName + joinLeftSuffix;
                leftWindowStore = JoinWindowStoreBuilder(thisJoinStoreName, windows, joined.KeySerdes, joined.LeftValueSerdes);
            }
            else
            {
                AssertWindowSettings(leftStoreSupplier, windows);
                leftWindowStore = Stores.WindowStoreBuilder(leftStoreSupplier, joined.KeySerdes, joined.LeftValueSerdes);
            }

            if (rightStoreSupplier == null)
            {
                var otherJoinStoreName = userProvidedBaseStoreName == null ? joinRightGeneratedName : userProvidedBaseStoreName + joinRightSuffix;
                rightWindowStore = JoinWindowStoreBuilder(otherJoinStoreName, windows, joined.KeySerdes, joined.RightValueSerdes);
            }
            else
            {
                AssertWindowSettings(rightStoreSupplier, windows);
                rightWindowStore = Stores.WindowStoreBuilder(rightStoreSupplier, joined.KeySerdes, joined.RightValueSerdes);
            }


            var leftStream       = new KStreamJoinWindow <K, V>(leftWindowStore.Name);
            var leftStreamParams = new ProcessorParameters <K, V>(leftStream, leftWindowStreamProcessorName);
            var leftNode         = new ProcessorGraphNode <K, V>(leftWindowStreamProcessorName, leftStreamParams);

            builder.AddGraphNode(leftStreamsGraphNode, leftNode);

            var rightStream       = new KStreamJoinWindow <K, V0>(rightWindowStore.Name);
            var rightStreamParams = new ProcessorParameters <K, V0>(rightStream, rightWindowStreamProcessorName);
            var rightNode         = new ProcessorGraphNode <K, V0>(rightWindowStreamProcessorName, rightStreamParams);

            builder.AddGraphNode(rightStreamsGraphNode, rightNode);

            var joinL       = new KStreamKStreamJoin <K, V, V0, VR>(joinLeftName, rightWindowStore.Name, windows.beforeMs, windows.afterMs, joiner, leftOuter);
            var joinLParams = new ProcessorParameters <K, V>(joinL, joinLeftName);
            var joinR       = new KStreamKStreamJoin <K, V0, V, VR>(joinRightName, leftWindowStore.Name, windows.beforeMs, windows.afterMs, joiner.Reverse(), rightOuter);
            var joinRParams = new ProcessorParameters <K, V0>(joinR, joinRightName);
            var merge       = new PassThrough <K, VR>();
            var mergeParams = new ProcessorParameters <K, VR>(merge, joinMergeName);

            var joinNode = new StreamStreamJoinNode <K, V, V0, VR>(
                joinMergeName,
                joiner,
                joinLParams,
                joinRParams,
                mergeParams,
                leftStreamParams,
                rightStreamParams,
                leftWindowStore,
                rightWindowStore,
                joined);

            builder.AddGraphNode(new List <StreamGraphNode> {
                leftStreamsGraphNode, rightStreamsGraphNode
            }, joinNode);

            ISet <string> allSourceNodes = new HashSet <string>(joinLeft.SetSourceNodes);

            allSourceNodes.AddRange(joinRight.SetSourceNodes);

            return(new KStream <K, VR>(
                       joinMergeName,
                       joined.KeySerdes,
                       null,
                       allSourceNodes.ToList(),
                       joinNode,
                       builder));
        }