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.
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/Cargo.lock +54 -5
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/Cargo.toml +1 -1
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/PKG-INFO +87 -145
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/README.md +77 -139
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/Cargo.toml +8 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/benches/allocation_regression.rs +49 -11
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/benches/sql_datafusion_performance.rs +970 -315
- calc_flow_python-2026.9.24/crates/calc-flow/benches/stream_asof_perf.rs +476 -0
- calc_flow_python-2026.9.24/crates/calc-flow/benches/stream_join_materialization.rs +388 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/config/asof.rs +101 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/config/late_output.rs +53 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/config.rs +78 -11
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/continuous.rs +63 -18
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/datafusion.rs +95 -3
- calc_flow_python-2026.9.24/crates/calc-flow/src/datafusion_predicate.rs +370 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/datafusion_rolling/sql_aggregate.rs +471 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/datafusion_rolling.rs +197 -31
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/lib.rs +15 -12
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/admission.rs +328 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/checkpoint/encoding.rs +296 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/checkpoint/validation.rs +169 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/checkpoint.rs +508 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/codec/framing.rs +161 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/codec.rs +176 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/duplicate_fallback.rs +139 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/finalize/prefix.rs +98 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/finalize.rs +277 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/identity.rs +81 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/identity_compare.rs +211 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/metadata.rs +54 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/mod.rs +441 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/output/tests.rs +108 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/output.rs +229 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/schema.rs +228 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/spec.rs +257 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/state.rs +401 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/status.rs +56 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/tests.rs +489 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/asof/workspace.rs +459 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/cross_section/late.rs +217 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/cross_section/tests/late.rs +618 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/cross_section.rs +280 -136
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/expression/projection.rs +22 -14
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/expression.rs +96 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/join/materialization.rs +592 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/join.rs +898 -92
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/late_output/identity.rs +117 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/late_output/plan.rs +271 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/late_output/tests/ownership.rs +135 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/late_output/tests.rs +279 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/late_output.rs +277 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/mod.rs +31 -4
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/output_chunk.rs +652 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/rolling/kernel/entity_parallel.rs +1238 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/rolling/kernel/entity_parallel_tests.rs +2207 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/rolling/kernel/sorted.rs +313 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/rolling/kernel.rs +422 -104
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/rolling/late.rs +179 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/rolling/ordered_stream.rs +701 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/rolling/tests/late.rs +593 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/rolling.rs +1603 -223
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/rolling_metrics/lease_tests.rs +120 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/operator/rolling_metrics.rs +632 -0
- {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
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/sql.rs +41 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/stream.rs +97 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/window.rs +11 -111
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/pipeline/batch.rs +2 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/pipeline/compile.rs +76 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/pipeline/mod.rs +1 -1
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/pipeline/stream.rs +59 -2
- calc_flow_python-2026.9.24/crates/calc-flow/src/project_store/asof.rs +242 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/project_store.rs +9 -2
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/channel.rs +201 -48
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/entity_work/tests.rs +283 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/entity_work.rs +635 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/failure.rs +57 -2
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/job/asof.rs +66 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/job.rs +11 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/mod.rs +1 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/operator_task/cooperation_tests.rs +691 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/operator_task/late_control_tests.rs +582 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/operator_task/performance_evidence.rs +457 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/operator_task/tests/asof_tests.rs +587 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/operator_task/tests/error_propagation_tests.rs +289 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/operator_task.rs +722 -47
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/driver.rs +219 -11
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/status.rs +70 -1
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/trace.rs +40 -1
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/projection.rs +92 -6
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/asof.rs +82 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/entity_work_tests/lifecycle_tests/checkpoint_tests.rs +334 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/entity_work_tests/lifecycle_tests.rs +354 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/entity_work_tests.rs +227 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/operator_fusion/allocation_evidence.rs +630 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/operator_fusion/allocation_evidence_guards.rs +93 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/operator_fusion.rs +1401 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/supervision.rs +129 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/supervision_loan_tests.rs +69 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/runner/tests/asof_tests.rs +939 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/runner.rs +493 -115
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/sink_task.rs +2 -1
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/soak/diagnostics.rs +312 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/soak.rs +372 -54
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/source_task.rs +2 -1
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/supervisor/ready_pair/native_tests.rs +544 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/supervisor/ready_pair/tests.rs +511 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/supervisor/ready_pair.rs +203 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/supervisor/terminal.rs +177 -0
- calc_flow_python-2026.9.24/crates/calc-flow/src/runtime/streaming/supervisor.rs +937 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/Cargo.toml +28 -3
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/README.md +2 -2
- calc_flow_python-2026.9.24/crates/calc-flow-connectors/examples/kafka_custom_decoder.rs +224 -0
- calc_flow_python-2026.9.24/crates/calc-flow-connectors/examples/kafka_protobuf_source.rs +171 -0
- calc_flow_python-2026.9.24/crates/calc-flow-connectors/examples/late_output_recovery.rs +593 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/file_sink.rs +110 -18
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/kafka.rs +687 -40
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/lib.rs +24 -5
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/mysql/mod.rs +2 -1
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/mysql/sink.rs +404 -74
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/mysql/types.rs +17 -11
- calc_flow_python-2026.9.24/crates/calc-flow-connectors/src/protobuf.rs +788 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/tests/file_connector.rs +148 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/tests/kafka_connector.rs +91 -0
- calc_flow_python-2026.9.24/crates/calc-flow-connectors/tests/late_output_file.rs +1007 -0
- calc_flow_python-2026.9.24/crates/calc-flow-connectors/tests/mysql_connector/checkpoint.rs +260 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/tests/mysql_connector.rs +3 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/Cargo.toml +10 -5
- calc_flow_python-2026.9.24/crates/calc-flow-python/build.rs +3 -0
- calc_flow_python-2026.9.24/crates/calc-flow-python/src/config/kafka_tests.rs +186 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/config.rs +140 -3
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/connector.rs +21 -3
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/continuous.rs +400 -19
- calc_flow_python-2026.9.24/crates/calc-flow-python/src/decoder.rs +585 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/error.rs +16 -3
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/execution_options.rs +71 -18
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/lib.rs +2 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/provider.rs +2 -2
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/runtime/dispatch.rs +1 -1
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/runtime.rs +14 -5
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/pyproject.toml +15 -9
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/__init__.py +80 -1
- calc_flow_python-2026.9.24/python/calc_flow/_compat.py +103 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/_native.pyi +27 -6
- calc_flow_python-2026.9.24/python/calc_flow/_stream_inputs.py +233 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/array.py +17 -4
- calc_flow_python-2026.9.24/python/calc_flow/asof_join_spec.py +126 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/capabilities.py +70 -16
- calc_flow_python-2026.9.24/python/calc_flow/compute.py +278 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/config.py +5 -3
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/join_spec.py +2 -1
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/pipeline.py +172 -7
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/runtime.py +118 -22
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/store.py +4 -2
- calc_flow_python-2026.9.24/python/calc_flow/stream.py +390 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/__init__.py +12 -8
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/analyzer.py +574 -66
- calc_flow_python-2026.9.24/python/calc_flow/symbolic/asof.py +212 -0
- calc_flow_python-2026.9.24/python/calc_flow/symbolic/asof_analysis.py +215 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/errors.py +9 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/expr.py +208 -20
- calc_flow_python-2026.9.24/python/calc_flow/symbolic/late_output.py +256 -0
- calc_flow_python-2026.9.24/python/calc_flow/symbolic/lower/asof.py +86 -0
- calc_flow_python-2026.9.24/python/calc_flow/symbolic/lower/bindings.py +69 -0
- calc_flow_python-2026.9.24/python/calc_flow/symbolic/lower/event_windows.py +477 -0
- calc_flow_python-2026.9.24/python/calc_flow/symbolic/lower/late_output.py +118 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/lower/planners.py +15 -7
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/lower/program.py +147 -147
- calc_flow_python-2026.9.24/python/calc_flow/symbolic/lower/schema.py +170 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/lower/segments.py +58 -23
- calc_flow_python-2026.9.24/python/calc_flow/symbolic/lower/sql.py +423 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/lower/strategies.py +93 -43
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/nodes.py +41 -18
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/ops.py +167 -17
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/optimizer.py +93 -1
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/program.py +141 -24
- calc_flow_python-2026.9.24/python/calc_flow/symbolic/sql.py +36 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/types.py +6 -6
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/windows.py +26 -2
- calc_flow_python-4.0.0/crates/calc-flow/src/operator/rolling/ordered_stream.rs +0 -406
- calc_flow_python-4.0.0/crates/calc-flow/src/runtime/streaming/supervisor.rs +0 -654
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/LICENSE +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/LICENSE +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/benches/core.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/benches/m4_state_window.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/benches/stream_join_perf.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/examples/README.md +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/examples/continuous_runtime.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/examples/export_schema.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/examples/expression_pipeline.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/examples/gen_v3_schema.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/examples/sql_join.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/examples/windowed_streaming.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/rolling-kernels.json +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/batch.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/connector/capability.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/connector/format.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/connector/mod.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/connector/registry.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/connector/secret.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/context.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/error.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/expression.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/json.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/batch.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/checkpoint.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/rolling/generated_kernel_manifest.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/rolling/state_v3.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/operator/union.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/mod.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/checkpoint/coordinator.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/checkpoint/mod.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/checkpoint/storage.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/checkpoint_runtime.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/checkpoint_status.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/context.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/message.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/metrics.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/aggregate.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/durable.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/generated.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/mod.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/prepare.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/snapshot.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/progress/types.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/registry.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/runtime/streaming/test_seams.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/state/backend.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/state/local.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/state/manifest.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/state/mod.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/state/segment.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/state/transaction.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/static_input.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/time/event_time.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/time/mod.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow/src/udf.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/arrow_schema.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/clickhouse.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/clickhouse_sink.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/csv.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/database_types.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/evidence.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/file.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/http.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/json_lines.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/mysql/config.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/mysql/source.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/options.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/parquet.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/postgresql.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/postgresql_cdc.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/src/websocket.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/tests/clickhouse_connector.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/tests/http_websocket_connectors.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/tests/postgresql_cdc.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-connectors/tests/postgresql_connector.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/batch.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/pipeline.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/runtime/profile.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/store.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/crates/calc-flow-python/src/udf.rs +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/errors.py +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/py.typed +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/_generated_rolling_kernels.py +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/domains.py +0 -0
- {calc_flow_python-4.0.0 → calc_flow_python-2026.9.24}/python/calc_flow/symbolic/lower/__init__.py +0 -0
- {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 = "
|
|
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 = "
|
|
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 = "
|
|
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.
|
|
3765
|
+
version = "0.23.45"
|
|
3717
3766
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
3718
|
-
checksum = "
|
|
3767
|
+
checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634"
|
|
3719
3768
|
dependencies = [
|
|
3720
3769
|
"aws-lc-rs",
|
|
3721
3770
|
"log",
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: calc-flow-python
|
|
3
|
-
Version:
|
|
3
|
+
Version: 2026.9.24
|
|
4
4
|
Requires-Dist: pydantic>=2.12.0,<3
|
|
5
|
-
Requires-Dist: pyarrow>=
|
|
6
|
-
Requires-Dist:
|
|
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:
|
|
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.
|
|
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
|
[](https://github.com/wegamekinglc/calc-flow/actions/workflows/ci-linux.yml)
|
|
44
48
|
[](https://github.com/wegamekinglc/calc-flow/actions/workflows/ci-windows.yml)
|
|
49
|
+
[](https://github.com/wegamekinglc/calc-flow/actions/workflows/benchmark-suite.yml)
|
|
50
|
+
[](https://app.codacy.com/gh/wegamekinglc/calc-flow/dashboard)
|
|
45
51
|
[](https://coveralls.io/github/wegamekinglc/calc-flow?branch=main)
|
|
46
52
|
|
|
47
|
-
Calc Flow
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
187
|
-
|
|
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 (
|
|
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/` |
|
|
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
|
|
215
|
-
| `benchmarks/` |
|
|
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
|
|
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
|
-
-
|
|
232
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
343
|
-
inspectors, isolated wheel smoke tests
|
|
344
|
-
|
|
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
|
-
- **[
|
|
302
|
+
- **[Expression workflows](docs/symbolic-workflows.md)** — declaration-to-Studio
|
|
361
303
|
batch, stream, recovery, static matrix, and performance workflows
|
|
362
|
-
- **[Rust
|
|
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
|
-
- **[
|
|
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)** —
|
|
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
|
|