Example #1
0
        public void StreamStreamJoinSpecificSerdes()
        {
            var stringSerdes = new StringSerDes();
            var config       = new StreamConfig
            {
                ApplicationId = "test-stream-stream-join"
            };

            StreamBuilder builder = new StreamBuilder();

            var stream = builder.Stream("topic1", stringSerdes, stringSerdes);

            builder
            .Stream("topic2", stringSerdes, stringSerdes)
            .Join(
                stream,
                (s, v) => $"{s}-{v}",
                JoinWindowOptions.Of(TimeSpan.FromSeconds(10)),
                StreamJoinProps.With(
                    keySerde: stringSerdes,
                    valueSerde: stringSerdes,
                    otherValueSerde: stringSerdes))
            .To("output-join");

            Topology t = builder.Build();

            using (var driver = new TopologyTestDriver(t, config))
            {
                var inputTopic  = driver.CreateInputTopic <string, string, StringSerDes, StringSerDes>("topic1");
                var outputTopic = driver.CreateOuputTopic <string, string, StringSerDes, StringSerDes>("output-join");
                inputTopic.PipeInput("test", "test");
                var record = outputTopic.ReadKeyValue();
                Assert.IsNull(record);
            }
        }
        public void TestJoinPropsNames()
        {
            var props = StreamJoinProps.As("name1", "store1");

            Assert.IsNotNull(props);
            Assert.AreEqual("store1", props.StoreName);
            Assert.AreEqual("name1", props.Name);
        }
        public void TestJoinPropsSupplier()
        {
            var props = StreamJoinProps.With(new TestSupplier(), new TestSupplier());

            Assert.IsNotNull(props);
            Assert.IsAssignableFrom <TestSupplier>(props.LeftStoreSupplier);
            Assert.IsAssignableFrom <TestSupplier>(props.RightStoreSupplier);
            Assert.IsNull(props.Name);
            Assert.IsNull(props.StoreName);
        }
        public void TestJoinPropsNames2()
        {
            var props = StreamJoinProps.As <string, string, string>("name1", "store1");

            Assert.IsNotNull(props);
            Assert.AreEqual("store1", props.StoreName);
            Assert.AreEqual("name1", props.Name);
            Assert.IsNull(props.KeySerdes);
            Assert.IsNull(props.LeftValueSerdes);
            Assert.IsNull(props.RightValueSerdes);
        }
        public void TestJoinPropsSupplier2()
        {
            var props = StreamJoinProps.With <string, string, string>(new TestSupplier(), new TestSupplier());

            Assert.IsNotNull(props);
            Assert.IsAssignableFrom <TestSupplier>(props.LeftStoreSupplier);
            Assert.IsAssignableFrom <TestSupplier>(props.RightStoreSupplier);
            Assert.IsNull(props.Name);
            Assert.IsNull(props.StoreName);
            Assert.IsNull(props.KeySerdes);
            Assert.IsNull(props.LeftValueSerdes);
            Assert.IsNull(props.RightValueSerdes);
        }
        public void TestJoinPropsWithSerdes()
        {
            var props = StreamJoinProps.With <string, int, long>(new StringSerDes(), new Int32SerDes(), new Int64SerDes());

            Assert.IsNotNull(props);
            Assert.IsNull(props.LeftStoreSupplier);
            Assert.IsNull(props.RightStoreSupplier);
            Assert.IsNull(props.Name);
            Assert.IsNull(props.StoreName);
            Assert.IsAssignableFrom <StringSerDes>(props.KeySerdes);
            Assert.IsAssignableFrom <Int32SerDes>(props.LeftValueSerdes);
            Assert.IsAssignableFrom <Int64SerDes>(props.RightValueSerdes);
        }
Example #7
0
        public void StreamSameStoreName()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>
            {
                ApplicationId = "test-stream-stream-left-join"
            };

            StreamBuilder builder = new StreamBuilder();

            var stream = builder.Stream <string, string>("topic1");

            var joinProps = StreamJoinProps.From <string, string, string>(StreamJoinProps.With(
                                                                              State.Stores.InMemoryWindowStore("test", TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10)),
                                                                              State.Stores.InMemoryWindowStore("test", TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10))));

            Assert.Throws <StreamsException>(() => builder
                                             .Stream <string, string>("topic2")
                                             .LeftJoin(stream, new MyJoinerMapper(), JoinWindowOptions.Of(TimeSpan.FromSeconds(10)), joinProps));
        }
