internal void AddSinkOperator<K, V>(ITopicNameExtractor<K, V> topicNameExtractor, string nameNode, Produced<K, V> produced, params string[] previousProcessorNames) { if (nodeFactories.ContainsKey(nameNode)) throw new TopologyException($"Sink processor {nameNode} is already added."); nodeFactories.Add(nameNode, new SinkNodeFactory<K, V>(nameNode, previousProcessorNames, topicNameExtractor, produced.KeySerdes, produced.ValueSerdes)); nodeGrouper.Add(nameNode); nodeGrouper.Unite(nameNode, previousProcessorNames); nodeGroups = null; }
internal void ConnectProcessorAndStateStore(string processorName, params string[] stateStoreNames) { foreach (var stateStoreName in stateStoreNames) { if (globalStateBuilders.ContainsKey(stateStoreName)) { throw new TopologyException($"Global StateStore {stateStoreName} can be used by a " + $"Processor without being specified; it should not be explicitly passed."); } if (!stateFactories.ContainsKey(stateStoreName)) { throw new TopologyException("StateStore " + stateStoreName + " is not added yet."); } if (!nodeFactories.ContainsKey(processorName)) { throw new TopologyException("Processor " + processorName + " is not added yet."); } var stateFactory = stateFactories[stateStoreName]; foreach (var u in stateFactory.users) { nodeGrouper.Unite(u, processorName); } stateFactory.users.Add(processorName); var nodeFactory = nodeFactories[processorName]; if (nodeFactory is IProcessorNodeFactory) { ((IProcessorNodeFactory)nodeFactory).AddStateStore(stateStoreName); } else { throw new TopologyException($"Cannot connect a state store {stateStoreName} to a source node or a sink node."); } } }