datajunction-server 0.0.1a75__tar.gz → 0.0.1a76.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 (509) hide show
  1. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/PKG-INFO +1 -1
  2. datajunction_server-0.0.1a76.dev0/datajunction_server/__about__.py +4 -0
  3. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/helpers.py +2 -2
  4. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/construction/build_v2.py +51 -41
  5. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/dimensionlink.py +5 -3
  6. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/metric.py +7 -0
  7. datajunction_server-0.0.1a76.dev0/datajunction_server/sql/decompose.py +172 -0
  8. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/parsing/ast.py +14 -1
  9. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/parsing/backends/antlr4.py +20 -1
  10. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/utils.py +17 -0
  11. datajunction_server-0.0.1a76.dev0/tests/sql/decompose_test.py +565 -0
  12. datajunction_server-0.0.1a75/datajunction_server/__about__.py +0 -4
  13. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/.coveragerc +0 -0
  14. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/.env +0 -0
  15. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/.env.integration +0 -0
  16. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/.flake8 +0 -0
  17. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/.gitignore +0 -0
  18. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/.isort.cfg +0 -0
  19. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/.pre-commit-config.yaml +0 -0
  20. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/.pylintrc +0 -0
  21. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/Dockerfile +0 -0
  22. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/Makefile +0 -0
  23. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/README.md +0 -0
  24. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/README +0 -0
  25. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/env.py +0 -0
  26. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/script.py.mako +0 -0
  27. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/versions/2023_12_20_1829-724445d2b29d_initial_migration.py +0 -0
  28. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/versions/2024_01_08_2034-945d44abcd32_add_dimension_links.py +0 -0
  29. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/versions/2024_01_11_2032-c74b11566d82_add_column_order.py +0 -0
  30. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/versions/2024_01_18_2011-20f060b02772_switch_enum_values.py +0 -0
  31. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/versions/2024_01_23_0617-c9cef8864ecb_add_missing_table_attribute_to_source_.py +0 -0
  32. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/versions/2024_01_23_1655-a8e22109be24_availability_state_s_valid_through_ts_.py +0 -0
  33. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/versions/2024_02_22_0713-d61fb7e48cc3_cascade_deletes_to_dimension_links.py +0 -0
  34. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/versions/2024_04_30_1556-de7ec1c82fe0_add_query_requests.py +0 -0
  35. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/versions/2024_05_09_1420-9b1227ff17f4_update_backfill_spec.py +0 -0
  36. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/versions/2024_05_21_0012-57fc93ef6947_add_query_id_to_queryrequest.py +0 -0
  37. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/versions/2024_06_21_1301-640a814db2d8_add_collection_tables.py +0 -0
  38. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/versions/2024_07_12_0348-34171c92dd6d_set_user_username_to_be_unique.py +0 -0
  39. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/versions/2024_08_18_0036-f3c9b40deb6f_add_create_by_to_nodes_node_revisions_.py +0 -0
  40. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/versions/2024_10_24_0015-4d6ab789e456_add_a_map_of_links_to_availability_state.py +0 -0
  41. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic/versions/2024_10_26_0340-70904373eab3_add_indexes_on_history_and_node_tables.py +0 -0
  42. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/alembic.ini +0 -0
  43. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/__init__.py +0 -0
  44. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/__init__.py +0 -0
  45. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/access/authentication/__init__.py +0 -0
  46. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/access/authentication/basic.py +0 -0
  47. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/access/authentication/github.py +0 -0
  48. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/access/authentication/google.py +0 -0
  49. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/access/authentication/whoami.py +0 -0
  50. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/attributes.py +0 -0
  51. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/catalogs.py +0 -0
  52. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/client.py +0 -0
  53. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/collection.py +0 -0
  54. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/cubes.py +0 -0
  55. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/data.py +0 -0
  56. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/dimensions.py +0 -0
  57. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/djsql.py +0 -0
  58. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/engines.py +0 -0
  59. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/graphql/__init__.py +0 -0
  60. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/graphql/catalogs.py +0 -0
  61. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/graphql/engines.py +0 -0
  62. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/graphql/main.py +0 -0
  63. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/graphql/resolvers/__init__.py +0 -0
  64. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/graphql/resolvers/nodes.py +0 -0
  65. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/graphql/scalars/__init__.py +0 -0
  66. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/graphql/scalars/availabilitystate.py +0 -0
  67. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/graphql/scalars/catalog_engine.py +0 -0
  68. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/graphql/scalars/column.py +0 -0
  69. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/graphql/scalars/materialization.py +0 -0
  70. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/graphql/scalars/metricmetadata.py +0 -0
  71. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/graphql/scalars/node.py +0 -0
  72. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/graphql/scalars/user.py +0 -0
  73. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/graphql/utils.py +0 -0
  74. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/health.py +0 -0
  75. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/history.py +0 -0
  76. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/logging.conf +0 -0
  77. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/main.py +0 -0
  78. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/materializations.py +0 -0
  79. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/measures.py +0 -0
  80. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/metrics.py +0 -0
  81. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/namespaces.py +0 -0
  82. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/nodes.py +0 -0
  83. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/notification.py +0 -0
  84. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/sql.py +0 -0
  85. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/tags.py +0 -0
  86. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/api/users.py +0 -0
  87. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/config.py +0 -0
  88. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/constants.py +0 -0
  89. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/construction/__init__.py +0 -0
  90. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/construction/build.py +0 -0
  91. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/construction/dimensions.py +0 -0
  92. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/construction/dj_query.py +0 -0
  93. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/construction/exceptions.py +0 -0
  94. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/construction/utils.py +0 -0
  95. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/__init__.py +0 -0
  96. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/attributetype.py +0 -0
  97. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/availabilitystate.py +0 -0
  98. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/backfill.py +0 -0
  99. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/base.py +0 -0
  100. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/catalog.py +0 -0
  101. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/collection.py +0 -0
  102. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/column.py +0 -0
  103. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/database.py +0 -0
  104. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/engine.py +0 -0
  105. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/history.py +0 -0
  106. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/materialization.py +0 -0
  107. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/measure.py +0 -0
  108. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/metricmetadata.py +0 -0
  109. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/namespace.py +0 -0
  110. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/node.py +0 -0
  111. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/partition.py +0 -0
  112. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/queryrequest.py +0 -0
  113. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/tag.py +0 -0
  114. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/database/user.py +0 -0
  115. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/enum.py +0 -0
  116. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/errors.py +0 -0
  117. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/__init__.py +0 -0
  118. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/access/__init__.py +0 -0
  119. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/access/authentication/__init__.py +0 -0
  120. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/access/authentication/basic.py +0 -0
  121. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/access/authentication/github.py +0 -0
  122. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/access/authentication/google.py +0 -0
  123. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/access/authentication/http.py +0 -0
  124. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/access/authentication/tokens.py +0 -0
  125. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/access/authorization.py +0 -0
  126. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/client.py +0 -0
  127. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/engines.py +0 -0
  128. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/materializations.py +0 -0
  129. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/namespaces.py +0 -0
  130. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/nodes.py +0 -0
  131. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/templates/client_setup.j2 +0 -0
  132. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/templates/create_cube.j2 +0 -0
  133. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/templates/create_dimension.j2 +0 -0
  134. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/templates/create_metric.j2 +0 -0
  135. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/templates/create_transform.j2 +0 -0
  136. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/templates/link_dimension.j2 +0 -0
  137. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/templates/namespace_mapping.j2 +0 -0
  138. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/templates/register_table.j2 +0 -0
  139. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/templates/set_column_attributes.j2 +0 -0
  140. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/internal/validation.py +0 -0
  141. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/materialization/__init__.py +0 -0
  142. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/materialization/jobs/__init__.py +0 -0
  143. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/materialization/jobs/cube_materialization.py +0 -0
  144. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/materialization/jobs/job_types.py +0 -0
  145. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/materialization/jobs/materialization_job.py +0 -0
  146. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/__init__.py +0 -0
  147. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/access.py +0 -0
  148. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/attribute.py +0 -0
  149. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/base.py +0 -0
  150. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/catalog.py +0 -0
  151. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/collection.py +0 -0
  152. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/column.py +0 -0
  153. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/cube.py +0 -0
  154. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/database.py +0 -0
  155. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/dimensionlink.py +0 -0
  156. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/engine.py +0 -0
  157. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/history.py +0 -0
  158. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/materialization.py +0 -0
  159. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/measure.py +0 -0
  160. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/node.py +0 -0
  161. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/node_type.py +0 -0
  162. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/partition.py +0 -0
  163. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/query.py +0 -0
  164. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/sql.py +0 -0
  165. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/table.py +0 -0
  166. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/tag.py +0 -0
  167. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/models/user.py +0 -0
  168. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/naming.py +0 -0
  169. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/service_clients.py +0 -0
  170. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/__init__.py +0 -0
  171. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/dag.py +0 -0
  172. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/functions.py +0 -0
  173. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/parsing/__init__.py +0 -0
  174. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/parsing/backends/__init__.py +0 -0
  175. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/parsing/backends/exceptions.py +0 -0
  176. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/parsing/backends/grammar/SqlBaseLexer.g4 +0 -0
  177. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/parsing/backends/grammar/SqlBaseParser.g4 +0 -0
  178. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/parsing/backends/grammar/__init__.py +0 -0
  179. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseLexer.interp +0 -0
  180. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseLexer.py +0 -0
  181. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseLexer.tokens +0 -0
  182. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParser.interp +0 -0
  183. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParser.py +0 -0
  184. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParser.tokens +0 -0
  185. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParserListener.py +0 -0
  186. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParserVisitor.py +0 -0
  187. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/sql/parsing/types.py +0 -0
  188. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/superset.py +0 -0
  189. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/transpilation.py +0 -0
  190. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/datajunction_server/typing.py +0 -0
  191. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/pdm.lock +0 -0
  192. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/pyproject.toml +0 -0
  193. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/requirements/docker.txt +0 -0
  194. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/requirements/test.txt +0 -0
  195. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/scripts/docs-snippets.js +0 -0
  196. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/scripts/docs-snippets.sh +0 -0
  197. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/scripts/generate-openapi.py +0 -0
  198. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/__init__.py +0 -0
  199. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/__init__.py +0 -0
  200. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/access_test.py +0 -0
  201. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/attributes_test.py +0 -0
  202. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/catalog_test.py +0 -0
  203. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/client_test.py +0 -0
  204. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/collections_test.py +0 -0
  205. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/cubes_test.py +0 -0
  206. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/data_test.py +0 -0
  207. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/dimension_links_test.py +0 -0
  208. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/dimensions_access_test.py +0 -0
  209. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/dimensions_test.py +0 -0
  210. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/djql_test.py +0 -0
  211. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/engine_test.py +0 -0
  212. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/client_test/create_cube.repairs_cube.namespace.txt +0 -0
  213. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/client_test/create_cube.repairs_cube.txt +0 -0
  214. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/client_test/create_dimension.repair_order.namespace.txt +0 -0
  215. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/client_test/create_dimension.repair_order.txt +0 -0
  216. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/client_test/create_metric.num_repair_orders.namespace.txt +0 -0
  217. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/client_test/create_metric.num_repair_orders.txt +0 -0
  218. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/client_test/create_transform.regional_level_agg.namespace.txt +0 -0
  219. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/client_test/create_transform.regional_level_agg.txt +0 -0
  220. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/client_test/dimension_links.repair_orders.namespace.txt +0 -0
  221. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/client_test/dimension_links.repair_orders.txt +0 -0
  222. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/client_test/include_client_setup.txt +0 -0
  223. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/client_test/notebook.create_cube.txt +0 -0
  224. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/client_test/notebook.create_transform.txt +0 -0
  225. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/client_test/notebook.link_dimension.txt +0 -0
  226. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/client_test/notebook.set_attribute.txt +0 -0
  227. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/client_test/register_table.txt +0 -0
  228. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/druid_measures_cube.full.druid_spec.json +0 -0
  229. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/druid_measures_cube.full.partition.druid_spec.json +0 -0
  230. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/druid_measures_cube.full.partition.query.sql +0 -0
  231. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/druid_measures_cube.full.query.sql +0 -0
  232. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/druid_measures_cube.incremental.categorical.query.sql +0 -0
  233. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/druid_measures_cube.incremental.druid_spec.json +0 -0
  234. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/druid_measures_cube.incremental.patched.query.sql +0 -0
  235. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/druid_measures_cube.incremental.query.sql +0 -0
  236. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/druid_metrics_cube.incremental.categorical.query.sql +0 -0
  237. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/druid_metrics_cube.incremental.druid_spec.json +0 -0
  238. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/druid_metrics_cube.incremental.query.sql +0 -0
  239. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/spark_sql.full.config.json +0 -0
  240. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/spark_sql.full.materializations.json +0 -0
  241. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/spark_sql.full.partition.config.json +0 -0
  242. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/spark_sql.full.partition.materializations.json +0 -0
  243. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/spark_sql.full.partition.query.sql +0 -0
  244. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/spark_sql.full.query.sql +0 -0
  245. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/spark_sql.incremental.additional.query.sql +0 -0
  246. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/spark_sql.incremental.categorical.query.sql +0 -0
  247. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/spark_sql.incremental.config.json +0 -0
  248. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/spark_sql.incremental.lookback.query.sql +0 -0
  249. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/files/materializations_test/spark_sql.incremental.query.sql +0 -0
  250. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/graphql/__init__.py +0 -0
  251. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/graphql/catalog_test.py +0 -0
  252. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/graphql/engine_test.py +0 -0
  253. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/graphql/find_nodes_test.py +0 -0
  254. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/health_test.py +0 -0
  255. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/helpers_test.py +0 -0
  256. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/history_test.py +0 -0
  257. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/materializations_test.py +0 -0
  258. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/measures_test.py +0 -0
  259. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/metrics_test.py +0 -0
  260. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/namespaces_test.py +0 -0
  261. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/nodes_test.py +0 -0
  262. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/nodes_update_test.py +0 -0
  263. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/notification_test.py +0 -0
  264. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/routers_test.py +0 -0
  265. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/sql_test.py +0 -0
  266. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/sql_v2_test.py +0 -0
  267. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/tags_test.py +0 -0
  268. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/api/users_test.py +0 -0
  269. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/conftest.py +0 -0
  270. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/construction/__init__.py +0 -0
  271. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/construction/build_test.py +0 -0
  272. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/construction/build_v2_test.py +11 -11
  273. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/construction/compile_test.py +0 -0
  274. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/construction/exceptions_test.py +0 -0
  275. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/construction/fixtures.py +0 -0
  276. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/construction/inference_test.py +0 -0
  277. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/construction/utils_test.py +0 -0
  278. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/default.duckdb +0 -0
  279. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/duckdb.sql +0 -0
  280. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/errors_test.py +0 -0
  281. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/examples.py +0 -0
  282. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/integration/__init__.py +0 -0
  283. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/integration/basic_test.py +0 -0
  284. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/internal/authentication/basic_test.py +0 -0
  285. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/internal/authentication/github_test.py +0 -0
  286. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/internal/authentication/http_test.py +0 -0
  287. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/internal/authentication/token_test.py +0 -0
  288. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/internal/authentication/whoami_test.py +0 -0
  289. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/migrations_test.py +0 -0
  290. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/models/__init__.py +0 -0
  291. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/models/catalog_test.py +0 -0
  292. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/models/hash_test.py +0 -0
  293. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/models/measure_test.py +0 -0
  294. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/models/node_test.py +0 -0
  295. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/models/query_test.py +0 -0
  296. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/pytest.ini +0 -0
  297. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/service_clients_test.py +0 -0
  298. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/__init__.py +0 -0
  299. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/dag_test.py +0 -0
  300. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/functions_test.py +0 -0
  301. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/__init__.py +0 -0
  302. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/backends/__init__.py +0 -0
  303. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/backends/antlr4_test.py +0 -0
  304. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/backends/types_test.py +0 -0
  305. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/__init__.py +0 -0
  306. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query1.sql +0 -0
  307. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query10.sql +0 -0
  308. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query11.sql +0 -0
  309. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query12.sql +0 -0
  310. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query13.sql +0 -0
  311. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query14.sql +0 -0
  312. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query15.sql +0 -0
  313. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query16.sql +0 -0
  314. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query17.sql +0 -0
  315. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query18.sql +0 -0
  316. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query19.sql +0 -0
  317. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query2.sql +0 -0
  318. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query20.sql +0 -0
  319. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query21.sql +0 -0
  320. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query22.sql +0 -0
  321. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query23.sql +0 -0
  322. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query24.sql +0 -0
  323. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query25.sql +0 -0
  324. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query26.sql +0 -0
  325. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query27.sql +0 -0
  326. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query28.sql +0 -0
  327. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query29.sql +0 -0
  328. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query3.sql +0 -0
  329. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query30.sql +0 -0
  330. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query31.sql +0 -0
  331. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query32.sql +0 -0
  332. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query33.sql +0 -0
  333. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query34.sql +0 -0
  334. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query35.sql +0 -0
  335. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query36.sql +0 -0
  336. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query37.sql +0 -0
  337. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query38.sql +0 -0
  338. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query39.sql +0 -0
  339. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query4.sql +0 -0
  340. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query40.sql +0 -0
  341. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query41.sql +0 -0
  342. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query42.sql +0 -0
  343. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query43.sql +0 -0
  344. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query44.sql +0 -0
  345. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query45.sql +0 -0
  346. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query46.sql +0 -0
  347. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query47.sql +0 -0
  348. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query48.sql +0 -0
  349. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query49.sql +0 -0
  350. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query5.sql +0 -0
  351. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query50.sql +0 -0
  352. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query51.sql +0 -0
  353. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query52.sql +0 -0
  354. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query53.sql +0 -0
  355. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query54.sql +0 -0
  356. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query55.sql +0 -0
  357. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query56.sql +0 -0
  358. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query57.sql +0 -0
  359. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query58.sql +0 -0
  360. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query59.sql +0 -0
  361. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query6.sql +0 -0
  362. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query60.sql +0 -0
  363. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query61.sql +0 -0
  364. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query62.sql +0 -0
  365. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query63.sql +0 -0
  366. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query64.sql +0 -0
  367. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query65.sql +0 -0
  368. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query66.sql +0 -0
  369. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query67.sql +0 -0
  370. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query68.sql +0 -0
  371. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query69.sql +0 -0
  372. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query7.sql +0 -0
  373. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query70.sql +0 -0
  374. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query71.sql +0 -0
  375. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query72.sql +0 -0
  376. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query73.sql +0 -0
  377. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query74.sql +0 -0
  378. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query75.sql +0 -0
  379. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query76.sql +0 -0
  380. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query77.sql +0 -0
  381. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query78.sql +0 -0
  382. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query79.sql +0 -0
  383. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query8.sql +0 -0
  384. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query80.sql +0 -0
  385. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query81.sql +0 -0
  386. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query82.sql +0 -0
  387. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query83.sql +0 -0
  388. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query84.sql +0 -0
  389. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query85.sql +0 -0
  390. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query86.sql +0 -0
  391. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query87.sql +0 -0
  392. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query88.sql +0 -0
  393. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query89.sql +0 -0
  394. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query9.sql +0 -0
  395. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query90.sql +0 -0
  396. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query91.sql +0 -0
  397. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query92.sql +0 -0
  398. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query93.sql +0 -0
  399. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query94.sql +0 -0
  400. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query95.sql +0 -0
  401. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query96.sql +0 -0
  402. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query97.sql +0 -0
  403. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query98.sql +0 -0
  404. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/ansi/query99.sql +0 -0
  405. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query1.sql +0 -0
  406. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query10.sql +0 -0
  407. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query11.sql +0 -0
  408. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query12.sql +0 -0
  409. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query13.sql +0 -0
  410. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query14.sql +0 -0
  411. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query15.sql +0 -0
  412. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query16.sql +0 -0
  413. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query17.sql +0 -0
  414. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query18.sql +0 -0
  415. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query19.sql +0 -0
  416. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query2.sql +0 -0
  417. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query20.sql +0 -0
  418. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query21.sql +0 -0
  419. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query22.sql +0 -0
  420. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query23.sql +0 -0
  421. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query24.sql +0 -0
  422. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query25.sql +0 -0
  423. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query26.sql +0 -0
  424. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query27.sql +0 -0
  425. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query28.sql +0 -0
  426. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query29.sql +0 -0
  427. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query3.sql +0 -0
  428. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query30.sql +0 -0
  429. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query31.sql +0 -0
  430. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query32.sql +0 -0
  431. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query33.sql +0 -0
  432. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query34.sql +0 -0
  433. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query35.sql +0 -0
  434. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query36.sql +0 -0
  435. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query37.sql +0 -0
  436. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query38.sql +0 -0
  437. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query39.sql +0 -0
  438. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query4.sql +0 -0
  439. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query40.sql +0 -0
  440. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query41.sql +0 -0
  441. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query42.sql +0 -0
  442. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query43.sql +0 -0
  443. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query44.sql +0 -0
  444. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query45.sql +0 -0
  445. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query46.sql +0 -0
  446. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query47.sql +0 -0
  447. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query48.sql +0 -0
  448. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query49.sql +0 -0
  449. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query5.sql +0 -0
  450. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query50.sql +0 -0
  451. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query51.sql +0 -0
  452. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query52.sql +0 -0
  453. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query53.sql +0 -0
  454. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query54.sql +0 -0
  455. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query55.sql +0 -0
  456. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query56.sql +0 -0
  457. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query57.sql +0 -0
  458. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query58.sql +0 -0
  459. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query59.sql +0 -0
  460. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query6.sql +0 -0
  461. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query60.sql +0 -0
  462. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query61.sql +0 -0
  463. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query62.sql +0 -0
  464. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query63.sql +0 -0
  465. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query64.sql +0 -0
  466. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query65.sql +0 -0
  467. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query66.sql +0 -0
  468. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query67.sql +0 -0
  469. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query68.sql +0 -0
  470. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query69.sql +0 -0
  471. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query7.sql +0 -0
  472. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query70.sql +0 -0
  473. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query71.sql +0 -0
  474. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query72.sql +0 -0
  475. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query73.sql +0 -0
  476. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query74.sql +0 -0
  477. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query75.sql +0 -0
  478. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query76.sql +0 -0
  479. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query77.sql +0 -0
  480. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query78.sql +0 -0
  481. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query79.sql +0 -0
  482. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query8.sql +0 -0
  483. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query80.sql +0 -0
  484. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query81.sql +0 -0
  485. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query82.sql +0 -0
  486. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query83.sql +0 -0
  487. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query84.sql +0 -0
  488. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query85.sql +0 -0
  489. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query86.sql +0 -0
  490. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query87.sql +0 -0
  491. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query88.sql +0 -0
  492. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query89.sql +0 -0
  493. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query9.sql +0 -0
  494. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query90.sql +0 -0
  495. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query91.sql +0 -0
  496. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query92.sql +0 -0
  497. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query93.sql +0 -0
  498. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query94.sql +0 -0
  499. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query95.sql +0 -0
  500. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query96.sql +0 -0
  501. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query97.sql +0 -0
  502. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query98.sql +0 -0
  503. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query99.sql +0 -0
  504. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/queries/tpcds/test_tpcds.py +0 -0
  505. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/parsing/test_ast.py +0 -0
  506. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/sql/utils.py +0 -0
  507. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/superset_test.py +0 -0
  508. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.dev0}/tests/transpilation_test.py +0 -0
  509. {datajunction_server-0.0.1a75 → datajunction_server-0.0.1a76.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.1a75
3
+ Version: 0.0.1a76.dev0
4
4
  Summary: DataJunction server library for running to a DataJunction server
5
5
  Project-URL: repository, https://github.com/DataJunction/dj
6
6
  Author-email: DataJunction Authors <yian.shang@gmail.com>
@@ -0,0 +1,4 @@
1
+ """
2
+ Version for Hatch
3
+ """
4
+ __version__ = "0.0.1a76.dev0"
@@ -59,7 +59,7 @@ from datajunction_server.naming import LOOKUP_CHARS
59
59
  from datajunction_server.service_clients import QueryServiceClient
60
60
  from datajunction_server.sql.parsing import ast
61
61
  from datajunction_server.typing import END_JOB_STATES
62
- from datajunction_server.utils import SEPARATOR
62
+ from datajunction_server.utils import SEPARATOR, refresh_if_needed
63
63
 
64
64
  _logger = logging.getLogger(__name__)
65
65
 
@@ -737,7 +737,7 @@ async def build_sql_for_multiple_metrics( # pylint: disable=too-many-arguments,
737
737
  ]
738
738
  upstream_tables = [tbl for tbl in query_ast.find_all(ast.Table) if tbl.dj_node]
739
739
  for tbl in upstream_tables:
740
- await session.refresh(tbl.dj_node, ["availability"])
740
+ await refresh_if_needed(session, tbl.dj_node, ["availability"])
741
741
  return (
742
742
  TranslatedSQL(
743
743
  sql=str(query_ast),
@@ -29,8 +29,8 @@ from datajunction_server.models.node_type import NodeType
29
29
  from datajunction_server.models.sql import GeneratedSQL
30
30
  from datajunction_server.naming import amenable_name, from_amenable_name
31
31
  from datajunction_server.sql.parsing.ast import CompileContext
32
- from datajunction_server.sql.parsing.backends.antlr4 import ast, parse
33
- from datajunction_server.utils import SEPARATOR
32
+ from datajunction_server.sql.parsing.backends.antlr4 import ast, cached_parse, parse
33
+ from datajunction_server.utils import SEPARATOR, refresh_if_needed
34
34
 
35
35
  logger = logging.getLogger(__name__)
36
36
 
@@ -189,7 +189,7 @@ async def get_measures_query( # pylint: disable=too-many-locals
189
189
  or from_amenable_name(expr.alias_or_name.identifier(False)) # type: ignore
190
190
  in dimensions_without_roles
191
191
  ]
192
- await session.refresh(parent_node.current, ["columns"])
192
+ await refresh_if_needed(session, parent_node.current, ["columns"])
193
193
  parent_ast = rename_columns(parent_ast, parent_node.current)
194
194
 
195
195
  # Sort the selected columns into dimension vs measure columns and
@@ -280,7 +280,11 @@ class QueryBuilder: # pylint: disable=too-many-instance-attributes,too-many-pub
280
280
  """
281
281
  Create a QueryBuilder instance for the node revision.
282
282
  """
283
- await session.refresh(node_revision, ["required_dimensions", "dimension_links"])
283
+ await refresh_if_needed(
284
+ session,
285
+ node_revision,
286
+ ["required_dimensions", "dimension_links"],
287
+ )
284
288
  instance = cls(session, node_revision, use_materialized=use_materialized)
285
289
  return instance
286
290
 
@@ -429,7 +433,11 @@ class QueryBuilder: # pylint: disable=too-many-instance-attributes,too-many-pub
429
433
  7. Add all requested dimensions to the final select.
430
434
  8. Add order by and limit to the final select (TODO)
431
435
  """
432
- await self.session.refresh(self.node_revision, ["availability", "columns"])
436
+ await refresh_if_needed(
437
+ self.session,
438
+ self.node_revision,
439
+ ["availability", "columns"],
440
+ )
433
441
  node_ast = (
434
442
  await compile_node_ast(self.session, self.node_revision)
435
443
  if not self.physical_table
@@ -463,7 +471,7 @@ class QueryBuilder: # pylint: disable=too-many-instance-attributes,too-many-pub
463
471
  """
464
472
  Build the ORDER BY clause from the provided order expressions
465
473
  """
466
- temp_orderbys = parse(
474
+ temp_orderbys = cached_parse(
467
475
  f"SELECT 1 ORDER BY {','.join(self._orderby)}",
468
476
  ).select.organization.order
469
477
  valid_sort_items = [
@@ -784,8 +792,8 @@ class CubeQueryBuilder: # pylint: disable=too-many-instance-attributes
784
792
  Create a QueryBuilder instance for the node revision.
785
793
  """
786
794
  for node in metric_nodes:
787
- await session.refresh(node, ["current"])
788
- await session.refresh(node.current, ["required_dimensions"])
795
+ await refresh_if_needed(session, node, ["current"])
796
+ await refresh_if_needed(session, node.current, ["required_dimensions"])
789
797
 
790
798
  instance = cls(session, metric_nodes, use_materialized=use_materialized)
791
799
  return instance
@@ -969,7 +977,7 @@ class CubeQueryBuilder: # pylint: disable=too-many-instance-attributes
969
977
  common_parents = group_metrics_by_parent(self.metric_nodes)
970
978
  measures_queries = {}
971
979
  for parent_node, metrics in common_parents.items(): # type: ignore
972
- await self.session.refresh(parent_node, ["current"])
980
+ await refresh_if_needed(self.session, parent_node, ["current"])
973
981
  query_builder = await QueryBuilder.create(self.session, parent_node.current)
974
982
  if self._ignore_errors:
975
983
  query_builder = query_builder.ignore_errors()
@@ -999,7 +1007,7 @@ class CubeQueryBuilder: # pylint: disable=too-many-instance-attributes
999
1007
  metric_proj = await self.build_metric_agg(metric_node, parent_node)
1000
1008
  parent_ast.select.projection.extend(metric_proj)
1001
1009
 
1002
- await self.session.refresh(parent_node.current, ["columns"])
1010
+ await refresh_if_needed(self.session, parent_node.current, ["columns"])
1003
1011
 
1004
1012
  # Generate semantic types for each
1005
1013
  for expr in parent_ast.select.projection:
@@ -1071,7 +1079,7 @@ class CubeQueryBuilder: # pylint: disable=too-many-instance-attributes
1071
1079
  """
1072
1080
  Creates an order by ast from the requested order bys
1073
1081
  """
1074
- temp_orderbys = parse( # type: ignore
1082
+ temp_orderbys = cached_parse( # type: ignore
1075
1083
  f"SELECT 1 ORDER BY {','.join(self._orderby)}",
1076
1084
  ).select.organization.order
1077
1085
  valid_sort_items = [
@@ -1117,27 +1125,20 @@ def get_column_from_canonical_dimension(
1117
1125
  column_name = dimension_attr.column_name
1118
1126
 
1119
1127
  # Dimension requested has reference link on node
1120
- for column in node.columns:
1121
- if (
1122
- column.dimension
1123
- and column.dimension.name == dimension_attr.node_name
1124
- and column.dimension_column == dimension_attr.column_name
1125
- ):
1126
- column_name = column.name
1128
+ dimension_columns = {
1129
+ (col.dimension.name, col.dimension_column): col.name
1130
+ for col in node.columns
1131
+ if col.dimension
1132
+ }
1133
+ key = (dimension_attr.node_name, dimension_attr.column_name)
1134
+ if key in dimension_columns:
1135
+ return dimension_columns[key]
1127
1136
 
1128
1137
  # Dimension referenced was foreign key of dimension link
1129
- link = next(
1130
- (
1131
- link
1132
- for link in node.dimension_links
1133
- if dimension_attr.name in link.foreign_keys_reversed
1134
- ),
1135
- None,
1136
- )
1137
- if link:
1138
- column_name = FullColumnName(
1139
- link.foreign_keys_reversed[dimension_attr.name],
1140
- ).column_name
1138
+ for link in node.dimension_links:
1139
+ foreign_key_column = link.foreign_keys_reversed.get(dimension_attr.name)
1140
+ if foreign_key_column:
1141
+ return FullColumnName(foreign_key_column).column_name
1141
1142
  return column_name
1142
1143
 
1143
1144
 
@@ -1190,7 +1191,7 @@ async def dimension_join_path(
1190
1191
 
1191
1192
  # If it's not a local dimension, traverse the node's dimensions graph
1192
1193
  # This queue tracks the dimension link being processed and the path to that link
1193
- await session.refresh(node, ["dimension_links"])
1194
+ await refresh_if_needed(session, node, ["dimension_links"])
1194
1195
 
1195
1196
  # Start with first layer of linked dims
1196
1197
  processing_queue = collections.deque(
@@ -1198,11 +1199,16 @@ async def dimension_join_path(
1198
1199
  )
1199
1200
  while processing_queue:
1200
1201
  current_link, join_path = processing_queue.popleft()
1201
- await session.refresh(current_link, ["dimension"])
1202
+ await refresh_if_needed(session, current_link, ["dimension"])
1202
1203
  if current_link.dimension.name == dimension_attr.node_name:
1203
1204
  return join_path
1204
- await session.refresh(current_link.dimension, ["current"])
1205
- await session.refresh(current_link.dimension.current, ["dimension_links"])
1205
+
1206
+ await refresh_if_needed(session, current_link.dimension, ["current"])
1207
+ await refresh_if_needed(
1208
+ session,
1209
+ current_link.dimension.current,
1210
+ ["dimension_links"],
1211
+ )
1206
1212
  processing_queue.extend(
1207
1213
  [
1208
1214
  (link, join_path + [link])
@@ -1223,8 +1229,12 @@ async def build_dimension_node_query(
1223
1229
  """
1224
1230
  Builds a dimension node query with the requested filters
1225
1231
  """
1226
- await session.refresh(link.dimension, ["current"])
1227
- await session.refresh(link.dimension.current, ["availability", "columns"])
1232
+ await refresh_if_needed(session, link.dimension, ["current"])
1233
+ await refresh_if_needed(
1234
+ session,
1235
+ link.dimension.current,
1236
+ ["availability", "columns"],
1237
+ )
1228
1238
  physical_table = get_table_for_node(
1229
1239
  link.dimension.current,
1230
1240
  build_criteria=build_criteria,
@@ -1298,7 +1308,7 @@ async def compile_node_ast(session, node_revision: NodeRevision) -> ast.Query:
1298
1308
  """
1299
1309
  Parses the node's query into an AST and compiles it.
1300
1310
  """
1301
- node_ast = parse(node_revision.query)
1311
+ node_ast = cached_parse(node_revision.query)
1302
1312
  ctx = CompileContext(session, DJException())
1303
1313
  await node_ast.compile(ctx)
1304
1314
  return node_ast
@@ -1354,8 +1364,8 @@ async def needs_dimension_join(
1354
1364
  """
1355
1365
  if len(join_path) == 1:
1356
1366
  link = join_path[0]
1357
- await session.refresh(link.dimension, ["current"])
1358
- await session.refresh(link.dimension.current, ["columns"])
1367
+ await refresh_if_needed(session, link.dimension, ["current"])
1368
+ await refresh_if_needed(session, link.dimension.current, ["columns"])
1359
1369
  if dimension_attribute in link.foreign_keys_reversed:
1360
1370
  return False
1361
1371
  return True
@@ -1430,7 +1440,7 @@ async def build_ast( # pylint: disable=too-many-arguments,too-many-locals
1430
1440
  This function will apply any filters that can be pushed down to each referenced node's AST
1431
1441
  (filters are only applied if they don't require dimension node joins).
1432
1442
  """
1433
- await session.refresh(node, ["dimension_links"])
1443
+ await refresh_if_needed(session, node, ["dimension_links"])
1434
1444
  context = CompileContext(session=session, exception=DJException())
1435
1445
  await query.compile(context)
1436
1446
  query.bake_ctes() # pylint: disable=W0212
@@ -1441,7 +1451,7 @@ async def build_ast( # pylint: disable=too-many-arguments,too-many-locals
1441
1451
 
1442
1452
  node_to_tables_mapping = get_dj_node_references_from_select(query.select)
1443
1453
  for referenced_node, reference_expressions in node_to_tables_mapping.items():
1444
- await session.refresh(referenced_node, ["dimension_links"])
1454
+ await refresh_if_needed(session, referenced_node, ["dimension_links"])
1445
1455
 
1446
1456
  for ref_expr in reference_expressions:
1447
1457
 
@@ -1,4 +1,5 @@
1
1
  """Dimension links table."""
2
+ from functools import cached_property
2
3
  from typing import TYPE_CHECKING, Dict, List, Optional, Set
3
4
 
4
5
  from sqlalchemy import JSON, BigInteger, Enum, ForeignKey, Integer
@@ -115,13 +116,14 @@ class DimensionLink(Base): # pylint: disable=too-few-public-methods
115
116
  from datajunction_server.sql.parsing.backends.antlr4 import ast
116
117
 
117
118
  # Find equality comparions (i.e., fact.order_id = dim.order_id)
119
+ join_asts = self.joins()
118
120
  equality_comparisons = (
119
121
  [
120
122
  expr
121
- for expr in self.joins()[0].criteria.on.find_all(ast.BinaryOp) # type: ignore
123
+ for expr in join_asts[0].criteria.on.find_all(ast.BinaryOp) # type: ignore
122
124
  if expr.op == ast.BinaryOpKind.Eq
123
125
  ]
124
- if self.joins()[0].criteria
126
+ if join_asts[0].criteria
125
127
  else []
126
128
  )
127
129
  mapping = {}
@@ -159,7 +161,7 @@ class DimensionLink(Base): # pylint: disable=too-few-public-methods
159
161
  for fk in self.foreign_keys.keys()
160
162
  }
161
163
 
162
- @hybrid_property
164
+ @cached_property
163
165
  def foreign_keys_reversed(self):
164
166
  """
165
167
  Returns a mapping from the primary key column(s) on the dimension node to the
@@ -13,6 +13,7 @@ from datajunction_server.models.node import (
13
13
  MetricMetadataOutput,
14
14
  )
15
15
  from datajunction_server.models.query import ColumnMetadata
16
+ from datajunction_server.sql.decompose import Measure, extractor
16
17
  from datajunction_server.sql.parsing.backends.antlr4 import ast, parse
17
18
  from datajunction_server.transpilation import get_transpilation_plugin
18
19
  from datajunction_server.typing import UTCDatetime
@@ -43,6 +44,9 @@ class Metric(BaseModel):
43
44
 
44
45
  incompatible_druid_functions: List[str]
45
46
 
47
+ measures: List[Measure]
48
+ derived_sql: str
49
+
46
50
  @classmethod
47
51
  def parse_node(cls, node: Node, dims: List[DimensionAttributeOutput]) -> "Metric":
48
52
  """
@@ -55,6 +59,7 @@ class Metric(BaseModel):
55
59
  for func in functions
56
60
  if Dialect.DRUID not in func.dialects
57
61
  ]
62
+ measures, derived_sql = extractor.extract_measures(node.current.query)
58
63
  return cls(
59
64
  id=node.id,
60
65
  name=node.name,
@@ -70,6 +75,8 @@ class Metric(BaseModel):
70
75
  metric_metadata=node.current.metric_metadata,
71
76
  required_dimensions=[dim.name for dim in node.current.required_dimensions],
72
77
  incompatible_druid_functions=incompatible_druid_functions,
78
+ measures=measures,
79
+ derived_sql=str(derived_sql).strip(),
73
80
  )
74
81
 
75
82
 
@@ -0,0 +1,172 @@
1
+ """Used for extracting measures form metric definitions."""
2
+ from pydantic import BaseModel
3
+
4
+ from datajunction_server.enum import StrEnum
5
+ from datajunction_server.sql import functions as dj_functions
6
+ from datajunction_server.sql.parsing.backends.antlr4 import ast, parse
7
+
8
+
9
+ class Aggregability(StrEnum):
10
+ """
11
+ Type of allowed aggregation for a given measure.
12
+ """
13
+
14
+ FULL = "full"
15
+ LIMITED = "limited"
16
+ NONE = "none"
17
+
18
+
19
+ class AggregationRule(BaseModel):
20
+ """
21
+ The aggregation rule for the measure. If the Aggregability type is LIMITED, the `level` should
22
+ be specified to highlight the level at which the measure needs to be aggregated in order to
23
+ support the specified aggregation function.
24
+
25
+ For example, consider a metric like COUNT(DISTINCT user_id). It can be decomposed into a
26
+ single measure with LIMITED aggregability, i.e., it is only aggregatable if the measure is
27
+ calculated at the `user_id` level:
28
+ - name: num_users
29
+ expression: DISTINCT user_id
30
+ aggregation: COUNT
31
+ rule:
32
+ type: LIMITED
33
+ level: ["user_id"]
34
+ """
35
+
36
+ type: Aggregability = Aggregability.NONE
37
+ level: list[str] | None = None
38
+
39
+
40
+ class Measure(BaseModel):
41
+ """
42
+ Measures are aggregated facts (e.g. SUM(view_secs)). They can be optionally combined
43
+ to build derived metrics, e.g. SUM(clicks) / SUM(view_secs). Combining is optional because
44
+ a stand-alone measure can itself be a metric.
45
+ """
46
+
47
+ name: str
48
+ expression: str # A SQL expression for defining the measure
49
+ aggregation: str
50
+ rule: AggregationRule
51
+
52
+
53
+ class MeasureExtractor:
54
+ """
55
+ Extracts aggregatable measures from a metric definition and generates SQL
56
+ derived from those measures.
57
+ """
58
+
59
+ def __init__(self):
60
+ """Register handlers for aggregation functions"""
61
+ self.handlers = {
62
+ dj_functions.Sum: self._simple_associative_agg,
63
+ dj_functions.Count: self._simple_associative_agg,
64
+ dj_functions.Max: self._simple_associative_agg,
65
+ dj_functions.Min: self._simple_associative_agg,
66
+ dj_functions.Avg: self._avg,
67
+ }
68
+
69
+ def extract_measures(self, metric_query: str) -> tuple[list[Measure], ast.Query]:
70
+ """
71
+ Decomposes the metric query into its constituent aggregatable measures and
72
+ constructs a SQL query derived from those measures.
73
+ """
74
+ query_ast = parse(metric_query)
75
+ measures = []
76
+
77
+ for idx, func in enumerate(query_ast.find_all(ast.Function)):
78
+ dj_function = func.function()
79
+ handler = self.handlers.get(dj_function)
80
+ if handler and dj_function.is_aggregation:
81
+ if func_measures := handler(func, idx): # pragma: no cover
82
+ MeasureExtractor.update_ast(func, func_measures)
83
+ measures.extend(func_measures)
84
+
85
+ return measures, query_ast
86
+
87
+ def _simple_associative_agg(self, func, idx) -> list[Measure]:
88
+ """
89
+ Handles measures decomposition for a single-argument associative aggregation function.
90
+ Examples: SUM, MAX, MIN, COUNT
91
+ """
92
+ arg = func.args[0]
93
+ measure_name = "_".join(
94
+ [str(col) for col in arg.find_all(ast.Column)] + [func.name.name.lower()],
95
+ )
96
+ return [
97
+ Measure(
98
+ name=f"{measure_name}_{idx}",
99
+ expression=f"{func.quantifier} {arg}" if func.quantifier else str(arg),
100
+ aggregation=func.name.name.upper(),
101
+ rule=AggregationRule(
102
+ type=Aggregability.FULL
103
+ if func.quantifier != ast.SetQuantifier.Distinct
104
+ else Aggregability.LIMITED,
105
+ ),
106
+ ),
107
+ ]
108
+
109
+ def _avg(self, func, idx) -> list[Measure]:
110
+ """
111
+ Handles measures decomposition for AVG (it requires both the SUM and COUNT
112
+ of the selected measure).
113
+ """
114
+ arg = func.args[0]
115
+ measure_name = "_".join(
116
+ [str(col) for col in arg.find_all(ast.Column)]
117
+ + [dj_functions.Sum.__name__.lower()],
118
+ )
119
+ return [
120
+ Measure(
121
+ name=f"{measure_name}_{idx}",
122
+ expression=str(arg),
123
+ aggregation=dj_functions.Sum.__name__.upper(),
124
+ rule=AggregationRule(
125
+ type=Aggregability.FULL
126
+ if func.quantifier != ast.SetQuantifier.Distinct
127
+ else Aggregability.LIMITED,
128
+ ),
129
+ ),
130
+ Measure(
131
+ name="count",
132
+ expression="1",
133
+ aggregation=dj_functions.Count.__name__.upper(),
134
+ rule=AggregationRule(
135
+ type=Aggregability.FULL
136
+ if func.quantifier != ast.SetQuantifier.Distinct
137
+ else Aggregability.LIMITED,
138
+ ),
139
+ ),
140
+ ]
141
+
142
+ @staticmethod
143
+ def update_ast(func, measures: list[Measure]):
144
+ """
145
+ Updates the query AST based on the measures derived from the function.
146
+ """
147
+ if func.function() == dj_functions.Avg:
148
+ func.parent.replace(
149
+ from_=func,
150
+ to=ast.BinaryOp(
151
+ op=ast.BinaryOpKind.Divide,
152
+ left=ast.Function(
153
+ ast.Name("SUM"),
154
+ args=[ast.Column(ast.Name(measures[0].name))],
155
+ ),
156
+ right=ast.Function(
157
+ ast.Name("COUNT"),
158
+ args=[ast.Column(ast.Name(measures[1].name))],
159
+ ),
160
+ ),
161
+ )
162
+ elif (
163
+ func.function() == dj_functions.Count
164
+ and func.quantifier != ast.SetQuantifier.Distinct
165
+ ):
166
+ func.name.name = "SUM"
167
+ func.args = [ast.Column(ast.Name(measure.name)) for measure in measures]
168
+ else:
169
+ func.args = [ast.Column(ast.Name(measure.name)) for measure in measures]
170
+
171
+
172
+ extractor = MeasureExtractor()
@@ -1679,6 +1679,19 @@ class Over(Expression):
1679
1679
  return f"OVER ({consolidated_by}{window_frame})"
1680
1680
 
1681
1681
 
1682
+ # pylint: disable=C0103
1683
+ class SetQuantifier(DJEnum):
1684
+ """
1685
+ The accepted set quantifiers
1686
+ """
1687
+
1688
+ All = "ALL"
1689
+ Distinct = "DISTINCT"
1690
+
1691
+ def __str__(self):
1692
+ return self.value
1693
+
1694
+
1682
1695
  @dataclass(eq=False)
1683
1696
  class Function(Named, Operation):
1684
1697
  """
@@ -1686,7 +1699,7 @@ class Function(Named, Operation):
1686
1699
  """
1687
1700
 
1688
1701
  args: List[Expression] = field(default_factory=list)
1689
- quantifier: str = ""
1702
+ quantifier: SetQuantifier | None = None
1690
1703
  over: Optional[Over] = None
1691
1704
  args_compiled: bool = False
1692
1705
 
@@ -1,7 +1,9 @@
1
1
  # pylint: skip-file
2
2
  # mypy: ignore-errors
3
+ import copy
3
4
  import inspect
4
5
  import logging
6
+ from functools import lru_cache
5
7
  from typing import TYPE_CHECKING, List, Optional, Tuple, Union, cast
6
8
 
7
9
  import antlr4
@@ -179,6 +181,14 @@ def parse_rule(sql: str, rule: str) -> Union[ast.Node, "ColumnType"]:
179
181
  return ast_tree
180
182
 
181
183
 
184
+ @lru_cache(maxsize=128)
185
+ def _cached_parse(sql: Optional[str]) -> ast.Query:
186
+ """
187
+ Parse a string sql query into a DJ query AST and cache it.
188
+ """
189
+ return parse(sql)
190
+
191
+
182
192
  def parse(sql: Optional[str]) -> ast.Query:
183
193
  """
184
194
  Parse a string sql query into a DJ ast Query
@@ -188,6 +198,13 @@ def parse(sql: Optional[str]) -> ast.Query:
188
198
  return cast(ast.Query, parse_rule(sql, "singleStatement"))
189
199
 
190
200
 
201
+ def cached_parse(sql: Optional[str]) -> ast.Query:
202
+ """
203
+ Parse a string sql query into a DJ ast Query
204
+ """
205
+ return copy.deepcopy(_cached_parse(sql))
206
+
207
+
191
208
  TERMINAL_NODE = antlr4.tree.Tree.TerminalNodeImpl
192
209
 
193
210
 
@@ -659,7 +676,9 @@ def _(ctx: sbp.DereferenceContext):
659
676
  @visit.register
660
677
  def _(ctx: sbp.FunctionCallContext):
661
678
  name = visit(ctx.functionName())
662
- quantifier = visit(ctx.setQuantifier()) if ctx.setQuantifier() else ""
679
+ quantifier = (
680
+ ast.SetQuantifier(visit(ctx.setQuantifier())) if ctx.setQuantifier() else None
681
+ )
663
682
  over = visit(ctx.windowSpec()) if ctx.windowSpec() else None
664
683
  args = visit(ctx.argument)
665
684
  return ast.Function(name, args, quantifier=quantifier, over=over)
@@ -16,6 +16,7 @@ from fastapi import Depends
16
16
  from rich.logging import RichHandler
17
17
  from sqlalchemy import AsyncAdaptedQueuePool
18
18
  from sqlalchemy.dialects.postgresql import insert
19
+ from sqlalchemy.exc import MissingGreenlet
19
20
  from sqlalchemy.ext.asyncio import (
20
21
  AsyncEngine,
21
22
  AsyncSession,
@@ -161,6 +162,22 @@ async def get_session() -> AsyncIterator[AsyncSession]:
161
162
  await session.close()
162
163
 
163
164
 
165
+ async def refresh_if_needed(session: AsyncSession, obj, attributes: list[str]):
166
+ """
167
+ Conditionally refresh a list of attributes for a SQLAlchemy ORM object.
168
+ """
169
+ attributes_to_refresh = []
170
+
171
+ for attr_name in attributes:
172
+ try:
173
+ getattr(obj, attr_name)
174
+ except MissingGreenlet:
175
+ attributes_to_refresh.append(attr_name)
176
+
177
+ if attributes_to_refresh:
178
+ await session.refresh(obj, attributes_to_refresh)
179
+
180
+
164
181
  def get_query_service_client() -> Optional[QueryServiceClient]:
165
182
  """
166
183
  Return query service client