rxgraph 0.7.0__tar.gz → 0.9.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.
Files changed (50) hide show
  1. {rxgraph-0.7.0 → rxgraph-0.9.0}/Cargo.lock +221 -2
  2. {rxgraph-0.7.0 → rxgraph-0.9.0}/Cargo.toml +1 -0
  3. {rxgraph-0.7.0 → rxgraph-0.9.0}/PKG-INFO +16 -4
  4. {rxgraph-0.7.0 → rxgraph-0.9.0}/README.md +15 -3
  5. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/Cargo.toml +2 -1
  6. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/examples/native_row_lazy.rs +14 -4
  7. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/dsl/arrow_value.rs +1 -1
  8. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/dsl/value.rs +18 -2
  9. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/examples/kernels.rs +85 -1
  10. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/graph/graph.rs +29 -1
  11. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/lib.rs +5 -3
  12. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/python.rs +157 -9
  13. rxgraph-0.9.0/crates/rxgraph/src/traversal/algo.rs +684 -0
  14. rxgraph-0.9.0/crates/rxgraph/src/traversal/engine.rs +803 -0
  15. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/traversal/mod.rs +23 -1
  16. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/traversal/native.rs +149 -299
  17. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/traversal/registry.rs +134 -6
  18. rxgraph-0.9.0/crates/rxgraph/src/traversal/typed.rs +1574 -0
  19. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph-python/Cargo.toml +1 -1
  20. {rxgraph-0.7.0 → rxgraph-0.9.0}/python/rxgraph/__init__.pyi +19 -2
  21. {rxgraph-0.7.0 → rxgraph-0.9.0}/python/rxgraph/plugin.py +37 -8
  22. rxgraph-0.7.0/crates/rxgraph/src/traversal/algo.rs +0 -1425
  23. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/README.md +0 -0
  24. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/benches/flight_routes.rs +0 -0
  25. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/benches/memory.rs +0 -0
  26. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/benches/payment_risk.rs +0 -0
  27. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/examples/flight_routes.rs +0 -0
  28. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/arrow.rs +0 -0
  29. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/dsl/bind.rs +0 -0
  30. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/dsl/eval.rs +0 -0
  31. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/dsl/expr.rs +0 -0
  32. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/dsl/mod.rs +0 -0
  33. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/dsl/ops/list.rs +0 -0
  34. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/dsl/ops/mod.rs +0 -0
  35. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/dsl/ops/scalar.rs +0 -0
  36. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/dsl/ops/string.rs +0 -0
  37. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/dsl/ops/struct_.rs +0 -0
  38. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/dsl/polars_json.rs +0 -0
  39. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/examples/mod.rs +0 -0
  40. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/graph/csr.rs +0 -0
  41. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/graph/mod.rs +0 -0
  42. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/graph/repo.rs +0 -0
  43. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/traversal/config.rs +0 -0
  44. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/traversal/kernel.rs +0 -0
  45. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph/src/traversal/progress.rs +0 -0
  46. {rxgraph-0.7.0 → rxgraph-0.9.0}/crates/rxgraph-python/src/lib.rs +0 -0
  47. {rxgraph-0.7.0 → rxgraph-0.9.0}/pyproject.toml +0 -0
  48. {rxgraph-0.7.0 → rxgraph-0.9.0}/python/rxgraph/__init__.py +0 -0
  49. {rxgraph-0.7.0 → rxgraph-0.9.0}/python/rxgraph/_graph_tables.py +0 -0
  50. {rxgraph-0.7.0 → rxgraph-0.9.0}/python/rxgraph/py.typed +0 -0
@@ -2,6 +2,12 @@
2
2
  # It is not intended for manual editing.
3
3
  version = 4
4
4
 
5
+ [[package]]
6
+ name = "adler2"
7
+ version = "2.0.1"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
10
+
5
11
  [[package]]
6
12
  name = "ahash"
7
13
  version = "0.8.12"
@@ -36,6 +42,21 @@ dependencies = [
36
42
  "num-traits",
37
43
  ]
38
44
 
