Skip to main content

reifydb_core/interface/
change.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use reifydb_type::value::datetime::DateTime;
5
6use crate::{
7	common::CommitVersion,
8	interface::catalog::{flow::FlowNodeId, shape::ShapeId},
9	value::column::columns::Columns,
10};
11
12/// Origin of a change
13#[derive(Debug, Clone)]
14pub enum ChangeOrigin {
15	Shape(ShapeId),
16	Flow(FlowNodeId),
17}
18/// Represents a single diff
19#[derive(Debug, Clone)]
20pub enum Diff {
21	Insert {
22		post: Columns,
23	},
24	Update {
25		pre: Columns,
26		post: Columns,
27	},
28	Remove {
29		pre: Columns,
30	},
31}
32
33/// A change with origin, diffs, version, and timestamp
34#[derive(Debug, Clone)]
35pub struct Change {
36	/// Origin of this change
37	pub origin: ChangeOrigin,
38	/// The list of diffs (changes)
39	pub diffs: Vec<Diff>,
40	/// Version of this change.
41	pub version: CommitVersion,
42	/// Timestamp when this was changed
43	pub changed_at: DateTime,
44}
45
46impl Change {
47	/// Create a change from a shape (external) source
48	pub fn from_shape(shape: ShapeId, version: CommitVersion, diffs: Vec<Diff>, changed_at: DateTime) -> Self {
49		Self {
50			origin: ChangeOrigin::Shape(shape),
51			diffs,
52			version,
53			changed_at,
54		}
55	}
56
57	/// Create a change from a flow node (internal)
58	pub fn from_flow(from: FlowNodeId, version: CommitVersion, diffs: Vec<Diff>, changed_at: DateTime) -> Self {
59		Self {
60			origin: ChangeOrigin::Flow(from),
61			diffs,
62			version,
63			changed_at,
64		}
65	}
66}