kotoba_core/ir/
patch.rs

1//! Patch-IR(差分表現)
2
3use serde::{Deserialize, Serialize};
4use crate::types::*;
5
6/// 頂点追加
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct AddVertex {
9    pub id: VertexId,
10    pub labels: Vec<Label>,
11    pub props: Properties,
12}
13
14/// エッジ追加
15#[derive(Debug, Clone, Serialize, Deserialize)]
16pub struct AddEdge {
17    pub id: EdgeId,
18    pub src: VertexId,
19    pub dst: VertexId,
20    pub label: Label,
21    pub props: Properties,
22}
23
24/// プロパティ更新
25#[derive(Debug, Clone, Serialize, Deserialize)]
26pub struct UpdateProp {
27    pub id: VertexId,  // 頂点IDまたはエッジID
28    pub key: PropertyKey,
29    pub value: Value,
30}
31
32/// リリンク(エッジの端点変更)
33#[derive(Debug, Clone, Serialize, Deserialize)]
34pub struct Relink {
35    pub edge_id: EdgeId,
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub new_src: Option<VertexId>,
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub new_dst: Option<VertexId>,
40}
41
42/// パッチ操作
43#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct Patch {
45    pub adds: Adds,
46    pub dels: Dels,
47    pub updates: Updates,
48}
49
50/// 追加操作
51#[derive(Debug, Clone, Serialize, Deserialize, Default)]
52pub struct Adds {
53    pub vertices: Vec<AddVertex>,
54    pub edges: Vec<AddEdge>,
55}
56
57/// 削除操作
58#[derive(Debug, Clone, Serialize, Deserialize, Default)]
59pub struct Dels {
60    pub vertices: Vec<VertexId>,
61    pub edges: Vec<EdgeId>,
62}
63
64/// 更新操作
65#[derive(Debug, Clone, Serialize, Deserialize, Default)]
66pub struct Updates {
67    pub props: Vec<UpdateProp>,
68    pub relinks: Vec<Relink>,
69}
70
71impl Patch {
72    /// 空のパッチを作成
73    pub fn empty() -> Self {
74        Self {
75            adds: Adds::default(),
76            dels: Dels::default(),
77            updates: Updates::default(),
78        }
79    }
80
81    /// パッチが空かどうか
82    pub fn is_empty(&self) -> bool {
83        self.adds.vertices.is_empty()
84            && self.adds.edges.is_empty()
85            && self.dels.vertices.is_empty()
86            && self.dels.edges.is_empty()
87            && self.updates.props.is_empty()
88            && self.updates.relinks.is_empty()
89    }
90
91    /// 2つのパッチをマージ
92    pub fn merge(mut self, other: Patch) -> Self {
93        self.adds.vertices.extend(other.adds.vertices);
94        self.adds.edges.extend(other.adds.edges);
95        self.dels.vertices.extend(other.dels.vertices);
96        self.dels.edges.extend(other.dels.edges);
97        self.updates.props.extend(other.updates.props);
98        self.updates.relinks.extend(other.updates.relinks);
99        self
100    }
101}