vgi-python 0.15.0__tar.gz → 0.16.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {vgi_python-0.15.0 → vgi_python-0.16.0}/PKG-INFO +1 -1
- {vgi_python-0.15.0 → vgi_python-0.16.0}/pyproject.toml +1 -1
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/landing/describe.expected.json +92 -2
- vgi_python-0.16.0/tests/table_in_out/generator/test_substream_partial_sum_function.py +70 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +5 -5
- vgi_python-0.16.0/tests/table_in_out/test_blended_metadata.py +150 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/uv.lock +1 -1
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table_in_out.py +747 -61
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/worker.py +26 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/catalog_interface.py +8 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/metadata.py +69 -1
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/protocol.py +83 -2
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/table_function.py +40 -3
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/table_in_out_function.py +49 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/worker.py +69 -9
- {vgi_python-0.15.0 → vgi_python-0.16.0}/.gitattributes +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/.github/dependabot.yml +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/.github/workflows/ci.yml +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/.github/workflows/docs.yml +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/.github/workflows/integration.yml +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/.github/workflows/release.yml +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/.gitignore +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/.python-version +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/.vale.ini +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/CLAUDE.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/DOCS_REVIEW_RUBRIC.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/DOCS_USABILITY_TEST.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/LICENSE +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/README.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/SECURITY.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/ci/README.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/ci/preprocess-require.awk +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/ci/run-integration.sh +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/dist-vgi/.gitignore +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/aggregate-functions.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/arguments.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/auth.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/catalogs.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/client.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/exceptions.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/filters.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/functions.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/http.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/index.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/metadata.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/observability.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/storage.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/transactor.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/worker.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/argument-serialization.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/apple-touch-icon.png +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/favicon-16x16.png +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/favicon-32x32.png +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/favicon.ico +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/kinds/aggregate.svg +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/kinds/buffering.svg +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/kinds/scalar.svg +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/kinds/table-in-out.svg +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/kinds/table.svg +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/logo.png +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/social-card.png +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/authentication.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/catalog-interface.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/cli.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/column-statistics.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/concepts/index.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/contributing-docs.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/filter-pushdown.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/generator-api.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/how-to/catalogs.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/how-to/function-patterns.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/how-to/http-auth.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/how-to/index.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/how-to/pushdown-and-statistics.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/how-to/state-storage.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/index.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/lifecycle.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/metadata.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/overrides/main.html +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/robots.txt +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/shared-storage.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/stylesheets/extra.css +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/tutorial/index.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/tutorial/scalar.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/tutorial/table.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/vgi-logo.png +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/examples/calc_scalar_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/examples/calc_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/examples/filter_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/examples/greeting_scalar_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/examples/row_count_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/examples/series_streaming_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/examples/sum_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/mkdocs.yml +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/packages/vgi-fixtures/LICENSE +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/packages/vgi-fixtures/README.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/packages/vgi-fixtures/pyproject.toml +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/scripts/measure_startup.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/scripts/run_all_tests.sh +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/test-data/generate.sh +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/_http_fixtures.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_catalog_interface.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_client_catalog.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_column_statistics.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_declarative.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_example_worker_catalog.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_integration.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_required_filters.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_scan_branches.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_serialization.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_setting.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_storage.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_time_travel.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_writable_table.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/client/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/client/test_broken_pipe.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/client/test_cli.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/client/test_cli_catalog_functions.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/client/test_worker_debug.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/_stub.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/conftest.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_accumulate.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_aggregate.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_attach.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_bearer_auth.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_const_param_enforcement.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_container.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_copy_from.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_copy_to.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_directory_parity.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_function_inventory.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_github.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_http_client.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_http_external_location.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_http_upload_url.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_macro.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_overload.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_protocol_inventory.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_protocol_version.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_resumable_scan.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_scalar.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_secret.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_settings.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_table.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_table_in_out.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_view.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_writable.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conftest.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/landing/_checker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/landing/describe.schema.json +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_bernoulli_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_binary_packet_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_client.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_conditional_message_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_hash_seed_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_multiply_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_random_bytes_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_return_secret_value_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_constant_columns_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_double_sequence_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_exception_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_filter_echo_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_logging_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_partitioned_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_projected_data_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_sequence_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_settings_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_struct_settings_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/generator/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/test_client.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_access_log_audit.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_aggregate_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_argument_spec.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_auth.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_bind_exceptions.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_bind_request_at_clause.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_bound_storage_conformance.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_cache_control.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_catalog_auth_binding.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_copy_from_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_copy_to_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_docstrings.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_documentation_examples.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_example_function_arg_types.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_examples_workers.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_exception_handling.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_exceptions.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_filter_pushdown.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_filter_pushdown_extension.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_function_storage.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_function_storage_azure_sql.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_function_storage_cf_do.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_function_storage_cf_do_integration.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_function_storage_conformance.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_cpp_constants.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_cpp_protocol_version.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_cpp_request_builders.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_cpp_schemas.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_cpp_secret.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_go_schemas.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_protocol_version.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_schemas_cross_lang.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_ts_client.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_ts_schemas.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_http_demo_storage.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_http_s3_offload_input.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_http_s3_offload_output.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_landing_conformance.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_metadata.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_mypy_consolidated.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_nest_tensor.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_otel.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_projection_enforcement.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_projection_repro.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_protocol_classes.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_resolved_secrets.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_schema_utils.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_serve.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_setting_secret_annotations.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_table_buffering_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_table_function_dynamic_to_string.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_tcp_transport.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_type_bounds.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_union_argument.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_worker_cli.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_worker_page.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/transactor/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/transactor/test_transactor.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_duckdb.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_storage_profile.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/attach_options.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/bad_enum.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/cancellable.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/catalog.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/companion.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/copy_from.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/copy_to.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/http_server.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/simple_writable.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/_common.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/cache.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/filters.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/make_series.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/misc.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/pairs.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/sequence.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/settings.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/versioned.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/versioned.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/writable/generic.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/writable/table.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/writable/worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/aggregate_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/argument_spec.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/arguments.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/auth.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/cache_control.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/_descriptor_spec.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/attach_option.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/descriptors.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/duckdb_statistics.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/secret_type.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/setting.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/storage.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/catalog_mixin.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/cli.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/cli_catalog.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/cli_schema.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/cli_table.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/cli_transaction.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/cli_utils.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/cli_view.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/client.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/_common.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/cpp_constants.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/cpp_protocol_version.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/cpp_request_builders.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/cpp_schemas.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/go_schemas.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/protocol_version.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/ts_client.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/ts_schemas.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/copy_from_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/copy_to_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/exceptions.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/function_storage.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/function_storage_azure_sql.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/function_storage_cf_do.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/http/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/http/demo_storage.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/http/describe_json.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/http/landing.html +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/http/landing_page.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/http/worker_page.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/invocation.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/logging_config.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/meta_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/otel.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/protocol_version.txt +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/py.typed +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/scalar_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/schema_utils.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/secret_protocol.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/secret_service.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/serve.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/table_buffering_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/table_filter_pushdown.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/transactor/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/transactor/_duckdb_compat.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/transactor/client.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/transactor/protocol.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/transactor/server.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.0}/wrangler.jsonc +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: vgi-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.16.0
|
|
4
4
|
Summary: Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow
|
|
5
5
|
Project-URL: Homepage, https://query.farm
|
|
6
6
|
Project-URL: Repository, https://github.com/Query-farm/vgi-python
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
{
|
|
4
4
|
"attach_options": [],
|
|
5
5
|
"counts": {
|
|
6
|
-
"functions":
|
|
6
|
+
"functions": 188,
|
|
7
7
|
"schemas": 2,
|
|
8
8
|
"tables": 59,
|
|
9
9
|
"views": 3
|
|
@@ -1247,6 +1247,18 @@
|
|
|
1247
1247
|
"returns": "string",
|
|
1248
1248
|
"type": "scalar"
|
|
1249
1249
|
},
|
|
1250
|
+
{
|
|
1251
|
+
"args": [
|
|
1252
|
+
{
|
|
1253
|
+
"desc": "Input column (ignored)",
|
|
1254
|
+
"name": "x",
|
|
1255
|
+
"type": "double"
|
|
1256
|
+
}
|
|
1257
|
+
],
|
|
1258
|
+
"doc": "Blended 1->0 map emitting a single 0-row batch (literal scan-mode)",
|
|
1259
|
+
"name": "blended_drop",
|
|
1260
|
+
"type": "table"
|
|
1261
|
+
},
|
|
1250
1262
|
{
|
|
1251
1263
|
"args": [
|
|
1252
1264
|
{
|
|
@@ -1820,6 +1832,59 @@
|
|
|
1820
1832
|
"name": "generator_exception",
|
|
1821
1833
|
"type": "table"
|
|
1822
1834
|
},
|
|
1835
|
+
{
|
|
1836
|
+
"args": [
|
|
1837
|
+
{
|
|
1838
|
+
"desc": "Latitude input column",
|
|
1839
|
+
"name": "latitude",
|
|
1840
|
+
"type": "double"
|
|
1841
|
+
},
|
|
1842
|
+
{
|
|
1843
|
+
"desc": "Longitude input column",
|
|
1844
|
+
"name": "longitude",
|
|
1845
|
+
"type": "double"
|
|
1846
|
+
},
|
|
1847
|
+
{
|
|
1848
|
+
"default": "4",
|
|
1849
|
+
"desc": "Rounding precision",
|
|
1850
|
+
"name": "precision",
|
|
1851
|
+
"named": true,
|
|
1852
|
+
"type": "int64"
|
|
1853
|
+
}
|
|
1854
|
+
],
|
|
1855
|
+
"doc": "Blended per-row geo encoder (lat, lon -> geohash)",
|
|
1856
|
+
"name": "geo_encode",
|
|
1857
|
+
"type": "table"
|
|
1858
|
+
},
|
|
1859
|
+
{
|
|
1860
|
+
"args": [
|
|
1861
|
+
{
|
|
1862
|
+
"desc": "Latitude input column",
|
|
1863
|
+
"name": "latitude",
|
|
1864
|
+
"type": "double"
|
|
1865
|
+
},
|
|
1866
|
+
{
|
|
1867
|
+
"desc": "Longitude input column",
|
|
1868
|
+
"name": "longitude",
|
|
1869
|
+
"type": "double"
|
|
1870
|
+
},
|
|
1871
|
+
{
|
|
1872
|
+
"desc": "Altitude input column",
|
|
1873
|
+
"name": "altitude",
|
|
1874
|
+
"type": "double"
|
|
1875
|
+
},
|
|
1876
|
+
{
|
|
1877
|
+
"default": "4",
|
|
1878
|
+
"desc": "Rounding precision",
|
|
1879
|
+
"name": "precision",
|
|
1880
|
+
"named": true,
|
|
1881
|
+
"type": "int64"
|
|
1882
|
+
}
|
|
1883
|
+
],
|
|
1884
|
+
"doc": "Blended per-row geo encoder (lat, lon, alt -> geohash)",
|
|
1885
|
+
"name": "geo_encode",
|
|
1886
|
+
"type": "table"
|
|
1887
|
+
},
|
|
1823
1888
|
{
|
|
1824
1889
|
"args": [
|
|
1825
1890
|
{
|
|
@@ -2349,6 +2414,25 @@
|
|
|
2349
2414
|
"name": "rff_struct_scan",
|
|
2350
2415
|
"type": "table"
|
|
2351
2416
|
},
|
|
2417
|
+
{
|
|
2418
|
+
"args": [
|
|
2419
|
+
{
|
|
2420
|
+
"desc": "Numeric input columns",
|
|
2421
|
+
"name": "values",
|
|
2422
|
+
"type": "double"
|
|
2423
|
+
},
|
|
2424
|
+
{
|
|
2425
|
+
"default": "false",
|
|
2426
|
+
"desc": "Sum absolute values",
|
|
2427
|
+
"name": "absolute",
|
|
2428
|
+
"named": true,
|
|
2429
|
+
"type": "bool"
|
|
2430
|
+
}
|
|
2431
|
+
],
|
|
2432
|
+
"doc": "Blended per-row varargs sum",
|
|
2433
|
+
"name": "row_sum",
|
|
2434
|
+
"type": "table"
|
|
2435
|
+
},
|
|
2352
2436
|
{
|
|
2353
2437
|
"args": [
|
|
2354
2438
|
{
|
|
@@ -2943,6 +3027,12 @@
|
|
|
2943
3027
|
"name": "slow_cancellable_buffering",
|
|
2944
3028
|
"type": "table_in_out"
|
|
2945
3029
|
},
|
|
3030
|
+
{
|
|
3031
|
+
"args": [],
|
|
3032
|
+
"doc": "Per-substream partial sum emitted at finalize (parallel streaming finalize)",
|
|
3033
|
+
"name": "substream_partial_sum",
|
|
3034
|
+
"type": "table_in_out"
|
|
3035
|
+
},
|
|
2946
3036
|
{
|
|
2947
3037
|
"args": [
|
|
2948
3038
|
{
|
|
@@ -2959,7 +3049,7 @@
|
|
|
2959
3049
|
},
|
|
2960
3050
|
{
|
|
2961
3051
|
"args": [],
|
|
2962
|
-
"doc": "Distributed sum using
|
|
3052
|
+
"doc": "Distributed sum using the buffered (Sink+Combine+Source) model",
|
|
2963
3053
|
"name": "sum_all_columns_simple_distributed",
|
|
2964
3054
|
"type": "table_in_out"
|
|
2965
3055
|
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Copyright 2025, 2026 Query Farm LLC - https://query.farm
|
|
2
|
+
|
|
3
|
+
"""Tests for SubstreamPartialSumFunction (parallel streaming finalize, A4).
|
|
4
|
+
|
|
5
|
+
At the single-worker client level there is exactly one substream, so ``finish()``
|
|
6
|
+
sees all input and emits one partial row equal to the whole sum. The per-substream
|
|
7
|
+
fan-out (many partials re-aggregated by an outer ``SELECT sum()``) is exercised by
|
|
8
|
+
the C++ integration test ``table_in_out/parallel_finalize.test`` over both
|
|
9
|
+
transports; here we assert the worker-side transform/finish contract in isolation.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import pyarrow as pa
|
|
15
|
+
|
|
16
|
+
from tests.conftest import filter_non_empty, make_schema
|
|
17
|
+
from vgi.client import Client
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class TestSubstreamPartialSumFunction:
|
|
21
|
+
"""Worker-side contract for substream_partial_sum."""
|
|
22
|
+
|
|
23
|
+
def test_partial_sum_single_batch(self, fixture_worker: str) -> None:
|
|
24
|
+
"""One substream (single client worker) → one partial = the whole sum."""
|
|
25
|
+
schema = make_schema([pa.field("n", pa.int64())])
|
|
26
|
+
batch = pa.RecordBatch.from_pydict({"n": [1, 2, 3, 4, 5]}, schema=schema)
|
|
27
|
+
with Client(fixture_worker) as client:
|
|
28
|
+
output = list(
|
|
29
|
+
client.table_in_out_function(
|
|
30
|
+
function_name="substream_partial_sum",
|
|
31
|
+
input=iter([batch]),
|
|
32
|
+
)
|
|
33
|
+
)
|
|
34
|
+
non_empty = filter_non_empty(output)
|
|
35
|
+
assert len(non_empty) == 1
|
|
36
|
+
assert non_empty[0].to_pydict() == {"n": [15]}
|
|
37
|
+
|
|
38
|
+
def test_partial_sum_many_batches(self, fixture_worker: str) -> None:
|
|
39
|
+
"""Accumulates across many input batches, emits one partial at finalize."""
|
|
40
|
+
schema = make_schema([pa.field("n", pa.int64())])
|
|
41
|
+
batches = [
|
|
42
|
+
pa.RecordBatch.from_pydict({"n": list(range(i * 100, (i + 1) * 100))}, schema=schema) for i in range(20)
|
|
43
|
+
]
|
|
44
|
+
expected = sum(range(0, 2000))
|
|
45
|
+
with Client(fixture_worker) as client:
|
|
46
|
+
output = list(
|
|
47
|
+
client.table_in_out_function(
|
|
48
|
+
function_name="substream_partial_sum",
|
|
49
|
+
input=iter(batches),
|
|
50
|
+
)
|
|
51
|
+
)
|
|
52
|
+
non_empty = filter_non_empty(output)
|
|
53
|
+
assert len(non_empty) == 1
|
|
54
|
+
assert non_empty[0].to_pydict() == {"n": [expected]}
|
|
55
|
+
|
|
56
|
+
def test_partial_sum_empty_input(self, fixture_worker: str) -> None:
|
|
57
|
+
"""No input rows → the single substream's partial is 0."""
|
|
58
|
+
schema = make_schema([pa.field("n", pa.int64())])
|
|
59
|
+
empty = pa.RecordBatch.from_pydict({"n": []}, schema=schema)
|
|
60
|
+
with Client(fixture_worker) as client:
|
|
61
|
+
output = list(
|
|
62
|
+
client.table_in_out_function(
|
|
63
|
+
function_name="substream_partial_sum",
|
|
64
|
+
input=iter([empty]),
|
|
65
|
+
)
|
|
66
|
+
)
|
|
67
|
+
non_empty = filter_non_empty(output)
|
|
68
|
+
# A single substream with zero rows still finalizes → one 0 partial.
|
|
69
|
+
assert len(non_empty) == 1
|
|
70
|
+
assert non_empty[0].to_pydict() == {"n": [0]}
|
|
@@ -197,13 +197,13 @@ class TestSumAllColumnsFunctionDistributed:
|
|
|
197
197
|
|
|
198
198
|
|
|
199
199
|
class TestSumAllColumnsSimpleDistributed:
|
|
200
|
-
"""Tests for sum_all_columns_simple_distributed (
|
|
200
|
+
"""Tests for sum_all_columns_simple_distributed (buffered global reduction)."""
|
|
201
201
|
|
|
202
202
|
def test_sum_simple_distributed_basic(self, fixture_worker: str, numeric_batches: list[pa.RecordBatch]) -> None:
|
|
203
203
|
"""Should sum all numeric columns across all batches."""
|
|
204
204
|
with Client(fixture_worker) as client:
|
|
205
205
|
output_batches = list(
|
|
206
|
-
client.
|
|
206
|
+
client.table_buffering_function(
|
|
207
207
|
function_name="sum_all_columns_simple_distributed",
|
|
208
208
|
input=iter(numeric_batches),
|
|
209
209
|
)
|
|
@@ -238,7 +238,7 @@ class TestSumAllColumnsSimpleDistributed:
|
|
|
238
238
|
|
|
239
239
|
with Client(fixture_worker) as client:
|
|
240
240
|
output_batches = list(
|
|
241
|
-
client.
|
|
241
|
+
client.table_buffering_function(
|
|
242
242
|
function_name="sum_all_columns_simple_distributed",
|
|
243
243
|
input=iter(batches),
|
|
244
244
|
)
|
|
@@ -256,7 +256,7 @@ class TestSumAllColumnsSimpleDistributed:
|
|
|
256
256
|
"""Should exclude non-numeric columns from output."""
|
|
257
257
|
with Client(fixture_worker) as client:
|
|
258
258
|
output_batches = list(
|
|
259
|
-
client.
|
|
259
|
+
client.table_buffering_function(
|
|
260
260
|
function_name="sum_all_columns_simple_distributed",
|
|
261
261
|
input=iter(simple_batches),
|
|
262
262
|
)
|
|
@@ -276,7 +276,7 @@ class TestSumAllColumnsSimpleDistributed:
|
|
|
276
276
|
|
|
277
277
|
with Client(fixture_worker) as client:
|
|
278
278
|
output_batches = list(
|
|
279
|
-
client.
|
|
279
|
+
client.table_buffering_function(
|
|
280
280
|
function_name="sum_all_columns_simple_distributed",
|
|
281
281
|
input=iter([empty_batch]),
|
|
282
282
|
)
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# Copyright 2025, 2026 Query Farm LLC - https://query.farm
|
|
2
|
+
|
|
3
|
+
"""Metadata resolution + foot-gun guards for blended RowTransformFunction (Phase B)."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from typing import Annotated
|
|
9
|
+
|
|
10
|
+
import pyarrow as pa
|
|
11
|
+
import pytest
|
|
12
|
+
|
|
13
|
+
from vgi.arguments import Arg, TableInput
|
|
14
|
+
from vgi.invocation import BindResponse
|
|
15
|
+
from vgi.metadata import (
|
|
16
|
+
CatalogFunctionType,
|
|
17
|
+
ResolvedMetadata,
|
|
18
|
+
arrow_to_metadata,
|
|
19
|
+
metadata_to_arrow,
|
|
20
|
+
resolve_metadata,
|
|
21
|
+
)
|
|
22
|
+
from vgi.schema_utils import schema
|
|
23
|
+
from vgi.table_function import BindParams
|
|
24
|
+
from vgi.table_in_out_function import RowTransformFunction
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass(slots=True, frozen=True, kw_only=True)
|
|
28
|
+
class _XYArgs:
|
|
29
|
+
"""Two positional input columns + one named option."""
|
|
30
|
+
|
|
31
|
+
x: Annotated[float, Arg(0)]
|
|
32
|
+
y: Annotated[float, Arg(1)]
|
|
33
|
+
opt: Annotated[int, Arg("opt", default=1)] = 1
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class _GoodBlended(RowTransformFunction[_XYArgs]):
|
|
37
|
+
"""A valid blended function."""
|
|
38
|
+
|
|
39
|
+
class Meta:
|
|
40
|
+
"""Metadata."""
|
|
41
|
+
|
|
42
|
+
name = "good_blended"
|
|
43
|
+
|
|
44
|
+
@classmethod
|
|
45
|
+
def on_bind(cls, params: BindParams[_XYArgs]) -> BindResponse:
|
|
46
|
+
"""Fixed output schema."""
|
|
47
|
+
return BindResponse(output_schema=schema({"z": pa.float64()}))
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class TestBlendedResolution:
|
|
51
|
+
"""Happy-path resolution of a blended function."""
|
|
52
|
+
|
|
53
|
+
def test_resolves_as_blended_table(self) -> None:
|
|
54
|
+
"""input_from_args=True, function_type=TABLE, no finalize."""
|
|
55
|
+
m = resolve_metadata(_GoodBlended)
|
|
56
|
+
assert m.function_type is CatalogFunctionType.TABLE
|
|
57
|
+
assert m.input_from_args is True
|
|
58
|
+
assert m.has_finalize is False
|
|
59
|
+
positions = {p.position for p in m.parameters}
|
|
60
|
+
assert 0 in positions and 1 in positions and "opt" in positions
|
|
61
|
+
|
|
62
|
+
def test_arrow_roundtrip_preserves_input_from_args(self) -> None:
|
|
63
|
+
"""input_from_args survives the Arrow + dict round-trips."""
|
|
64
|
+
m = resolve_metadata(_GoodBlended)
|
|
65
|
+
assert arrow_to_metadata(metadata_to_arrow(m)).input_from_args is True
|
|
66
|
+
assert ResolvedMetadata.from_dict(m.to_dict()).input_from_args is True
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class TestBlendedFootguns:
|
|
70
|
+
"""resolve_metadata rejects the invalid blended shapes."""
|
|
71
|
+
|
|
72
|
+
def test_reject_finalize_override(self) -> None:
|
|
73
|
+
"""A blended fn that overrides finish()/finalize() is rejected."""
|
|
74
|
+
|
|
75
|
+
class _WithFinalize(RowTransformFunction[_XYArgs]):
|
|
76
|
+
"""Illegal: blended with a finalize."""
|
|
77
|
+
|
|
78
|
+
class Meta:
|
|
79
|
+
"""Metadata."""
|
|
80
|
+
|
|
81
|
+
name = "blended_finalize"
|
|
82
|
+
|
|
83
|
+
@classmethod
|
|
84
|
+
def finish(cls, params, states): # noqa: ANN001, ANN206, D102
|
|
85
|
+
return []
|
|
86
|
+
|
|
87
|
+
with pytest.raises(TypeError, match="cannot override finalize"):
|
|
88
|
+
resolve_metadata(_WithFinalize)
|
|
89
|
+
|
|
90
|
+
def test_reject_table_input(self) -> None:
|
|
91
|
+
"""A blended fn that declares a TableInput arg is rejected."""
|
|
92
|
+
|
|
93
|
+
@dataclass(slots=True, frozen=True, kw_only=True)
|
|
94
|
+
class _TblArgs:
|
|
95
|
+
"""Illegal: a TableInput on a blended fn."""
|
|
96
|
+
|
|
97
|
+
x: Annotated[float, Arg(0)]
|
|
98
|
+
data: Annotated[TableInput, Arg(1)]
|
|
99
|
+
|
|
100
|
+
class _WithTable(RowTransformFunction[_TblArgs]):
|
|
101
|
+
"""Illegal: blended with TableInput."""
|
|
102
|
+
|
|
103
|
+
class Meta:
|
|
104
|
+
"""Metadata."""
|
|
105
|
+
|
|
106
|
+
name = "blended_table"
|
|
107
|
+
|
|
108
|
+
with pytest.raises(TypeError, match="must not declare a TableInput"):
|
|
109
|
+
resolve_metadata(_WithTable)
|
|
110
|
+
|
|
111
|
+
def test_reject_positional_const(self) -> None:
|
|
112
|
+
"""A blended fn with a positional const arg is rejected."""
|
|
113
|
+
|
|
114
|
+
@dataclass(slots=True, frozen=True, kw_only=True)
|
|
115
|
+
class _ConstArgs:
|
|
116
|
+
"""Illegal: a positional const on a blended fn."""
|
|
117
|
+
|
|
118
|
+
k: Annotated[int, Arg(0, const=True)]
|
|
119
|
+
x: Annotated[float, Arg(1)]
|
|
120
|
+
|
|
121
|
+
class _WithConst(RowTransformFunction[_ConstArgs]):
|
|
122
|
+
"""Illegal: blended with a positional const."""
|
|
123
|
+
|
|
124
|
+
class Meta:
|
|
125
|
+
"""Metadata."""
|
|
126
|
+
|
|
127
|
+
name = "blended_const"
|
|
128
|
+
|
|
129
|
+
with pytest.raises(TypeError, match="cannot take a positional const"):
|
|
130
|
+
resolve_metadata(_WithConst)
|
|
131
|
+
|
|
132
|
+
def test_reject_zero_positional(self) -> None:
|
|
133
|
+
"""A blended fn with no positional args is rejected."""
|
|
134
|
+
|
|
135
|
+
@dataclass(slots=True, frozen=True, kw_only=True)
|
|
136
|
+
class _NamedOnlyArgs:
|
|
137
|
+
"""Illegal: no positional input columns."""
|
|
138
|
+
|
|
139
|
+
opt: Annotated[int, Arg("opt", default=1)] = 1
|
|
140
|
+
|
|
141
|
+
class _NamedOnly(RowTransformFunction[_NamedOnlyArgs]):
|
|
142
|
+
"""Illegal: blended with no positional args."""
|
|
143
|
+
|
|
144
|
+
class Meta:
|
|
145
|
+
"""Metadata."""
|
|
146
|
+
|
|
147
|
+
name = "blended_named_only"
|
|
148
|
+
|
|
149
|
+
with pytest.raises(TypeError, match="at least one positional Arg"):
|
|
150
|
+
resolve_metadata(_NamedOnly)
|