calc-flow-python 4.0.0__tar.gz → 2026.9.24__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 (268) hide show
  1. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/Cargo.lock +54 -5
  2. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/Cargo.toml +1 -1
  3. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/PKG-INFO +87 -145
  4. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/README.md +77 -139
  5. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/Cargo.toml +8 -0
  6. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/benches/allocation_regression.rs +49 -11
  7. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/benches/sql_datafusion_performance.rs +970 -315
  8. calc_flow_python-2026.9.24/crates/calc-flow/benches/stream_asof_perf.rs +476 -0
  9. calc_flow_python-2026.9.24/crates/calc-flow/benches/stream_join_materialization.rs +388 -0
  10. calc_flow_python-2026.9.24/crates/calc-flow/src/config/asof.rs +101 -0
  11. calc_flow_python-2026.9.24/crates/calc-flow/src/config/late_output.rs +53 -0
  12. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/config.rs +78 -11
  13. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/continuous.rs +63 -18
  14. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/datafusion.rs +95 -3
  15. calc_flow_python-2026.9.24/crates/calc-flow/src/datafusion_predicate.rs +370 -0
  16. calc_flow_python-2026.9.24/crates/calc-flow/src/datafusion_rolling/sql_aggregate.rs +471 -0
  17. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/datafusion_rolling.rs +197 -31
  18. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/lib.rs +15 -12
  19. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/admission.rs +328 -0
  20. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/checkpoint/encoding.rs +296 -0
  21. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/checkpoint/validation.rs +169 -0
  22. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/checkpoint.rs +508 -0
  23. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/codec/framing.rs +161 -0
  24. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/codec.rs +176 -0
  25. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/duplicate_fallback.rs +139 -0
  26. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/finalize/prefix.rs +98 -0
  27. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/finalize.rs +277 -0
  28. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/identity.rs +81 -0
  29. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/identity_compare.rs +211 -0
  30. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/metadata.rs +54 -0
  31. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/mod.rs +441 -0
  32. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/output/tests.rs +108 -0
  33. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/output.rs +229 -0
  34. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/schema.rs +228 -0
  35. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/spec.rs +257 -0
  36. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/state.rs +401 -0
  37. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/status.rs +56 -0
  38. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/tests.rs +489 -0
  39. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/workspace.rs +459 -0
  40. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/cross_section/late.rs +217 -0
  41. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/cross_section/tests/late.rs +618 -0
  42. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/cross_section.rs +280 -136
  43. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/expression/projection.rs +22 -14
  44. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/expression.rs +96 -0
  45. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/join/materialization.rs +592 -0
  46. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/join.rs +898 -92
  47. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/late_output/identity.rs +117 -0
  48. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/late_output/plan.rs +271 -0
  49. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/late_output/tests/ownership.rs +135 -0
  50. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/late_output/tests.rs +279 -0
  51. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/late_output.rs +277 -0
  52. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/mod.rs +31 -4
  53. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/output_chunk.rs +652 -0
  54. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/rolling/kernel/entity_parallel.rs +1238 -0
  55. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/rolling/kernel/entity_parallel_tests.rs +2207 -0
  56. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/rolling/kernel/sorted.rs +313 -0
  57. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/rolling/kernel.rs +422 -104
  58. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/rolling/late.rs +179 -0
  59. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/rolling/ordered_stream.rs +701 -0
  60. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/rolling/tests/late.rs +593 -0
  61. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/rolling.rs +1603 -223
  62. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/rolling_metrics/lease_tests.rs +120 -0
  63. calc_flow_python-2026.9.24/crates/calc-flow/src/operator/rolling_metrics.rs +632 -0
  64. {calc_flow_python-4.0.0/crates/calc-flow/src/operator/rolling → calc_flow_python-2026.9.24/crates/calc-flow/src/operator}/row_cost.rs +96 -19
  65. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/sql.rs +41 -0
  66. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/stream.rs +97 -0
  67. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/window.rs +11 -111
  68. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/pipeline/batch.rs +2 -0
  69. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/pipeline/compile.rs +76 -0
  70. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/pipeline/mod.rs +1 -1
  71. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/pipeline/stream.rs +59 -2
  72. calc_flow_python-2026.9.24/crates/calc-flow/src/project_store/asof.rs +242 -0
  73. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/project_store.rs +9 -2
  74. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/channel.rs +201 -48
  75. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/entity_work/tests.rs +283 -0
  76. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/entity_work.rs +635 -0
  77. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/failure.rs +57 -2
  78. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/job/asof.rs +66 -0
  79. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/job.rs +11 -0
  80. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/mod.rs +1 -0
  81. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/operator_task/cooperation_tests.rs +691 -0
  82. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/operator_task/late_control_tests.rs +582 -0
  83. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/operator_task/performance_evidence.rs +457 -0
  84. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/operator_task/tests/asof_tests.rs +587 -0
  85. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/operator_task/tests/error_propagation_tests.rs +289 -0
  86. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/operator_task.rs +722 -47
  87. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/driver.rs +219 -11
  88. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/status.rs +70 -1
  89. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/trace.rs +40 -1
  90. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/projection.rs +92 -6
  91. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/asof.rs +82 -0
  92. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/entity_work_tests/lifecycle_tests/checkpoint_tests.rs +334 -0
  93. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/entity_work_tests/lifecycle_tests.rs +354 -0
  94. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/entity_work_tests.rs +227 -0
  95. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/operator_fusion/allocation_evidence.rs +630 -0
  96. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/operator_fusion/allocation_evidence_guards.rs +93 -0
  97. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/operator_fusion.rs +1401 -0
  98. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/supervision.rs +129 -0
  99. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/supervision_loan_tests.rs +69 -0
  100. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/tests/asof_tests.rs +939 -0
  101. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/runner.rs +493 -115
  102. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/sink_task.rs +2 -1
  103. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/soak/diagnostics.rs +312 -0
  104. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/soak.rs +372 -54
  105. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/source_task.rs +2 -1
  106. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/supervisor/ready_pair/native_tests.rs +544 -0
  107. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/supervisor/ready_pair/tests.rs +511 -0
  108. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/supervisor/ready_pair.rs +203 -0
  109. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/supervisor/terminal.rs +177 -0
  110. calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/supervisor.rs +937 -0
  111. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/Cargo.toml +28 -3
  112. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/README.md +2 -2
  113. calc_flow_python-2026.9.24/crates/calc-flow-connectors/examples/kafka_custom_decoder.rs +224 -0
  114. calc_flow_python-2026.9.24/crates/calc-flow-connectors/examples/kafka_protobuf_source.rs +171 -0
  115. calc_flow_python-2026.9.24/crates/calc-flow-connectors/examples/late_output_recovery.rs +593 -0
  116. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/file_sink.rs +110 -18
  117. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/kafka.rs +687 -40
  118. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/lib.rs +24 -5
  119. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/mysql/mod.rs +2 -1
  120. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/mysql/sink.rs +404 -74
  121. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/mysql/types.rs +17 -11
  122. calc_flow_python-2026.9.24/crates/calc-flow-connectors/src/protobuf.rs +788 -0
  123. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/tests/file_connector.rs +148 -0
  124. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/tests/kafka_connector.rs +91 -0
  125. calc_flow_python-2026.9.24/crates/calc-flow-connectors/tests/late_output_file.rs +1007 -0
  126. calc_flow_python-2026.9.24/crates/calc-flow-connectors/tests/mysql_connector/checkpoint.rs +260 -0
  127. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/tests/mysql_connector.rs +3 -0
  128. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/Cargo.toml +10 -5
  129. calc_flow_python-2026.9.24/crates/calc-flow-python/build.rs +3 -0
  130. calc_flow_python-2026.9.24/crates/calc-flow-python/src/config/kafka_tests.rs +186 -0
  131. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/config.rs +140 -3
  132. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/connector.rs +21 -3
  133. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/continuous.rs +400 -19
  134. calc_flow_python-2026.9.24/crates/calc-flow-python/src/decoder.rs +585 -0
  135. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/error.rs +16 -3
  136. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/execution_options.rs +71 -18
  137. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/lib.rs +2 -0
  138. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/provider.rs +2 -2
  139. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/runtime/dispatch.rs +1 -1
  140. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/runtime.rs +14 -5
  141. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/pyproject.toml +15 -9
  142. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/__init__.py +80 -1
  143. calc_flow_python-2026.9.24/python/calc_flow/_compat.py +103 -0
  144. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/_native.pyi +27 -6
  145. calc_flow_python-2026.9.24/python/calc_flow/_stream_inputs.py +233 -0
  146. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/array.py +17 -4
  147. calc_flow_python-2026.9.24/python/calc_flow/asof_join_spec.py +126 -0
  148. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/capabilities.py +70 -16
  149. calc_flow_python-2026.9.24/python/calc_flow/compute.py +278 -0
  150. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/config.py +5 -3
  151. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/join_spec.py +2 -1
  152. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/pipeline.py +172 -7
  153. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/runtime.py +118 -22
  154. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/store.py +4 -2
  155. calc_flow_python-2026.9.24/python/calc_flow/stream.py +390 -0
  156. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/__init__.py +12 -8
  157. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/analyzer.py +574 -66
  158. calc_flow_python-2026.9.24/python/calc_flow/symbolic/asof.py +212 -0
  159. calc_flow_python-2026.9.24/python/calc_flow/symbolic/asof_analysis.py +215 -0
  160. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/errors.py +9 -0
  161. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/expr.py +208 -20
  162. calc_flow_python-2026.9.24/python/calc_flow/symbolic/late_output.py +256 -0
  163. calc_flow_python-2026.9.24/python/calc_flow/symbolic/lower/asof.py +86 -0
  164. calc_flow_python-2026.9.24/python/calc_flow/symbolic/lower/bindings.py +69 -0
  165. calc_flow_python-2026.9.24/python/calc_flow/symbolic/lower/event_windows.py +477 -0
  166. calc_flow_python-2026.9.24/python/calc_flow/symbolic/lower/late_output.py +118 -0
  167. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/lower/planners.py +15 -7
  168. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/lower/program.py +147 -147
  169. calc_flow_python-2026.9.24/python/calc_flow/symbolic/lower/schema.py +170 -0
  170. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/lower/segments.py +58 -23
  171. calc_flow_python-2026.9.24/python/calc_flow/symbolic/lower/sql.py +423 -0
  172. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/lower/strategies.py +93 -43
  173. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/nodes.py +41 -18
  174. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/ops.py +167 -17
  175. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/optimizer.py +93 -1
  176. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/program.py +141 -24
  177. calc_flow_python-2026.9.24/python/calc_flow/symbolic/sql.py +36 -0
  178. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/types.py +6 -6
  179. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/windows.py +26 -2
  180. calc_flow_python-4.0.0/crates/calc-flow/src/operator/rolling/ordered_stream.rs +0 -406
  181. calc_flow_python-4.0.0/crates/calc-flow/src/runtime/streaming/supervisor.rs +0 -654
  182. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/LICENSE +0 -0
  183. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/LICENSE +0 -0
  184. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/benches/core.rs +0 -0
  185. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/benches/m4_state_window.rs +0 -0
  186. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/benches/stream_join_perf.rs +0 -0
  187. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/examples/README.md +0 -0
  188. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/examples/continuous_runtime.rs +0 -0
  189. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/examples/export_schema.rs +0 -0
  190. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/examples/expression_pipeline.rs +0 -0
  191. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/examples/gen_v3_schema.rs +0 -0
  192. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/examples/sql_join.rs +0 -0
  193. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/examples/windowed_streaming.rs +0 -0
  194. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/rolling-kernels.json +0 -0
  195. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/batch.rs +0 -0
  196. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/connector/capability.rs +0 -0
  197. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/connector/format.rs +0 -0
  198. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/connector/mod.rs +0 -0
  199. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/connector/registry.rs +0 -0
  200. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/connector/secret.rs +0 -0
  201. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/context.rs +0 -0
  202. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/error.rs +0 -0
  203. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/expression.rs +0 -0
  204. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/json.rs +0 -0
  205. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/batch.rs +0 -0
  206. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/checkpoint.rs +0 -0
  207. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/rolling/generated_kernel_manifest.rs +0 -0
  208. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/rolling/state_v3.rs +0 -0
  209. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/union.rs +0 -0
  210. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/mod.rs +0 -0
  211. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/checkpoint/coordinator.rs +0 -0
  212. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/checkpoint/mod.rs +0 -0
  213. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/checkpoint/storage.rs +0 -0
  214. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/checkpoint_runtime.rs +0 -0
  215. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/checkpoint_status.rs +0 -0
  216. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/context.rs +0 -0
  217. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/message.rs +0 -0
  218. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/metrics.rs +0 -0
  219. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/aggregate.rs +0 -0
  220. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/durable.rs +0 -0
  221. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/generated.rs +0 -0
  222. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/mod.rs +0 -0
  223. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/prepare.rs +0 -0
  224. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/snapshot.rs +0 -0
  225. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/types.rs +0 -0
  226. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/registry.rs +0 -0
  227. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/test_seams.rs +0 -0
  228. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/state/backend.rs +0 -0
  229. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/state/local.rs +0 -0
  230. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/state/manifest.rs +0 -0
  231. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/state/mod.rs +0 -0
  232. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/state/segment.rs +0 -0
  233. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/state/transaction.rs +0 -0
  234. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/static_input.rs +0 -0
  235. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/time/event_time.rs +0 -0
  236. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/time/mod.rs +0 -0
  237. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/udf.rs +0 -0
  238. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/arrow_schema.rs +0 -0
  239. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/clickhouse.rs +0 -0
  240. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/clickhouse_sink.rs +0 -0
  241. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/csv.rs +0 -0
  242. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/database_types.rs +0 -0
  243. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/evidence.rs +0 -0
  244. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/file.rs +0 -0
  245. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/http.rs +0 -0
  246. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/json_lines.rs +0 -0
  247. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/mysql/config.rs +0 -0
  248. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/mysql/source.rs +0 -0
  249. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/options.rs +0 -0
  250. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/parquet.rs +0 -0
  251. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/postgresql.rs +0 -0
  252. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/postgresql_cdc.rs +0 -0
  253. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/websocket.rs +0 -0
  254. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/tests/clickhouse_connector.rs +0 -0
  255. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/tests/http_websocket_connectors.rs +0 -0
  256. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/tests/postgresql_cdc.rs +0 -0
  257. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/tests/postgresql_connector.rs +0 -0
  258. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/batch.rs +0 -0
  259. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/pipeline.rs +0 -0
  260. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/runtime/profile.rs +0 -0
  261. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/store.rs +0 -0
  262. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/udf.rs +0 -0
  263. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/errors.py +0 -0
  264. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/py.typed +0 -0
  265. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/_generated_rolling_kernels.py +0 -0
  266. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/domains.py +0 -0
  267. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/lower/__init__.py +0 -0
  268. {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/udf.py +0 -0
@@ -553,7 +553,7 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04"
553
553
 
554
554
  [[package]]
555
555
  name = "calc-flow"
556
- version = "4.0.0"
556
+ version = "2026.9.24"
557
557
  dependencies = [
558
558
  "allocation-counter",
559
559
  "async-trait",
@@ -582,8 +582,9 @@ dependencies = [
582
582
 
583
583
  [[package]]
584
584
  name = "calc-flow-connectors"
585
- version = "4.0.0"
585
+ version = "2026.9.24"
586
586
  dependencies = [
587
+ "allocation-counter",
587
588
  "arrow",
588
589
  "arrow-csv",
589
590
  "arrow-json",
@@ -591,6 +592,7 @@ dependencies = [
591
592
  "bytes",
592
593
  "calc-flow",
593
594
  "chrono",
595
+ "clap",
594
596
  "datafusion",
595
597
  "flate2",
596
598
  "futures-util",
@@ -599,6 +601,9 @@ dependencies = [
599
601
  "parquet",
600
602
  "pgwire-replication",
601
603
  "postgres-types",
604
+ "prost",
605
+ "prost-reflect",
606
+ "prost-types",
602
607
  "rdkafka",
603
608
  "reqwest",
604
609
  "rust_decimal",
@@ -617,7 +622,7 @@ dependencies = [
617
622
 
618
623
  [[package]]
619
624
  name = "calc-flow-python"
620
- version = "4.0.0"
625
+ version = "2026.9.24"
621
626
  dependencies = [
622
627
  "async-trait",
623
628
  "calc-flow",
@@ -631,6 +636,8 @@ dependencies = [
631
636
  "pyo3",
632
637
  "pyo3-arrow",
633
638
  "pyo3-async-runtimes",
639
+ "pyo3-build-config",
640
+ "rdkafka",
634
641
  "serde_json",
635
642
  "tempfile",
636
643
  "tokio",
@@ -3157,6 +3164,48 @@ dependencies = [
3157
3164
  "unarray",
3158
3165
  ]
3159
3166
 
3167
+ [[package]]
3168
+ name = "prost"
3169
+ version = "0.14.4"
3170
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3171
+ checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1"
3172
+ dependencies = [
3173
+ "bytes",
3174
+ "prost-derive",
3175
+ ]
3176
+
3177
+ [[package]]
3178
+ name = "prost-derive"
3179
+ version = "0.14.4"
3180
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3181
+ checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf"
3182
+ dependencies = [
3183
+ "anyhow",
3184
+ "itertools 0.14.0",
3185
+ "proc-macro2",
3186
+ "quote",
3187
+ "syn 2.0.118",
3188
+ ]
3189
+
3190
+ [[package]]
3191
+ name = "prost-reflect"
3192
+ version = "0.16.5"
3193
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3194
+ checksum = "01b80ea363c31af2de2b92e3c07ed1156628f7838c4afb4df75ee78a37fedbd1"
3195
+ dependencies = [
3196
+ "prost",
3197
+ "prost-types",
3198
+ ]
3199
+
3200
+ [[package]]
3201
+ name = "prost-types"
3202
+ version = "0.14.4"
3203
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3204
+ checksum = "f94967dc7688f3054c7fac87473ffae4cc4c3904800e2d9f5b857246d8963b0a"
3205
+ dependencies = [
3206
+ "prost",
3207
+ ]
3208
+
3160
3209
  [[package]]
3161
3210
  name = "ptr_meta"
3162
3211
  version = "0.1.4"
@@ -3713,9 +3762,9 @@ dependencies = [
3713
3762
 
3714
3763
  [[package]]
3715
3764
  name = "rustls"
3716
- version = "0.23.43"
3765
+ version = "0.23.45"
3717
3766
  source = "registry+https://github.com/rust-lang/crates.io-index"
3718
- checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06"
3767
+ checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634"
3719
3768
  dependencies = [
3720
3769
  "aws-lc-rs",
3721
3770
  "log",
@@ -3,7 +3,7 @@ members = ["crates/calc-flow", "crates/calc-flow-connectors", "crates/calc-flow-
3
3
  resolver = "3"
4
4
 
5
5
  [workspace.package]
6
- version = "4.0.0"
6
+ version = "2026.9.24"
7
7
  edition = "2024"
8
8
  rust-version = "1.88.0"
9
9
  license = "Apache-2.0"
@@ -1,9 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: calc-flow-python
3
- Version: 4.0.0
3
+ Version: 2026.9.24
4
4
  Requires-Dist: pydantic>=2.12.0,<3
5
- Requires-Dist: pyarrow>=24.0.0,<25
6
- Requires-Dist: jax>=0.4 ; extra == 'array'
5
+ Requires-Dist: pyarrow>=21.0.0,<22 ; python_full_version < '3.10'
6
+ Requires-Dist: pyarrow>=24.0.0,<25 ; python_full_version >= '3.10'
7
+ Requires-Dist: typing-extensions>=4.12
8
+ Requires-Dist: jax>=0.4.30,<0.4.31 ; python_full_version < '3.10' and extra == 'array'
9
+ Requires-Dist: jax>=0.4 ; python_full_version >= '3.10' and extra == 'array'
7
10
  Requires-Dist: numpy>=2.0.0 ; extra == 'array'
8
11
  Requires-Dist: ta-lib==0.7.1 ; extra == 'benchmark'
9
12
  Requires-Dist: datafusion==54.0.0 ; extra == 'benchmark'
@@ -24,7 +27,8 @@ Requires-Dist: pytest>=8 ; extra == 'dev'
24
27
  Requires-Dist: pytest-cov>=7.1 ; extra == 'dev'
25
28
  Requires-Dist: pytest-xdist>=3.6 ; extra == 'dev'
26
29
  Requires-Dist: ruff==0.16.0 ; extra == 'dev'
27
- Requires-Dist: jax>=0.4 ; extra == 'jax'
30
+ Requires-Dist: jax>=0.4.30,<0.4.31 ; python_full_version < '3.10' and extra == 'jax'
31
+ Requires-Dist: jax>=0.4 ; python_full_version >= '3.10' and extra == 'jax'
28
32
  Requires-Dist: numpy>=2.0.0 ; extra == 'numpy'
29
33
  Provides-Extra: array
30
34
  Provides-Extra: benchmark
@@ -32,9 +36,9 @@ Provides-Extra: dev
32
36
  Provides-Extra: jax
33
37
  Provides-Extra: numpy
34
38
  License-File: LICENSE
35
- Summary: Rust-native DataFusion batch and streaming calculation pipelines
39
+ Summary: Python expression API for batch and streaming calculations on a Rust runtime
36
40
  License-Expression: Apache-2.0
37
- Requires-Python: >=3.13
41
+ Requires-Python: >=3.9
38
42
  Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
39
43
  Project-URL: Repository, https://github.com/wegamekinglc/calc-flow
40
44
 
@@ -42,18 +46,19 @@ Project-URL: Repository, https://github.com/wegamekinglc/calc-flow
42
46
 
43
47
  [![Linux CI](https://github.com/wegamekinglc/calc-flow/actions/workflows/ci-linux.yml/badge.svg?branch=main)](https://github.com/wegamekinglc/calc-flow/actions/workflows/ci-linux.yml)
44
48
  [![Windows CI](https://github.com/wegamekinglc/calc-flow/actions/workflows/ci-windows.yml/badge.svg?branch=main)](https://github.com/wegamekinglc/calc-flow/actions/workflows/ci-windows.yml)
49
+ [![Scheduled Benchmarks](https://github.com/wegamekinglc/calc-flow/actions/workflows/benchmark-suite.yml/badge.svg?branch=main)](https://github.com/wegamekinglc/calc-flow/actions/workflows/benchmark-suite.yml)
50
+ [![Codacy Grade](https://app.codacy.com/project/badge/Grade/7416ea8873544e599089cf63aba3717d)](https://app.codacy.com/gh/wegamekinglc/calc-flow/dashboard)
45
51
  [![Coverage Status](https://coveralls.io/repos/github/wegamekinglc/calc-flow/badge.svg?branch=main)](https://coveralls.io/github/wegamekinglc/calc-flow?branch=main)
46
52
 
47
- Calc Flow 4.0 is a Rust-native calculation engine for immutable Arrow
48
- micro-batches and stateful streams. The core crate compiles typed calculation
49
- graphs, runs every table expression and query with Apache DataFusion, and owns
50
- checkpoint/recovery semantics. The Python package is a PyO3 binding to that
51
- engine; it is not a second implementation. Calc Flow Studio remains a separate
52
- local FastAPI and React application.
53
+ Calc Flow is a Python calculation library for Arrow tables and stateful streams.
54
+ Compose typed expressions, SQL, and reusable Python functions in one pipeline.
55
+ Collect a dataset or iterate its results as data arrives. Rust provides the internal runtime:
56
+ DataFusion table execution, graph compilation, state, checkpoints, and recovery.
57
+ Calc Flow Studio is a separate local FastAPI and React application.
53
58
 
54
59
  ## Install
55
60
 
56
- Python 3.13 or newer:
61
+ CPython 3.9 or newer:
57
62
 
58
63
  ```bash
59
64
  uv add calc-flow-python
@@ -66,125 +71,54 @@ uv add "calc-flow-python[numpy]"
66
71
  uv add "calc-flow-python[jax]"
67
72
  ```
68
73
 
69
- Rust:
70
-
71
- ```toml
72
- [dependencies]
73
- calc-flow = "4.0.0"
74
- ```
75
-
76
74
  ## Python quickstart
77
75
 
78
76
  ```python
79
- from datetime import UTC, datetime, timedelta
80
-
81
77
  import pyarrow as pa
78
+ import calc_flow as cf
82
79
 
83
- from calc_flow import Batch, ExecutionOptions, PipelineBuilder
84
-
85
- batch = Batch.from_pyarrow(pa.table({"a": [1, 3], "b": [2, 4]}))
86
- plan = (
87
- PipelineBuilder("totals").expression("calculate", "total = a + b").compile_batch()
88
- )
89
- result = plan.execute(
90
- {"input": batch},
91
- options=ExecutionOptions(
92
- settings={"request": {"source": "readme"}},
93
- deadline=datetime.now(UTC) + timedelta(seconds=30),
94
- ),
95
- )
96
-
97
- assert result.outputs["output"].to_pyarrow()["total"].to_pylist() == [3, 7]
98
- ```
99
-
100
- `PipelineBuilder` is functional: every method returns a new builder and leaves
101
- its input unchanged. Unconnected input ports become graph inputs; unconnected
102
- output ports become graph outputs. Use `execute_async()` inside an event loop.
103
- Both execution forms accept keyword-only, frozen `ExecutionOptions` carrying
104
- deep-copied strict-JSON settings and an optional timezone-aware deadline that
105
- is normalized to UTC. Settings may be nested mappings/lists; `settings=None`
106
- means empty settings.
107
-
108
- See [the Python API guide](docs/python-api.md) and the executable
109
- [examples](examples/README.md) for SQL, Python scalar UDFs, continuous
110
- execution and recovery, asyncio, and NumPy/JAX.
111
- The [symbolic workflow guide](docs/symbolic-workflows.md) covers composed
112
- financial features, checkpoint recovery, static matrices, bounded stream
113
- joins, capability errors, Studio inspection, and performance output.
114
-
115
- ## Rust quickstart
116
-
117
- The Rust crate exposes the native data, operator, graph, runtime, project, and
118
- checkpoint types directly. A table `Batch` contains one or more Arrow
119
- `RecordBatch` values plus immutable metadata. Build a graph with
120
- `PipelineBuilder`, compile it against a `UdfRegistrySnapshot`, then await
121
- `BatchExecutionPlan::execute`. The canonical first example is
122
- [`crates/calc-flow/examples/expression_pipeline.rs`](crates/calc-flow/examples/expression_pipeline.rs),
123
- a true twin of the Python quickstart:
124
-
125
- ```rust
126
- use std::{collections::BTreeMap, sync::Arc};
127
-
128
- use calc_flow::{
129
- Batch, BatchMetadata, ExecutionOptions, ExpressionOperator, PipelineBuilder, UdfRegistry,
130
- };
131
- use datafusion::arrow::{array::Int64Array, record_batch::RecordBatch};
132
-
133
- #[tokio::main]
134
- async fn main() -> Result<(), Box<dyn std::error::Error>> {
135
- let plan = PipelineBuilder::new("totals")?
136
- .add_node(
137
- "calculate",
138
- Box::new(ExpressionOperator::new(
139
- "calculate",
140
- "total = a + b",
141
- Vec::new(),
142
- None,
143
- Vec::new(),
144
- )?),
145
- )?
146
- .compile_batch(&UdfRegistry::new().snapshot())?;
147
- let input = RecordBatch::try_from_iter(vec![
148
- (
149
- "a",
150
- Arc::new(Int64Array::from(vec![1, 3])) as Arc<dyn datafusion::arrow::array::Array>,
151
- ),
152
- ("b", Arc::new(Int64Array::from(vec![2, 4])) as _),
153
- ])?;
154
- let result = plan
155
- .execute(
156
- BTreeMap::from([(
157
- "input".into(),
158
- Batch::table(vec![input], BatchMetadata::default())?,
159
- )]),
160
- ExecutionOptions::default(),
161
- )
162
- .await?;
163
- let output = result.outputs["output"].table_payload()?;
164
- let totals = output.batches()[0]
165
- .column_by_name("total")
166
- .expect("expression output contains total")
167
- .as_any()
168
- .downcast_ref::<Int64Array>()
169
- .expect("total is an Int64 column");
170
-
171
- assert_eq!(totals.values(), &[3, 7]);
172
- println!("calculated totals: {totals:?}");
173
- Ok(())
174
- }
175
- ```
176
-
177
- Run the checked examples:
178
-
179
- ```bash
180
- cargo run -p calc-flow --example expression_pipeline
181
- cargo run -p calc-flow --example sql_join
182
- cargo run -p calc-flow --example continuous_runtime
183
- cargo run -p calc-flow --example windowed_streaming
80
+ data = pa.table({"a": [1, 3], "b": [2, 4]})
81
+ result = cf.compute(data, lambda t: t.select(total=t["a"] + t["b"]))
82
+ assert result.to_pydict() == {"total": [3, 7]}
184
83
  ```
185
84
 
186
- See [the Rust API guide](docs/rust-api.md) for paired source examples and links
187
- to the public types, or the [Rust examples index](crates/calc-flow/examples/README.md).
85
+ `cf.compute` infers the supported Arrow schema and returns a `pyarrow.Table`.
86
+ The builder receives a `TableExpr`; indexing selects columns, operators compose
87
+ calculations, and `select`, `with_columns`, and `filter` return new declarations.
88
+ Use `await cf.compute_async(...)` in an event loop.
89
+
90
+ Add a read-only SQL stage with `t.sql(query)`, using the local alias `input`.
91
+ Use `cf.sql(query, orders=orders, fees=fees)` for explicit named table declarations.
92
+ SQL returns another `TableExpr`, so `pipe`, column operators, and table methods
93
+ compose before and after it. `expression.pipe(function, *args, **kwargs)` calls
94
+ an ordinary synchronous function once while building the calculation.
95
+
96
+ For streams, use `async with output.stream(batches()) as results`, then
97
+ `async for table in results`. One native job retains state across batches and
98
+ owns cleanup. Declared event-time inputs default to validated nondecreasing
99
+ timestamps and watermarks that produce finalized results before EOF. Use
100
+ `watermarks` for explicit disorder or source-provided progress; see
101
+ [watermark policies](docs/streaming-guide.md#watermark-policies).
102
+ A `Program` yields named `StreamOutput` events for multiple
103
+ outputs. The convenience stream uses temporary checkpoints and best-effort
104
+ iterable delivery; durable recovery uses explicit source/sink bindings and a
105
+ managed checkpoint root.
106
+
107
+ Continue with [SQL and reusable pipelines](docs/batch-guide.md#compose-sql-and-python-pipelines)
108
+ and the [first streaming pipeline](docs/streaming-guide.md#first-python-continuous-job).
109
+ The runnable examples cover [SQL composition](examples/19_sql_expression_pipeline.py),
110
+ [stateful streaming](examples/20_streaming_pipeline.py), and
111
+ [named streaming outputs](examples/21_streaming_outputs.py). The
112
+ [connector examples](docs/connectors/README.md) cover all seven transports
113
+ and every supported read/write direction, with service setup and output checks.
114
+ The default wheel includes file; other transports require native build features.
115
+ [Expression workflows](docs/symbolic-workflows.md) cover financial features,
116
+ recovery, static matrices, and joins. Use explicit `Runtime`, plans, `Batch`,
117
+ UDFs, and `PipelineBuilder` for runtime integrations and diagnostics.
118
+
119
+ The [Rust runtime reference](docs/rust-api.md) and
120
+ [native examples](crates/calc-flow/examples/README.md) cover implementation and
121
+ extension work. The `calc-flow` crate's exports remain available to those users.
188
122
 
189
123
  ## Architecture
190
124
 
@@ -192,7 +126,7 @@ to the public types, or the [Rust examples index](crates/calc-flow/examples/READ
192
126
  crates/calc-flow (Rust core: Batch, graph compiler, DataFusion, runners, stores)
193
127
  ├─ crates/calc-flow-connectors (trusted transport implementations)
194
128
  └─ crates/calc-flow-python (PyO3 _native binding + registered connectors)
195
- └─ python/calc_flow (pure-Python public API + functional adapters)
129
+ └─ python/calc_flow (Python expressions, Arrow execution + integrations)
196
130
  └─ web-ui/backend (calc-flow-studio FastAPI, /api/v3, loopback only)
197
131
  └─ web-ui/src (React + TypeScript + Vite + React Flow studio, via REST)
198
132
  ```
@@ -207,16 +141,17 @@ Python package is not a second engine.
207
141
  | `crates/calc-flow/` | Native core: batches, ports/operators, graph compiler, DataFusion runtime, UDF/provider registries, runners, checkpoints, project stores |
208
142
  | `crates/calc-flow-connectors/` | Trusted file, Kafka, PostgreSQL, MySQL, ClickHouse, HTTP, and WebSocket connectors behind feature gates |
209
143
  | `crates/calc-flow-python/` | PyO3 binding exposing the core as `calc_flow._native` |
210
- | `python/calc_flow/` | Pure-Python public API, functional `PipelineBuilder`, runner/store adapters, NumPy/JAX provider registration, exception hierarchy |
144
+ | `python/calc_flow/` | Python expressions and SQL, `pipe`, Arrow collection, owned stream results, lowering, and runtime integrations |
211
145
  | `web-ui/backend/` | `calc-flow-studio` FastAPI service under `/api/v3`, loopback-bound, spawned bounded continuous-job workers |
212
146
  | `web-ui/src/` | React + TypeScript + Vite + React Flow studio; API types generated from `web-ui/openapi.json` |
213
147
  | `schemas/` | `project-v3.schema.json`, the canonical generated project contract |
214
- | `examples/` | Executable v3 Python examples |
215
- | `benchmarks/` | pytest-benchmark harness (informational) |
148
+ | `examples/` | Executable Python expression and integration examples |
149
+ | `benchmarks/` | Benchmark workloads; scheduled regression gates and informational comparisons |
216
150
 
217
151
  ## Data and execution model
218
152
 
219
- - Table data is Arrow-backed and calculated only by DataFusion.
153
+ - Table data is Arrow-backed. The Rust runtime executes row expressions and SQL
154
+ with DataFusion and owns native rolling, window, and cross-section operators.
220
155
  - NumPy and JAX are optional Python array providers. They are registered
221
156
  explicitly and evaluate a bounded, allowlisted expression language.
222
157
  - Raw tables or arrays never cross a graph or runner boundary; they are wrapped
@@ -228,16 +163,20 @@ Python package is not a second engine.
228
163
  - Table and mixed graph runs own one run-scoped DataFusion session. External-only
229
164
  NumPy/JAX runs own no DataFusion configuration, UDF state, or runtime and
230
165
  return an empty DataFusion metrics list.
231
- - Every graph run returns named outputs, per-node row counts/timings, and run
232
- metadata; table work additionally reports DataFusion plans and timings.
166
+ - Convenience batch calls return Arrow tables. Explicit plan execution returns
167
+ named `Batch` outputs, per-node timings, metadata, and DataFusion diagnostics.
233
168
  - Python executions accept reusable frozen `ExecutionOptions` with
234
169
  deep-copied strict-JSON settings and a cooperative, timezone-aware deadline
235
170
  normalized to UTC.
171
+ - `TableExpr.stream` and `Program.stream` own a single native job with bounded
172
+ backpressure. SQL accepts one alias in a stream and runs per native batch;
173
+ SQL aggregation, sorting, and limits do not span batches.
236
174
  - The source-driven `StreamingRunner` consumes a `StreamExecutionPlan`, owns
237
175
  async source/sink bindings, and returns a one-owner `StreamingJob`.
238
176
  - Managed epoch checkpoints use `LocalStateBackend` segments and strict v3
239
177
  `CheckpointManifest` documents. Exactly-once compatibility is proved per
240
- requested output; ordinary sinks remain at least once.
178
+ requested output; ordinary sinks can provide at-least-once delivery on a
179
+ lossless replayable route. Async iterable convenience inputs provide best effort.
241
180
 
242
181
  The capabilities and execution model are introduced in
243
182
  [docs/introduction.md](docs/introduction.md). The complete component and
@@ -252,7 +191,7 @@ input types, return type, and volatility. Graph nodes select registrations
252
191
  explicitly with `(provider, name, version)` references. Serialized projects
253
192
  contain references only.
254
193
 
255
- Rust applications use `UdfRegistry` for native DataFusion UDFs and
194
+ Runtime extension authors use `UdfRegistry` for native DataFusion UDFs and
256
195
  `ProviderRegistry` for explicitly registered external operators.
257
196
 
258
197
  ## Studio
@@ -298,7 +237,7 @@ response types are in `web-ui/src/api/schema.d.ts`.
298
237
 
299
238
  ## Project contracts
300
239
 
301
- Calc Flow 4.0 accepts strict project-v3 documents and exposes the Studio
240
+ Calc Flow accepts strict project-v3 documents and exposes the Studio
302
241
  `/api/v3` surface. Read [projects and persistence](docs/projects-guide.md)
303
242
  for validation, serialization, and reloading a graph. Historical changes are
304
243
  recorded in [CHANGELOG.md](CHANGELOG.md).
@@ -306,7 +245,10 @@ recorded in [CHANGELOG.md](CHANGELOG.md).
306
245
  ## Development
307
246
 
308
247
  Large Cargo and Maturin outputs should use the repository `target/` tree.
309
- A typical local verification sequence is:
248
+ The complete CI/full-verification command reference is below. Local changes use
249
+ the smallest affected checks under [AGENTS.md Verification](AGENTS.md#verification);
250
+ full regression, Rust 90% coverage, and Studio backend 85% coverage belong to
251
+ CI; routine performance gates run on the benchmark schedule:
310
252
 
311
253
  ```bash
312
254
  uv sync --extra dev
@@ -339,10 +281,10 @@ npm run test:e2e
339
281
  npm audit --omit=dev
340
282
  ```
341
283
 
342
- Release gates also run `cargo audit`, `cargo deny --locked check`, package
343
- inspectors, isolated wheel smoke tests, `cargo package`, and
344
- `cargo publish --dry-run`. See [AGENTS.md](AGENTS.md) for the maintained
345
- repository commands and constraints.
284
+ Regular CI runs `cargo audit`, `cargo deny --locked check`, core package
285
+ inspectors, and isolated wheel smoke tests. The Python release workflow builds,
286
+ verifies, and publishes core package artifacts. See [AGENTS.md](AGENTS.md) for
287
+ the maintained repository commands and constraints.
346
288
 
347
289
  ## Documentation
348
290
 
@@ -353,20 +295,20 @@ repository commands and constraints.
353
295
  - **[Batch calculations](docs/batch-guide.md)** — expressions, SQL, UDFs, and async execution
354
296
  - **[Arrays and matrices](docs/array-guide.md)** — NumPy/JAX and static weights
355
297
  - **[Continuous streaming](docs/streaming-guide.md)** — source-to-recovery tutorial
356
- - **[Connectors](docs/connectors.md)** — transport configuration and guarantees
298
+ - **[Connectors](docs/connectors/README.md)** — transport configuration and guarantees
357
299
  - **[Projects and persistence](docs/projects-guide.md)** — JSON/YAML and file stores
358
300
  - **[Studio](docs/studio-guide.md)** — local editing, inspection, and job controls
359
301
  - **[Python API](docs/python-api.md)** — Python surface and examples
360
- - **[Symbolic workflows](docs/symbolic-workflows.md)** — declaration-to-Studio
302
+ - **[Expression workflows](docs/symbolic-workflows.md)** — declaration-to-Studio
361
303
  batch, stream, recovery, static matrix, and performance workflows
362
- - **[Rust API](docs/rust-api.md)** — native surface and examples
304
+ - **[Rust runtime reference](docs/rust-api.md)** — native surface and examples
363
305
  - **[API reference](docs/api-reference.md)** — supported surfaces at a glance
364
- - **[Symbolic API](docs/symbolic-api.md)** — declarations, analysis, and compile requirements
306
+ - **[Expression API](docs/symbolic-api.md)** — declarations, analysis, and compile requirements
365
307
  - **[Design and architecture](docs/design.md)** — component ownership and execution design
366
308
  - **[Verification](docs/verification.md)** — documentation, examples, and implementation checks
367
309
  - **[Python release guide](docs/python-release.md)** — packaging, verification,
368
310
  Trusted Publishers, and the PyPI procedure
369
- - **[Benchmark suite](docs/benchmark-suite.md)** — complete CI tables, scale matrices,
311
+ - **[Benchmark suite](docs/benchmark-suite.md)** — scheduled tables, scale matrices,
370
312
  external-engine comparisons and historical regression evidence
371
313
  - **[Changelog](CHANGELOG.md)** — the single history of changes
372
314