datajunction-server 0.0.1a68.dev1__tar.gz → 0.0.1a69.dev0__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.
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/PKG-INFO +1 -1
- datajunction_server-0.0.1a69.dev0/datajunction_server/__about__.py +4 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/construction/build.py +19 -86
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/construction/build_v2.py +386 -2
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/cubes_test.py +162 -61
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/dimension_links_test.py +62 -38
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/dimensions_test.py +18 -2
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/nodes_test.py +11 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/sql_test.py +209 -119
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/sql_v2_test.py +117 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/users_test.py +1 -1
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/construction/build_test.py +39 -20
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/examples.py +11 -1
- datajunction_server-0.0.1a68.dev1/datajunction_server/__about__.py +0 -4
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/.coveragerc +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/.env +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/.env.integration +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/.flake8 +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/.gitignore +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/.isort.cfg +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/.pre-commit-config.yaml +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/.pylintrc +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/Dockerfile +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/Makefile +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/README.md +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/README +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/env.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/script.py.mako +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/versions/2023_12_20_1829-724445d2b29d_initial_migration.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/versions/2024_01_08_2034-945d44abcd32_add_dimension_links.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/versions/2024_01_11_2032-c74b11566d82_add_column_order.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/versions/2024_01_18_2011-20f060b02772_switch_enum_values.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/versions/2024_01_23_0617-c9cef8864ecb_add_missing_table_attribute_to_source_.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/versions/2024_01_23_1655-a8e22109be24_availability_state_s_valid_through_ts_.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/versions/2024_02_22_0713-d61fb7e48cc3_cascade_deletes_to_dimension_links.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/versions/2024_04_30_1556-de7ec1c82fe0_add_query_requests.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/versions/2024_05_09_1420-9b1227ff17f4_update_backfill_spec.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/versions/2024_05_21_0012-57fc93ef6947_add_query_id_to_queryrequest.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/versions/2024_06_21_1301-640a814db2d8_add_collection_tables.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/versions/2024_07_12_0348-34171c92dd6d_set_user_username_to_be_unique.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/versions/2024_08_18_0036-f3c9b40deb6f_add_create_by_to_nodes_node_revisions_.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/versions/2024_10_05_1707-f953dc7ec5a5_add_indexes_on_history.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/versions/2024_10_05_1713-6b30d917f125_add_indexes_on_history2.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/versions/2024_10_05_1720-90d6250dc394_add_indexes_on_nodes.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic/versions/2024_10_06_0447-1c13a84b41d6_add_indexes_on_node_namespace.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/alembic.ini +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/access/authentication/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/access/authentication/basic.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/access/authentication/github.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/access/authentication/google.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/access/authentication/whoami.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/attributes.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/catalogs.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/client.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/collection.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/cubes.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/data.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/dimensions.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/djsql.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/engines.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/graphql/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/graphql/catalogs.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/graphql/engines.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/graphql/main.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/graphql/resolvers/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/graphql/resolvers/nodes.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/graphql/scalars/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/graphql/scalars/availabilitystate.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/graphql/scalars/catalog_engine.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/graphql/scalars/column.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/graphql/scalars/materialization.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/graphql/scalars/metricmetadata.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/graphql/scalars/node.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/graphql/scalars/user.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/graphql/utils.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/health.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/helpers.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/history.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/logging.conf +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/main.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/materializations.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/measures.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/metrics.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/namespaces.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/nodes.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/sql.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/tags.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/api/users.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/config.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/constants.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/construction/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/construction/dimensions.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/construction/dj_query.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/construction/exceptions.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/construction/utils.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/attributetype.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/availabilitystate.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/backfill.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/base.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/catalog.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/collection.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/column.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/database.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/dimensionlink.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/engine.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/history.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/materialization.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/measure.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/metricmetadata.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/namespace.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/node.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/partition.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/queryrequest.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/tag.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/database/user.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/enum.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/errors.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/access/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/access/authentication/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/access/authentication/basic.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/access/authentication/github.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/access/authentication/google.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/access/authentication/http.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/access/authentication/tokens.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/access/authorization.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/client.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/engines.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/materializations.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/namespaces.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/nodes.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/templates/client_setup.j2 +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/templates/create_cube.j2 +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/templates/create_dimension.j2 +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/templates/create_metric.j2 +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/templates/create_transform.j2 +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/templates/link_dimension.j2 +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/templates/namespace_mapping.j2 +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/templates/register_table.j2 +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/templates/set_column_attributes.j2 +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/internal/validation.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/materialization/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/materialization/jobs/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/materialization/jobs/cube_materialization.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/materialization/jobs/job_types.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/materialization/jobs/materialization_job.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/access.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/attribute.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/base.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/catalog.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/collection.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/column.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/cube.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/database.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/dimensionlink.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/engine.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/history.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/materialization.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/measure.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/metric.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/node.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/node_type.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/partition.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/query.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/sql.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/table.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/tag.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/models/user.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/naming.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/service_clients.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/dag.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/functions.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/parsing/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/parsing/ast.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/parsing/backends/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/parsing/backends/antlr4.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/parsing/backends/exceptions.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/parsing/backends/grammar/SqlBaseLexer.g4 +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/parsing/backends/grammar/SqlBaseParser.g4 +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/parsing/backends/grammar/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseLexer.interp +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseLexer.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseLexer.tokens +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParser.interp +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParser.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParser.tokens +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParserListener.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParserVisitor.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/sql/parsing/types.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/superset.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/transpilation.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/typing.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/datajunction_server/utils.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/pdm.lock +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/pyproject.toml +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/requirements/docker.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/requirements/test.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/scripts/docs-snippets.js +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/scripts/docs-snippets.sh +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/scripts/generate-openapi.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/access_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/attributes_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/catalog_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/client_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/collections_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/data_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/dimensions_access_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/djql_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/engine_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/client_test/create_cube.repairs_cube.namespace.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/client_test/create_cube.repairs_cube.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/client_test/create_dimension.repair_order.namespace.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/client_test/create_dimension.repair_order.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/client_test/create_metric.num_repair_orders.namespace.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/client_test/create_metric.num_repair_orders.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/client_test/create_transform.regional_level_agg.namespace.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/client_test/create_transform.regional_level_agg.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/client_test/dimension_links.repair_orders.namespace.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/client_test/dimension_links.repair_orders.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/client_test/include_client_setup.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/client_test/notebook.create_cube.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/client_test/notebook.create_transform.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/client_test/notebook.link_dimension.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/client_test/notebook.set_attribute.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/client_test/register_table.txt +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/druid_measures_cube.full.druid_spec.json +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/druid_measures_cube.full.partition.druid_spec.json +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/druid_measures_cube.full.partition.query.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/druid_measures_cube.full.query.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/druid_measures_cube.incremental.categorical.query.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/druid_measures_cube.incremental.druid_spec.json +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/druid_measures_cube.incremental.patched.query.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/druid_measures_cube.incremental.query.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/druid_metrics_cube.incremental.categorical.query.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/druid_metrics_cube.incremental.druid_spec.json +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/druid_metrics_cube.incremental.query.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/spark_sql.full.config.json +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/spark_sql.full.materializations.json +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/spark_sql.full.partition.config.json +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/spark_sql.full.partition.materializations.json +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/spark_sql.full.partition.query.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/spark_sql.full.query.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/spark_sql.incremental.additional.query.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/spark_sql.incremental.categorical.query.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/spark_sql.incremental.config.json +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/spark_sql.incremental.lookback.query.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/files/materializations_test/spark_sql.incremental.query.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/graphql/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/graphql/catalog_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/graphql/engine_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/graphql/find_nodes_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/health_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/helpers_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/history_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/materializations_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/measures_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/metrics_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/namespaces_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/nodes_update_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/routers_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/api/tags_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/conftest.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/construction/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/construction/build_v2_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/construction/compile_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/construction/exceptions_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/construction/fixtures.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/construction/inference_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/construction/utils_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/default.duckdb +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/duckdb.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/errors_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/integration/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/integration/basic_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/internal/authentication/basic_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/internal/authentication/github_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/internal/authentication/http_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/internal/authentication/token_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/internal/authentication/whoami_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/migrations_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/models/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/models/catalog_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/models/hash_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/models/measure_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/models/node_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/models/query_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/pytest.ini +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/service_clients_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/dag_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/functions_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/backends/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/backends/antlr4_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/backends/types_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/__init__.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query1.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query10.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query11.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query12.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query13.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query14.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query15.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query16.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query17.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query18.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query19.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query2.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query20.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query21.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query22.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query23.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query24.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query25.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query26.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query27.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query28.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query29.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query3.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query30.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query31.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query32.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query33.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query34.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query35.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query36.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query37.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query38.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query39.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query4.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query40.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query41.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query42.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query43.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query44.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query45.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query46.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query47.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query48.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query49.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query5.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query50.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query51.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query52.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query53.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query54.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query55.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query56.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query57.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query58.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query59.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query6.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query60.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query61.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query62.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query63.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query64.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query65.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query66.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query67.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query68.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query69.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query7.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query70.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query71.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query72.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query73.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query74.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query75.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query76.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query77.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query78.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query79.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query8.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query80.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query81.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query82.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query83.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query84.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query85.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query86.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query87.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query88.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query89.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query9.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query90.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query91.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query92.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query93.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query94.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query95.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query96.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query97.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query98.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/ansi/query99.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query1.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query10.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query11.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query12.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query13.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query14.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query15.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query16.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query17.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query18.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query19.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query2.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query20.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query21.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query22.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query23.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query24.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query25.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query26.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query27.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query28.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query29.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query3.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query30.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query31.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query32.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query33.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query34.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query35.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query36.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query37.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query38.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query39.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query4.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query40.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query41.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query42.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query43.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query44.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query45.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query46.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query47.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query48.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query49.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query5.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query50.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query51.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query52.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query53.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query54.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query55.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query56.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query57.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query58.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query59.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query6.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query60.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query61.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query62.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query63.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query64.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query65.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query66.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query67.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query68.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query69.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query7.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query70.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query71.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query72.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query73.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query74.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query75.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query76.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query77.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query78.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query79.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query8.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query80.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query81.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query82.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query83.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query84.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query85.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query86.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query87.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query88.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query89.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query9.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query90.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query91.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query92.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query93.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query94.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query95.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query96.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query97.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query98.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query99.sql +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/queries/tpcds/test_tpcds.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/parsing/test_ast.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/sql/utils.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/superset_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/transpilation_test.py +0 -0
- {datajunction_server-0.0.1a68.dev1 → datajunction_server-0.0.1a69.dev0}/tests/utils_test.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: datajunction-server
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.1a69.dev0
|
|
4
4
|
Summary: DataJunction server library for running to a DataJunction server
|
|
5
5
|
Project-URL: repository, https://github.com/DataJunction/dj
|
|
6
6
|
Author-email: DataJunction Authors <yian.shang@gmail.com>
|
|
@@ -17,7 +17,6 @@ from datajunction_server.errors import (
|
|
|
17
17
|
)
|
|
18
18
|
from datajunction_server.internal.engines import get_engine
|
|
19
19
|
from datajunction_server.models import access
|
|
20
|
-
from datajunction_server.models.column import SemanticType
|
|
21
20
|
from datajunction_server.models.engine import Dialect
|
|
22
21
|
from datajunction_server.models.materialization import GenericCubeConfig
|
|
23
22
|
from datajunction_server.models.node import BuildCriteria
|
|
@@ -152,7 +151,7 @@ async def validate_shared_dimensions(
|
|
|
152
151
|
)
|
|
153
152
|
|
|
154
153
|
|
|
155
|
-
async def build_metric_nodes(
|
|
154
|
+
async def build_metric_nodes( # pylint: disable=too-many-statements
|
|
156
155
|
session: AsyncSession,
|
|
157
156
|
metric_nodes: List[Node],
|
|
158
157
|
filters: List[str],
|
|
@@ -178,7 +177,7 @@ async def build_metric_nodes(
|
|
|
178
177
|
(f) Select all the requested metrics and dimensions in the final SELECT
|
|
179
178
|
"""
|
|
180
179
|
from datajunction_server.construction.build_v2 import ( # pylint: disable=import-outside-toplevel
|
|
181
|
-
|
|
180
|
+
CubeQueryBuilder,
|
|
182
181
|
)
|
|
183
182
|
|
|
184
183
|
engine = (
|
|
@@ -186,91 +185,25 @@ async def build_metric_nodes(
|
|
|
186
185
|
if engine_name and engine_version
|
|
187
186
|
else None
|
|
188
187
|
)
|
|
189
|
-
build_criteria = BuildCriteria(
|
|
188
|
+
build_criteria = build_criteria or BuildCriteria(
|
|
190
189
|
dialect=engine.dialect if engine and engine.dialect else Dialect.SPARK,
|
|
191
190
|
)
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
.with_build_criteria(build_criteria)
|
|
209
|
-
.add_dimensions(dimensions)
|
|
210
|
-
.add_filters(filters)
|
|
211
|
-
.build()
|
|
212
|
-
)
|
|
213
|
-
|
|
214
|
-
dimension_columns = [
|
|
215
|
-
expr
|
|
216
|
-
for expr in parent_ast.select.projection
|
|
217
|
-
if from_amenable_name(expr.alias_or_name.identifier(False)) # type: ignore
|
|
218
|
-
in dimensions
|
|
219
|
-
]
|
|
220
|
-
parent_ast.select.projection = dimension_columns
|
|
221
|
-
for col in dimension_columns:
|
|
222
|
-
group_by_col = col.copy()
|
|
223
|
-
group_by_col.alias = None
|
|
224
|
-
parent_ast.select.group_by.append(group_by_col)
|
|
225
|
-
|
|
226
|
-
# Add metric aggregations to select
|
|
227
|
-
for metric_node in metrics:
|
|
228
|
-
if access_control:
|
|
229
|
-
access_control.add_request_by_node(metric_node) # type: ignore
|
|
230
|
-
metric_query_builder = await QueryBuilder.create(session, metric_node)
|
|
231
|
-
if ignore_errors:
|
|
232
|
-
metric_query_builder = (
|
|
233
|
-
metric_query_builder.ignore_errors()
|
|
234
|
-
) # pragma: no cover
|
|
235
|
-
metric_query = await (
|
|
236
|
-
metric_query_builder.with_access_control(access_control)
|
|
237
|
-
.with_build_criteria(build_criteria)
|
|
238
|
-
.build()
|
|
239
|
-
)
|
|
240
|
-
|
|
241
|
-
metric_query.ctes[-1].select.projection[0].set_semantic_entity( # type: ignore
|
|
242
|
-
f"{metric_node.name}.{amenable_name(metric_node.name)}",
|
|
243
|
-
)
|
|
244
|
-
metric_query.ctes[-1].select.projection[0].set_alias( # type: ignore
|
|
245
|
-
ast.Name(amenable_name(metric_node.name)),
|
|
246
|
-
)
|
|
247
|
-
metric_query.ctes[-1].select.projection[0].set_semantic_type( # type: ignore
|
|
248
|
-
SemanticType.METRIC,
|
|
249
|
-
)
|
|
250
|
-
for col in metric_query.ctes[-1].select.find_all(ast.Column):
|
|
251
|
-
col._table = ast.Table(
|
|
252
|
-
name=ast.Name(name=amenable_name(parent_node.name)),
|
|
253
|
-
)
|
|
254
|
-
|
|
255
|
-
parent_ast.select.projection.extend(metric_query.ctes[-1].select.projection)
|
|
256
|
-
|
|
257
|
-
await session.refresh(parent_node.current, ["columns"])
|
|
258
|
-
|
|
259
|
-
# Generate semantic types for each
|
|
260
|
-
for expr in parent_ast.select.projection:
|
|
261
|
-
column_identifier = expr.alias_or_name.identifier(False) # type: ignore
|
|
262
|
-
semantic_entity = from_amenable_name(column_identifier)
|
|
263
|
-
if semantic_entity in dimensions:
|
|
264
|
-
expr.set_semantic_entity(semantic_entity) # type: ignore
|
|
265
|
-
expr.set_semantic_type(SemanticType.DIMENSION) # type: ignore
|
|
266
|
-
|
|
267
|
-
# Add limit
|
|
268
|
-
if limit:
|
|
269
|
-
parent_ast.select.limit = ast.Number(value=limit)
|
|
270
|
-
|
|
271
|
-
await parent_ast.compile(context)
|
|
272
|
-
measures_queries.append(parent_ast)
|
|
273
|
-
return measures_queries[0]
|
|
191
|
+
builder = await CubeQueryBuilder.create(
|
|
192
|
+
session,
|
|
193
|
+
metric_nodes,
|
|
194
|
+
use_materialized=False,
|
|
195
|
+
)
|
|
196
|
+
builder = (
|
|
197
|
+
builder.add_filters(filters)
|
|
198
|
+
.add_dimensions(dimensions)
|
|
199
|
+
.order_by(orderby)
|
|
200
|
+
.limit(limit)
|
|
201
|
+
.with_build_criteria(build_criteria)
|
|
202
|
+
.with_access_control(access_control)
|
|
203
|
+
)
|
|
204
|
+
if ignore_errors:
|
|
205
|
+
builder = builder.ignore_errors()
|
|
206
|
+
return await builder.build()
|
|
274
207
|
|
|
275
208
|
|
|
276
209
|
def build_temp_select(temp_query: str):
|
|
@@ -5,14 +5,14 @@ import logging
|
|
|
5
5
|
import re
|
|
6
6
|
from dataclasses import dataclass
|
|
7
7
|
from functools import cached_property
|
|
8
|
-
from typing import Any, DefaultDict, Dict, List, Optional, Union, cast
|
|
8
|
+
from typing import Any, DefaultDict, Dict, List, Optional, Tuple, Union, cast
|
|
9
9
|
|
|
10
10
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
11
11
|
|
|
12
12
|
from datajunction_server.construction.utils import to_namespaced_name
|
|
13
13
|
from datajunction_server.database import Engine
|
|
14
14
|
from datajunction_server.database.dimensionlink import DimensionLink
|
|
15
|
-
from datajunction_server.database.node import NodeRevision
|
|
15
|
+
from datajunction_server.database.node import Node, NodeRevision
|
|
16
16
|
from datajunction_server.database.user import User
|
|
17
17
|
from datajunction_server.errors import (
|
|
18
18
|
DJException,
|
|
@@ -720,6 +720,390 @@ class QueryBuilder: # pylint: disable=too-many-instance-attributes,too-many-pub
|
|
|
720
720
|
return dimension_node_joins
|
|
721
721
|
|
|
722
722
|
|
|
723
|
+
class CubeQueryBuilder: # pylint: disable=too-many-instance-attributes
|
|
724
|
+
"""
|
|
725
|
+
This class allows users to configure building cube SQL (retrieving SQL for multiple
|
|
726
|
+
metrics + dimensions) through settings like adding filters, dimensions, ordering, and limit
|
|
727
|
+
clauses. The builder then handles the management of CTEs, dimension joins, and error
|
|
728
|
+
validation, allowing for dynamic node query generation based on runtime conditions.
|
|
729
|
+
"""
|
|
730
|
+
|
|
731
|
+
def __init__(
|
|
732
|
+
self,
|
|
733
|
+
session: AsyncSession,
|
|
734
|
+
metric_nodes: List[Node],
|
|
735
|
+
use_materialized: bool = True,
|
|
736
|
+
):
|
|
737
|
+
self.session = session
|
|
738
|
+
self.metric_nodes = metric_nodes
|
|
739
|
+
self.use_materialized = use_materialized
|
|
740
|
+
|
|
741
|
+
self._filters: List[str] = []
|
|
742
|
+
self._required_dimensions: List[str] = [
|
|
743
|
+
required.name
|
|
744
|
+
for metric_node in self.metric_nodes
|
|
745
|
+
for required in metric_node.current.required_dimensions
|
|
746
|
+
]
|
|
747
|
+
self._dimensions: List[str] = []
|
|
748
|
+
self._orderby: List[str] = []
|
|
749
|
+
self._limit: Optional[int] = None
|
|
750
|
+
self._build_criteria: Optional[BuildCriteria] = self.get_default_criteria()
|
|
751
|
+
self._access_control: Optional[access.AccessControlStore] = None
|
|
752
|
+
self._ignore_errors: bool = False
|
|
753
|
+
|
|
754
|
+
# The following attributes will be modified as the query gets built.
|
|
755
|
+
# --
|
|
756
|
+
# Track node query CTEs as they get built
|
|
757
|
+
self.cte_mapping: Dict[str, ast.Query] = {} # Maps node name to its CTE
|
|
758
|
+
# Keep a list of build errors
|
|
759
|
+
self.errors: List[DJQueryBuildError] = []
|
|
760
|
+
# The final built query AST
|
|
761
|
+
self.final_ast: Optional[ast.Query] = None
|
|
762
|
+
|
|
763
|
+
def get_default_criteria(
|
|
764
|
+
self,
|
|
765
|
+
engine: Optional[Engine] = None,
|
|
766
|
+
) -> BuildCriteria:
|
|
767
|
+
"""
|
|
768
|
+
Get the default build criteria for a node.
|
|
769
|
+
Set the dialect by using the provided engine, if any. If no engine is specified,
|
|
770
|
+
set the dialect by finding available engines for this node, or default to Spark
|
|
771
|
+
"""
|
|
772
|
+
return BuildCriteria(
|
|
773
|
+
dialect=engine.dialect if engine and engine.dialect else Dialect.SPARK,
|
|
774
|
+
)
|
|
775
|
+
|
|
776
|
+
@classmethod
|
|
777
|
+
async def create(
|
|
778
|
+
cls,
|
|
779
|
+
session: AsyncSession,
|
|
780
|
+
metric_nodes: List[Node],
|
|
781
|
+
use_materialized: bool = True,
|
|
782
|
+
) -> "CubeQueryBuilder":
|
|
783
|
+
"""
|
|
784
|
+
Create a QueryBuilder instance for the node revision.
|
|
785
|
+
"""
|
|
786
|
+
for node in metric_nodes:
|
|
787
|
+
await session.refresh(node, ["current"])
|
|
788
|
+
await session.refresh(node.current, ["required_dimensions"])
|
|
789
|
+
|
|
790
|
+
instance = cls(session, metric_nodes, use_materialized=use_materialized)
|
|
791
|
+
return instance
|
|
792
|
+
|
|
793
|
+
def ignore_errors(self):
|
|
794
|
+
"""Do not raise on errors in query build."""
|
|
795
|
+
self._ignore_errors = True
|
|
796
|
+
return self
|
|
797
|
+
|
|
798
|
+
def raise_errors(self):
|
|
799
|
+
"""Raise on errors in query build."""
|
|
800
|
+
self._ignore_errors = False # pragma: no cover
|
|
801
|
+
return self # pragma: no cover
|
|
802
|
+
|
|
803
|
+
def filter_by(self, filter_: str):
|
|
804
|
+
"""Add filter to the query builder."""
|
|
805
|
+
if filter_ not in self._filters: # pragma: no cover
|
|
806
|
+
self._filters.append(filter_)
|
|
807
|
+
return self
|
|
808
|
+
|
|
809
|
+
def add_filters(self, filters: Optional[List[str]] = None):
|
|
810
|
+
"""Add filters to the query builder."""
|
|
811
|
+
for filter_ in filters or []:
|
|
812
|
+
self.filter_by(filter_)
|
|
813
|
+
return self
|
|
814
|
+
|
|
815
|
+
def add_dimension(self, dimension: str):
|
|
816
|
+
"""Add dimension to the query builder."""
|
|
817
|
+
if ( # pragma: no cover
|
|
818
|
+
dimension not in self._dimensions
|
|
819
|
+
and dimension not in self._required_dimensions
|
|
820
|
+
):
|
|
821
|
+
self._dimensions.append(dimension)
|
|
822
|
+
return self
|
|
823
|
+
|
|
824
|
+
def add_dimensions(self, dimensions: Optional[List[str]] = None):
|
|
825
|
+
"""Add dimensions to the query builder."""
|
|
826
|
+
for dimension in dimensions or []:
|
|
827
|
+
self.add_dimension(dimension)
|
|
828
|
+
return self
|
|
829
|
+
|
|
830
|
+
def order_by(self, orderby: Optional[Union[str, List[str]]] = None):
|
|
831
|
+
"""Set order by for the query builder."""
|
|
832
|
+
if isinstance(orderby, str):
|
|
833
|
+
if orderby not in self._orderby: # pragma: no cover
|
|
834
|
+
self._orderby.append(orderby) # pragma: no cover
|
|
835
|
+
else:
|
|
836
|
+
for order in orderby or []:
|
|
837
|
+
if order not in self._orderby: # pragma: no cover
|
|
838
|
+
self._orderby.append(order)
|
|
839
|
+
return self
|
|
840
|
+
|
|
841
|
+
def limit(self, limit: Optional[int] = None):
|
|
842
|
+
"""Set limit for the query builder."""
|
|
843
|
+
if limit: # pragma: no cover
|
|
844
|
+
self._limit = limit
|
|
845
|
+
return self
|
|
846
|
+
|
|
847
|
+
def with_build_criteria(self, build_criteria: Optional[BuildCriteria] = None):
|
|
848
|
+
"""Set build criteria for the query builder."""
|
|
849
|
+
if build_criteria: # pragma: no cover
|
|
850
|
+
self._build_criteria = build_criteria
|
|
851
|
+
return self
|
|
852
|
+
|
|
853
|
+
def with_access_control(
|
|
854
|
+
self,
|
|
855
|
+
access_control: Optional[access.AccessControlStore] = None,
|
|
856
|
+
):
|
|
857
|
+
"""
|
|
858
|
+
Set access control for the query builder.
|
|
859
|
+
"""
|
|
860
|
+
if access_control: # pragma: no cover
|
|
861
|
+
access_control.add_request_by_nodes(self.metric_nodes)
|
|
862
|
+
self._access_control = access_control
|
|
863
|
+
return self
|
|
864
|
+
|
|
865
|
+
@property
|
|
866
|
+
def dimensions(self) -> List[str]:
|
|
867
|
+
"""All dimensions"""
|
|
868
|
+
return self._dimensions # TO DO: add self._required_dimensions
|
|
869
|
+
|
|
870
|
+
@property
|
|
871
|
+
def filters(self) -> List[str]:
|
|
872
|
+
"""All filters"""
|
|
873
|
+
return self._filters
|
|
874
|
+
|
|
875
|
+
async def build(self) -> ast.Query:
|
|
876
|
+
"""
|
|
877
|
+
Builds SQL for multiple metrics with the requested set of dimensions,
|
|
878
|
+
filter expressions, order by, and limit clauses.
|
|
879
|
+
"""
|
|
880
|
+
measures_queries = await self.build_measures_queries()
|
|
881
|
+
|
|
882
|
+
# Join together the transforms on the shared dimensions and select all
|
|
883
|
+
# requested metrics and dimensions in the final select projection
|
|
884
|
+
parent_ctes, metric_ctes = self.extract_ctes(measures_queries)
|
|
885
|
+
initial_cte = metric_ctes[0]
|
|
886
|
+
self.final_ast = ast.Query(
|
|
887
|
+
ctes=parent_ctes + metric_ctes,
|
|
888
|
+
select=ast.Select(
|
|
889
|
+
projection=[
|
|
890
|
+
ast.Column(
|
|
891
|
+
name=ast.Name(proj.alias, namespace=initial_cte.alias), # type: ignore
|
|
892
|
+
_type=proj.type, # type: ignore
|
|
893
|
+
semantic_entity=proj.semantic_entity, # type: ignore
|
|
894
|
+
semantic_type=proj.semantic_type, # type: ignore
|
|
895
|
+
)
|
|
896
|
+
for proj in initial_cte.select.projection
|
|
897
|
+
],
|
|
898
|
+
from_=ast.From(
|
|
899
|
+
relations=[ast.Relation(primary=ast.Table(initial_cte.alias))], # type: ignore
|
|
900
|
+
),
|
|
901
|
+
),
|
|
902
|
+
)
|
|
903
|
+
# Add metrics
|
|
904
|
+
for metric_cte in metric_ctes[1:]:
|
|
905
|
+
self.final_ast.select.projection.extend(
|
|
906
|
+
[
|
|
907
|
+
ast.Column(
|
|
908
|
+
name=ast.Name(proj.alias, namespace=metric_cte.alias), # type: ignore
|
|
909
|
+
_type=proj.type, # type: ignore
|
|
910
|
+
semantic_entity=proj.semantic_entity, # type: ignore
|
|
911
|
+
semantic_type=proj.semantic_type, # type: ignore
|
|
912
|
+
)
|
|
913
|
+
for proj in metric_cte.select.projection
|
|
914
|
+
if from_amenable_name(proj.alias_or_name.identifier()) # type: ignore
|
|
915
|
+
not in self.dimensions
|
|
916
|
+
],
|
|
917
|
+
)
|
|
918
|
+
join_on = [
|
|
919
|
+
ast.BinaryOp(
|
|
920
|
+
op=ast.BinaryOpKind.Eq,
|
|
921
|
+
left=ast.Column(
|
|
922
|
+
name=ast.Name(proj.alias, namespace=initial_cte.alias), # type: ignore
|
|
923
|
+
_type=proj.type, # type: ignore
|
|
924
|
+
),
|
|
925
|
+
right=ast.Column(
|
|
926
|
+
name=ast.Name(proj.alias, namespace=metric_cte.alias), # type: ignore
|
|
927
|
+
_type=proj.type, # type: ignore
|
|
928
|
+
),
|
|
929
|
+
)
|
|
930
|
+
for proj in metric_cte.select.projection # type: ignore
|
|
931
|
+
if from_amenable_name(proj.alias_or_name.identifier()) # type: ignore
|
|
932
|
+
in self.dimensions
|
|
933
|
+
]
|
|
934
|
+
self.final_ast.select.from_.relations[0].extensions.append( # type: ignore
|
|
935
|
+
ast.Join(
|
|
936
|
+
join_type="full",
|
|
937
|
+
right=ast.Table(metric_cte.alias), # type: ignore
|
|
938
|
+
criteria=ast.JoinCriteria(
|
|
939
|
+
on=ast.BinaryOp.And(*join_on),
|
|
940
|
+
),
|
|
941
|
+
),
|
|
942
|
+
)
|
|
943
|
+
|
|
944
|
+
if self._orderby:
|
|
945
|
+
self.final_ast.select.organization = self.build_orderby()
|
|
946
|
+
|
|
947
|
+
if self._limit:
|
|
948
|
+
self.final_ast.select.limit = ast.Number(value=self._limit)
|
|
949
|
+
|
|
950
|
+
# Error validation
|
|
951
|
+
self.validate_access()
|
|
952
|
+
if self.errors and not self._ignore_errors:
|
|
953
|
+
raise DJQueryBuildException(errors=self.errors) # pragma: no cover
|
|
954
|
+
return self.final_ast
|
|
955
|
+
|
|
956
|
+
def validate_access(self):
|
|
957
|
+
"""Validates access"""
|
|
958
|
+
if self._access_control:
|
|
959
|
+
self._access_control.validate_and_raise()
|
|
960
|
+
|
|
961
|
+
async def build_measures_queries(self):
|
|
962
|
+
"""
|
|
963
|
+
Build the metrics' queries grouped by parent
|
|
964
|
+
"""
|
|
965
|
+
from datajunction_server.construction.build import ( # pylint: disable=import-outside-toplevel,line-too-long
|
|
966
|
+
group_metrics_by_parent,
|
|
967
|
+
)
|
|
968
|
+
|
|
969
|
+
common_parents = group_metrics_by_parent(self.metric_nodes)
|
|
970
|
+
measures_queries = {}
|
|
971
|
+
for parent_node, metrics in common_parents.items(): # type: ignore
|
|
972
|
+
await self.session.refresh(parent_node, ["current"])
|
|
973
|
+
query_builder = await QueryBuilder.create(self.session, parent_node.current)
|
|
974
|
+
if self._ignore_errors:
|
|
975
|
+
query_builder = query_builder.ignore_errors()
|
|
976
|
+
parent_ast = await (
|
|
977
|
+
query_builder.with_access_control(self._access_control)
|
|
978
|
+
.with_build_criteria(self._build_criteria)
|
|
979
|
+
.add_dimensions(self.dimensions)
|
|
980
|
+
.add_filters(self.filters)
|
|
981
|
+
.build()
|
|
982
|
+
)
|
|
983
|
+
self.errors.extend(query_builder.errors)
|
|
984
|
+
|
|
985
|
+
dimension_columns = [
|
|
986
|
+
expr
|
|
987
|
+
for expr in parent_ast.select.projection
|
|
988
|
+
if from_amenable_name(expr.alias_or_name.identifier(False)) # type: ignore
|
|
989
|
+
in self.dimensions
|
|
990
|
+
]
|
|
991
|
+
parent_ast.select.projection = dimension_columns
|
|
992
|
+
for col in dimension_columns:
|
|
993
|
+
group_by_col = col.copy()
|
|
994
|
+
group_by_col.alias = None
|
|
995
|
+
parent_ast.select.group_by.append(group_by_col)
|
|
996
|
+
|
|
997
|
+
# Add metric aggregations to select
|
|
998
|
+
for metric_node in metrics:
|
|
999
|
+
metric_proj = await self.build_metric_agg(metric_node, parent_node)
|
|
1000
|
+
parent_ast.select.projection.extend(metric_proj)
|
|
1001
|
+
|
|
1002
|
+
await self.session.refresh(parent_node.current, ["columns"])
|
|
1003
|
+
|
|
1004
|
+
# Generate semantic types for each
|
|
1005
|
+
for expr in parent_ast.select.projection:
|
|
1006
|
+
column_identifier = expr.alias_or_name.identifier(False) # type: ignore
|
|
1007
|
+
semantic_entity = from_amenable_name(column_identifier)
|
|
1008
|
+
if semantic_entity in self.dimensions:
|
|
1009
|
+
expr.set_semantic_entity(semantic_entity) # type: ignore
|
|
1010
|
+
expr.set_semantic_type(SemanticType.DIMENSION) # type: ignore
|
|
1011
|
+
|
|
1012
|
+
ctx = CompileContext(self.session, DJException())
|
|
1013
|
+
await parent_ast.compile(ctx)
|
|
1014
|
+
measures_queries[parent_node.name] = parent_ast
|
|
1015
|
+
return measures_queries
|
|
1016
|
+
|
|
1017
|
+
async def build_metric_agg(self, metric_node, parent_node):
|
|
1018
|
+
"""
|
|
1019
|
+
Build the metric's aggregate expression.
|
|
1020
|
+
"""
|
|
1021
|
+
if self._access_control:
|
|
1022
|
+
self._access_control.add_request_by_node(metric_node) # type: ignore
|
|
1023
|
+
metric_query_builder = await QueryBuilder.create(self.session, metric_node)
|
|
1024
|
+
if self._ignore_errors:
|
|
1025
|
+
metric_query_builder = ( # pragma: no cover
|
|
1026
|
+
metric_query_builder.ignore_errors()
|
|
1027
|
+
)
|
|
1028
|
+
metric_query = await (
|
|
1029
|
+
metric_query_builder.with_access_control(self._access_control)
|
|
1030
|
+
.with_build_criteria(self._build_criteria)
|
|
1031
|
+
.build()
|
|
1032
|
+
)
|
|
1033
|
+
self.errors.extend(metric_query_builder.errors)
|
|
1034
|
+
|
|
1035
|
+
metric_query.ctes[-1].select.projection[0].set_semantic_entity( # type: ignore
|
|
1036
|
+
f"{metric_node.name}.{amenable_name(metric_node.name)}",
|
|
1037
|
+
)
|
|
1038
|
+
metric_query.ctes[-1].select.projection[0].set_alias( # type: ignore
|
|
1039
|
+
ast.Name(amenable_name(metric_node.name)),
|
|
1040
|
+
)
|
|
1041
|
+
metric_query.ctes[-1].select.projection[0].set_semantic_type( # type: ignore
|
|
1042
|
+
SemanticType.METRIC,
|
|
1043
|
+
)
|
|
1044
|
+
for col in metric_query.ctes[-1].select.find_all(ast.Column):
|
|
1045
|
+
col._table = ast.Table(
|
|
1046
|
+
name=ast.Name(name=amenable_name(parent_node.name)),
|
|
1047
|
+
)
|
|
1048
|
+
return metric_query.ctes[-1].select.projection
|
|
1049
|
+
|
|
1050
|
+
def extract_ctes(self, measures_queries) -> Tuple[List[ast.Query], List[ast.Query]]:
|
|
1051
|
+
"""
|
|
1052
|
+
Extracts the parent CTEs and the metric CTEs from the queries
|
|
1053
|
+
"""
|
|
1054
|
+
parent_ctes: List[ast.Query] = []
|
|
1055
|
+
metric_ctes: List[ast.Query] = []
|
|
1056
|
+
for parent_name, parent_query in measures_queries.items():
|
|
1057
|
+
existing_cte_aliases = {
|
|
1058
|
+
cte.alias_or_name.identifier() for cte in parent_ctes
|
|
1059
|
+
}
|
|
1060
|
+
parent_ctes += [
|
|
1061
|
+
cte
|
|
1062
|
+
for cte in parent_query.ctes
|
|
1063
|
+
if cte.alias_or_name.identifier() not in existing_cte_aliases
|
|
1064
|
+
]
|
|
1065
|
+
parent_query.ctes = []
|
|
1066
|
+
metric_ctes += [
|
|
1067
|
+
parent_query.to_cte(ast.Name(amenable_name(parent_name + "_metrics"))),
|
|
1068
|
+
]
|
|
1069
|
+
return parent_ctes, metric_ctes
|
|
1070
|
+
|
|
1071
|
+
def build_orderby(self):
|
|
1072
|
+
"""
|
|
1073
|
+
Creates an order by ast from the requested order bys
|
|
1074
|
+
"""
|
|
1075
|
+
temp_orderbys = parse( # type: ignore
|
|
1076
|
+
f"SELECT 1 ORDER BY {','.join(self._orderby)}",
|
|
1077
|
+
).select.organization.order
|
|
1078
|
+
valid_sort_items = [
|
|
1079
|
+
sortitem
|
|
1080
|
+
for sortitem in temp_orderbys
|
|
1081
|
+
if amenable_name(sortitem.expr.identifier()) # type: ignore
|
|
1082
|
+
in self.final_ast.select.column_mapping
|
|
1083
|
+
]
|
|
1084
|
+
if len(valid_sort_items) < len(temp_orderbys):
|
|
1085
|
+
self.errors.append( # pragma: no cover
|
|
1086
|
+
DJQueryBuildError(
|
|
1087
|
+
code=ErrorCode.INVALID_ORDER_BY,
|
|
1088
|
+
message=f"{self._orderby} is not a valid ORDER BY request",
|
|
1089
|
+
),
|
|
1090
|
+
)
|
|
1091
|
+
return ast.Organization(
|
|
1092
|
+
order=[
|
|
1093
|
+
ast.SortItem(
|
|
1094
|
+
expr=self.final_ast.select.column_mapping.get( # type: ignore
|
|
1095
|
+
amenable_name(sortitem.expr.identifier()), # type: ignore
|
|
1096
|
+
)
|
|
1097
|
+
.copy()
|
|
1098
|
+
.set_alias(None),
|
|
1099
|
+
asc=sortitem.asc,
|
|
1100
|
+
nulls=sortitem.nulls,
|
|
1101
|
+
)
|
|
1102
|
+
for sortitem in valid_sort_items
|
|
1103
|
+
],
|
|
1104
|
+
)
|
|
1105
|
+
|
|
1106
|
+
|
|
723
1107
|
def get_column_from_canonical_dimension(
|
|
724
1108
|
dimension_name: str,
|
|
725
1109
|
node: NodeRevision,
|