45
+ [[package]]
46
+ name = "alloc-no-stdlib"
47
+ version = "2.0.4"
48
+ source = "registry+https://github.com/rust-lang/crates.io-index"
49
+ checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
50
+
51
+ [[package]]
52
+ name = "alloc-stdlib"
53
+ version = "0.2.4"
54
+ source = "registry+https://github.com/rust-lang/crates.io-index"
55
+ checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195"
56
+ dependencies = [
57
+ "alloc-no-stdlib",
58
+ ]
59
+
39
60
  [[package]]
40
61
  name = "alloca"
41
62
  version = "0.4.0"
@@ -329,12 +350,39 @@ version = "2.11.1"
329
350
  source = "registry+https://github.com/rust-lang/crates.io-index"
330
351
  checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
331
352
 
353
+ [[package]]
354
+ name = "brotli"
355
+ version = "8.0.4"
356
+ source = "registry+https://github.com/rust-lang/crates.io-index"
357
+ checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3"
358
+ dependencies = [
359
+ "alloc-no-stdlib",
360
+ "alloc-stdlib",
361
+ "brotli-decompressor",
362
+ ]
363
+
364
+ [[package]]
365
+ name = "brotli-decompressor"
366
+ version = "5.0.3"
367
+ source = "registry+https://github.com/rust-lang/crates.io-index"
368
+ checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583"
369
+ dependencies = [
370
+ "alloc-no-stdlib",
371
+ "alloc-stdlib",
372
+ ]
373
+
332
374
  [[package]]
333
375
  name = "bumpalo"
334
376
  version = "3.20.3"
335
377
  source = "registry+https://github.com/rust-lang/crates.io-index"
336
378
  checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
337
379
 
380
+ [[package]]
381
+ name = "byteorder"
382
+ version = "1.5.0"
383
+ source = "registry+https://github.com/rust-lang/crates.io-index"
384
+ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
385
+
338
386
  [[package]]
339
387
  name = "bytes"
340
388
  version = "1.11.1"
@@ -354,6 +402,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
354
402
  checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f"
355
403
  dependencies = [
356
404
  "find-msvc-tools",
405
+ "jobserver",
406
+ "libc",
357
407
  "shlex",
358
408
  ]
359
409
 
@@ -615,6 +665,16 @@ dependencies = [
615
665
  "rustc_version",
616
666
  ]
617
667
 
668
+ [[package]]
669
+ name = "flate2"
670
+ version = "1.1.9"
671
+ source = "registry+https://github.com/rust-lang/crates.io-index"
672
+ checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"
673
+ dependencies = [
674
+ "miniz_oxide",
675
+ "zlib-rs",
676
+ ]
677
+
618
678
  [[package]]
619
679
  name = "foldhash"
620
680
  version = "0.1.5"
@@ -763,6 +823,12 @@ dependencies = [
763
823
  "serde_core",
764
824
  ]
765
825
 
826
+ [[package]]
827
+ name = "integer-encoding"
828
+ version = "3.0.4"
829
+ source = "registry+https://github.com/rust-lang/crates.io-index"
830
+ checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02"
831
+
766
832
  [[package]]
767
833
  name = "inventory"
768
834
  version = "0.3.24"
@@ -787,6 +853,16 @@ version = "1.0.18"
787
853
  source = "registry+https://github.com/rust-lang/crates.io-index"
788
854
  checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
789
855
 
856
+ [[package]]
857
+ name = "jobserver"
858
+ version = "0.1.34"
859
+ source = "registry+https://github.com/rust-lang/crates.io-index"
860
+ checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
861
+ dependencies = [
862
+ "getrandom 0.3.4",
863
+ "libc",
864
+ ]
865
+
790
866
  [[package]]
791
867
  name = "js-sys"
792
868
  version = "0.3.99"
@@ -880,6 +956,15 @@ version = "0.4.30"
880
956
  source = "registry+https://github.com/rust-lang/crates.io-index"
881
957
  checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5"
882
958
 
959
+ [[package]]
960
+ name = "lz4_flex"
961
+ version = "0.13.1"
962
+ source = "registry+https://github.com/rust-lang/crates.io-index"
963
+ checksum = "7ef0d4ed8669f8f8826eb00dc878084aa8f253506c4fd5e8f58f5bce72ddb97e"
964
+ dependencies = [
965
+ "twox-hash",
966
+ ]
967
+
883
968
  [[package]]
