lora-python 0.22.2__tar.gz → 0.23.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 (419) hide show
  1. {lora_python-0.22.2 → lora_python-0.23.0}/Cargo.lock +19 -19
  2. {lora_python-0.22.2 → lora_python-0.23.0}/Cargo.toml +13 -13
  3. {lora_python-0.22.2 → lora_python-0.23.0}/PKG-INFO +1 -1
  4. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-analyzer/src/analyzer/clauses.rs +270 -1
  5. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-analyzer/src/analyzer/expressions.rs +4 -1
  6. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-analyzer/src/analyzer/state.rs +8 -1
  7. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-analyzer/src/errors.rs +6 -0
  8. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-analyzer/src/resolved.rs +13 -0
  9. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-analyzer/src/symbols.rs +6 -0
  10. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-compiler/src/lib.rs +17 -8
  11. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-compiler/src/logical.rs +39 -0
  12. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-compiler/src/optimizer.rs +137 -3
  13. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-compiler/src/pattern.rs +55 -3
  14. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-compiler/src/physical.rs +26 -0
  15. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-compiler/src/plan_tree.rs +31 -0
  16. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-compiler/src/planner.rs +106 -4
  17. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/benches/README.md +1 -0
  18. lora_python-0.23.0/crates/lora-database/examples/storage_baseline.rs +992 -0
  19. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/database/compile.rs +26 -0
  20. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/database/execute.rs +1 -0
  21. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/database/explain.rs +11 -0
  22. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/database/mod.rs +1 -0
  23. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/database/occ.rs +34 -4
  24. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/database/profile.rs +1 -0
  25. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/database/pull_mode.rs +3 -1
  26. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/database/stream.rs +1 -0
  27. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/plan_cache.rs +1 -0
  28. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/transaction.rs +3 -0
  29. lora_python-0.23.0/crates/lora-database/tests/aggregate_semantics.rs +297 -0
  30. lora_python-0.23.0/crates/lora-database/tests/bit_shifts.rs +141 -0
  31. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/borrowed_variable_reads.rs +2 -1
  32. lora_python-0.23.0/crates/lora-database/tests/deferred_existence_end_state.rs +225 -0
  33. lora_python-0.23.0/crates/lora-database/tests/entity_property_values.rs +197 -0
  34. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/errors.rs +9 -7
  35. lora_python-0.23.0/crates/lora-database/tests/expression_semantics.rs +185 -0
  36. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/expressions.rs +10 -5
  37. lora_python-0.23.0/crates/lora-database/tests/id_seek.rs +569 -0
  38. lora_python-0.23.0/crates/lora-database/tests/integer_literals.rs +128 -0
  39. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/invariants.rs +6 -7
  40. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/limit_skip_counts.rs +5 -5
  41. lora_python-0.23.0/crates/lora-database/tests/missing_parameters.rs +159 -0
  42. lora_python-0.23.0/crates/lora-database/tests/nested_aggregates.rs +244 -0
  43. lora_python-0.23.0/crates/lora-database/tests/order_by_aggregates.rs +185 -0
  44. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/parameters.rs +25 -16
  45. lora_python-0.23.0/crates/lora-database/tests/restart_index_state.rs +398 -0
  46. lora_python-0.23.0/crates/lora-database/tests/statement_atomicity.rs +215 -0
  47. lora_python-0.23.0/crates/lora-database/tests/sum_empty.rs +127 -0
  48. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/temporal.rs +11 -3
  49. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/where_clause.rs +2 -3
  50. lora_python-0.23.0/crates/lora-database/tests/write_path_bindings.rs +166 -0
  51. lora_python-0.23.0/crates/lora-database/tests/write_scaling.rs +268 -0
  52. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/binops.rs +36 -7
  53. lora_python-0.23.0/crates/lora-executor/src/eval/builtins/bits_ns.rs +77 -0
  54. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/list.rs +17 -5
  55. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/number.rs +2 -2
  56. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/expr.rs +16 -12
  57. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/executor/aggregation.rs +5 -4
  58. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/executor/helpers.rs +194 -57
  59. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/executor/immutable.rs +40 -0
  60. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/executor/mod.rs +7 -6
  61. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/executor/mutable.rs +199 -97
  62. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/aggregate.rs +99 -84
  63. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/columns.rs +2 -0
  64. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/scan.rs +33 -7
  65. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/traits.rs +25 -5
  66. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/value.rs +15 -8
  67. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-parser/src/parser/expressions.rs +32 -4
  68. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-parser/src/parser/literals.rs +37 -22
  69. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-parser/src/parser/tests.rs +69 -20
  70. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/lib.rs +1 -1
  71. lora_python-0.23.0/crates/lora-store/src/memory/chunked_vec.rs +495 -0
  72. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/constraint_enforce.rs +70 -2
  73. lora_python-0.23.0/crates/lora-store/src/memory/cow.rs +1499 -0
  74. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/entity_index_store.rs +35 -25
  75. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/fulltext_index.rs +23 -15
  76. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/graph.rs +71 -199
  77. lora_python-0.23.0/crates/lora-store/src/memory/id_map.rs +530 -0
  78. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/id_set.rs +284 -86
  79. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/impls.rs +45 -0
  80. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/index_catalog.rs +1 -1
  81. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/mem_report.rs +106 -17
  82. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/mod.rs +2 -1
  83. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/point_index.rs +15 -13
  84. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/property_index.rs +148 -44
  85. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/snapshot.rs +6 -1
  86. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/sorted_property_index.rs +8 -8
  87. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/tests.rs +25 -5
  88. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/text_index.rs +2 -1
  89. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/traits.rs +35 -0
  90. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/temporal/duration.rs +23 -7
  91. {lora_python-0.22.2 → lora_python-0.23.0}/pyproject.toml +1 -1
  92. lora_python-0.22.2/crates/lora-database/tests/write_scaling.rs +0 -75
  93. lora_python-0.22.2/crates/lora-executor/src/eval/builtins/bits_ns.rs +0 -33
  94. lora_python-0.22.2/crates/lora-store/src/memory/chunked_vec.rs +0 -252
  95. lora_python-0.22.2/crates/lora-store/src/memory/cow.rs +0 -585
  96. {lora_python-0.22.2 → lora_python-0.23.0}/LICENSE +0 -0
  97. {lora_python-0.22.2 → lora_python-0.23.0}/README.md +0 -0
  98. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-binding-buffer/Cargo.toml +0 -0
  99. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-binding-buffer/src/lib.rs +0 -0
  100. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-binding-buffer/src/stream.rs +0 -0
  101. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-python/.gitignore +0 -0
  102. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-python/Cargo.toml +0 -0
  103. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-python/LICENSE +0 -0
  104. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-python/README.md +0 -0
  105. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-python/build.rs +0 -0
  106. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-python/examples/async_demo.py +0 -0
  107. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-python/examples/basic.py +0 -0
  108. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-python/src/errors.rs +0 -0
  109. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-python/src/from_python.rs +0 -0
  110. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-python/src/gil.rs +0 -0
  111. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-python/src/lib.rs +0 -0
  112. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-python/src/stream.rs +0 -0
  113. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-python/src/to_python.rs +0 -0
  114. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-python/tests/test_async.py +0 -0
  115. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-python/tests/test_concurrency.py +0 -0
  116. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-python/tests/test_explain_profile.py +0 -0
  117. {lora_python-0.22.2 → lora_python-0.23.0}/crates/bindings/lora-python/tests/test_sync.py +0 -0
  118. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-analyzer/Cargo.toml +0 -0
  119. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-analyzer/src/analyzer/builtin_signatures.rs +0 -0
  120. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-analyzer/src/analyzer/mod.rs +0 -0
  121. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-analyzer/src/analyzer/patterns.rs +0 -0
  122. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-analyzer/src/analyzer/tests.rs +0 -0
  123. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-analyzer/src/lib.rs +0 -0
  124. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-analyzer/src/scope.rs +0 -0
  125. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-analyzer/tests/error_messages.rs +0 -0
  126. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-ast/Cargo.toml +0 -0
  127. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-ast/src/ast.rs +0 -0
  128. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-ast/src/lib.rs +0 -0
  129. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-builtins-meta/Cargo.toml +0 -0
  130. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-builtins-meta/src/lib.rs +0 -0
  131. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-compiler/Cargo.toml +0 -0
  132. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/Cargo.toml +0 -0
  133. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/benches/advanced.rs +0 -0
  134. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/benches/concurrency_guard.rs +0 -0
  135. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/benches/concurrent.rs +0 -0
  136. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/benches/engine.rs +0 -0
  137. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/benches/fixtures.rs +0 -0
  138. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/benches/index_acceleration.rs +0 -0
  139. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/benches/memory.rs +0 -0
  140. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/benches/memory_baseline.json +0 -0
  141. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/benches/perf_smoke.rs +0 -0
  142. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/benches/perf_smoke_baseline.json +0 -0
  143. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/benches/query_implementations.rs +0 -0
  144. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/benches/realistic.rs +0 -0
  145. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/benches/scale.rs +0 -0
  146. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/benches/temporal_spatial.rs +0 -0
  147. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/benches/wal.rs +0 -0
  148. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/examples/bulk_probe.rs +0 -0
  149. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/examples/carried_probe.rs +0 -0
  150. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/examples/heap_probe.rs +0 -0
  151. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/examples/keyset_probe.rs +0 -0
  152. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/examples/optional_probe.rs +0 -0
  153. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/examples/perf_probe.rs +0 -0
  154. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/examples/pushdown_probe.rs +0 -0
  155. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/changes/build.rs +0 -0
  156. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/changes/history.rs +0 -0
  157. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/changes/mod.rs +0 -0
  158. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/database/builder.rs +0 -0
  159. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/database/changes.rs +0 -0
  160. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/database/graph_api.rs +0 -0
  161. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/database/procedures.rs +0 -0
  162. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/database/replay.rs +0 -0
  163. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/database/row_projection.rs +0 -0
  164. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/database/schema.rs +0 -0
  165. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/database/show_pipeline.rs +0 -0
  166. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/database/write_guard.rs +0 -0
  167. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/durable_io.rs +0 -0
  168. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/error.rs +0 -0
  169. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/explain.rs +0 -0
  170. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/io.rs +0 -0
  171. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/lib.rs +0 -0
  172. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/live_store.rs +0 -0
  173. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/named.rs +0 -0
  174. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/snapshot/json.rs +0 -0
  175. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/snapshot/mod.rs +0 -0
  176. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/snapshot/store.rs +0 -0
  177. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/stream.rs +0 -0
  178. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/wal/admin.rs +0 -0
  179. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/wal/archive/format.rs +0 -0
  180. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/wal/archive/lock.rs +0 -0
  181. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/wal/archive/platform.rs +0 -0
  182. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/wal/archive/worker.rs +0 -0
  183. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/wal/archive/workspace.rs +0 -0
  184. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/wal/archive.rs +0 -0
  185. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/wal/mod.rs +0 -0
  186. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/src/wal/write_scope.rs +0 -0
  187. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/advanced_queries.rs +0 -0
  188. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/aggregation.rs +0 -0
  189. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/and_or_short_circuit.rs +0 -0
  190. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/backend_stub.rs +0 -0
  191. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/bbox_antimeridian.rs +0 -0
  192. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/binary.rs +0 -0
  193. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/builtin_namespaces.rs +0 -0
  194. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/call_subquery_writes.rs +0 -0
  195. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/carried_value_sharing.rs +0 -0
  196. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/change_feed.rs +0 -0
  197. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/collect_nulls.rs +0 -0
  198. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/comparison_ordering.rs +0 -0
  199. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/constraints.rs +0 -0
  200. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/create.rs +0 -0
  201. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/cypher_compat.rs +0 -0
  202. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/docs_examples.rs +0 -0
  203. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/early_limit.rs +0 -0
  204. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/empty_ranges.rs +0 -0
  205. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/error_messages.rs +0 -0
  206. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/explain_estimates.rs +0 -0
  207. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/explain_profile.rs +0 -0
  208. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/foreach.rs +0 -0
  209. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/fulltext_index.rs +0 -0
  210. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/fulltext_list_properties.rs +0 -0
  211. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/functions_extended.rs +0 -0
  212. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/grouping_key_identity.rs +0 -0
  213. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/index_acceleration.rs +0 -0
  214. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/managed_snapshots.rs +0 -0
  215. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/match.rs +0 -0
  216. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/merge.rs +0 -0
  217. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/merge_bound_end.rs +0 -0
  218. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/null_properties_and_deferred_existence.rs +0 -0
  219. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/optional_match_correlated.rs +0 -0
  220. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/optional_match_leading.rs +0 -0
  221. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/order_by_index.rs +0 -0
  222. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/order_limit_semantics.rs +0 -0
  223. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/ordering.rs +0 -0
  224. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/parser.rs +0 -0
  225. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/paths.rs +0 -0
  226. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/pattern_subquery_property_seek.rs +0 -0
  227. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/pattern_subquery_rel_properties.rs +0 -0
  228. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/pattern_subquery_scope.rs +0 -0
  229. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/pattern_subquery_var_length.rs +0 -0
  230. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/planner_pushdown.rs +0 -0
  231. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/procedure_yield.rs +0 -0
  232. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/projection.rs +0 -0
  233. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/range_scan_other_kinds.rs +0 -0
  234. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/scale.rs +0 -0
  235. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/schema.rs +0 -0
  236. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/schema_in_transaction.rs +0 -0
  237. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/seeds.rs +0 -0
  238. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/shared_index_value_writes.rs +0 -0
  239. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/snapshot.rs +0 -0
  240. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/sort_limit_probe.rs +0 -0
  241. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/spatial.rs +0 -0
  242. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/starts_with_range_seek.rs +0 -0
  243. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/string_number_addition.rs +0 -0
  244. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/temporal_constructor_functions.rs +0 -0
  245. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/temporal_constructors.rs +0 -0
  246. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/temporal_map_components.rs +0 -0
  247. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/temporal_range_index.rs +0 -0
  248. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/temporal_strings.rs +0 -0
  249. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/temporal_time_zones.rs +0 -0
  250. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/temporal_zone_accessors.rs +0 -0
  251. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/test_helpers.rs +0 -0
  252. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/timeouts.rs +0 -0
  253. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/transactions.rs +0 -0
  254. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/types_advanced.rs +0 -0
  255. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/union.rs +0 -0
  256. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/unknown_names.rs +0 -0
  257. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/unwind_ingestion.rs +0 -0
  258. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/update.rs +0 -0
  259. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/var_length_bound_endpoint.rs +0 -0
  260. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/var_length_hop_ranges.rs +0 -0
  261. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/vector_index.rs +0 -0
  262. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/vectors.rs +0 -0
  263. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/wal.rs +0 -0
  264. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/with.rs +0 -0
  265. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/with_predicates.rs +0 -0
  266. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-database/tests/write_results.rs +0 -0
  267. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/Cargo.toml +0 -0
  268. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/cancel.rs +0 -0
  269. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/errors.rs +0 -0
  270. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/bytes_ns.rs +0 -0
  271. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/cast_ns.rs +0 -0
  272. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/crypto.rs +0 -0
  273. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/edge.rs +0 -0
  274. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/geo.rs +0 -0
  275. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/index_ns.rs +0 -0
  276. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/json_ns.rs +0 -0
  277. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/map_ns.rs +0 -0
  278. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/math_ns.rs +0 -0
  279. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/mod.rs +0 -0
  280. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/node.rs +0 -0
  281. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/path.rs +0 -0
  282. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/string_ns.rs +0 -0
  283. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/temporal.rs +0 -0
  284. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/temporal_build.rs +0 -0
  285. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/text.rs +0 -0
  286. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/type_ns.rs +0 -0
  287. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/uuid_ns.rs +0 -0
  288. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/value.rs +0 -0
  289. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/builtins/vector_ns.rs +0 -0
  290. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/errors.rs +0 -0
  291. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/functions.rs +0 -0
  292. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/mod.rs +0 -0
  293. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/point.rs +0 -0
  294. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/regex.rs +0 -0
  295. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/eval/vector.rs +0 -0
  296. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/executor/optional.rs +0 -0
  297. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/executor/sort.rs +0 -0
  298. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/lib.rs +0 -0
  299. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/profile.rs +0 -0
  300. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/call_subquery.rs +0 -0
  301. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/context.rs +0 -0
  302. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/expand.rs +0 -0
  303. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/filter.rs +0 -0
  304. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/hydration.rs +0 -0
  305. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/mod.rs +0 -0
  306. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/mutable.rs +0 -0
  307. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/optional.rs +0 -0
  308. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/path.rs +0 -0
  309. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/projection.rs +0 -0
  310. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/shape.rs +0 -0
  311. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/sort.rs +0 -0
  312. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/source.rs +0 -0
  313. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/tests.rs +0 -0
  314. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/src/pull/union.rs +0 -0
  315. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-executor/tests/error_messages.rs +0 -0
  316. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-io/Cargo.toml +0 -0
  317. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-io/src/csv.rs +0 -0
  318. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-io/src/format.rs +0 -0
  319. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-io/src/json_array.rs +0 -0
  320. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-io/src/jsonl.rs +0 -0
  321. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-io/src/lib.rs +0 -0
  322. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-io/src/mapping.rs +0 -0
  323. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-io/src/value_json.rs +0 -0
  324. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-parser/Cargo.toml +0 -0
  325. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-parser/src/cypher.pest +0 -0
  326. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-parser/src/errors.rs +0 -0
  327. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-parser/src/lib.rs +0 -0
  328. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-parser/src/parser/clauses.rs +0 -0
  329. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-parser/src/parser/mod.rs +0 -0
  330. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-parser/src/parser/patterns.rs +0 -0
  331. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-parser/src/parser/query.rs +0 -0
  332. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-parser/src/parser/schema.rs +0 -0
  333. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-parser/src/parser/util.rs +0 -0
  334. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-parser/tests/error_messages.rs +0 -0
  335. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-snapshot/Cargo.toml +0 -0
  336. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-snapshot/src/body.rs +0 -0
  337. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-snapshot/src/codec.rs +0 -0
  338. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-snapshot/src/columnar.rs +0 -0
  339. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-snapshot/src/envelope.rs +0 -0
  340. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-snapshot/src/errors.rs +0 -0
  341. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-snapshot/src/format.rs +0 -0
  342. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-snapshot/src/lib.rs +0 -0
  343. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-snapshot/src/options.rs +0 -0
  344. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-snapshot/src/tests.rs +0 -0
  345. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-snapshot/src/transform.rs +0 -0
  346. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-snapshot/src/view.rs +0 -0
  347. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-snapshot/tests/error_messages.rs +0 -0
  348. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/Cargo.toml +0 -0
  349. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/codec.rs +0 -0
  350. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/intern.rs +0 -0
  351. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/lock_table.rs +0 -0
  352. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/constraint_catalog.rs +0 -0
  353. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/hnsw.rs +0 -0
  354. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/secondary_index_maintenance.rs +0 -0
  355. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/stats.rs +0 -0
  356. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/memory/vector_index.rs +0 -0
  357. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/mutation.rs +0 -0
  358. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/snapshot.rs +0 -0
  359. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/binary/mod.rs +0 -0
  360. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/binary/tests.rs +0 -0
  361. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/binary/traits.rs +0 -0
  362. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/binary/types.rs +0 -0
  363. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/graph.rs +0 -0
  364. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/mod.rs +0 -0
  365. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/property_map.rs +0 -0
  366. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/property_value.rs +0 -0
  367. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/spatial/bbox.rs +0 -0
  368. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/spatial/distance.rs +0 -0
  369. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/spatial/mod.rs +0 -0
  370. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/spatial/point.rs +0 -0
  371. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/spatial/srid.rs +0 -0
  372. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/spatial/tests.rs +0 -0
  373. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/temporal/calendar.rs +0 -0
  374. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/temporal/date.rs +0 -0
  375. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/temporal/datetime.rs +0 -0
  376. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/temporal/format.rs +0 -0
  377. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/temporal/mod.rs +0 -0
  378. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/temporal/parsing.rs +0 -0
  379. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/temporal/time.rs +0 -0
  380. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/temporal/zone.rs +0 -0
  381. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/vector/build.rs +0 -0
  382. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/vector/mod.rs +0 -0
  383. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/vector/similarity.rs +0 -0
  384. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/vector/tests.rs +0 -0
  385. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/src/types/vector/types.rs +0 -0
  386. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-store/tests/error_messages.rs +0 -0
  387. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/Cargo.toml +0 -0
  388. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/codec/decode.rs +0 -0
  389. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/codec/encode.rs +0 -0
  390. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/codec/format.rs +0 -0
  391. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/codec/mod.rs +0 -0
  392. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/codec/tests.rs +0 -0
  393. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/config.rs +0 -0
  394. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/dir.rs +0 -0
  395. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/errors.rs +0 -0
  396. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/history.rs +0 -0
  397. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/io.rs +0 -0
  398. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/lib.rs +0 -0
  399. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/lock.rs +0 -0
  400. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/lsn.rs +0 -0
  401. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/record.rs +0 -0
  402. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/recorder/errors.rs +0 -0
  403. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/recorder/mirror.rs +0 -0
  404. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/recorder/mod.rs +0 -0
  405. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/recorder/recorder.rs +0 -0
  406. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/recorder/tests.rs +0 -0
  407. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/replay.rs +0 -0
  408. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/segment.rs +0 -0
  409. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/testing.rs +0 -0
  410. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/wal/group_flusher.rs +0 -0
  411. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/wal/mod.rs +0 -0
  412. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/wal/tests.rs +0 -0
  413. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/src/wal/wal.rs +0 -0
  414. {lora_python-0.22.2 → lora_python-0.23.0}/crates/lora-wal/tests/error_messages.rs +0 -0
  415. {lora_python-0.22.2 → lora_python-0.23.0}/python/lora_python/__init__.py +0 -0
  416. {lora_python-0.22.2 → lora_python-0.23.0}/python/lora_python/_async.py +0 -0
  417. {lora_python-0.22.2 → lora_python-0.23.0}/python/lora_python/_native.pyi +0 -0
  418. {lora_python-0.22.2 → lora_python-0.23.0}/python/lora_python/py.typed +0 -0
  419. {lora_python-0.22.2 → lora_python-0.23.0}/python/lora_python/types.py +0 -0