Example #8
0
 public StreamStreamJoinNode(
     string name,
     IValueJoiner <V1, V2, VR> valueJoiner,
     ProcessorParameters <K, V1> joinLeftParams,
     ProcessorParameters <K, V2> joinRightParams,
     ProcessorParameters <K, VR> joinMergeParams,
     ProcessorParameters <K, V1> windowedLeftParams,
     ProcessorParameters <K, V2> windowedRightParams,
     StoreBuilder <WindowStore <K, V1> > windowedLeftStoreBuilder,
     StoreBuilder <WindowStore <K, V2> > windowedRightStoreBuilder,
     StreamJoinProps <K, V1, V2> joinedProps)
     : base(name, valueJoiner, joinLeftParams, joinRightParams, joinMergeParams, null, null)
 {
     this.windowedLeftParams        = windowedLeftParams;
     this.windowedRightParams       = windowedRightParams;
     this.windowedLeftStoreBuilder  = windowedLeftStoreBuilder;
     this.windowedRightStoreBuilder = windowedRightStoreBuilder;
     this.joinedProps = joinedProps;
 }
Example #9
0
        public void RepartitionTestJoinTopology()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>
            {
                ApplicationId = "test-repartition-processor"
            };

            var supplier = new MockKafkaSupplier(10);

            StreamBuilder builder = new StreamBuilder();

            IKStream <string, string> stream1 = builder
                                                .Stream <string, string>("topic")
                                                .Map((k, v) => KeyValuePair.Create(k.ToUpper(), v));

            IKStream <string, string> stream2 = builder.Stream <string, string>("topic2");

            stream1.Join(stream2,
                         (v1, v2) => $"{v1}-{v2}",
                         JoinWindowOptions.Of(TimeSpan.FromMinutes(1)),
                         StreamJoinProps.As <string, string, string>("join-store"))
            .To("output");

            Topology t = builder.Build();

            using (var driver = new TopologyTestDriver(t.Builder, config, TopologyTestDriver.Mode.ASYNC_CLUSTER_IN_MEMORY, supplier))
            {
                var inputTopic  = driver.CreateInputTopic <string, string>("topic");
                var inputTopic2 = driver.CreateInputTopic <string, string>("topic2");
                var outputTopic = driver.CreateOuputTopic <string, string>("output");
                inputTopic.PipeInput("test", "coucou");
                inputTopic2.PipeInput("TEST", "sylvain");
                inputTopic2.PipeInput("TEST2", "antoine");
                inputTopic.PipeInput("test2", "test");
                var records = IntegrationTestUtils
                              .WaitUntilMinKeyValueRecordsReceived(outputTopic, 2)
                              .ToUpdateDictionary(r => r.Message.Key, r => r.Message.Value);
                Assert.IsNotNull(records);
                Assert.AreEqual(2, records.Count);
                Assert.AreEqual("coucou-sylvain", records["TEST"]);
                Assert.AreEqual("test-antoine", records["TEST2"]);
            }
        }
Example #10
0
        public void StreamInvalidTimeSettings()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>
            {
                ApplicationId = "test-stream-stream-left-join"
            };

            StreamBuilder builder = new StreamBuilder();

            var stream = builder.Stream <string, string>("topic1");

            var joinProps = StreamJoinProps.From <string, string, string>(StreamJoinProps.With(
                                                                              State.Stores.InMemoryWindowStore("test1", TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10)),
                                                                              State.Stores.InMemoryWindowStore("test2", TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10))));

            // JoinWindowOptions.Of => use default retention => One Day
            // joinProps use supplier with retention 10 secondes => BAD THING !!
            Assert.Throws <StreamsException>(() => builder
                                             .Stream <string, string>("topic2")
                                             .LeftJoin(stream, new MyJoinerMapper(), JoinWindowOptions.Of(TimeSpan.FromSeconds(10)), joinProps));
        }
Example #11
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));
        }