risingwave_stream/from_proto/
changelog.rs1use risingwave_pb::stream_plan::ChangeLogNode;
16use risingwave_pb::stream_plan::change_log_node::Mode;
17use risingwave_storage::StateStore;
18
19use super::ExecutorBuilder;
20use crate::error::StreamResult;
21use crate::executor::{ChangeLogExecutor, ChangeLogMode, Executor};
22use crate::task::ExecutorParams;
23
24pub struct ChangeLogExecutorBuilder;
25
26impl_stream_node_body!(Changelog(ChangeLogNode) => ChangeLogExecutorBuilder);
27
28impl ExecutorBuilder for ChangeLogExecutorBuilder {
29 type Node = ChangeLogNode;
30
31 async fn new_boxed_executor(
32 params: ExecutorParams,
33 node: &Self::Node,
34 _store: impl StateStore,
35 ) -> StreamResult<Executor> {
36 let [input]: [_; 1] = params.input.try_into().unwrap();
37
38 let vnodes = params.vnode_bitmap;
39 let vnode_count = params.actor_context.vnode_count;
40 let distribution_keys = node
41 .distribution_keys
42 .iter()
43 .map(|k| *k as usize)
44 .collect::<Vec<_>>();
45 let mode = match &node.mode {
46 None => ChangeLogMode::Normal,
47 Some(Mode::Keyed(keyed)) => ChangeLogMode::Keyed {
48 additional_key_columns: keyed
49 .additional_key_columns
50 .iter()
51 .map(|&index| index as usize)
52 .collect(),
53 },
54 };
55 let stream_keys = node.stream_keys.iter().map(|&k| k as usize).collect();
56 let exec = ChangeLogExecutor::new(
57 params.actor_context,
58 input,
59 node.need_op,
60 vnode_count,
61 vnodes,
62 mode,
63 distribution_keys,
64 stream_keys,
65 );
66 Ok((params.info, exec).into())
67 }
68}