@@ -854,7 +854,7 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
854
854
 
855
855
  [[package]]
856
856
  name = "lora-analyzer"
857
- version = "0.22.2"
857
+ version = "0.23.0"
858
858
  dependencies = [
859
859
  "lora-ast",
860
860
  "lora-builtins-meta",
@@ -865,14 +865,14 @@ dependencies = [
865
865
 
866
866
  [[package]]
867
867
  name = "lora-ast"
868
- version = "0.22.2"
868
+ version = "0.23.0"
869
869
  dependencies = [
870
870
  "smallvec 2.0.0-alpha.12",
871
871
  ]
872
872
 
873
873
  [[package]]
874
874
  name = "lora-binding-buffer"
875
- version = "0.22.2"
875
+ version = "0.23.0"
876
876
  dependencies = [
877
877
  "lora-database",
878
878
  "lora-store",
@@ -880,11 +880,11 @@ dependencies = [
880
880
 
881
881
  [[package]]
882
882
  name = "lora-builtins-meta"
883
- version = "0.22.2"
883
+ version = "0.23.0"
884
884
 
885
885
  [[package]]
886
886
  name = "lora-compiler"
887
- version = "0.22.2"
887
+ version = "0.23.0"
888
888
  dependencies = [
889
889
  "lora-analyzer",
890
890
  "lora-ast",
@@ -893,7 +893,7 @@ dependencies = [
893
893
 
894
894
  [[package]]
895
895
  name = "lora-database"
896
- version = "0.22.2"
896
+ version = "0.23.0"
897
897
  dependencies = [
898
898
  "anyhow",
899
899
  "chacha20poly1305",
@@ -918,7 +918,7 @@ dependencies = [
918
918
 
919
919
  [[package]]
920
920
  name = "lora-executor"
921
- version = "0.22.2"
921
+ version = "0.23.0"
922
922
  dependencies = [
923
923
  "blake3",
924
924
  "crc32fast",
@@ -941,7 +941,7 @@ dependencies = [
941
941
 
942
942
  [[package]]
943
943
  name = "lora-ffi"
944
- version = "0.22.2"
944
+ version = "0.23.0"
945
945
  dependencies = [
946
946
  "anyhow",
947
947
  "lora-binding-buffer",
@@ -953,7 +953,7 @@ dependencies = [
953
953
 
954
954
  [[package]]
955
955
  name = "lora-io"
956
- version = "0.22.2"
956
+ version = "0.23.0"
957
957
  dependencies = [
958
958
  "lora-executor",
959
959
  "lora-store",
@@ -964,7 +964,7 @@ dependencies = [
964
964
 
965
965
  [[package]]
966
966
  name = "lora-node"
967
- version = "0.22.2"
967
+ version = "0.23.0"
968
968
  dependencies = [
969
969
  "anyhow",
970
970
  "lora-binding-buffer",
@@ -979,7 +979,7 @@ dependencies = [
979
979
 
980
980
  [[package]]
981
981
  name = "lora-parser"
982
- version = "0.22.2"
982
+ version = "0.23.0"
983
983
  dependencies = [
984
984
  "lora-ast",
985
985
  "pest",
@@ -990,7 +990,7 @@ dependencies = [
990
990
 
991
991
  [[package]]
992
992
  name = "lora-python"
993
- version = "0.22.2"
993
+ version = "0.23.0"
994
994
  dependencies = [
995
995
  "anyhow",
996
996
  "lora-binding-buffer",
@@ -1003,7 +1003,7 @@ dependencies = [
1003
1003
 
1004
1004
  [[package]]
1005
1005
  name = "lora-query-wasm"
1006
- version = "0.22.2"
1006
+ version = "0.23.0"
1007
1007
  dependencies = [
1008
1008
  "console_error_panic_hook",
1009
1009
  "js-sys",
@@ -1017,7 +1017,7 @@ dependencies = [
1017
1017
 
1018
1018
  [[package]]
1019
1019
  name = "lora-server"
1020
- version = "0.22.2"
1020
+ version = "0.23.0"
1021
1021
  dependencies = [
1022
1022
  "anyhow",
1023
1023
  "axum",
@@ -1032,7 +1032,7 @@ dependencies = [
1032
1032
 
1033
1033
  [[package]]
1034
1034
  name = "lora-snapshot"
1035
- version = "0.22.2"
1035
+ version = "0.23.0"
1036
1036
  dependencies = [
1037
1037
  "argon2",
1038
1038
  "blake3",
@@ -1047,7 +1047,7 @@ dependencies = [
1047
1047
 
1048
1048
  [[package]]
1049
1049
  name = "lora-store"
1050
- version = "0.22.2"
1050
+ version = "0.23.0"
1051
1051
  dependencies = [
1052
1052
  "crc32fast",
1053
1053
  "jiff",
@@ -1062,7 +1062,7 @@ dependencies = [
1062
1062
 
1063
1063
  [[package]]
1064
1064
  name = "lora-wal"
1065
- version = "0.22.2"
1065
+ version = "0.23.0"
1066
1066
  dependencies = [
1067
1067
  "crc32fast",
1068
1068
  "lora-store",
@@ -1072,7 +1072,7 @@ dependencies = [
1072
1072
 
1073
1073
  [[package]]
1074
1074
  name = "lora-wasm"
1075
- version = "0.22.2"
1075
+ version = "0.23.0"
1076
1076
  dependencies = [
1077
1077
  "anyhow",
1078
1078
  "console_error_panic_hook",
@@ -1088,7 +1088,7 @@ dependencies = [
1088
1088
 
1089
1089
  [[package]]
1090
1090
  name = "lora_ruby"
1091
- version = "0.22.2"
1091
+ version = "0.23.0"
1092
1092
  dependencies = [
1093
1093
  "anyhow",
1094
1094
  "lora-database",
@@ -4,7 +4,7 @@ resolver = "2"
4
4
 
5
5
  [workspace.package]
6
6
  edition = "2021"
7
- version = "0.22.2"
7
+ version = "0.23.0"
8
8
  license = "BUSL-1.1"
9
9
  authors = ["LoraDB, Inc."]
10
10
  repository = "https://github.com/lora-db/lora"
@@ -15,18 +15,18 @@ rust-version = "1.87"
15
15
  # Internal crates — versions are kept in lockstep with [workspace.package].version
16
16
  # by `scripts/sync-versions.mjs`. Both `path` and `version` are set so that
17
17
  # `cargo publish` works (crates.io cannot resolve path-only deps).
18
- lora-ast = { path = "crates/lora-ast", version = "=0.22.2" }
19
- lora-parser = { path = "crates/lora-parser", version = "=0.22.2" }
20
- lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.22.2" }
21
- lora-analyzer = { path = "crates/lora-analyzer", version = "=0.22.2" }
22
- lora-compiler = { path = "crates/lora-compiler", version = "=0.22.2" }
23
- lora-store = { path = "crates/lora-store", version = "=0.22.2" }
24
- lora-snapshot = { path = "crates/lora-snapshot", version = "=0.22.2", default-features = false }
25
- lora-io = { path = "crates/lora-io", version = "=0.22.2" }
26
- lora-wal = { path = "crates/lora-wal", version = "=0.22.2" }
27
- lora-executor = { path = "crates/lora-executor", version = "=0.22.2", default-features = false }
28
- lora-database = { path = "crates/lora-database", version = "=0.22.2" }
29
- lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.22.2" }
18
+ lora-ast = { path = "crates/lora-ast", version = "=0.23.0" }
19
+ lora-parser = { path = "crates/lora-parser", version = "=0.23.0" }
20
+ lora-builtins-meta = { path = "crates/lora-builtins-meta", version = "=0.23.0" }
21
+ lora-analyzer = { path = "crates/lora-analyzer", version = "=0.23.0" }
22
+ lora-compiler = { path = "crates/lora-compiler", version = "=0.23.0" }
23
+ lora-store = { path = "crates/lora-store", version = "=0.23.0" }
24
+ lora-snapshot = { path = "crates/lora-snapshot", version = "=0.23.0", default-features = false }
25
+ lora-io = { path = "crates/lora-io", version = "=0.23.0" }
26
+ lora-wal = { path = "crates/lora-wal", version = "=0.23.0" }
27
+ lora-executor = { path = "crates/lora-executor", version = "=0.23.0", default-features = false }
28
+ lora-database = { path = "crates/lora-database", version = "=0.23.0" }
29
+ lora-binding-buffer = { path = "crates/bindings/lora-binding-buffer", version = "=0.23.0" }
30
30
 
31
31
  # External crates.
32
32
  anyhow = "1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lora-python
3
- Version: 0.22.2
3
+ Version: 0.23.0
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: Programming Language :: Python :: 3.8
@@ -3,7 +3,7 @@ use super::state::{Analyzer, PatternContext};
3
3
  use crate::{errors::*, resolved::*, symbols::*};
4
4
  use lora_ast::{
5
5
  Create, Delete, Expr, Foreach, InQueryCall, Match, Merge, ProjectionBody, ProjectionItem,
6
- Remove, RemoveItem, Return, Set, SetItem, Unwind, UpdatingClause, Variable, With,
6
+ Remove, RemoveItem, Return, Set, SetItem, Span, Unwind, UpdatingClause, Variable, With,
7
7
  };
8
8
  use lora_store::GraphCatalog;
9
9
  use std::collections::{BTreeMap, BTreeSet};
@@ -17,6 +17,7 @@ pub(super) struct ExportedAlias {
17
17
  #[derive(Debug, Clone)]
18
18
  pub(super) struct AnalyzedProjectionBody {
19
19
  pub(super) items: Vec<ResolvedProjection>,
20
+ pub(super) lifted_aggregates: Vec<ResolvedProjection>,
20
21
  pub(super) include_existing: bool,
21
22
  pub(super) exported_aliases: Vec<ExportedAlias>,
22
23
  pub(super) order: Vec<ResolvedSortItem>,
@@ -318,6 +319,7 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
318
319
  Ok(ResolvedReturn {
319
320
  distinct: r.body.distinct,
320
321
  items: analyzed.items,
322
+ lifted_aggregates: analyzed.lifted_aggregates,
321
323
  include_existing: analyzed.include_existing,
322
324
  order: analyzed.order,
323
325
  skip: analyzed.skip,
@@ -352,6 +354,7 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
352
354
  Ok(ResolvedWith {
353
355
  distinct: w.body.distinct,
354
356
  items: analyzed.items,
357
+ lifted_aggregates: analyzed.lifted_aggregates,
355
358
  include_existing: analyzed.include_existing,
356
359
  order: analyzed.order,
357
360
  skip: analyzed.skip,
@@ -364,6 +367,7 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
364
367
  &mut self,
365
368
  body: &ProjectionBody,
366
369
  ) -> Result<AnalyzedProjectionBody, SemanticError> {
370
+ let first_var = self.symbols.next_var();
367
371
  let mut items = Vec::new();
368
372
  let mut include_existing = false;
369
373
  let mut exported_aliases = Vec::new();
@@ -406,6 +410,20 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
406
410
  }
407
411
  }
408
412
 
413
+ // The items as written, before lifting rewrites them: an ORDER BY key
414
+ // that restates one sorts by its column.
415
+ let written: Vec<(String, VarId, bool)> = items
416
+ .iter()
417
+ .map(|item| {
418
+ (
419
+ format!("{:?}", item.expr),
420
+ item.output,
421
+ expr_contains_aggregate(&item.expr),
422
+ )
423
+ })
424
+ .collect();
425
+ let mut lifted_aggregates = self.lift_nested_aggregates(&mut items, first_var)?;
426
+
409
427
  // Build a lookup from alias names to their output VarIds so ORDER BY
410
428
  // can reference projection aliases (e.g. ORDER BY name when RETURN p.name AS name).
411
429
  let alias_map: BTreeMap<String, VarId> = exported_aliases
@@ -424,6 +442,13 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
424
442
  })
425
443
  })
426
444
  .collect::<Result<Vec<_>, SemanticError>>()?;
445
+ let order = self.lift_order_aggregates(
446
+ order,
447
+ &written,
448
+ &mut lifted_aggregates,
449
+ body.distinct,
450
+ first_var,
451
+ )?;
427
452
 
428
453
  let skip = body
429
454
  .skip
@@ -438,6 +463,7 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
438
463
 
439
464
  Ok(AnalyzedProjectionBody {
440
465
  items,
466
+ lifted_aggregates,
441
467
  include_existing,
442
468
  exported_aliases,
443
469
  order,
@@ -447,6 +473,249 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
447
473
  }
448
474
  }
449
475
 
476
+ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
477
+ /// Split every item that nests an aggregate inside a larger expression
478
+ /// (`size(collect(x))`, `{c: count(*)}`): each aggregate call becomes a
479
+ /// hidden column and the item reads it, so the planner can aggregate
480
+ /// first and evaluate the item on the grouped row. Inside such an item,
481
+ /// a sub-expression that restates a grouping key reads that key's column.
482
+ ///
483
+ /// Anything else the item reads from before this projection would be a
484
+ /// different value per row of the group, so it is rejected, as in
485
+ /// openCypher. `first_var` is the first id this projection allocated:
486
+ /// lower ids are those earlier bindings, higher ones its own aliases and
487
+ /// comprehension locals.
488
+ fn lift_nested_aggregates(
489
+ &mut self,
490
+ items: &mut [ResolvedProjection],
491
+ first_var: VarId,
492
+ ) -> Result<Vec<ResolvedProjection>, SemanticError> {
493
+ if !items
494
+ .iter()
495
+ .any(|item| expr_contains_aggregate(&item.expr) && !is_bare_aggregate(&item.expr))
496
+ {
497
+ return Ok(Vec::new());
498
+ }
499
+
500
+ // Grouping keys, compared by their derived `Debug` form (structural
501
+ // and deterministic), with the column each one lands in.
502
+ let keys: Vec<(String, VarId)> = items
503
+ .iter()
504
+ .filter(|item| !expr_contains_aggregate(&item.expr))
505
+ .map(|item| (format!("{:?}", item.expr), item.output))
506
+ .collect();
507
+
508
+ let mut lifted = Vec::new();
509
+ for item in items.iter_mut() {
510
+ if !expr_contains_aggregate(&item.expr) || is_bare_aggregate(&item.expr) {
511
+ continue;
512
+ }
513
+ let mut expr = item.expr.clone();
514
+ lift_aggregates_in(
515
+ &mut expr,
516
+ &keys,
517
+ &mut || self.symbols.new_var(),
518
+ &mut lifted,
519
+ item.span,
520
+ );
521
+
522
+ if reads_ungrouped(&expr, &keys, first_var) {
523
+ return Err(SemanticError::ImplicitGroupingKey(item.name.to_string()));
524
+ }
525
+ item.expr = expr;
526
+ }
527
+ Ok(lifted)
528
+ }
529
+
530
+ /// Point ORDER BY keys of an aggregating projection at what they mean
531
+ /// on the grouped rows. A key that restates an item (as written, before
532
+ /// lifting) sorts by that item's column; an aggregate in any other key
533
+ /// is lifted into a hidden column like a nested one in an item, the
534
+ /// planner keeping it until the sort. A projection that doesn't
535
+ /// aggregate can't aggregate in ORDER BY, and after DISTINCT a key can
536
+ /// only aggregate what is projected (openCypher rejects both).
537
+ fn lift_order_aggregates(
538
+ &mut self,
539
+ order: Vec<ResolvedSortItem>,
540
+ written: &[(String, VarId, bool)],
541
+ lifted: &mut Vec<ResolvedProjection>,
542
+ distinct: bool,
543
+ first_var: VarId,
544
+ ) -> Result<Vec<ResolvedSortItem>, SemanticError> {
545
+ let aggregating = written.iter().any(|(_, _, aggregates)| *aggregates);
546
+ if !aggregating {
547
+ if order.iter().any(|key| expr_contains_aggregate(&key.expr)) {
548
+ return Err(SemanticError::AggregationInOrderBy(
549
+ "the projection doesn't aggregate".into(),
550
+ ));
551
+ }
552
+ return Ok(order);
553
+ }
554
+
555
+ let keys: Vec<(String, VarId)> = written
556
+ .iter()
557
+ .filter(|(_, _, aggregates)| !aggregates)
558
+ .map(|(shape, output, _)| (shape.clone(), *output))
559
+ .collect();
560
+ order
561
+ .into_iter()
562
+ .map(|mut key| {
563
+ let shape = format!("{:?}", key.expr);
564
+ if let Some((_, output, _)) = written.iter().find(|(s, _, _)| *s == shape) {
565
+ key.expr = ResolvedExpr::Variable(*output);
566
+ return Ok(key);
567
+ }
568
+ if !expr_contains_aggregate(&key.expr) {
569
+ return Ok(key);
570
+ }
571
+ if distinct {
572
+ return Err(SemanticError::AggregationInOrderBy(
573
+ "after DISTINCT it can only sort by an aggregate that is projected".into(),
574
+ ));
575
+ }
576
+ lift_aggregates_in(
577
+ &mut key.expr,
578
+ &keys,
579
+ &mut || self.symbols.new_var(),
580
+ lifted,
581
+ Span::default(),
582
+ );
583
+ if reads_ungrouped(&key.expr, &keys, first_var) {
584
+ return Err(SemanticError::ImplicitGroupingKey("ORDER BY".into()));
585
+ }
586
+ Ok(key)
587
+ })
588
+ .collect()
589
+ }
590
+ }
591
+
592
+ /// Whether `expr`, after lifting, reads a binding from before the
593
+ /// projection (an id below `first_var`) that isn't a grouping key's
594
+ /// column: a value that differs per row of the group.
595
+ fn reads_ungrouped(expr: &ResolvedExpr, keys: &[(String, VarId)], first_var: VarId) -> bool {
596
+ let mut reads = BTreeSet::new();
597
+ expr.collect_vars(&mut reads);
598
+ reads
599
+ .iter()
600
+ .any(|v| *v < first_var && !keys.iter().any(|(_, key)| key == v))
601
+ }
602
+
603
+ /// Whether `expr` is itself one aggregate call, the shape the aggregation
604
+ /// operator evaluates directly.
605
+ fn is_bare_aggregate(expr: &ResolvedExpr) -> bool {
606
+ matches!(expr, ResolvedExpr::Function { function, .. } if function.is_aggregate())
607
+ }
608
+
609
+ /// Replace each aggregate call in `expr` with a fresh variable, recording
610
+ /// the call as a hidden projection in `lifted`; replace each aggregate-free
611
+ /// sub-expression that restates a grouping key with that key's column.
612
+ fn lift_aggregates_in(
613
+ expr: &mut ResolvedExpr,
614
+ keys: &[(String, VarId)],
615
+ new_var: &mut dyn FnMut() -> VarId,
616
+ lifted: &mut Vec<ResolvedProjection>,
617
+ span: Span,
618
+ ) {
619
+ if is_bare_aggregate(expr) {
620
+ let output = new_var();
621
+ let call = std::mem::replace(expr, ResolvedExpr::Variable(output));
622
+ lifted.push(ResolvedProjection {
623
+ expr: call,
624
+ output,
625
+ name: format!(" aggregate {}", output.0).into(),
626
+ explicit_alias: false,
627
+ span,
628
+ });
629
+ return;
630
+ }
631
+ // Not a key, but its parts may be (`size(n.tags)` with `n.tags` grouped).
632
+ if !keys.is_empty() && !expr_contains_aggregate(expr) {
633
+ let shape = format!("{:?}", expr);
634
+ if let Some((_, output)) = keys.iter().find(|(key, _)| *key == shape) {
635
+ *expr = ResolvedExpr::Variable(*output);
636
+ return;
637
+ }
638
+ }
639
+ let mut go = |e: &mut ResolvedExpr| lift_aggregates_in(e, keys, new_var, lifted, span);
640
+ match expr {
641
+ ResolvedExpr::Variable(_) | ResolvedExpr::Literal(_) | ResolvedExpr::Parameter(_) => {}
642
+ ResolvedExpr::Property { expr, .. } | ResolvedExpr::Unary { expr, .. } => go(expr),
643
+ ResolvedExpr::Binary { lhs, rhs, .. } => {
644
+ go(lhs);
645
+ go(rhs);
646
+ }
647
+ ResolvedExpr::Function { args, .. } => args.iter_mut().for_each(go),
648
+ ResolvedExpr::List(items) => items.iter_mut().for_each(go),
649
+ ResolvedExpr::Map(items) => items.iter_mut().for_each(|(_, v)| go(v)),
650
+ ResolvedExpr::Case {
651
+ input,
652
+ alternatives,
653
+ else_expr,
654
+ } => {
655
+ if let Some(e) = input {
656
+ go(e);
657
+ }
658
+ for (w, t) in alternatives {
659
+ go(w);
660
+ go(t);
661
+ }
662
+ if let Some(e) = else_expr {
663
+ go(e);
664
+ }
665
+ }
666
+ ResolvedExpr::ListPredicate {
667
+ list, predicate, ..
668
+ } => {
669
+ go(list);
670
+ go(predicate);
671
+ }
672
+ ResolvedExpr::ListComprehension {
673
+ list,
674
+ filter,
675
+ map_expr,
676
+ ..
677
+ } => {
678
+ go(list);
679
+ if let Some(e) = filter {
680
+ go(e);
681
+ }
682
+ if let Some(e) = map_expr {
683
+ go(e);
684
+ }
685
+ }
686
+ ResolvedExpr::Reduce {
687
+ init, list, expr, ..
688
+ } => {
689
+ go(init);
690
+ go(list);
691
+ go(expr);
692
+ }
693
+ ResolvedExpr::MapProjection { base, selectors } => {
694
+ go(base);
695
+ for selector in selectors {
696
+ if let ResolvedMapSelector::Literal(_, e) = selector {
697
+ go(e);
698
+ }
699
+ }
700
+ }
701
+ ResolvedExpr::Index { expr, index } => {
702
+ go(expr);
703
+ go(index);
704
+ }
705
+ ResolvedExpr::Slice { expr, from, to } => {
706
+ go(expr);
707
+ if let Some(e) = from {
708
+ go(e);
709
+ }
710
+ if let Some(e) = to {
711
+ go(e);
712
+ }
713
+ }
714
+ // Their pattern reads row bindings directly; aggregates can't nest there.
715
+ ResolvedExpr::ExistsSubquery { .. } | ResolvedExpr::PatternComprehension { .. } => {}
716
+ }
717
+ }
718
+
450
719
  fn projection_name(expr: &Expr) -> String {
451
720
  match expr {
452
721
  Expr::Variable(v) => v.name.clone(),
@@ -117,7 +117,10 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
117
117
  Expr::String(v, _) => Ok(ResolvedExpr::Literal(LiteralValue::String(v.clone()))),
118
118
  Expr::Bool(v, _) => Ok(ResolvedExpr::Literal(LiteralValue::Bool(*v))),
119
119
  Expr::Null(_) => Ok(ResolvedExpr::Literal(LiteralValue::Null)),
120
- Expr::Parameter(name, _) => Ok(ResolvedExpr::Parameter(name.clone())),
120
+ Expr::Parameter(name, _) => {
121
+ self.parameters.insert(name.clone());
122
+ Ok(ResolvedExpr::Parameter(name.clone()))
123
+ }
121
124
 
122
125
  Expr::List(items, _) => {
123
126
  let items = items
@@ -20,6 +20,8 @@ pub struct Analyzer<'a, S: GraphCatalog + ?Sized> {
20
20
  /// graph-catalog check — the caller can't know which keys the data
21
21
  /// carries until rows are bound at execution time.
22
22
  pub(super) dynamic_property_vars: BTreeSet<VarId>,
23
+ /// Every `$name` resolved so far (see [`ResolvedQuery::parameters`]).
24
+ pub(super) parameters: BTreeSet<String>,
23
25
  }
24
26
 
25
27
  #[derive(Debug, Clone, Copy, PartialEq, Eq)]
@@ -37,6 +39,7 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
37
39
  scopes: ScopeStack::new(),
38
40
  symbols: SymbolTable::default(),
39
41
  dynamic_property_vars: BTreeSet::new(),
42
+ parameters: BTreeSet::new(),
40
43
  }
41
44
  }
42
45
 
@@ -106,7 +109,11 @@ impl<'a, S: GraphCatalog + ?Sized> Analyzer<'a, S> {
106
109
  }
107
110
  }
108
111
 
109
- Ok(ResolvedQuery { clauses, unions })
112
+ Ok(ResolvedQuery {
113
+ clauses,
114
+ unions,
115
+ parameters: std::mem::take(&mut self.parameters),
116
+ })
110
117
  }
111
118
 
112
119
  fn analyze_single_query(
@@ -47,6 +47,12 @@ pub enum SemanticError {
47
47
  #[error("aggregation functions are not allowed in WHERE clause")]
48
48
  AggregationInWhere,
49
49
 
50
+ #[error("`{0}` aggregates, so outside its aggregate functions it can only use grouping keys; project that value as its own column")]
51
+ ImplicitGroupingKey(String),
52
+
53
+ #[error("ORDER BY can't aggregate here: {0}")]
54
+ AggregationInOrderBy(String),
55
+
50
56
  #[error("all UNION branches must return the same number of columns: expected {0}, got {1}")]
51
57
  UnionColumnCountMismatch(usize, usize),
52
58
 
@@ -8,6 +8,9 @@ use lora_ast::{
8
8
  #[derive(Debug, Clone)]
9
9
  pub struct ResolvedQuery {
10
10
  pub clauses: Vec<ResolvedClause>,
11
+ /// Every `$name` the query reads, across its UNION branches and
12
+ /// subqueries: running it without one of them is an error.
13
+ pub parameters: BTreeSet<String>,
11
14
  /// Additional UNION branches. Each branch is a separate resolved query
12
15
  /// that produces rows to be combined with the head query's results.
13
16
  pub unions: Vec<ResolvedUnionPart>,
@@ -142,6 +145,11 @@ pub enum ResolvedRemoveItem {
142
145
  pub struct ResolvedReturn {
143
146
  pub distinct: bool,
144
147
  pub items: Vec<ResolvedProjection>,
148
+ /// Aggregate calls nested inside a larger item (`size(collect(x))`,
149
+ /// `count(*) + 1`), each lifted into its own hidden column. Those items
150
+ /// read the lifted columns, and grouping keys, by output id, so they
151
+ /// are evaluated after aggregation.
152
+ pub lifted_aggregates: Vec<ResolvedProjection>,
145
153
  pub include_existing: bool,
146
154
  pub order: Vec<ResolvedSortItem>,
147
155
  pub skip: Option<ResolvedExpr>,
@@ -152,6 +160,11 @@ pub struct ResolvedReturn {
152
160
  pub struct ResolvedWith {
153
161
  pub distinct: bool,
154
162
  pub items: Vec<ResolvedProjection>,
163
+ /// Aggregate calls nested inside a larger item (`size(collect(x))`,
164
+ /// `count(*) + 1`), each lifted into its own hidden column. Those items
165
+ /// read the lifted columns, and grouping keys, by output id, so they
166
+ /// are evaluated after aggregation.
167
+ pub lifted_aggregates: Vec<ResolvedProjection>,
155
168
  pub include_existing: bool,
156
169
  pub order: Vec<ResolvedSortItem>,
157
170
  pub skip: Option<ResolvedExpr>,
@@ -19,6 +19,12 @@ impl SymbolTable {
19
19
  Self { next_var: 0 }
20
20
  }
21
21
 
22
+ /// The id the next `new_var` returns. Every variable bound from here on
23
+ /// (aliases, comprehension locals) gets this id or a higher one.
24
+ pub fn next_var(&self) -> VarId {
25
+ VarId(self.next_var)
26
+ }
27
+
22
28
  pub fn new_var(&mut self) -> VarId {
23
29
  let id = VarId(self.next_var);
24
30
  self.next_var += 1;