datajunction-server 0.0.1a98.dev1__tar.gz → 0.0.1a99.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.
Files changed (539) hide show
  1. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/PKG-INFO +1 -1
  2. datajunction_server-0.0.1a99.dev0/datajunction_server/__about__.py +5 -0
  3. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/helpers.py +8 -2
  4. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/nodes.py +16 -19
  5. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/sql.py +37 -15
  6. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/construction/build.py +3 -1
  7. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/construction/build_v2.py +70 -0
  8. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/errors.py +1 -0
  9. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/node.py +4 -4
  10. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/dag.py +90 -0
  11. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/parsing/ast.py +30 -0
  12. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/parsing/backends/antlr4.py +11 -0
  13. datajunction_server-0.0.1a99.dev0/tests/api/query_params_test.py +179 -0
  14. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/construction/build_v2_test.py +41 -0
  15. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/backends/antlr4_test.py +48 -1
  16. datajunction_server-0.0.1a98.dev1/datajunction_server/__about__.py +0 -5
  17. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/.coveragerc +0 -0
  18. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/.env +0 -0
  19. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/.env.integration +0 -0
  20. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/.flake8 +0 -0
  21. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/.gitignore +0 -0
  22. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/.isort.cfg +0 -0
  23. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/.pre-commit-config.yaml +0 -0
  24. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/Dockerfile +0 -0
  25. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/Makefile +0 -0
  26. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/README.md +0 -0
  27. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/__init__.py +0 -0
  28. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/README +0 -0
  29. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/env.py +0 -0
  30. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/script.py.mako +0 -0
  31. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2023_12_20_1829-724445d2b29d_initial_migration.py +0 -0
  32. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2024_01_08_2034-945d44abcd32_add_dimension_links.py +0 -0
  33. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2024_01_11_2032-c74b11566d82_add_column_order.py +0 -0
  34. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2024_01_18_2011-20f060b02772_switch_enum_values.py +0 -0
  35. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2024_01_23_0617-c9cef8864ecb_add_missing_table_attribute_to_source_.py +0 -0
  36. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2024_01_23_1655-a8e22109be24_availability_state_s_valid_through_ts_.py +0 -0
  37. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2024_02_22_0713-d61fb7e48cc3_cascade_deletes_to_dimension_links.py +0 -0
  38. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2024_04_30_1556-de7ec1c82fe0_add_query_requests.py +0 -0
  39. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2024_05_09_1420-9b1227ff17f4_update_backfill_spec.py +0 -0
  40. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2024_05_21_0012-57fc93ef6947_add_query_id_to_queryrequest.py +0 -0
  41. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2024_06_21_1301-640a814db2d8_add_collection_tables.py +0 -0
  42. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2024_07_12_0348-34171c92dd6d_set_user_username_to_be_unique.py +0 -0
  43. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2024_08_18_0036-f3c9b40deb6f_add_create_by_to_nodes_node_revisions_.py +0 -0
  44. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2024_10_24_0015-4d6ab789e456_add_a_map_of_links_to_availability_state.py +0 -0
  45. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2024_10_26_0340-70904373eab3_add_indexes_on_history_and_node_tables.py +0 -0
  46. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2025_01_19_1808-9650f9b728a2_add_query_ast_for_noderevision.py +0 -0
  47. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2025_01_24_0020-bec3296d7537_add_custom_metadata_field_to_nodes.py +0 -0
  48. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2025_02_11_1619-c3d5f327296c_notificationpreferences.py +0 -0
  49. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2025_03_14_1513-ae9eba981a2d_add_index_on_display_name.py +0 -0
  50. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2025_03_14_2304-135fa5833fed_added_column_description.py +0 -0
  51. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2025_04_05_2149-a2d7ea04cf79_add_formatting_metric_metadata.py +0 -0
  52. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic/versions/2025_04_24_1810-51547dcccb10_fix_unique_constraint.py +0 -0
  53. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/alembic.ini +0 -0
  54. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/__init__.py +0 -0
  55. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/access/authentication/__init__.py +0 -0
  56. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/access/authentication/basic.py +0 -0
  57. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/access/authentication/github.py +0 -0
  58. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/access/authentication/google.py +0 -0
  59. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/access/authentication/whoami.py +0 -0
  60. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/attributes.py +0 -0
  61. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/catalogs.py +0 -0
  62. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/client.py +0 -0
  63. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/collection.py +0 -0
  64. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/cubes.py +0 -0
  65. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/data.py +0 -0
  66. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/dimensions.py +0 -0
  67. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/djsql.py +0 -0
  68. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/engines.py +0 -0
  69. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/__init__.py +0 -0
  70. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/main.py +0 -0
  71. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/queries/__init__.py +0 -0
  72. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/queries/catalogs.py +0 -0
  73. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/queries/dag.py +0 -0
  74. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/queries/engines.py +0 -0
  75. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/queries/nodes.py +0 -0
  76. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/queries/sql.py +0 -0
  77. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/queries/tags.py +0 -0
  78. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/resolvers/__init__.py +0 -0
  79. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/resolvers/nodes.py +0 -0
  80. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/resolvers/tags.py +0 -0
  81. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/scalars/__init__.py +0 -0
  82. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/scalars/availabilitystate.py +0 -0
  83. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/scalars/catalog_engine.py +0 -0
  84. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/scalars/column.py +0 -0
  85. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/scalars/errors.py +0 -0
  86. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/scalars/materialization.py +0 -0
  87. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/scalars/metricmetadata.py +0 -0
  88. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/scalars/node.py +0 -0
  89. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/scalars/sql.py +0 -0
  90. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/scalars/tag.py +0 -0
  91. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/scalars/user.py +0 -0
  92. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/graphql/utils.py +0 -0
  93. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/health.py +0 -0
  94. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/history.py +0 -0
  95. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/logging.conf +0 -0
  96. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/main.py +0 -0
  97. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/materializations.py +0 -0
  98. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/measures.py +0 -0
  99. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/metrics.py +0 -0
  100. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/namespaces.py +0 -0
  101. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/notifications.py +0 -0
  102. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/tags.py +0 -0
  103. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/api/users.py +0 -0
  104. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/config.py +0 -0
  105. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/constants.py +0 -0
  106. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/construction/__init__.py +0 -0
  107. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/construction/dimensions.py +0 -0
  108. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/construction/dj_query.py +0 -0
  109. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/construction/exceptions.py +0 -0
  110. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/construction/utils.py +0 -0
  111. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/__init__.py +0 -0
  112. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/attributetype.py +0 -0
  113. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/availabilitystate.py +0 -0
  114. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/backfill.py +0 -0
  115. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/base.py +0 -0
  116. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/catalog.py +0 -0
  117. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/collection.py +0 -0
  118. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/column.py +0 -0
  119. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/database.py +0 -0
  120. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/dimensionlink.py +0 -0
  121. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/engine.py +0 -0
  122. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/history.py +0 -0
  123. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/materialization.py +0 -0
  124. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/measure.py +0 -0
  125. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/metricmetadata.py +0 -0
  126. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/namespace.py +0 -0
  127. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/node.py +0 -0
  128. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/notification_preference.py +0 -0
  129. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/partition.py +0 -0
  130. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/queryrequest.py +0 -0
  131. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/tag.py +0 -0
  132. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/database/user.py +0 -0
  133. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/enum.py +0 -0
  134. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/__init__.py +0 -0
  135. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/access/__init__.py +0 -0
  136. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/access/authentication/__init__.py +0 -0
  137. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/access/authentication/basic.py +0 -0
  138. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/access/authentication/github.py +0 -0
  139. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/access/authentication/google.py +0 -0
  140. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/access/authentication/http.py +0 -0
  141. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/access/authentication/tokens.py +0 -0
  142. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/access/authorization.py +0 -0
  143. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/caching/cachelib_cache.py +0 -0
  144. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/caching/interface.py +0 -0
  145. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/caching/noop_cache.py +0 -0
  146. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/client.py +0 -0
  147. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/cube_materializations.py +0 -0
  148. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/engines.py +0 -0
  149. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/history.py +0 -0
  150. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/materializations.py +0 -0
  151. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/namespaces.py +0 -0
  152. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/nodes.py +0 -0
  153. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/notifications.py +0 -0
  154. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/templates/client_setup.j2 +0 -0
  155. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/templates/create_cube.j2 +0 -0
  156. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/templates/create_dimension.j2 +0 -0
  157. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/templates/create_metric.j2 +0 -0
  158. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/templates/create_transform.j2 +0 -0
  159. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/templates/link_dimension.j2 +0 -0
  160. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/templates/namespace_mapping.j2 +0 -0
  161. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/templates/register_table.j2 +0 -0
  162. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/templates/set_column_attributes.j2 +0 -0
  163. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/internal/validation.py +0 -0
  164. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/materialization/__init__.py +0 -0
  165. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/materialization/jobs/__init__.py +0 -0
  166. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/materialization/jobs/cube_materialization.py +0 -0
  167. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/materialization/jobs/job_types.py +0 -0
  168. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/materialization/jobs/materialization_job.py +0 -0
  169. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/__init__.py +0 -0
  170. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/access.py +0 -0
  171. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/attribute.py +0 -0
  172. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/base.py +0 -0
  173. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/catalog.py +0 -0
  174. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/collection.py +0 -0
  175. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/column.py +0 -0
  176. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/cube.py +0 -0
  177. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/cube_materialization.py +0 -0
  178. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/database.py +0 -0
  179. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/dimensionlink.py +0 -0
  180. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/engine.py +0 -0
  181. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/history.py +0 -0
  182. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/materialization.py +0 -0
  183. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/measure.py +0 -0
  184. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/metric.py +0 -0
  185. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/node_type.py +0 -0
  186. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/notifications.py +0 -0
  187. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/partition.py +0 -0
  188. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/query.py +0 -0
  189. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/sql.py +0 -0
  190. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/table.py +0 -0
  191. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/tag.py +0 -0
  192. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/models/user.py +0 -0
  193. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/naming.py +0 -0
  194. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/service_clients.py +0 -0
  195. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/__init__.py +0 -0
  196. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/decompose.py +0 -0
  197. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/functions.py +0 -0
  198. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/parsing/__init__.py +0 -0
  199. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/parsing/backends/__init__.py +0 -0
  200. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/parsing/backends/exceptions.py +0 -0
  201. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/parsing/backends/grammar/SqlBaseLexer.g4 +0 -0
  202. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/parsing/backends/grammar/SqlBaseParser.g4 +0 -0
  203. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/parsing/backends/grammar/__init__.py +0 -0
  204. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseLexer.interp +0 -0
  205. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseLexer.py +0 -0
  206. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseLexer.tokens +0 -0
  207. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParser.interp +0 -0
  208. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParser.py +0 -0
  209. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParser.tokens +0 -0
  210. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParserListener.py +0 -0
  211. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParserVisitor.py +0 -0
  212. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/sql/parsing/types.py +0 -0
  213. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/superset.py +0 -0
  214. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/transpilation.py +0 -0
  215. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/typing.py +0 -0
  216. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/datajunction_server/utils.py +0 -0
  217. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/init_data/seed.sql +0 -0
  218. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/pdm.lock +0 -0
  219. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/pyproject.toml +0 -0
  220. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/requirements/docker.txt +0 -0
  221. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/requirements/test.txt +0 -0
  222. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/scripts/docs-snippets.js +0 -0
  223. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/scripts/docs-snippets.sh +0 -0
  224. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/scripts/generate-openapi.py +0 -0
  225. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/__init__.py +0 -0
  226. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/__init__.py +0 -0
  227. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/access_test.py +0 -0
  228. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/attributes_test.py +0 -0
  229. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/catalog_test.py +0 -0
  230. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/client_test.py +0 -0
  231. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/collections_test.py +0 -0
  232. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/cubes_test.py +0 -0
  233. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/data_test.py +0 -0
  234. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/dimension_links_test.py +0 -0
  235. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/dimensions_access_test.py +0 -0
  236. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/dimensions_test.py +0 -0
  237. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/djql_test.py +0 -0
  238. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/engine_test.py +0 -0
  239. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/client_test/create_cube.repairs_cube.namespace.txt +0 -0
  240. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/client_test/create_cube.repairs_cube.txt +0 -0
  241. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/client_test/create_dimension.repair_order.namespace.txt +0 -0
  242. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/client_test/create_dimension.repair_order.txt +0 -0
  243. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/client_test/create_metric.num_repair_orders.namespace.txt +0 -0
  244. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/client_test/create_metric.num_repair_orders.txt +0 -0
  245. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/client_test/create_transform.regional_level_agg.namespace.txt +0 -0
  246. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/client_test/create_transform.regional_level_agg.txt +0 -0
  247. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/client_test/dimension_links.repair_orders.namespace.txt +0 -0
  248. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/client_test/dimension_links.repair_orders.txt +0 -0
  249. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/client_test/include_client_setup.txt +0 -0
  250. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/client_test/notebook.create_cube.txt +0 -0
  251. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/client_test/notebook.create_transform.txt +0 -0
  252. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/client_test/notebook.link_dimension.txt +0 -0
  253. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/client_test/notebook.set_attribute.txt +0 -0
  254. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/client_test/register_table.txt +0 -0
  255. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/druid_measures_cube.full.druid_spec.json +0 -0
  256. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/druid_measures_cube.full.partition.druid_spec.json +0 -0
  257. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/druid_measures_cube.full.partition.query.sql +0 -0
  258. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/druid_measures_cube.full.query.sql +0 -0
  259. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/druid_measures_cube.incremental.categorical.query.sql +0 -0
  260. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/druid_measures_cube.incremental.druid_spec.json +0 -0
  261. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/druid_measures_cube.incremental.patched.query.sql +0 -0
  262. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/druid_measures_cube.incremental.query.sql +0 -0
  263. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/druid_metrics_cube.incremental.categorical.query.sql +0 -0
  264. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/druid_metrics_cube.incremental.druid_spec.json +0 -0
  265. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/druid_metrics_cube.incremental.query.sql +0 -0
  266. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/spark_sql.full.config.json +0 -0
  267. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/spark_sql.full.materializations.json +0 -0
  268. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/spark_sql.full.partition.config.json +0 -0
  269. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/spark_sql.full.partition.materializations.json +0 -0
  270. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/spark_sql.full.partition.query.sql +0 -0
  271. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/spark_sql.full.query.sql +0 -0
  272. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/spark_sql.incremental.additional.query.sql +0 -0
  273. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/spark_sql.incremental.categorical.query.sql +0 -0
  274. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/spark_sql.incremental.config.json +0 -0
  275. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/spark_sql.incremental.lookback.query.sql +0 -0
  276. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/files/materializations_test/spark_sql.incremental.query.sql +0 -0
  277. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/graphql/__init__.py +0 -0
  278. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/graphql/catalog_test.py +0 -0
  279. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/graphql/common_dimensions_test.py +0 -0
  280. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/graphql/engine_test.py +0 -0
  281. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/graphql/find_nodes_test.py +0 -0
  282. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/graphql/measures_sql_test.py +0 -0
  283. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/graphql/tags_test.py +0 -0
  284. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/health_test.py +0 -0
  285. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/helpers_test.py +0 -0
  286. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/history_test.py +0 -0
  287. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/materializations_test.py +0 -0
  288. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/measures_test.py +0 -0
  289. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/metrics_test.py +0 -0
  290. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/namespaces_test.py +0 -0
  291. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/nodes_test.py +0 -0
  292. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/nodes_update_test.py +0 -0
  293. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/notifications_test.py +0 -0
  294. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/routers_test.py +0 -0
  295. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/sql_test.py +0 -0
  296. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/sql_v2_test.py +0 -0
  297. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/tags_test.py +0 -0
  298. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/api/users_test.py +0 -0
  299. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/conftest.py +0 -0
  300. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/construction/__init__.py +0 -0
  301. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/construction/build_test.py +0 -0
  302. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/construction/compile_test.py +0 -0
  303. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/construction/conftest.py +0 -0
  304. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/construction/exceptions_test.py +0 -0
  305. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/construction/inference_test.py +0 -0
  306. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/construction/utils_test.py +0 -0
  307. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/default.duckdb +0 -0
  308. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/duckdb.sql +0 -0
  309. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/errors_test.py +0 -0
  310. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/examples.py +0 -0
  311. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/integration/__init__.py +0 -0
  312. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/integration/basic_test.py +0 -0
  313. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/internal/authentication/basic_test.py +0 -0
  314. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/internal/authentication/github_test.py +0 -0
  315. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/internal/authentication/http_test.py +0 -0
  316. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/internal/authentication/token_test.py +0 -0
  317. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/internal/authentication/whoami_test.py +0 -0
  318. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/internal/caching/cachelib_cache_test.py +0 -0
  319. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/internal/caching/noop_cache_test.py +0 -0
  320. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/migrations_test.py +0 -0
  321. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/models/__init__.py +0 -0
  322. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/models/catalog_test.py +0 -0
  323. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/models/hash_test.py +0 -0
  324. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/models/measure_test.py +0 -0
  325. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/models/node_test.py +0 -0
  326. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/models/query_test.py +0 -0
  327. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/service_clients_test.py +0 -0
  328. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/__init__.py +0 -0
  329. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/dag_test.py +0 -0
  330. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/decompose_test.py +0 -0
  331. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/functions_test.py +0 -0
  332. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/__init__.py +0 -0
  333. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/backends/__init__.py +0 -0
  334. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/backends/types_test.py +0 -0
  335. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/__init__.py +0 -0
  336. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query1.sql +0 -0
  337. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query10.sql +0 -0
  338. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query11.sql +0 -0
  339. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query12.sql +0 -0
  340. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query13.sql +0 -0
  341. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query14.sql +0 -0
  342. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query15.sql +0 -0
  343. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query16.sql +0 -0
  344. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query17.sql +0 -0
  345. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query18.sql +0 -0
  346. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query19.sql +0 -0
  347. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query2.sql +0 -0
  348. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query20.sql +0 -0
  349. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query21.sql +0 -0
  350. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query22.sql +0 -0
  351. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query23.sql +0 -0
  352. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query24.sql +0 -0
  353. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query25.sql +0 -0
  354. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query26.sql +0 -0
  355. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query27.sql +0 -0
  356. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query28.sql +0 -0
  357. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query29.sql +0 -0
  358. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query3.sql +0 -0
  359. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query30.sql +0 -0
  360. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query31.sql +0 -0
  361. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query32.sql +0 -0
  362. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query33.sql +0 -0
  363. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query34.sql +0 -0
  364. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query35.sql +0 -0
  365. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query36.sql +0 -0
  366. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query37.sql +0 -0
  367. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query38.sql +0 -0
  368. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query39.sql +0 -0
  369. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query4.sql +0 -0
  370. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query40.sql +0 -0
  371. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query41.sql +0 -0
  372. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query42.sql +0 -0
  373. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query43.sql +0 -0
  374. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query44.sql +0 -0
  375. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query45.sql +0 -0
  376. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query46.sql +0 -0
  377. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query47.sql +0 -0
  378. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query48.sql +0 -0
  379. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query49.sql +0 -0
  380. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query5.sql +0 -0
  381. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query50.sql +0 -0
  382. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query51.sql +0 -0
  383. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query52.sql +0 -0
  384. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query53.sql +0 -0
  385. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query54.sql +0 -0
  386. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query55.sql +0 -0
  387. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query56.sql +0 -0
  388. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query57.sql +0 -0
  389. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query58.sql +0 -0
  390. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query59.sql +0 -0
  391. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query6.sql +0 -0
  392. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query60.sql +0 -0
  393. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query61.sql +0 -0
  394. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query62.sql +0 -0
  395. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query63.sql +0 -0
  396. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query64.sql +0 -0
  397. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query65.sql +0 -0
  398. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query66.sql +0 -0
  399. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query67.sql +0 -0
  400. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query68.sql +0 -0
  401. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query69.sql +0 -0
  402. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query7.sql +0 -0
  403. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query70.sql +0 -0
  404. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query71.sql +0 -0
  405. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query72.sql +0 -0
  406. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query73.sql +0 -0
  407. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query74.sql +0 -0
  408. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query75.sql +0 -0
  409. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query76.sql +0 -0
  410. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query77.sql +0 -0
  411. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query78.sql +0 -0
  412. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query79.sql +0 -0
  413. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query8.sql +0 -0
  414. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query80.sql +0 -0
  415. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query81.sql +0 -0
  416. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query82.sql +0 -0
  417. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query83.sql +0 -0
  418. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query84.sql +0 -0
  419. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query85.sql +0 -0
  420. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query86.sql +0 -0
  421. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query87.sql +0 -0
  422. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query88.sql +0 -0
  423. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query89.sql +0 -0
  424. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query9.sql +0 -0
  425. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query90.sql +0 -0
  426. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query91.sql +0 -0
  427. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query92.sql +0 -0
  428. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query93.sql +0 -0
  429. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query94.sql +0 -0
  430. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query95.sql +0 -0
  431. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query96.sql +0 -0
  432. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query97.sql +0 -0
  433. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query98.sql +0 -0
  434. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/ansi/query99.sql +0 -0
  435. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query1.sql +0 -0
  436. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query10.sql +0 -0
  437. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query11.sql +0 -0
  438. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query12.sql +0 -0
  439. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query13.sql +0 -0
  440. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query14.sql +0 -0
  441. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query15.sql +0 -0
  442. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query16.sql +0 -0
  443. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query17.sql +0 -0
  444. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query18.sql +0 -0
  445. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query19.sql +0 -0
  446. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query2.sql +0 -0
  447. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query20.sql +0 -0
  448. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query21.sql +0 -0
  449. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query22.sql +0 -0
  450. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query23.sql +0 -0
  451. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query24.sql +0 -0
  452. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query25.sql +0 -0
  453. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query26.sql +0 -0
  454. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query27.sql +0 -0
  455. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query28.sql +0 -0
  456. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query29.sql +0 -0
  457. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query3.sql +0 -0
  458. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query30.sql +0 -0
  459. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query31.sql +0 -0
  460. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query32.sql +0 -0
  461. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query33.sql +0 -0
  462. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query34.sql +0 -0
  463. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query35.sql +0 -0
  464. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query36.sql +0 -0
  465. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query37.sql +0 -0
  466. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query38.sql +0 -0
  467. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query39.sql +0 -0
  468. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query4.sql +0 -0
  469. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query40.sql +0 -0
  470. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query41.sql +0 -0
  471. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query42.sql +0 -0
  472. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query43.sql +0 -0
  473. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query44.sql +0 -0
  474. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query45.sql +0 -0
  475. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query46.sql +0 -0
  476. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query47.sql +0 -0
  477. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query48.sql +0 -0
  478. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query49.sql +0 -0
  479. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query5.sql +0 -0
  480. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query50.sql +0 -0
  481. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query51.sql +0 -0
  482. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query52.sql +0 -0
  483. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query53.sql +0 -0
  484. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query54.sql +0 -0
  485. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query55.sql +0 -0
  486. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query56.sql +0 -0
  487. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query57.sql +0 -0
  488. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query58.sql +0 -0
  489. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query59.sql +0 -0
  490. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query6.sql +0 -0
  491. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query60.sql +0 -0
  492. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query61.sql +0 -0
  493. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query62.sql +0 -0
  494. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query63.sql +0 -0
  495. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query64.sql +0 -0
  496. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query65.sql +0 -0
  497. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query66.sql +0 -0
  498. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query67.sql +0 -0
  499. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query68.sql +0 -0
  500. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query69.sql +0 -0
  501. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query7.sql +0 -0
  502. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query70.sql +0 -0
  503. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query71.sql +0 -0
  504. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query72.sql +0 -0
  505. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query73.sql +0 -0
  506. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query74.sql +0 -0
  507. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query75.sql +0 -0
  508. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query76.sql +0 -0
  509. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query77.sql +0 -0
  510. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query78.sql +0 -0
  511. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query79.sql +0 -0
  512. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query8.sql +0 -0
  513. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query80.sql +0 -0
  514. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query81.sql +0 -0
  515. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query82.sql +0 -0
  516. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query83.sql +0 -0
  517. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query84.sql +0 -0
  518. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query85.sql +0 -0
  519. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query86.sql +0 -0
  520. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query87.sql +0 -0
  521. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query88.sql +0 -0
  522. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query89.sql +0 -0
  523. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query9.sql +0 -0
  524. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query90.sql +0 -0
  525. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query91.sql +0 -0
  526. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query92.sql +0 -0
  527. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query93.sql +0 -0
  528. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query94.sql +0 -0
  529. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query95.sql +0 -0
  530. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query96.sql +0 -0
  531. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query97.sql +0 -0
  532. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query98.sql +0 -0
  533. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query99.sql +0 -0
  534. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/queries/tpcds/test_tpcds.py +0 -0
  535. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/parsing/test_ast.py +0 -0
  536. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/sql/utils.py +0 -0
  537. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/superset_test.py +0 -0
  538. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.dev0}/tests/transpilation_test.py +0 -0
  539. {datajunction_server-0.0.1a98.dev1 → datajunction_server-0.0.1a99.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.1a98.dev1
3
+ Version: 0.0.1a99.dev0
4
4
  Summary: DataJunction server library for running to a DataJunction server
5
5
  Project-URL: Homepage, https://datajunction.io
6
6
  Project-URL: Repository, https://github.com/DataJunction/dj
@@ -0,0 +1,5 @@
1
+ """
2
+ Version for Hatch
3
+ """
4
+
5
+ __version__ = "0.0.1a99.dev0"
@@ -201,6 +201,8 @@ async def get_query(
201
201
  engine: Optional[Engine] = None,
202
202
  access_control: Optional[access.AccessControlStore] = None,
203
203
  use_materialized: bool = True,
204
+ query_parameters: Optional[Dict[str, str]] = None,
205
+ ignore_errors: bool = True,
204
206
  ) -> ast.Query:
205
207
  """
206
208
  Get a query for a metric, dimensions, and filters
@@ -214,12 +216,14 @@ async def get_query(
214
216
  node.current, # type: ignore
215
217
  use_materialized=use_materialized,
216
218
  )
217
- query_ast = await (
219
+ if ignore_errors:
218
220
  query_builder.ignore_errors()
219
- .with_access_control(access_control)
221
+ query_ast = await (
222
+ query_builder.with_access_control(access_control)
220
223
  .with_build_criteria(build_criteria)
221
224
  .add_dimensions(dimensions)
222
225
  .add_filters(filters)
226
+ .add_query_parameters(query_parameters)
223
227
  .limit(limit)
224
228
  .order_by(orderby)
225
229
  .build()
@@ -605,6 +609,7 @@ async def build_sql_for_multiple_metrics(
605
609
  access_control: Optional[access.AccessControlStore] = None,
606
610
  ignore_errors: bool = True,
607
611
  use_materialized: bool = True,
612
+ query_parameters: Optional[Dict[str, str]] = None,
608
613
  ) -> Tuple[TranslatedSQL, Engine, Catalog]:
609
614
  """
610
615
  Build SQL for multiple metrics. Used by both /sql and /data endpoints
@@ -730,6 +735,7 @@ async def build_sql_for_multiple_metrics(
730
735
  limit=limit,
731
736
  access_control=access_control,
732
737
  ignore_errors=ignore_errors,
738
+ query_parameters=query_parameters,
733
739
  )
734
740
  columns = [
735
741
  assemble_column_metadata(col) # type: ignore
@@ -106,8 +106,8 @@ from datajunction_server.service_clients import QueryServiceClient
106
106
  from datajunction_server.sql.dag import (
107
107
  _node_output_options,
108
108
  get_dimensions,
109
+ get_dimensions_graph,
109
110
  get_downstream_nodes,
110
- get_filter_only_dimensions,
111
111
  get_upstream_nodes,
112
112
  )
113
113
  from datajunction_server.sql.parsing.backends.antlr4 import parse, parse_rule
@@ -1561,27 +1561,24 @@ async def list_all_dimension_attributes(
1561
1561
  *,
1562
1562
  depth: int = 30,
1563
1563
  session: AsyncSession = Depends(get_session),
1564
- ) -> List[DimensionAttributeOutput]:
1564
+ ) -> list[DimensionAttributeOutput]:
1565
1565
  """
1566
1566
  List all available dimension attributes for the given node.
1567
1567
  """
1568
- node = await Node.get_by_name(
1569
- session,
1570
- name,
1571
- options=[
1572
- joinedload(Node.current).options(
1573
- joinedload(NodeRevision.parents).options(joinedload(Node.current)),
1574
- ),
1575
- ],
1576
- )
1577
- dimensions = await get_dimensions(
1578
- session,
1579
- node, # type: ignore
1580
- with_attributes=True,
1581
- depth=depth,
1582
- )
1583
- filter_only_dimensions = await get_filter_only_dimensions(session, name)
1584
- return dimensions + filter_only_dimensions
1568
+ dims = await get_dimensions_graph(session, name)
1569
+ dimensions_map = {dim.id: dim for dim, _ in dims}
1570
+ return [
1571
+ DimensionAttributeOutput(
1572
+ name=f"{dim.name}.{col.name}",
1573
+ node_name=dim.name,
1574
+ node_display_name=dim.current.display_name,
1575
+ properties=[], # attribute_types.split(",") if attribute_types else [],
1576
+ type=str(col.type),
1577
+ path=[dimensions_map[int(node_id)].name for node_id in path],
1578
+ )
1579
+ for dim, path in dims
1580
+ for col in dim.current.columns
1581
+ ]
1585
1582
 
1586
1583
 
1587
1584
  @router.get(
@@ -2,10 +2,11 @@
2
2
  SQL related APIs.
3
3
  """
4
4
 
5
+ import json
5
6
  import logging
6
7
  from collections import OrderedDict
7
8
  from http import HTTPStatus
8
- from typing import List, Optional, Tuple, cast
9
+ from typing import Any, List, Optional, Tuple, cast
9
10
 
10
11
  from fastapi import BackgroundTasks, Depends, Query
11
12
  from sqlalchemy.ext.asyncio import AsyncSession
@@ -58,6 +59,7 @@ async def get_measures_sql_for_cube_v2(
58
59
  "subsequent queries are more efficient."
59
60
  ),
60
61
  ),
62
+ query_params: str = Query("{}", description="Query parameters"),
61
63
  *,
62
64
  include_all_columns: bool = Query(
63
65
  False,
@@ -106,6 +108,7 @@ async def get_measures_sql_for_cube_v2(
106
108
  sql_transpilation_library=settings.sql_transpilation_library,
107
109
  use_materialized=use_materialized,
108
110
  preagg_requested=preaggregate,
111
+ query_parameters=json.loads(query_params),
109
112
  )
110
113
  return measures_query
111
114
 
@@ -122,6 +125,7 @@ async def build_and_save_node_sql(
122
125
  access_control: AccessControlStore,
123
126
  ignore_errors: bool = True,
124
127
  use_materialized: bool = True,
128
+ query_parameters: dict[str, Any] | None = None,
125
129
  ) -> QueryRequest:
126
130
  """
127
131
  Build node SQL and save it to query requests
@@ -152,6 +156,7 @@ async def build_and_save_node_sql(
152
156
  engine_version=engine.version if engine else None,
153
157
  access_control=access_control,
154
158
  use_materialized=use_materialized,
159
+ query_parameters=query_parameters,
155
160
  )
156
161
  # We save the request for both the cube and the metrics, so that if someone makes either
157
162
  # of these types of requests, they'll go to the cached query
@@ -160,6 +165,8 @@ async def build_and_save_node_sql(
160
165
  ([node_name], QueryBuildType.NODE),
161
166
  ]
162
167
  for nodes, query_type in requests_to_save:
168
+ if query_parameters:
169
+ continue # pragma: no cover
163
170
  request = await QueryRequest.save_query_request(
164
171
  session=session,
165
172
  nodes=nodes,
@@ -190,6 +197,7 @@ async def build_and_save_node_sql(
190
197
  access_control=access_control,
191
198
  ignore_errors=ignore_errors,
192
199
  use_materialized=use_materialized,
200
+ query_parameters=query_parameters,
193
201
  )
194
202
  query = translated_sql.sql
195
203
  columns = translated_sql.columns
@@ -204,6 +212,8 @@ async def build_and_save_node_sql(
204
212
  engine=engine,
205
213
  access_control=access_control,
206
214
  use_materialized=use_materialized,
215
+ query_parameters=query_parameters,
216
+ ignore_errors=ignore_errors,
207
217
  )
208
218
  columns = [
209
219
  assemble_column_metadata(col) # type: ignore
@@ -242,6 +252,7 @@ async def get_node_sql(
242
252
  background_tasks: BackgroundTasks,
243
253
  ignore_errors: bool = True,
244
254
  use_materialized: bool = True,
255
+ query_parameters: dict[str, Any] | None = None,
245
256
  ) -> Tuple[TranslatedSQL, QueryRequest]:
246
257
  """
247
258
  Return SQL for a node.
@@ -283,6 +294,7 @@ async def get_node_sql(
283
294
  engine=engine,
284
295
  access_control=access_control,
285
296
  use_materialized=use_materialized,
297
+ query_parameters=query_parameters,
286
298
  )
287
299
  return (
288
300
  TranslatedSQL(
@@ -304,6 +316,7 @@ async def get_node_sql(
304
316
  access_control=access_control,
305
317
  ignore_errors=ignore_errors,
306
318
  use_materialized=use_materialized,
319
+ query_parameters=query_parameters,
307
320
  )
308
321
  return (
309
322
  TranslatedSQL(
@@ -326,6 +339,7 @@ async def get_sql(
326
339
  filters: List[str] = Query([]),
327
340
  orderby: List[str] = Query([]),
328
341
  limit: Optional[int] = None,
342
+ query_params: str = Query("{}", description="Query parameters"),
329
343
  *,
330
344
  session: AsyncSession = Depends(get_session),
331
345
  engine_name: Optional[str] = None,
@@ -355,6 +369,7 @@ async def get_sql(
355
369
  background_tasks=background_tasks,
356
370
  ignore_errors=ignore_errors, # type: ignore
357
371
  use_materialized=use_materialized, # type: ignore
372
+ query_parameters=json.loads(query_params),
358
373
  )
359
374
  return translated_sql
360
375
 
@@ -366,6 +381,7 @@ async def get_sql_for_metrics(
366
381
  filters: List[str] = Query([]),
367
382
  orderby: List[str] = Query([]),
368
383
  limit: Optional[int] = None,
384
+ query_params: str = Query("{}", description="Query parameters"),
369
385
  *,
370
386
  session: AsyncSession = Depends(get_session),
371
387
  engine_name: Optional[str] = None,
@@ -402,19 +418,21 @@ async def get_sql_for_metrics(
402
418
  http_status_code=HTTPStatus.UNPROCESSABLE_ENTITY,
403
419
  )
404
420
 
405
- if query_request := await QueryRequest.get_query_request(
406
- session,
407
- nodes=metrics,
408
- dimensions=dimensions,
409
- filters=filters,
410
- orderby=orderby,
411
- limit=limit,
412
- engine_name=engine_name,
413
- engine_version=engine_version,
414
- query_type=QueryBuildType.METRICS,
415
- ):
421
+ if (
422
+ query_request := await QueryRequest.get_query_request(
423
+ session,
424
+ nodes=metrics,
425
+ dimensions=dimensions,
426
+ filters=filters,
427
+ orderby=orderby,
428
+ limit=limit,
429
+ engine_name=engine_name,
430
+ engine_version=engine_version,
431
+ query_type=QueryBuildType.METRICS,
432
+ )
433
+ ) and not query_params:
416
434
  # Update the node SQL in a background task to keep it up-to-date
417
- background_tasks.add_task(
435
+ background_tasks.add_task( # pragma: no cover
418
436
  build_and_save_sql_for_metrics,
419
437
  session=session,
420
438
  metrics=metrics,
@@ -427,13 +445,14 @@ async def get_sql_for_metrics(
427
445
  access_control=access_control,
428
446
  ignore_errors=ignore_errors,
429
447
  use_materialized=use_materialized,
448
+ query_parameters=json.loads(query_params),
430
449
  )
431
- engine = (
450
+ engine = ( # pragma: no cover
432
451
  await get_engine(session, engine_name, engine_version) # type: ignore
433
452
  if engine_name
434
453
  else None
435
454
  )
436
- return TranslatedSQL(
455
+ return TranslatedSQL( # pragma: no cover
437
456
  sql=query_request.query,
438
457
  columns=query_request.columns,
439
458
  dialect=engine.dialect if engine else None,
@@ -451,6 +470,7 @@ async def get_sql_for_metrics(
451
470
  access_control,
452
471
  ignore_errors=ignore_errors, # type: ignore
453
472
  use_materialized=use_materialized, # type: ignore
473
+ query_parameters=json.loads(query_params),
454
474
  )
455
475
 
456
476
 
@@ -466,6 +486,7 @@ async def build_and_save_sql_for_metrics(
466
486
  access_control: Optional[access.AccessControlStore] = None,
467
487
  ignore_errors: bool = True,
468
488
  use_materialized: bool = True,
489
+ query_parameters: dict[str, Any] | None = None,
469
490
  ):
470
491
  """
471
492
  Builds and saves SQL for metrics.
@@ -482,6 +503,7 @@ async def build_and_save_sql_for_metrics(
482
503
  access_control,
483
504
  ignore_errors=ignore_errors, # type: ignore
484
505
  use_materialized=use_materialized, # type: ignore
506
+ query_parameters=query_parameters,
485
507
  )
486
508
 
487
509
  await QueryRequest.save_query_request(
@@ -4,7 +4,7 @@ import collections
4
4
  import logging
5
5
  import os
6
6
  from concurrent.futures import ThreadPoolExecutor
7
- from typing import DefaultDict, List, Optional, Set, Tuple
7
+ from typing import Any, DefaultDict, List, Optional, Set, Tuple
8
8
 
9
9
  from sqlalchemy.ext.asyncio import AsyncSession
10
10
 
@@ -164,6 +164,7 @@ async def build_metric_nodes(
164
164
  build_criteria: Optional[BuildCriteria] = None,
165
165
  access_control: Optional[access.AccessControlStore] = None,
166
166
  ignore_errors: bool = True,
167
+ query_parameters: Optional[dict[str, Any]] = None,
167
168
  ):
168
169
  """
169
170
  Build a single query for all metrics in the list, including the specified
@@ -195,6 +196,7 @@ async def build_metric_nodes(
195
196
  builder = (
196
197
  builder.add_filters(filters)
197
198
  .add_dimensions(dimensions)
199
+ .add_query_parameters(query_parameters)
198
200
  .order_by(orderby)
199
201
  .limit(limit)
200
202
  .with_build_criteria(build_criteria)
@@ -104,6 +104,7 @@ async def get_measures_query(
104
104
  sql_transpilation_library: Optional[str] = None,
105
105
  use_materialized: bool = True,
106
106
  preagg_requested: bool = False,
107
+ query_parameters: dict[str, Any] = None,
107
108
  ) -> List[GeneratedSQL]:
108
109
  """
109
110
  Builds the measures SQL for a set of metrics with dimensions and filters.
@@ -185,6 +186,7 @@ async def get_measures_query(
185
186
  .with_build_criteria(build_criteria)
186
187
  .add_dimensions(dimensions)
187
188
  .add_filters(filters)
189
+ .add_query_parameters(query_parameters)
188
190
  .order_by(orderby)
189
191
  .build()
190
192
  )
@@ -380,6 +382,7 @@ class QueryBuilder:
380
382
  self.use_materialized = use_materialized
381
383
 
382
384
  self._filters: List[str] = []
385
+ self._parameters: dict[str, ast.Value] = {}
383
386
  self._required_dimensions: List[str] = [
384
387
  required.name for required in self.node_revision.required_dimensions
385
388
  ]
@@ -439,6 +442,18 @@ class QueryBuilder:
439
442
  self.filter_by(filter_)
440
443
  return self
441
444
 
445
+ def add_query_parameters(
446
+ self,
447
+ query_parameters: dict[str, ast.Value | Any] | None = None,
448
+ ):
449
+ """Add parameters to the query builder."""
450
+ for param, value in (query_parameters or {}).items():
451
+ self._parameters[param] = QueryBuilder.normalize_query_param_value(
452
+ param,
453
+ value,
454
+ )
455
+ return self
456
+
442
457
  def add_dimension(self, dimension: str):
443
458
  """Add dimension to the query builder."""
444
459
  if (
@@ -499,6 +514,13 @@ class QueryBuilder:
499
514
  """All filters"""
500
515
  return self._filters
501
516
 
517
+ @property
518
+ def parameters(self) -> dict[str, ast.Value]:
519
+ """
520
+ Extracts parameters from relevant filters
521
+ """
522
+ return self._parameters
523
+
502
524
  @property
503
525
  def filter_asts(self) -> List[ast.Expression]:
504
526
  """
@@ -593,6 +615,18 @@ class QueryBuilder:
593
615
  order=order,
594
616
  )
595
617
 
618
+ # Replace any parameters in the final AST with their values
619
+ for param in self.final_ast.find_all(ast.QueryParameter): # type: ignore
620
+ if param.name in self.parameters and param.parent:
621
+ param.parent.replace(param, self.parameters[param.name])
622
+ else:
623
+ self.errors.append(
624
+ DJQueryBuildError(
625
+ code=ErrorCode.MISSING_PARAMETER,
626
+ message=f"Missing value for parameter: {param.name}",
627
+ ),
628
+ )
629
+
596
630
  # Error validation
597
631
  self.validate_access()
598
632
  if self.errors and not self._ignore_errors:
@@ -860,6 +894,24 @@ class QueryBuilder:
860
894
  dimension_node_joins[dim_node].requested_dimensions.append(dim)
861
895
  return dimension_node_joins
862
896
 
897
+ @classmethod
898
+ def normalize_query_param_value(cls, param: str, value: ast.Value | Any):
899
+ match value:
900
+ case ast.Value():
901
+ return value
902
+ case bool():
903
+ return ast.Boolean(value)
904
+ case int() | float():
905
+ return ast.Number(value)
906
+ case None:
907
+ return ast.Null()
908
+ case str():
909
+ return ast.String(f"'{value}'")
910
+ case _:
911
+ raise TypeError(
912
+ f"Unsupported parameter type: {type(value)} for param {param}",
913
+ )
914
+
863
915
 
864
916
  class CubeQueryBuilder:
865
917
  """
@@ -888,6 +940,7 @@ class CubeQueryBuilder:
888
940
  self._dimensions: List[str] = []
889
941
  self._orderby: List[str] = []
890
942
  self._limit: Optional[int] = None
943
+ self._parameters: dict[str, ast.Value] = {}
891
944
  self._build_criteria: Optional[BuildCriteria] = self.get_default_criteria()
892
945
  self._access_control: Optional[access.AccessControlStore] = None
893
946
  self._ignore_errors: bool = False
@@ -968,6 +1021,15 @@ class CubeQueryBuilder:
968
1021
  self.add_dimension(dimension)
969
1022
  return self
970
1023
 
1024
+ def add_query_parameters(self, query_parameters: dict[str, Any] | None = None):
1025
+ """Add parameters to the query builder."""
1026
+ for param, value in (query_parameters or {}).items():
1027
+ self._parameters[param] = QueryBuilder.normalize_query_param_value(
1028
+ param,
1029
+ value,
1030
+ )
1031
+ return self
1032
+
971
1033
  def order_by(self, orderby: Optional[Union[str, List[str]]] = None):
972
1034
  """Set order by for the query builder."""
973
1035
  if isinstance(orderby, str):
@@ -1013,6 +1075,13 @@ class CubeQueryBuilder:
1013
1075
  """All filters"""
1014
1076
  return self._filters
1015
1077
 
1078
+ @property
1079
+ def parameters(self) -> dict[str, ast.Value]:
1080
+ """
1081
+ Extracts parameters from relevant filters
1082
+ """
1083
+ return self._parameters
1084
+
1016
1085
  async def build(self) -> ast.Query:
1017
1086
  """
1018
1087
  Builds SQL for multiple metrics with the requested set of dimensions,
@@ -1119,6 +1188,7 @@ class CubeQueryBuilder:
1119
1188
  .with_build_criteria(self._build_criteria)
1120
1189
  .add_dimensions(self.dimensions)
1121
1190
  .add_filters(self.filters)
1191
+ .add_query_parameters(self.parameters)
1122
1192
  .build()
1123
1193
  )
1124
1194
  self.errors.extend(query_builder.errors)
@@ -40,6 +40,7 @@ class ErrorCode(IntEnum):
40
40
  COMPOUND_BUILD_EXCEPTION = 300
41
41
  MISSING_PARENT = 301
42
42
  TYPE_INFERENCE = 302
43
+ MISSING_PARAMETER = 303
43
44
 
44
45
  # Authentication
45
46
  AUTHENTICATION_ERROR = 400
@@ -580,11 +580,11 @@ class DimensionAttributeOutput(BaseModel):
580
580
  """
581
581
 
582
582
  name: str
583
- node_name: Optional[str]
584
- node_display_name: Optional[str]
583
+ node_name: str | None
584
+ node_display_name: str | None
585
585
  properties: list[str] | None
586
- type: str
587
- path: List[str]
586
+ type: str | None
587
+ path: list[str]
588
588
  filter_only: bool = False
589
589
 
590
590
 
@@ -9,6 +9,7 @@ from sqlalchemy import and_, func, join, literal, or_, select
9
9
  from sqlalchemy.ext.asyncio import AsyncSession
10
10
  from sqlalchemy.orm import aliased, contains_eager, joinedload, selectinload
11
11
  from sqlalchemy.sql.operators import is_
12
+ from sqlalchemy.dialects.postgresql import array
12
13
 
13
14
  from datajunction_server.database.attributetype import AttributeType, ColumnAttribute
14
15
  from datajunction_server.database.column import Column
@@ -226,6 +227,95 @@ async def get_upstream_nodes(
226
227
  ]
227
228
 
228
229
 
230
+ async def get_dimensions_graph(
231
+ session: AsyncSession,
232
+ node_name: str,
233
+ node_type: NodeType = None,
234
+ include_deactivated: bool = True,
235
+ ) -> list[tuple[Node, list[str]]]:
236
+ """
237
+ Gets all upstreams of the given node, filterable by node type.
238
+ Uses a recursive CTE query to build out all parents of the node.
239
+ """
240
+ node = (
241
+ (
242
+ await session.execute(
243
+ select(Node)
244
+ .where(
245
+ (Node.name == node_name) & (is_(Node.deactivated_at, None)),
246
+ )
247
+ .options(joinedload(Node.current)),
248
+ )
249
+ )
250
+ .unique()
251
+ .scalar()
252
+ )
253
+ if not node:
254
+ raise DJDoesNotExistException( # pragma: no cover
255
+ message=f"Node with name {node_name} does not exist",
256
+ )
257
+
258
+ dag = (
259
+ (
260
+ select(
261
+ DimensionLink.node_revision_id,
262
+ NodeRevision.id,
263
+ NodeRevision.node_id,
264
+ array([NodeRevision.node_id]).label("join_path"), # start path
265
+ )
266
+ .where(DimensionLink.node_revision_id == node.current.id)
267
+ .join(Node, DimensionLink.dimension_id == Node.id)
268
+ .join(
269
+ NodeRevision,
270
+ (Node.id == NodeRevision.node_id)
271
+ & (Node.current_version == NodeRevision.version),
272
+ )
273
+ )
274
+ .cte("dimensions", recursive=True)
275
+ .suffix_with(
276
+ "CYCLE node_id SET is_cycle USING path",
277
+ )
278
+ )
279
+
280
+ paths = dag.union_all(
281
+ select(
282
+ dag.c.node_revision_id,
283
+ NodeRevision.id,
284
+ NodeRevision.node_id,
285
+ func.array_cat(dag.c.join_path, array([NodeRevision.node_id])).label(
286
+ "join_path",
287
+ ),
288
+ )
289
+ .join(DimensionLink, dag.c.id == DimensionLink.node_revision_id)
290
+ .join(Node, DimensionLink.dimension_id == Node.id)
291
+ .join(
292
+ NodeRevision,
293
+ (Node.id == NodeRevision.node_id)
294
+ & (Node.current_version == NodeRevision.version),
295
+ ),
296
+ )
297
+
298
+ node_selector = select(Node, paths.c.join_path)
299
+ if not include_deactivated:
300
+ node_selector = node_selector.where(is_(Node.deactivated_at, None))
301
+ statement = (
302
+ node_selector.join(paths, paths.c.node_id == Node.id)
303
+ .join(
304
+ NodeRevision,
305
+ (Node.current_version == NodeRevision.version)
306
+ & (Node.id == NodeRevision.node_id),
307
+ )
308
+ .options(*_node_output_options())
309
+ )
310
+ results = await session.execute(statement)
311
+ rows = results.all()
312
+ return [
313
+ (node, path)
314
+ for node, path in rows
315
+ if node.type == node_type or node_type is None
316
+ ]
317
+
318
+
229
319
  async def get_dimensions_dag(
230
320
  session: AsyncSession,
231
321
  node_revision: NodeRevision,
@@ -9,6 +9,7 @@ from dataclasses import dataclass, field, fields
9
9
  from enum import Enum
10
10
  from functools import reduce
11
11
  from itertools import chain, zip_longest
12
+ import re
12
13
  from typing import (
13
14
  Any,
14
15
  Callable,
@@ -2603,6 +2604,35 @@ class SelectExpression(Aliasable, Expression):
2603
2604
  return {col.alias_or_name.name: col for col in self.projection}
2604
2605
 
2605
2606
 
2607
+ @dataclass(eq=False)
2608
+ class QueryParameter(Expression):
2609
+ """
2610
+ Represents a query parameter that can be substituted in a query
2611
+ """
2612
+
2613
+ name: str
2614
+ prefix: str = ":"
2615
+ quote_style: str = ""
2616
+ _type: Optional["ColumnType"] = field(repr=False, default=None)
2617
+
2618
+ def __str__(self) -> str:
2619
+ return self.identifier(quotes=True)
2620
+
2621
+ def identifier(self, quotes: bool = True) -> str:
2622
+ """
2623
+ The full parameter name, including the prefix and quotes
2624
+ """
2625
+ quote_style = "" if not quotes else self.quote_style
2626
+ return f"{self.prefix}{quote_style}{self.name}{quote_style}"
2627
+
2628
+ @property
2629
+ def type(self) -> ColumnType:
2630
+ """
2631
+ The type of the parameter
2632
+ """
2633
+ return self._type if self._type else StringType()
2634
+
2635
+
2606
2636
  class Select(SelectExpression):
2607
2637
  """
2608
2638
  A single select statement type
@@ -3,6 +3,7 @@ import copy
3
3
  import inspect
4
4
  import logging
5
5
  from functools import lru_cache
6
+ import re
6
7
  from typing import TYPE_CHECKING, List, Optional, Tuple, Union, cast
7
8
 
8
9
  import antlr4
@@ -656,6 +657,16 @@ def _(ctx: sbp.NumericLiteralContext):
656
657
  return ast.Number(ctx.number().getText())
657
658
 
658
659
 
660
+ @visit.register
661
+ def _(ctx: sbp.ParameterLiteralContext):
662
+ raw = ctx.getText()
663
+ match = re.match(r'^:("?`?)([\w.]+)(`?"?)$', raw)
664
+ if not match:
665
+ raise ValueError(f"Invalid query parameter format: {raw}")
666
+ param_name = match.group(2)
667
+ return ast.QueryParameter(name=param_name, quote_style=match.group(3))
668
+
669
+
659
670
  @visit.register
660
671
  def _(ctx: sbp.StringLitContext):
661
672
  if string := ctx.STRING():