1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// Copyright (c) 2026 Austin Han <austinhan1024@gmail.com>
//
// This file is part of RocksGraph.
//
// RocksGraph is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// RocksGraph is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with RocksGraph. If not, see <https://www.gnu.org/licenses/>.
//! RocksGraph — a Gremlin-inspired property graph database engine backed by RocksDB.
//!
//! ## Quick start
//!
//! ```
//! use rocksgraph::{Graph, TraversalBuilder, Value};
//!
//! # let dir = tempfile::tempdir().unwrap();
//! # let graph = Graph::open(dir.path()).unwrap();
//!
//! // Read-write transaction
//! let mut tx = graph.begin();
//! tx.g().addV("person").property("id", 1).property("name", "alice").next().unwrap();
//! tx.g().addV("person").property("id", 2).property("name", "bob").next().unwrap();
//! tx.g().addE("knows").from(1).to(2).property("weight", 0.9f64).next().unwrap();
//! tx.commit().unwrap();
//!
//! // Read-only snapshot query
//! let mut snap = graph.read();
//! let count = snap.g().V([1]).out(["knows"]).count().next().unwrap().unwrap();
//! assert_eq!(count, Value::Int64(1));
//! let names = snap.g().V([1]).out(["knows"]).values(["name"]).to_list().unwrap();
//! assert_eq!(names, vec![Value::String("bob".into())]);
//! for v in snap.g().V([]).out(["knows"]).iter().unwrap() { println!("{:?}", v.unwrap()); }
//! # graph.close().unwrap();
//! ```
//!
//! ## Architecture
//!
//! ```text
//! Graph::open / graph.read() / graph.begin() ← api (pub)
//! │ session.g() → ReadTraversal / WriteTraversal
//! │ step methods: self → Self (move semantics)
//! │ terminals: .next()? / .to_list()? / .iter()?
//! ▼
//! gremlin::traversal fluent builder → LogicalPlan AST
//! ▼
//! planner AST → LogicalPlan IR + optimizer
//! ▼
//! engine::volcano pull-based Volcano iterator pipeline
//! ▼
//! graph query-scoped overlay (OCC dirty tracking)
//! ▼
//! store / RocksDB OptimisticTransactionDB
//! ```
//!
//! All modules below `api` are `pub(crate)` — users only interact through
//! [`Graph`], [`ReadSession`], [`TxSession`], and the traversal types re-exported
//! at the crate root.
pub
pub
pub
pub
pub
pub
// ── User-facing re-exports ────────────────────────────────────────────────────
pub use ;
pub use ;
pub use EdgeListSource;
pub use RocksOptions;
// GraphTraversal is doc-hidden but must be pub so users can pass `__()` values
// to where/coalesce/union without naming the type.
pub use GraphTraversal;
pub use ;
pub use Primitive;
pub use StoreError;