884
969
  name = "matrixmultiply"
885
970
  version = "0.3.10"
@@ -896,6 +981,16 @@ version = "2.8.1"
896
981
  source = "registry+https://github.com/rust-lang/crates.io-index"
897
982
  checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8"
898
983
 
984
+ [[package]]
985
+ name = "miniz_oxide"
986
+ version = "0.8.9"
987
+ source = "registry+https://github.com/rust-lang/crates.io-index"
988
+ checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
989
+ dependencies = [
990
+ "adler2",
991
+ "simd-adler32",
992
+ ]
993
+
899
994
  [[package]]
900
995
  name = "ndarray"
901
996
  version = "0.17.2"
@@ -998,6 +1093,15 @@ version = "11.1.5"
998
1093
  source = "registry+https://github.com/rust-lang/crates.io-index"
999
1094
  checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e"
1000
1095
 
1096
+ [[package]]
1097
+ name = "ordered-float"
1098
+ version = "2.10.1"
1099
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1100
+ checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c"
1101
+ dependencies = [
1102
+ "num-traits",
1103
+ ]
1104
+
1001
1105
  [[package]]
1002
1106
  name = "page_size"
1003
1107
  version = "0.6.0"
@@ -1008,6 +1112,45 @@ dependencies = [
1008
1112
  "winapi",
1009
1113
  ]
1010
1114
 
1115
+ [[package]]
1116
+ name = "parquet"
1117
+ version = "58.3.0"
1118
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1119
+ checksum = "5dafa7d01085b62a47dd0c1829550a0a36710ea9c4fe358a05a85477cec8a908"
1120
+ dependencies = [
1121
+ "ahash",
1122
+ "arrow-array",
1123
+ "arrow-buffer",
1124
+ "arrow-data",
1125
+ "arrow-ipc",
1126
+ "arrow-schema",
1127
+ "arrow-select",
1128
+ "base64",
1129
+ "brotli",
1130
+ "bytes",
1131
+ "chrono",
1132
+ "flate2",
1133
+ "half",
1134
+ "hashbrown 0.17.1",
1135
+ "lz4_flex",
1136
+ "num-bigint",
1137
+ "num-integer",
1138
+ "num-traits",
1139
+ "paste",
1140
+ "seq-macro",
1141
+ "simdutf8",
1142
+ "snap",
1143
+ "thrift",
1144
+ "twox-hash",
1145
+ "zstd",
1146
+ ]
1147
+
1148
+ [[package]]
1149
+ name = "paste"
1150
+ version = "1.0.15"
1151
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1152
+ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
1153
+
1011
1154
  [[package]]
1012
1155
  name = "phf"
1013
1156
  version = "0.12.1"
@@ -1032,6 +1175,12 @@ version = "0.2.17"
1032
1175
  source = "registry+https://github.com/rust-lang/crates.io-index"
1033
1176
  checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
1034
1177
 
1178
+ [[package]]
1179
+ name = "pkg-config"
1180
+ version = "0.3.33"
1181
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1182
+ checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e"
1183
+
1035
1184
  [[package]]
1036
1185
  name = "plotters"
1037
1186
  version = "0.3.7"
@@ -1302,13 +1451,14 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
1302
1451
 
1303
1452
  [[package]]
1304
1453
  name = "rxgraph"
