overgraph 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- overgraph-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +26 -0
- overgraph-0.1.0/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- overgraph-0.1.0/.github/workflows/benchmarks.yml +250 -0
- overgraph-0.1.0/.github/workflows/ci.yml +45 -0
- overgraph-0.1.0/.github/workflows/release.yml +177 -0
- overgraph-0.1.0/.gitignore +42 -0
- overgraph-0.1.0/CHANGELOG.md +102 -0
- overgraph-0.1.0/CONTRIBUTING.md +133 -0
- overgraph-0.1.0/Cargo.lock +1254 -0
- overgraph-0.1.0/Cargo.toml +54 -0
- overgraph-0.1.0/LICENSE-APACHE +200 -0
- overgraph-0.1.0/LICENSE-MIT +21 -0
- overgraph-0.1.0/PKG-INFO +15 -0
- overgraph-0.1.0/README.md +270 -0
- overgraph-0.1.0/benches/core_ops.rs +745 -0
- overgraph-0.1.0/docs/04-quality/Benchmark-FAQ.md +42 -0
- overgraph-0.1.0/docs/04-quality/Benchmark-Methodology.md +93 -0
- overgraph-0.1.0/docs/04-quality/Benchmark-Plan.md +205 -0
- overgraph-0.1.0/docs/04-quality/Benchmark-Runner.md +64 -0
- overgraph-0.1.0/docs/04-quality/regression-allowlist.json +13 -0
- overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack/README.md +82 -0
- overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack/results-small-group-commit.json +291 -0
- overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/README.md +237 -0
- overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/parity-report.json +37 -0
- overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/parity-report.md +34 -0
- overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/results-small-group-commit-parity.json +39 -0
- overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/node-large.json +478 -0
- overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/node-medium.json +478 -0
- overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/node-small.json +478 -0
- overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/python-large.json +478 -0
- overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/python-medium.json +478 -0
- overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/python-small.json +478 -0
- overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/rust-large.json +444 -0
- overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/rust-medium.json +444 -0
- overgraph-0.1.0/docs/04-quality/reports/2026-03-04-launch-pack-parity/run-data/rust-small.json +444 -0
- overgraph-0.1.0/docs/04-quality/reports/Performance-Overview.md +135 -0
- overgraph-0.1.0/docs/04-quality/reports/README.md +26 -0
- overgraph-0.1.0/docs/04-quality/reports/baselines/README.md +20 -0
- overgraph-0.1.0/docs/04-quality/reports/baselines/examples/large/node.json +478 -0
- overgraph-0.1.0/docs/04-quality/reports/baselines/examples/large/python.json +478 -0
- overgraph-0.1.0/docs/04-quality/reports/baselines/examples/large/rust.json +444 -0
- overgraph-0.1.0/docs/04-quality/reports/baselines/examples/medium/node.json +478 -0
- overgraph-0.1.0/docs/04-quality/reports/baselines/examples/medium/python.json +478 -0
- overgraph-0.1.0/docs/04-quality/reports/baselines/examples/medium/rust.json +444 -0
- overgraph-0.1.0/docs/04-quality/reports/baselines/examples/small/node.json +478 -0
- overgraph-0.1.0/docs/04-quality/reports/baselines/examples/small/python.json +478 -0
- overgraph-0.1.0/docs/04-quality/reports/baselines/examples/small/rust.json +444 -0
- overgraph-0.1.0/docs/04-quality/workloads/README.md +48 -0
- overgraph-0.1.0/docs/04-quality/workloads/profiles.json +91 -0
- overgraph-0.1.0/docs/04-quality/workloads/scenario-contract.json +127 -0
- overgraph-0.1.0/docs/architecture-overview.md +169 -0
- overgraph-0.1.0/docs/getting-started.md +403 -0
- overgraph-0.1.0/examples/node/knowledge-graph.mjs +126 -0
- overgraph-0.1.0/examples/python/knowledge_graph.py +125 -0
- overgraph-0.1.0/examples/rust/knowledge_graph.rs +122 -0
- overgraph-0.1.0/overgraph-python/Cargo.toml +14 -0
- overgraph-0.1.0/overgraph-python/src/lib.rs +2174 -0
- overgraph-0.1.0/overgraph-python/tests/conftest.py +52 -0
- overgraph-0.1.0/overgraph-python/tests/test_analytics.py +166 -0
- overgraph-0.1.0/overgraph-python/tests/test_async.py +471 -0
- overgraph-0.1.0/overgraph-python/tests/test_batch.py +342 -0
- overgraph-0.1.0/overgraph-python/tests/test_crud.py +242 -0
- overgraph-0.1.0/overgraph-python/tests/test_edge_cases.py +539 -0
- overgraph-0.1.0/overgraph-python/tests/test_lifecycle.py +116 -0
- overgraph-0.1.0/overgraph-python/tests/test_maintenance.py +104 -0
- overgraph-0.1.0/overgraph-python/tests/test_pagination.py +223 -0
- overgraph-0.1.0/overgraph-python/tests/test_persistence.py +229 -0
- overgraph-0.1.0/overgraph-python/tests/test_queries.py +119 -0
- overgraph-0.1.0/overgraph-python/tests/test_retention.py +103 -0
- overgraph-0.1.0/overgraph-python/tests/test_traversal.py +266 -0
- overgraph-0.1.0/pyproject.toml +28 -0
- overgraph-0.1.0/python/overgraph/__init__.py +2 -0
- overgraph-0.1.0/python/overgraph/__init__.pyi +445 -0
- overgraph-0.1.0/python/overgraph/async_api.py +406 -0
- overgraph-0.1.0/python/overgraph/py.typed +0 -0
- overgraph-0.1.0/scripts/bench/run-node.sh +5 -0
- overgraph-0.1.0/scripts/bench/run-python.sh +5 -0
- overgraph-0.1.0/scripts/bench/run-rust.sh +5 -0
- overgraph-0.1.0/src/bin/benchmark_harness.rs +1168 -0
- overgraph-0.1.0/src/bin/inspect.rs +235 -0
- overgraph-0.1.0/src/encoding.rs +571 -0
- overgraph-0.1.0/src/engine.rs +16735 -0
- overgraph-0.1.0/src/error.rs +46 -0
- overgraph-0.1.0/src/lib.rs +55 -0
- overgraph-0.1.0/src/manifest.rs +297 -0
- overgraph-0.1.0/src/memtable.rs +1324 -0
- overgraph-0.1.0/src/segment_reader.rs +2562 -0
- overgraph-0.1.0/src/segment_writer.rs +2034 -0
- overgraph-0.1.0/src/types.rs +604 -0
- overgraph-0.1.0/src/wal.rs +732 -0
- overgraph-0.1.0/src/wal_sync.rs +385 -0
- overgraph-0.1.0/tests/inspect_integration.rs +241 -0
- overgraph-0.1.0/tests/phase1_integration.rs +216 -0
- overgraph-0.1.0/tests/phase2_integration.rs +203 -0
- overgraph-0.1.0/tests/phase3_integration.rs +256 -0
- overgraph-0.1.0/tests/phase4_integration.rs +376 -0
- overgraph-0.1.0/tests/phase5_integration.rs +257 -0
- overgraph-0.1.0/tests/robustness_integration.rs +365 -0
- overgraph-0.1.0/tools/bench/__init__.py +1 -0
- overgraph-0.1.0/tools/bench/compare_baseline.py +421 -0
- overgraph-0.1.0/tools/bench/python_connector_benchmark.py +647 -0
- overgraph-0.1.0/tools/bench/run_suite.py +481 -0
- overgraph-0.1.0/tools/bench/tests/test_compare_baseline.py +438 -0
- overgraph-0.1.0/tools/bench/tests/test_run_suite.py +107 -0
- overgraph-0.1.0/tools/bench/tests/test_run_suite_rust_parse.py +43 -0
- overgraph-0.1.0/tools/bench/tests/test_validate_parity.py +148 -0
- overgraph-0.1.0/tools/bench/validate_parity.py +344 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug Report
|
|
3
|
+
about: Something isn't working right
|
|
4
|
+
title: ""
|
|
5
|
+
labels: bug
|
|
6
|
+
assignees: ""
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
**What happened?**
|
|
10
|
+
A clear description of the bug.
|
|
11
|
+
|
|
12
|
+
**What did you expect?**
|
|
13
|
+
What should have happened instead.
|
|
14
|
+
|
|
15
|
+
**How to reproduce**
|
|
16
|
+
Steps or a minimal code example:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
// your code here
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Environment**
|
|
23
|
+
- OS: [e.g., macOS 14, Ubuntu 22.04, Windows 11]
|
|
24
|
+
- Language: [Rust / Node.js / Python]
|
|
25
|
+
- OverGraph version: [e.g., 0.1.0]
|
|
26
|
+
- Rust version (if building from source): [e.g., 1.75.0]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature Request
|
|
3
|
+
about: Suggest something new
|
|
4
|
+
title: ""
|
|
5
|
+
labels: enhancement
|
|
6
|
+
assignees: ""
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
**What's the use case?**
|
|
10
|
+
Describe what you're trying to do and why the current API doesn't cover it.
|
|
11
|
+
|
|
12
|
+
**What would the API look like?**
|
|
13
|
+
If you have ideas about how this would work, show an example:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
// your ideal API here
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**Anything else?**
|
|
20
|
+
Any context, alternatives you've considered, or related issues.
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
name: Benchmarks
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
profile:
|
|
7
|
+
description: "Benchmark profile"
|
|
8
|
+
required: false
|
|
9
|
+
default: small
|
|
10
|
+
type: choice
|
|
11
|
+
options:
|
|
12
|
+
- small
|
|
13
|
+
- medium
|
|
14
|
+
- large
|
|
15
|
+
baseline_root:
|
|
16
|
+
description: "Optional baseline root dir (defaults to docs/04-quality/reports/baselines/gha-ubuntu-22.04/<profile>)"
|
|
17
|
+
required: false
|
|
18
|
+
type: string
|
|
19
|
+
fail_on_warning:
|
|
20
|
+
description: "Fail workflow when only warning-threshold regressions are found"
|
|
21
|
+
required: false
|
|
22
|
+
default: false
|
|
23
|
+
type: boolean
|
|
24
|
+
schedule:
|
|
25
|
+
- cron: "0 7 * * *"
|
|
26
|
+
|
|
27
|
+
permissions:
|
|
28
|
+
contents: read
|
|
29
|
+
|
|
30
|
+
jobs:
|
|
31
|
+
benchmark:
|
|
32
|
+
runs-on: ubuntu-22.04
|
|
33
|
+
timeout-minutes: 180
|
|
34
|
+
|
|
35
|
+
steps:
|
|
36
|
+
- name: Checkout
|
|
37
|
+
uses: actions/checkout@v4
|
|
38
|
+
|
|
39
|
+
- name: Resolve benchmark config
|
|
40
|
+
shell: bash
|
|
41
|
+
run: |
|
|
42
|
+
set -euo pipefail
|
|
43
|
+
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
|
|
44
|
+
PROFILE="${{ inputs.profile }}"
|
|
45
|
+
BASELINE_ROOT_INPUT="${{ inputs.baseline_root }}"
|
|
46
|
+
FAIL_ON_WARNING="${{ inputs.fail_on_warning }}"
|
|
47
|
+
else
|
|
48
|
+
PROFILE="medium"
|
|
49
|
+
BASELINE_ROOT_INPUT=""
|
|
50
|
+
FAIL_ON_WARNING="false"
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
if [[ -n "${BASELINE_ROOT_INPUT}" ]]; then
|
|
54
|
+
BASELINE_ROOT="${BASELINE_ROOT_INPUT}"
|
|
55
|
+
else
|
|
56
|
+
BASELINE_ROOT="docs/04-quality/reports/baselines/gha-ubuntu-22.04/${PROFILE}"
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
case "${PROFILE}" in
|
|
60
|
+
small)
|
|
61
|
+
WARMUP=10
|
|
62
|
+
ITERS=30
|
|
63
|
+
;;
|
|
64
|
+
medium)
|
|
65
|
+
WARMUP=20
|
|
66
|
+
ITERS=80
|
|
67
|
+
;;
|
|
68
|
+
large)
|
|
69
|
+
WARMUP=20
|
|
70
|
+
ITERS=80
|
|
71
|
+
;;
|
|
72
|
+
*)
|
|
73
|
+
echo "Unsupported profile: ${PROFILE}" >&2
|
|
74
|
+
exit 1
|
|
75
|
+
;;
|
|
76
|
+
esac
|
|
77
|
+
|
|
78
|
+
RUN_TAG="ci-$(date -u +%Y%m%dT%H%M%SZ)-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
|
|
79
|
+
|
|
80
|
+
{
|
|
81
|
+
echo "PROFILE=${PROFILE}"
|
|
82
|
+
echo "BASELINE_ROOT=${BASELINE_ROOT}"
|
|
83
|
+
echo "WARMUP=${WARMUP}"
|
|
84
|
+
echo "ITERS=${ITERS}"
|
|
85
|
+
echo "RUN_TAG=${RUN_TAG}"
|
|
86
|
+
echo "FAIL_ON_WARNING=${FAIL_ON_WARNING}"
|
|
87
|
+
} >> "$GITHUB_ENV"
|
|
88
|
+
|
|
89
|
+
- name: Setup Rust
|
|
90
|
+
uses: dtolnay/rust-toolchain@stable
|
|
91
|
+
|
|
92
|
+
- name: Cache Rust build artifacts
|
|
93
|
+
uses: Swatinem/rust-cache@v2
|
|
94
|
+
|
|
95
|
+
- name: Setup Node
|
|
96
|
+
uses: actions/setup-node@v4
|
|
97
|
+
with:
|
|
98
|
+
node-version: "20"
|
|
99
|
+
|
|
100
|
+
- name: Setup Python
|
|
101
|
+
uses: actions/setup-python@v5
|
|
102
|
+
with:
|
|
103
|
+
python-version: "3.11"
|
|
104
|
+
|
|
105
|
+
- name: Install system deps
|
|
106
|
+
shell: bash
|
|
107
|
+
run: |
|
|
108
|
+
set -euo pipefail
|
|
109
|
+
sudo apt-get update
|
|
110
|
+
sudo apt-get install -y pkg-config libssl-dev
|
|
111
|
+
|
|
112
|
+
- name: Install Node deps + build connector
|
|
113
|
+
shell: bash
|
|
114
|
+
run: |
|
|
115
|
+
set -euo pipefail
|
|
116
|
+
npm ci --prefix overgraph-node
|
|
117
|
+
npm --prefix overgraph-node run build
|
|
118
|
+
|
|
119
|
+
- name: Install Python deps + build connector
|
|
120
|
+
shell: bash
|
|
121
|
+
run: |
|
|
122
|
+
set -euo pipefail
|
|
123
|
+
python3 -m pip install --upgrade pip
|
|
124
|
+
python3 -m pip install maturin==1.7.8
|
|
125
|
+
python3 -m pip install -e overgraph-python
|
|
126
|
+
|
|
127
|
+
- name: Run benchmark suite
|
|
128
|
+
shell: bash
|
|
129
|
+
run: |
|
|
130
|
+
set -euo pipefail
|
|
131
|
+
mkdir -p bench-artifacts/runs/rust
|
|
132
|
+
mkdir -p bench-artifacts/runs/node
|
|
133
|
+
mkdir -p bench-artifacts/runs/python
|
|
134
|
+
|
|
135
|
+
scripts/bench/run-rust.sh \
|
|
136
|
+
--profile "${PROFILE}" \
|
|
137
|
+
--warmup "${WARMUP}" \
|
|
138
|
+
--iters "${ITERS}" \
|
|
139
|
+
--output-root bench-artifacts/runs/rust \
|
|
140
|
+
--run-id "${RUN_TAG}-rust-${PROFILE}"
|
|
141
|
+
|
|
142
|
+
scripts/bench/run-node.sh \
|
|
143
|
+
--profile "${PROFILE}" \
|
|
144
|
+
--warmup "${WARMUP}" \
|
|
145
|
+
--iters "${ITERS}" \
|
|
146
|
+
--output-root bench-artifacts/runs/node \
|
|
147
|
+
--run-id "${RUN_TAG}-node-${PROFILE}"
|
|
148
|
+
|
|
149
|
+
scripts/bench/run-python.sh \
|
|
150
|
+
--profile "${PROFILE}" \
|
|
151
|
+
--warmup "${WARMUP}" \
|
|
152
|
+
--iters "${ITERS}" \
|
|
153
|
+
--output-root bench-artifacts/runs/python \
|
|
154
|
+
--run-id "${RUN_TAG}-python-${PROFILE}"
|
|
155
|
+
|
|
156
|
+
- name: Validate cross-language parity
|
|
157
|
+
shell: bash
|
|
158
|
+
run: |
|
|
159
|
+
set -euo pipefail
|
|
160
|
+
mkdir -p bench-artifacts/parity
|
|
161
|
+
|
|
162
|
+
python3 tools/bench/validate_parity.py \
|
|
163
|
+
--rust "bench-artifacts/runs/rust/${RUN_TAG}-rust-${PROFILE}/rust.json" \
|
|
164
|
+
--node "bench-artifacts/runs/node/${RUN_TAG}-node-${PROFILE}/node.json" \
|
|
165
|
+
--python "bench-artifacts/runs/python/${RUN_TAG}-python-${PROFILE}/python.json" \
|
|
166
|
+
--report-json bench-artifacts/parity/parity-report.json \
|
|
167
|
+
--report-md bench-artifacts/parity/parity-report.md
|
|
168
|
+
|
|
169
|
+
- name: Compare to baseline
|
|
170
|
+
shell: bash
|
|
171
|
+
run: |
|
|
172
|
+
set -euo pipefail
|
|
173
|
+
mkdir -p bench-artifacts/compare
|
|
174
|
+
|
|
175
|
+
status=0
|
|
176
|
+
for lang in rust node python; do
|
|
177
|
+
candidate_json="bench-artifacts/runs/${lang}/${RUN_TAG}-${lang}-${PROFILE}/${lang}.json"
|
|
178
|
+
baseline_json="${BASELINE_ROOT}/${lang}.json"
|
|
179
|
+
report_md="bench-artifacts/compare/${lang}-compare.md"
|
|
180
|
+
report_json="bench-artifacts/compare/${lang}-compare.json"
|
|
181
|
+
|
|
182
|
+
if [[ ! -f "${candidate_json}" ]]; then
|
|
183
|
+
echo "Missing candidate file: ${candidate_json}" >&2
|
|
184
|
+
status=2
|
|
185
|
+
continue
|
|
186
|
+
fi
|
|
187
|
+
|
|
188
|
+
if [[ -f "${baseline_json}" ]]; then
|
|
189
|
+
args=(
|
|
190
|
+
python3 tools/bench/compare_baseline.py
|
|
191
|
+
--baseline "${baseline_json}"
|
|
192
|
+
--candidate "${candidate_json}"
|
|
193
|
+
--allowlist docs/04-quality/regression-allowlist.json
|
|
194
|
+
--warn-threshold-pct 10
|
|
195
|
+
--fail-threshold-pct 20
|
|
196
|
+
--report-md "${report_md}"
|
|
197
|
+
--report-json "${report_json}"
|
|
198
|
+
)
|
|
199
|
+
if [[ "${FAIL_ON_WARNING}" == "true" ]]; then
|
|
200
|
+
args+=(--fail-on-warning)
|
|
201
|
+
fi
|
|
202
|
+
|
|
203
|
+
set +e
|
|
204
|
+
"${args[@]}"
|
|
205
|
+
rc=$?
|
|
206
|
+
set -e
|
|
207
|
+
|
|
208
|
+
if (( rc > status )); then
|
|
209
|
+
status=$rc
|
|
210
|
+
fi
|
|
211
|
+
else
|
|
212
|
+
{
|
|
213
|
+
echo "# Benchmark Baseline Comparison"
|
|
214
|
+
echo
|
|
215
|
+
echo "- Language: \`${lang}\`"
|
|
216
|
+
echo "- Status: \`error\`"
|
|
217
|
+
echo "- Reason: required baseline file not found at \`${baseline_json}\`"
|
|
218
|
+
} > "${report_md}"
|
|
219
|
+
status=2
|
|
220
|
+
fi
|
|
221
|
+
done
|
|
222
|
+
|
|
223
|
+
exit "${status}"
|
|
224
|
+
|
|
225
|
+
- name: Publish comparison summary
|
|
226
|
+
if: always()
|
|
227
|
+
shell: bash
|
|
228
|
+
run: |
|
|
229
|
+
set -euo pipefail
|
|
230
|
+
if [[ -f "bench-artifacts/parity/parity-report.md" ]]; then
|
|
231
|
+
echo "## parity-report.md" >> "$GITHUB_STEP_SUMMARY"
|
|
232
|
+
cat "bench-artifacts/parity/parity-report.md" >> "$GITHUB_STEP_SUMMARY"
|
|
233
|
+
echo >> "$GITHUB_STEP_SUMMARY"
|
|
234
|
+
fi
|
|
235
|
+
if compgen -G "bench-artifacts/compare/*.md" > /dev/null; then
|
|
236
|
+
for file in bench-artifacts/compare/*.md; do
|
|
237
|
+
echo "## $(basename "${file}")" >> "$GITHUB_STEP_SUMMARY"
|
|
238
|
+
cat "${file}" >> "$GITHUB_STEP_SUMMARY"
|
|
239
|
+
echo >> "$GITHUB_STEP_SUMMARY"
|
|
240
|
+
done
|
|
241
|
+
fi
|
|
242
|
+
|
|
243
|
+
- name: Upload benchmark artifacts
|
|
244
|
+
if: always()
|
|
245
|
+
uses: actions/upload-artifact@v4
|
|
246
|
+
with:
|
|
247
|
+
name: benchmark-${{ env.RUN_TAG }}-${{ env.PROFILE }}
|
|
248
|
+
path: bench-artifacts
|
|
249
|
+
if-no-files-found: error
|
|
250
|
+
retention-days: 30
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
test:
|
|
14
|
+
name: Test (${{ matrix.os }})
|
|
15
|
+
runs-on: ${{ matrix.os }}
|
|
16
|
+
strategy:
|
|
17
|
+
fail-fast: false
|
|
18
|
+
matrix:
|
|
19
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
20
|
+
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v4
|
|
23
|
+
|
|
24
|
+
- name: Install Rust
|
|
25
|
+
uses: dtolnay/rust-toolchain@stable
|
|
26
|
+
|
|
27
|
+
- name: Cache cargo registry and build
|
|
28
|
+
uses: actions/cache@v4
|
|
29
|
+
with:
|
|
30
|
+
path: |
|
|
31
|
+
~/.cargo/registry
|
|
32
|
+
~/.cargo/git
|
|
33
|
+
target
|
|
34
|
+
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
|
35
|
+
restore-keys: |
|
|
36
|
+
${{ runner.os }}-cargo-
|
|
37
|
+
|
|
38
|
+
- name: Build
|
|
39
|
+
run: cargo build --all-targets --features cli
|
|
40
|
+
|
|
41
|
+
- name: Run tests
|
|
42
|
+
run: cargo test --features cli
|
|
43
|
+
|
|
44
|
+
- name: Run tests (no default features)
|
|
45
|
+
run: cargo test
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*'
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
# ──────────────────────────────────────────────
|
|
13
|
+
# Rust: publish to crates.io
|
|
14
|
+
# ──────────────────────────────────────────────
|
|
15
|
+
# Uses API token for first publish. After v0.1.0 is live, configure
|
|
16
|
+
# Trusted Publishing on crates.io and switch to crates-io-auth-action.
|
|
17
|
+
publish-rust:
|
|
18
|
+
name: Publish to crates.io
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v4
|
|
22
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
23
|
+
- uses: actions/cache@v4
|
|
24
|
+
with:
|
|
25
|
+
path: |
|
|
26
|
+
~/.cargo/registry
|
|
27
|
+
~/.cargo/git
|
|
28
|
+
target
|
|
29
|
+
key: ${{ runner.os }}-cargo-publish-${{ hashFiles('**/Cargo.lock') }}
|
|
30
|
+
- run: cargo publish -p overgraph
|
|
31
|
+
env:
|
|
32
|
+
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
|
|
33
|
+
|
|
34
|
+
# ──────────────────────────────────────────────
|
|
35
|
+
# Node.js: build native binaries for each platform
|
|
36
|
+
# ──────────────────────────────────────────────
|
|
37
|
+
build-node:
|
|
38
|
+
name: Build Node.js (${{ matrix.target }})
|
|
39
|
+
runs-on: ${{ matrix.os }}
|
|
40
|
+
strategy:
|
|
41
|
+
fail-fast: false
|
|
42
|
+
matrix:
|
|
43
|
+
include:
|
|
44
|
+
- os: macos-latest
|
|
45
|
+
target: aarch64-apple-darwin
|
|
46
|
+
- os: macos-latest
|
|
47
|
+
target: x86_64-apple-darwin
|
|
48
|
+
- os: ubuntu-latest
|
|
49
|
+
target: x86_64-unknown-linux-gnu
|
|
50
|
+
- os: windows-latest
|
|
51
|
+
target: x86_64-pc-windows-msvc
|
|
52
|
+
steps:
|
|
53
|
+
- uses: actions/checkout@v4
|
|
54
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
55
|
+
with:
|
|
56
|
+
targets: ${{ matrix.target }}
|
|
57
|
+
- uses: actions/setup-node@v4
|
|
58
|
+
with:
|
|
59
|
+
node-version: 22
|
|
60
|
+
- name: Install dependencies
|
|
61
|
+
working-directory: overgraph-node
|
|
62
|
+
run: npm install
|
|
63
|
+
- name: Build native module
|
|
64
|
+
working-directory: overgraph-node
|
|
65
|
+
run: npx napi build --platform --release --target ${{ matrix.target }}
|
|
66
|
+
- name: Upload artifact
|
|
67
|
+
uses: actions/upload-artifact@v4
|
|
68
|
+
with:
|
|
69
|
+
name: node-${{ matrix.target }}
|
|
70
|
+
path: overgraph-node/*.node
|
|
71
|
+
if-no-files-found: error
|
|
72
|
+
|
|
73
|
+
# ──────────────────────────────────────────────
|
|
74
|
+
# Node.js: publish to npm
|
|
75
|
+
# ──────────────────────────────────────────────
|
|
76
|
+
# Uses granular access token for first publish. After v0.1.0 is live,
|
|
77
|
+
# configure Trusted Publishing on npmjs.com and switch to OIDC.
|
|
78
|
+
publish-node:
|
|
79
|
+
name: Publish to npm
|
|
80
|
+
needs: build-node
|
|
81
|
+
runs-on: ubuntu-latest
|
|
82
|
+
steps:
|
|
83
|
+
- uses: actions/checkout@v4
|
|
84
|
+
- uses: actions/setup-node@v4
|
|
85
|
+
with:
|
|
86
|
+
node-version: 22
|
|
87
|
+
registry-url: https://registry.npmjs.org
|
|
88
|
+
- name: Download all artifacts
|
|
89
|
+
uses: actions/download-artifact@v4
|
|
90
|
+
with:
|
|
91
|
+
path: overgraph-node/artifacts
|
|
92
|
+
pattern: node-*
|
|
93
|
+
- name: Move binaries into place
|
|
94
|
+
working-directory: overgraph-node
|
|
95
|
+
run: |
|
|
96
|
+
for dir in artifacts/node-*/; do
|
|
97
|
+
cp "$dir"*.node .
|
|
98
|
+
done
|
|
99
|
+
ls -la *.node
|
|
100
|
+
- name: Publish
|
|
101
|
+
working-directory: overgraph-node
|
|
102
|
+
run: npm publish --access public
|
|
103
|
+
env:
|
|
104
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
105
|
+
|
|
106
|
+
# ──────────────────────────────────────────────
|
|
107
|
+
# Python: build wheels for each platform
|
|
108
|
+
# ──────────────────────────────────────────────
|
|
109
|
+
build-python:
|
|
110
|
+
name: Build Python (${{ matrix.target }})
|
|
111
|
+
runs-on: ${{ matrix.os }}
|
|
112
|
+
strategy:
|
|
113
|
+
fail-fast: false
|
|
114
|
+
matrix:
|
|
115
|
+
include:
|
|
116
|
+
- os: macos-latest
|
|
117
|
+
target: aarch64-apple-darwin
|
|
118
|
+
- os: macos-latest
|
|
119
|
+
target: x86_64-apple-darwin
|
|
120
|
+
- os: ubuntu-latest
|
|
121
|
+
target: x86_64-unknown-linux-gnu
|
|
122
|
+
- os: windows-latest
|
|
123
|
+
target: x86_64-pc-windows-msvc
|
|
124
|
+
steps:
|
|
125
|
+
- uses: actions/checkout@v4
|
|
126
|
+
- uses: actions/setup-python@v5
|
|
127
|
+
with:
|
|
128
|
+
python-version: '3.12'
|
|
129
|
+
- name: Build wheel
|
|
130
|
+
uses: PyO3/maturin-action@v1
|
|
131
|
+
with:
|
|
132
|
+
working-directory: overgraph-python
|
|
133
|
+
target: ${{ matrix.target }}
|
|
134
|
+
args: --release --out ../dist
|
|
135
|
+
manylinux: auto
|
|
136
|
+
- name: Upload wheel
|
|
137
|
+
uses: actions/upload-artifact@v4
|
|
138
|
+
with:
|
|
139
|
+
name: python-${{ matrix.target }}
|
|
140
|
+
path: dist/*.whl
|
|
141
|
+
if-no-files-found: error
|
|
142
|
+
|
|
143
|
+
build-python-sdist:
|
|
144
|
+
name: Build Python sdist
|
|
145
|
+
runs-on: ubuntu-latest
|
|
146
|
+
steps:
|
|
147
|
+
- uses: actions/checkout@v4
|
|
148
|
+
- name: Build sdist
|
|
149
|
+
uses: PyO3/maturin-action@v1
|
|
150
|
+
with:
|
|
151
|
+
working-directory: overgraph-python
|
|
152
|
+
command: sdist
|
|
153
|
+
args: --out ../dist
|
|
154
|
+
- name: Upload sdist
|
|
155
|
+
uses: actions/upload-artifact@v4
|
|
156
|
+
with:
|
|
157
|
+
name: python-sdist
|
|
158
|
+
path: dist/*.tar.gz
|
|
159
|
+
if-no-files-found: error
|
|
160
|
+
|
|
161
|
+
# ──────────────────────────────────────────────
|
|
162
|
+
# Python: publish to PyPI (Trusted Publishers — no token needed)
|
|
163
|
+
# ──────────────────────────────────────────────
|
|
164
|
+
publish-python:
|
|
165
|
+
name: Publish to PyPI
|
|
166
|
+
needs: [build-python, build-python-sdist]
|
|
167
|
+
runs-on: ubuntu-latest
|
|
168
|
+
permissions:
|
|
169
|
+
id-token: write
|
|
170
|
+
steps:
|
|
171
|
+
- uses: actions/download-artifact@v4
|
|
172
|
+
with:
|
|
173
|
+
path: dist
|
|
174
|
+
pattern: python-*
|
|
175
|
+
merge-multiple: true
|
|
176
|
+
- name: Publish
|
|
177
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Build artifacts
|
|
2
|
+
/target
|
|
3
|
+
*.so
|
|
4
|
+
*.dylib
|
|
5
|
+
*.dSYM/
|
|
6
|
+
|
|
7
|
+
# Node.js
|
|
8
|
+
node_modules/
|
|
9
|
+
*.node
|
|
10
|
+
|
|
11
|
+
# Python
|
|
12
|
+
__pycache__/
|
|
13
|
+
*.pyc
|
|
14
|
+
*.pyo
|
|
15
|
+
*.egg-info/
|
|
16
|
+
dist/
|
|
17
|
+
.pytest_cache/
|
|
18
|
+
|
|
19
|
+
# OS files
|
|
20
|
+
.DS_Store
|
|
21
|
+
Thumbs.db
|
|
22
|
+
|
|
23
|
+
# IDE
|
|
24
|
+
.vscode/
|
|
25
|
+
.idea/
|
|
26
|
+
*.swp
|
|
27
|
+
*.swo
|
|
28
|
+
|
|
29
|
+
# Environment
|
|
30
|
+
.env
|
|
31
|
+
.env.local
|
|
32
|
+
|
|
33
|
+
# Claude Code
|
|
34
|
+
.claude/
|
|
35
|
+
CLAUDE.md
|
|
36
|
+
AGENTS.md
|
|
37
|
+
|
|
38
|
+
# Internal development docs (not public-facing)
|
|
39
|
+
docs/internal/
|
|
40
|
+
|
|
41
|
+
# Research notes
|
|
42
|
+
research-docs/
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/), and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
6
|
+
|
|
7
|
+
## [0.1.0] - 2026-03-04
|
|
8
|
+
|
|
9
|
+
Initial release.
|
|
10
|
+
|
|
11
|
+
### Core Engine
|
|
12
|
+
- Log-structured merge tree storage engine, written entirely in Rust with zero C/C++ dependencies
|
|
13
|
+
- Write-ahead log with CRC32 integrity checks and crash recovery
|
|
14
|
+
- Configurable durability: `Immediate` (fsync per write) or `GroupCommit` (batched fsync, ~20x throughput)
|
|
15
|
+
- Immutable segments with memory-mapped reads (no application-level caching)
|
|
16
|
+
- Background compaction with metadata sidecars, raw binary copy, and metadata-driven index building
|
|
17
|
+
- Atomic manifest updates with rollback safety
|
|
18
|
+
- Directory-scoped databases (each DB is a self-contained folder)
|
|
19
|
+
|
|
20
|
+
### Data Model
|
|
21
|
+
- Typed nodes with `(type_id, key)` upsert semantics
|
|
22
|
+
- Typed edges with optional `(from, to, type_id)` uniqueness
|
|
23
|
+
- Weighted nodes and edges (`f32` weight field)
|
|
24
|
+
- Schemaless properties encoded as MessagePack (supports null, bool, int, float, string, bytes, arrays)
|
|
25
|
+
|
|
26
|
+
### Graph Operations
|
|
27
|
+
- Single and batch upsert for nodes and edges
|
|
28
|
+
- Packed binary batch format for maximum throughput
|
|
29
|
+
- Delete with tombstone-based soft deletion
|
|
30
|
+
- Atomic `graph_patch` for multi-operation mutations
|
|
31
|
+
- Point lookups by ID, by `(type_id, key)`, and by `(from, to, type_id)` triple
|
|
32
|
+
- Bulk reads with sorted merge-walk (not per-item lookups)
|
|
33
|
+
|
|
34
|
+
### Query and Traversal
|
|
35
|
+
- 1-hop and 2-hop neighbor expansion with edge type filters and direction control
|
|
36
|
+
- Constrained 2-hop: traverse specific edge types, filter target nodes by type
|
|
37
|
+
- Top-K neighbors by weight, recency, or decay-adjusted score
|
|
38
|
+
- Property equality search (hash-indexed)
|
|
39
|
+
- Type-based node and edge listing with counts
|
|
40
|
+
- Time-range queries on a sorted timestamp index
|
|
41
|
+
- Subgraph extraction up to N hops deep
|
|
42
|
+
- Personalized PageRank from seed nodes
|
|
43
|
+
- Graph adjacency export with type filters
|
|
44
|
+
|
|
45
|
+
### Temporal Features
|
|
46
|
+
- Bi-temporal edges with `valid_from` and `valid_to` timestamps
|
|
47
|
+
- Point-in-time queries via `at_epoch` parameter
|
|
48
|
+
- Edge invalidation (mark as no longer valid without deleting)
|
|
49
|
+
- Exponential decay scoring via `decay_lambda` parameter
|
|
50
|
+
|
|
51
|
+
### Pagination
|
|
52
|
+
- Keyset pagination on all collection-returning APIs
|
|
53
|
+
- Stable cursors across concurrent writes
|
|
54
|
+
- K-way merge with binary-seek cursor for efficient multi-source pagination
|
|
55
|
+
|
|
56
|
+
### Retention
|
|
57
|
+
- Manual `prune()` by age, weight threshold, or node type
|
|
58
|
+
- Named prune policies stored in manifest, evaluated at read time (lazy expiration) and compaction time (physical deletion)
|
|
59
|
+
- Automatic edge cascade on node pruning
|
|
60
|
+
|
|
61
|
+
### Indexes
|
|
62
|
+
- Outgoing and incoming adjacency indexes with delta-encoded postings
|
|
63
|
+
- `(type_id, key)` to node_id key index
|
|
64
|
+
- `type_id` to sorted ID list type index
|
|
65
|
+
- Property equality hash index
|
|
66
|
+
- Sorted timestamp index for time-range queries
|
|
67
|
+
- Tombstone index
|
|
68
|
+
|
|
69
|
+
### Performance
|
|
70
|
+
- Node lookups: ~200ns
|
|
71
|
+
- Neighbor traversal: ~2μs
|
|
72
|
+
- Batch writes: 600K+ nodes/sec
|
|
73
|
+
- Sorted cursor walk for batch adjacency operations (PPR, subgraph, export)
|
|
74
|
+
- Memtable backpressure (64MB hard cap)
|
|
75
|
+
- Segment format v5 with metadata sidecars for fast filtered compaction
|
|
76
|
+
|
|
77
|
+
### Node.js Connector
|
|
78
|
+
- napi-rs bindings with full API parity
|
|
79
|
+
- Sync and async variants of every method
|
|
80
|
+
- Lazy getters on record types (no deserialization until access)
|
|
81
|
+
- Typed arrays (`Float64Array`, `BigInt64Array`) for bulk data
|
|
82
|
+
- Packed binary batch protocol for node and edge upserts
|
|
83
|
+
- Context manager support
|
|
84
|
+
|
|
85
|
+
### Python Connector
|
|
86
|
+
- PyO3 + maturin bindings with full API parity
|
|
87
|
+
- Sync `OverGraph` and async `AsyncOverGraph` classes
|
|
88
|
+
- GIL released for all Rust calls via `py.allow_threads()`
|
|
89
|
+
- Lazy `.props` deserialization
|
|
90
|
+
- `IdArray` lazy sequence wrapper
|
|
91
|
+
- Context manager support (`with` / `async with`)
|
|
92
|
+
- PEP 561 type stubs (`.pyi`)
|
|
93
|
+
- Compaction progress callback with Python exception capture
|
|
94
|
+
|
|
95
|
+
### CLI
|
|
96
|
+
- `overgraph inspect <path>`: show manifest, segment count, node/edge counts, WAL size, prune policies
|
|
97
|
+
|
|
98
|
+
### CI
|
|
99
|
+
- Cross-platform CI: macOS, Linux, Windows
|
|
100
|
+
- Benchmark CI with regression detection and cross-language parity validation
|
|
101
|
+
|
|
102
|
+
[0.1.0]: https://github.com/Bhensley5/overgraph/releases/tag/v0.1.0
|