1305
- version = "0.7.0"
1454
+ version = "0.9.0"
1306
1455
  dependencies = [
1307
1456
  "anyhow",
1308
1457
  "arrow",
1309
1458
  "arrow-schema",
1310
1459
  "criterion",
1311
1460
  "inventory",
1461
+ "parquet",
1312
1462
  "pretty_assertions",
1313
1463
  "pyo3",
1314
1464
  "pyo3-arrow",
@@ -1323,7 +1473,7 @@ dependencies = [
1323
1473
 
1324
1474
  [[package]]
1325
1475
  name = "rxgraph-python"
1326
- version = "0.7.0"
1476
+ version = "0.9.0"
1327
1477
  dependencies = [
1328
1478
  "pyo3",
1329
1479
  "rxgraph",
@@ -1350,6 +1500,12 @@ version = "1.0.28"
1350
1500
  source = "registry+https://github.com/rust-lang/crates.io-index"
1351
1501
  checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
1352
1502
 
1503
+ [[package]]
1504
+ name = "seq-macro"
1505
+ version = "0.3.6"
1506
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1507
+ checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc"
1508
+
1353
1509
  [[package]]
1354
1510
  name = "serde"
1355
1511
  version = "1.0.228"
@@ -1399,6 +1555,12 @@ version = "2.0.1"
1399
1555
  source = "registry+https://github.com/rust-lang/crates.io-index"
1400
1556
  checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
1401
1557
 
1558
+ [[package]]
1559
+ name = "simd-adler32"
1560
+ version = "0.3.9"
1561
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1562
+ checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214"
1563
+
1402
1564
  [[package]]
1403
1565
  name = "simdutf8"
1404
1566
  version = "0.1.5"
@@ -1423,6 +1585,12 @@ version = "1.15.1"
1423
1585
  source = "registry+https://github.com/rust-lang/crates.io-index"
1424
1586
  checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
1425
1587
 
1588
+ [[package]]
1589
+ name = "snap"
1590
+ version = "1.1.1"
1591
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1592
+ checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b"
1593
+
1426
1594
  [[package]]
1427
1595
  name = "sprs"
1428
1596
  version = "0.11.4"
@@ -1481,6 +1649,17 @@ dependencies = [
1481
1649
  "syn",
1482
1650
  ]
1483
1651
 
1652
+ [[package]]
1653
+ name = "thrift"
1654
+ version = "0.17.0"
1655
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1656
+ checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09"
1657
+ dependencies = [
1658
+ "byteorder",
1659
+ "integer-encoding",
1660
+ "ordered-float",
1661
+ ]
1662
+
1484
1663
  [[package]]
1485
1664
  name = "tiny-keccak"
1486
1665
  version = "2.0.2"
@@ -1500,6 +1679,12 @@ dependencies = [
1500
1679
  "serde_json",
1501
1680
  ]
1502
1681
 
1682
+ [[package]]
1683
+ name = "twox-hash"
1684
+ version = "2.1.2"
1685
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1686
+ checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c"
1687
+
1503
1688
  [[package]]
1504
1689
  name = "unicode-ident"
1505
1690
  version = "1.0.24"
@@ -1872,8 +2057,42 @@ dependencies = [
1872
2057
  "syn",
1873
2058
  ]
1874
2059
 
2060
+ [[package]]
2061
+ name = "zlib-rs"
2062
+ version = "0.6.3"
2063
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2064
+ checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513"
2065
+
1875
2066
  [[package]]
1876
2067
  name = "zmij"
1877
2068
  version = "1.0.21"
1878
2069
  source = "registry+https://github.com/rust-lang/crates.io-index"
1879
2070
  checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
2071
+
2072
+ [[package]]
2073
+ name = "zstd"
2074
+ version = "0.13.3"
2075
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2076
+ checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a"
2077
+ dependencies = [
2078
+ "zstd-safe",
2079
+ ]
2080
+
2081
+ [[package]]
2082
+ name = "zstd-safe"
2083
+ version = "7.2.4"
2084
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2085
+ checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d"
2086
+ dependencies = [
2087
+ "zstd-sys",
2088
+ ]
2089
+
2090
+ [[package]]
2091
+ name = "zstd-sys"
2092
+ version = "2.0.16+zstd.1.5.7"
2093
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2094
+ checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748"
2095
+ dependencies = [
2096
+ "cc",
2097
+ "pkg-config",
2098
+ ]
@@ -14,6 +14,7 @@ arrow = "~58.3.0"
14
14
  arrow-schema = "~58.3.0"
15
15
  criterion = { version = "~0.8.2", features = ["html_reports"] }
16
16
  inventory = "~0.3.21"
17
+ parquet = "~58.3.0"
17
18
  pretty_assertions = "~1.4.1"
18
19
  pyo3 = "~0.28.3"
19
20
  pyo3-arrow = "~0.17.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rxgraph
3
- Version: 0.7.0
3
+ Version: 0.9.0
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: 3.11
6
6
  Classifier: Programming Language :: Python :: 3.12
@@ -185,6 +185,17 @@ result = graph.search(
185
185
  )
186
186
  ```
187
187
 
188
+ File-backed graphs use the same plugin path and keep Python out of the search
189
+ loop:
190
+
191
+ ```python
192
+ graph = rxg.Graph.from_parquet(
193
+ nodes="nodes.parquet",
194
+ edges="edges.parquet",
195
+ payloads="lazy",
196
+ )
197
+ ```
198
+
188
199
  The consumer's crate depends on `rxgraph` with the `python` feature (their own
189
200
  crate is the `cdylib` that needs pyo3's `extension-module`; rxgraph's `python`
190
201
  feature deliberately does not enable it):
@@ -195,17 +206,18 @@ rxgraph = { version = "0.6", features = ["python"] }
195
206
  pyo3 = { version = "0.28", features = ["extension-module"] }
196
207
  ```
197
208
 
198
- The Rust side implements `rxgraph::Kernel` and ends with a small macro call:
209
+ The Rust side implements `rxgraph::TypedKernel`, decodes payload structs with
210
+ `TryFrom<rxgraph::ArrowRow<'_>>`, and ends with a small macro call:
199
211
 
200
212
  ```rust
201
- rxgraph::plugin! {
213
+ rxgraph::typed_plugin! {
202
214
  module = _native;
203
215
  "hop_budget" => HopBudget::from_params,
204
216
  }
205
217
  ```
206
218
 
207
219
  See [`examples/rust-kernel-plugin/`](examples/rust-kernel-plugin/README.md) for
208
- the full guide, including the `EdgeCtx` accessor reference and the maturin build.
220
+ the full guide, including the typed payload shape and the maturin build.
209
221
 
210
222
  ## Architecture
211
223
 
@@ -171,6 +171,17 @@ result = graph.search(
171
171
  )
172
172
  ```
173
173
 
174
+ File-backed graphs use the same plugin path and keep Python out of the search
175
+ loop:
176
+
177
+ ```python
178
+ graph = rxg.Graph.from_parquet(
179
+ nodes="nodes.parquet",
180
+ edges="edges.parquet",
181
+ payloads="lazy",
182
+ )
183
+ ```
184
+
174
185
  The consumer's crate depends on `rxgraph` with the `python` feature (their own
175
186
  crate is the `cdylib` that needs pyo3's `extension-module`; rxgraph's `python`
176
187
  feature deliberately does not enable it):
@@ -181,17 +192,18 @@ rxgraph = { version = "0.6", features = ["python"] }
181
192
  pyo3 = { version = "0.28", features = ["extension-module"] }
182
193
  ```
183
194
 
184
- The Rust side implements `rxgraph::Kernel` and ends with a small macro call:
195
+ The Rust side implements `rxgraph::TypedKernel`, decodes payload structs with
196
+ `TryFrom<rxgraph::ArrowRow<'_>>`, and ends with a small macro call:
185
197
 
186
198
  ```rust
187
- rxgraph::plugin! {
199
+ rxgraph::typed_plugin! {
188
200
  module = _native;
189
201
  "hop_budget" => HopBudget::from_params,
190
202
  }
191
203
  ```
192
204
 
193
205
  See [`examples/rust-kernel-plugin/`](examples/rust-kernel-plugin/README.md) for
194
- the full guide, including the `EdgeCtx` accessor reference and the maturin build.
206
+ the full guide, including the typed payload shape and the maturin build.
195
207
 
196
208
  ## Architecture
197
209
 
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rxgraph"
3
- version = "0.7.0"
3
+ version = "0.9.0"
4
4
  edition.workspace = true
5
5
  rust-version.workspace = true
6
6
  description = "High-performance graph traversal engine"
@@ -22,6 +22,7 @@ anyhow.workspace = true
22
22
  arrow.workspace = true
23
23
  arrow-schema.workspace = true
24
24
  inventory.workspace = true
25
+ parquet.workspace = true
25
26
  # Optional: only pulled in by the `python` feature for the PyO3 binding layer.
26
27
  # `extension-module` is intentionally NOT enabled here; the final extension
27
28
  # crate (cdylib) enables it, so this stays linkable/testable as an rlib.
@@ -6,7 +6,7 @@ use std::{
6
6
 
7
7
  use anyhow::{Context, Result};
8
8
  use rxgraph::{
9
- GraphId, NodeId, RunOptions, TraversalStrategy, search_native,
9
+ GraphId, NodeId, RunOptions, TraversalStrategy, Value, search_native,
10
10
  traversal::native::{self, GraphStore, OutgoingEdge},
11
11
  };
12
12
 
@@ -113,7 +113,10 @@ impl native::Kernel for RiskKernel {
113
113
  })
114
114
  }
115
115
 
116
- fn visit(&self, cx: &native::EdgeCtx<'_, Self::Node, Self::Edge, Self::State>) -> Result<bool> {
116
+ fn visit(
117
+ &self,
118
+ cx: &native::EdgeCtx<'_, '_, Self::Node, Self::Edge, Self::State>,
119
+ ) -> Result<bool> {
117
120
  let transfer = cx.edge()?;
118
121
  let dest = cx.dest()?;
119
122
  Ok(transfer.allowed
@@ -123,7 +126,7 @@ impl native::Kernel for RiskKernel {
123
126
 
124
127
  fn next_state(
125
128
  &self,
126
- cx: &native::EdgeCtx<'_, Self::Node, Self::Edge, Self::State>,
129
+ cx: &native::EdgeCtx<'_, '_, Self::Node, Self::Edge, Self::State>,
127
130
  ) -> Result<Self::State> {
128
131
  let transfer = cx.edge()?;
129
132
  let dest = cx.dest()?;
@@ -136,9 +139,16 @@ impl native::Kernel for RiskKernel {
136
139
  Ok(next)
137
140
  }
138
141
 
139
- fn stop(&self, cx: &native::EdgeCtx<'_, Self::Node, Self::Edge, Self::State>) -> Result<bool> {
142
+ fn stop(
143
+ &self,
144
+ cx: &native::EdgeCtx<'_, '_, Self::Node, Self::Edge, Self::State>,
145
+ ) -> Result<bool> {
140
146
  Ok(cx.dest()?.target && (!self.require_checkpoint || !cx.state().checkpoints.is_empty()))
141
147
  }
148
+
149
+ fn state_row(&self, state: &Self::State) -> rxgraph::StateRow {
150
+ vec![("total_risk".to_string(), Value::U64(state.total_risk))]
151
+ }
142
152
  }
143
153
 
144
154
  struct FraudStore {
@@ -300,7 +300,7 @@ pub(crate) fn ipc_list_literal_to_value(bytes: &[u8]) -> Result<Value> {
300
300
  .map(Value::List)
301
301
  }
302
302
 
303
- fn array_row_to_value(array: &dyn Array, row: usize) -> Result<Value> {
303
+ pub(crate) fn array_row_to_value(array: &dyn Array, row: usize) -> Result<Value> {
304
304
  macro_rules! primitive {
305
305
  ($array:ty, $value:expr) => {
306
306
  if let Some(array) = array.as_any().downcast_ref::<$array>() {
@@ -113,7 +113,7 @@ impl Value {
113
113
  }
114
114
  }
115
115
 
116
- pub(crate) fn as_list(&self) -> Result<Option<&[Value]>> {
116
+ pub fn as_list(&self) -> Result<Option<&[Value]>> {
117
117
  match self {
118
118
  Self::Null => Ok(None),
119
119
  Self::List(values) => Ok(Some(values)),
@@ -121,7 +121,23 @@ impl Value {
121
121
  }
122
122
  }
123
123
 
124
- pub(crate) fn into_struct(self) -> Result<Option<Vec<(String, Value)>>> {
124
+ pub fn into_list(self) -> Result<Option<Vec<Value>>> {
125
+ match self {
126
+ Self::Null => Ok(None),
127
+ Self::List(values) => Ok(Some(values)),
128
+ other => bail!("expected list, got {other:?}"),
129
+ }
130
+ }
131
+
132
+ pub fn as_struct(&self) -> Result<Option<&[(String, Value)]>> {
133
+ match self {
134
+ Self::Null => Ok(None),
135
+ Self::Struct(fields) => Ok(Some(fields)),
136
+ other => bail!("expected struct, got {other:?}"),
137
+ }
138
+ }
139
+
140
+ pub fn into_struct(self) -> Result<Option<Vec<(String, Value)>>> {
125
141
  match self {
126
142
  Self::Null => Ok(None),
127
143
  Self::Struct(fields) => Ok(Some(fields)),
@@ -10,7 +10,7 @@ use anyhow::{Result, anyhow};
10
10
  use crate::{
11
11
  dsl::{StateRow, Value},
12
12
  graph::{Graph, NodeId, OwnedGraphId},
13
- traversal::{EdgeCtx, Kernel},
13
+ traversal::{ArrowRow, EdgeCtx, Kernel, PayloadField, TypedKernel, native},
14
14
  };
15
15
 
16
16
  /// Per-path state for [`WeightedBudget`]: the weight accumulated so far.
@@ -118,3 +118,87 @@ crate::inventory::submit! {
118
118
  make: |params| Ok(crate::boxed_run(WeightedBudget::from_params(params)?)),
119
119
  }
120
120
  }
121
+
122
+ #[derive(Clone, Debug)]
123
+ pub struct WeightedBudgetTyped {
124
+ pub weight_col: String,
125
+ pub budget: u64,
126
+ pub target: OwnedGraphId,
127
+ }
128
+
129
+ #[derive(Clone, Debug, PartialEq, Eq)]
130
+ pub struct BudgetEdge {
131
+ pub weight: u64,
132
+ }
133
+
134
+ impl TryFrom<ArrowRow<'_>> for BudgetEdge {
135
+ type Error = anyhow::Error;
136
+
137
+ fn try_from(row: ArrowRow<'_>) -> Result<Self> {
138
+ Ok(Self {
139
+ weight: row.u64("weight")?.unwrap_or(0),
140
+ })
141
+ }
142
+ }
143
+
144
+ impl TypedKernel for WeightedBudgetTyped {
145
+ type Node = ();
146
+ type Edge = BudgetEdge;
147
+ type State = BudgetState;
148
+
149
+ fn edge_fields(&self) -> Vec<PayloadField> {
150
+ vec![PayloadField::aliased(self.weight_col.clone(), "weight")]
151
+ }
152
+
153
+ fn initial_state(
154
+ &self,
155
+ _cx: &native::StartCtx<'_, Self::Node, Self::Edge>,
156
+ ) -> Result<Self::State> {
157
+ Ok(BudgetState { spent: 0 })
158
+ }
159
+
160
+ fn visit(
161
+ &self,
162
+ cx: &native::EdgeCtx<'_, '_, Self::Node, Self::Edge, Self::State>,
163
+ ) -> Result<bool> {
164
+ Ok(cx.state().spent.saturating_add(cx.edge()?.weight) <= self.budget)
165
+ }
166
+
167
+ fn next_state(
168
+ &self,
169
+ cx: &native::EdgeCtx<'_, '_, Self::Node, Self::Edge, Self::State>,
170
+ ) -> Result<Self::State> {
171
+ Ok(BudgetState {
172
+ spent: cx.state().spent.saturating_add(cx.edge()?.weight),
173
+ })
174
+ }
175
+
176
+ fn stop(
177
+ &self,
178
+ cx: &native::EdgeCtx<'_, '_, Self::Node, Self::Edge, Self::State>,
179
+ ) -> Result<bool> {
180
+ Ok(cx.dest_external_id()? == Some(self.target.as_ref()))
181
+ }
182
+
183
+ fn state_row(&self, state: &Self::State) -> StateRow {
184
+ vec![("spent".to_string(), Value::U64(state.spent))]
185
+ }
186
+ }
187
+
188
+ impl WeightedBudgetTyped {
189
+ fn from_params(params: &serde_json::Value) -> Result<Self> {
190
+ let base = WeightedBudget::from_params(params)?;
191
+ Ok(Self {
192
+ weight_col: base.weight_col,
193
+ budget: base.budget,
194
+ target: base.target,
195
+ })
196
+ }
197
+ }
198
+
199
+ crate::inventory::submit! {
200
+ crate::TypedKernelEntry {
201
+ name: "weighted_budget",
202
+ make: |params| Ok(crate::boxed_typed_run(WeightedBudgetTyped::from_params(params)?)),
203
+ }
204
+ }