datajunction-server 0.0.1a35__tar.gz → 0.0.1a35.dev1__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 (411) hide show
  1. datajunction_server-0.0.1a35.dev1/.env +3 -0
  2. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/.gitignore +3 -0
  3. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/PKG-INFO +2 -1
  4. datajunction_server-0.0.1a35.dev1/alembic/versions/2023_11_21_1611-d1a8716cf2d2_add_materialization_strategy_and_job_.py +69 -0
  5. datajunction_server-0.0.1a35.dev1/datajunction_server/__about__.py +4 -0
  6. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/catalogs.py +18 -0
  7. datajunction_server-0.0.1a35.dev1/datajunction_server/api/cubes.py +155 -0
  8. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/data.py +1 -1
  9. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/helpers.py +28 -20
  10. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/main.py +12 -1
  11. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/materializations.py +11 -1
  12. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/nodes.py +21 -1
  13. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/sql.py +1 -1
  14. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/config.py +3 -0
  15. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/constants.py +1 -1
  16. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/construction/build.py +132 -61
  17. datajunction_server-0.0.1a35.dev1/datajunction_server/construction/dimensions.py +125 -0
  18. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/internal/materializations.py +159 -191
  19. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/internal/nodes.py +50 -99
  20. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/materialization/jobs/cube_materialization.py +10 -71
  21. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/column.py +17 -0
  22. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/cube.py +20 -0
  23. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/materialization.py +135 -1
  24. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/metric.py +1 -0
  25. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/node.py +12 -2
  26. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/partition.py +11 -0
  27. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/query.py +1 -1
  28. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/dag.py +6 -3
  29. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/parsing/ast.py +12 -1
  30. datajunction_server-0.0.1a35.dev1/dj.copy.db +0 -0
  31. datajunction_server-0.0.1a35.dev1/dj.internal.db +0 -0
  32. datajunction_server-0.0.1a35.dev1/dj.test.db +0 -0
  33. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/pdm.lock +230 -1
  34. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/pyproject.toml +1 -0
  35. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/catalog_test.py +1 -0
  36. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/cubes_test.py +660 -580
  37. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/data_test.py +35 -27
  38. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/graphql/catalog_test.py +8 -1
  39. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/metrics_test.py +0 -14
  40. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/nodes_test.py +4 -8
  41. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/sql_test.py +96 -92
  42. datajunction_server-0.0.1a35.dev1/tests/default.duckdb +0 -0
  43. datajunction_server-0.0.1a35/.env +0 -2
  44. datajunction_server-0.0.1a35/datajunction_server/__about__.py +0 -4
  45. datajunction_server-0.0.1a35/datajunction_server/api/cubes.py +0 -28
  46. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/.coveragerc +0 -0
  47. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/.env.integration +0 -0
  48. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/.flake8 +0 -0
  49. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/.isort.cfg +0 -0
  50. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/.pre-commit-config.yaml +0 -0
  51. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/.pylintrc +0 -0
  52. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/Dockerfile +0 -0
  53. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/Makefile +0 -0
  54. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/README.md +0 -0
  55. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/alembic/README +0 -0
  56. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/alembic/env.py +0 -0
  57. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/alembic/script.py.mako +0 -0
  58. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/alembic/versions/2023_07_07_2006-4e1ff36c27c6_initial_migration.py +0 -0
  59. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/alembic/versions/2023_07_11_2337-bd313a10e2a8_add_bound_dimensions_attribute_to_.py +0 -0
  60. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/alembic/versions/2023_07_14_0428-5c3d0c958c3c_add_node_to_history.py +0 -0
  61. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/alembic/versions/2023_07_30_1608-4147da2ac841_add_deactivated_to_materialization.py +0 -0
  62. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/alembic/versions/2023_08_02_0055-ccc77abcf899_add_deactivated_to_namespace.py +0 -0
  63. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/alembic/versions/2023_08_08_1856-cde75f986a62_user_model.py +0 -0
  64. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/alembic/versions/2023_08_18_2348-fe8d3dbe512a_store_column_level_lineage.py +0 -0
  65. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/alembic/versions/2023_09_18_1346-f2e9ef937daf_add_measures.py +0 -0
  66. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/alembic/versions/2023_09_20_2049-879128f3e778_add_display_name_to_column.py +0 -0
  67. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/alembic/versions/2023_09_21_0033-b75e5163b09d_add_description_and_display_name_to_.py +0 -0
  68. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/alembic/versions/2023_10_02_1642-d8fa1e6371a7_add_url_to_availability_state.py +0 -0
  69. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/alembic/versions/2023_10_08_1438-58e246fba34b_add_partitions_and_backfills.py +0 -0
  70. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/alembic/versions/2023_10_24_0354-87cf9c00ac00_add_metric_metadata.py +0 -0
  71. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/alembic.ini +0 -0
  72. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/__init__.py +0 -0
  73. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/__init__.py +0 -0
  74. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/access/authentication/__init__.py +0 -0
  75. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/access/authentication/basic.py +0 -0
  76. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/access/authentication/github.py +0 -0
  77. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/access/authentication/google.py +0 -0
  78. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/access/authentication/whoami.py +0 -0
  79. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/attributes.py +0 -0
  80. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/client.py +0 -0
  81. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/dimensions.py +0 -0
  82. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/djsql.py +0 -0
  83. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/engines.py +0 -0
  84. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/graphql/__init__.py +0 -0
  85. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/graphql/catalogs.py +0 -0
  86. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/graphql/engines.py +0 -0
  87. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/graphql/main.py +0 -0
  88. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/health.py +0 -0
  89. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/history.py +0 -0
  90. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/logging.conf +0 -0
  91. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/measures.py +0 -0
  92. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/metrics.py +0 -0
  93. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/namespaces.py +0 -0
  94. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/api/tags.py +0 -0
  95. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/construction/__init__.py +0 -0
  96. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/construction/dj_query.py +0 -0
  97. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/construction/exceptions.py +0 -0
  98. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/construction/utils.py +0 -0
  99. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/errors.py +0 -0
  100. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/internal/__init__.py +0 -0
  101. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/internal/access/__init__.py +0 -0
  102. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/internal/access/authentication/__init__.py +0 -0
  103. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/internal/access/authentication/basic.py +0 -0
  104. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/internal/access/authentication/github.py +0 -0
  105. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/internal/access/authentication/google.py +0 -0
  106. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/internal/access/authentication/http.py +0 -0
  107. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/internal/access/authentication/tokens.py +0 -0
  108. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/internal/access/authorization.py +0 -0
  109. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/internal/engines.py +0 -0
  110. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/internal/namespaces.py +0 -0
  111. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/materialization/__init__.py +0 -0
  112. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/materialization/jobs/__init__.py +0 -0
  113. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/materialization/jobs/materialization_job.py +0 -0
  114. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/__init__.py +0 -0
  115. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/access.py +0 -0
  116. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/attribute.py +0 -0
  117. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/base.py +0 -0
  118. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/catalog.py +0 -0
  119. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/database.py +0 -0
  120. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/engine.py +0 -0
  121. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/history.py +0 -0
  122. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/measure.py +0 -0
  123. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/table.py +0 -0
  124. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/tag.py +0 -0
  125. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/models/user.py +0 -0
  126. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/service_clients.py +0 -0
  127. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/__init__.py +0 -0
  128. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/functions.py +0 -0
  129. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/parsing/__init__.py +0 -0
  130. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/parsing/backends/__init__.py +0 -0
  131. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/parsing/backends/antlr4.py +0 -0
  132. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/parsing/backends/exceptions.py +0 -0
  133. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/parsing/backends/grammar/SqlBaseLexer.g4 +0 -0
  134. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/parsing/backends/grammar/SqlBaseParser.g4 +0 -0
  135. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/parsing/backends/grammar/__init__.py +0 -0
  136. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseLexer.interp +0 -0
  137. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseLexer.py +0 -0
  138. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseLexer.tokens +0 -0
  139. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParser.interp +0 -0
  140. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParser.py +0 -0
  141. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParser.tokens +0 -0
  142. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParserListener.py +0 -0
  143. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParserVisitor.py +0 -0
  144. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/sql/parsing/types.py +0 -0
  145. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/superset.py +0 -0
  146. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/transpilation.py +0 -0
  147. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/typing.py +0 -0
  148. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/datajunction_server/utils.py +0 -0
  149. {datajunction_server-0.0.1a35/tests → datajunction_server-0.0.1a35.dev1}/default.duckdb +0 -0
  150. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/dj.demo.db +0 -0
  151. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/requirements/docker.txt +0 -0
  152. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/requirements/test.txt +0 -0
  153. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/scripts/docs-snippets.js +0 -0
  154. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/scripts/docs-snippets.sh +0 -0
  155. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/scripts/generate-openapi.py +0 -0
  156. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/__init__.py +0 -0
  157. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/__init__.py +0 -0
  158. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/attributes_test.py +0 -0
  159. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/client_test.py +0 -0
  160. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/dimensions_test.py +0 -0
  161. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/djql_test.py +0 -0
  162. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/engine_test.py +0 -0
  163. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/graphql/__init__.py +0 -0
  164. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/graphql/engine_test.py +0 -0
  165. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/health_test.py +0 -0
  166. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/helpers_test.py +0 -0
  167. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/history_test.py +0 -0
  168. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/measures_test.py +0 -0
  169. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/namespaces_test.py +0 -0
  170. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/node_update_test.py +0 -0
  171. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/routers_test.py +0 -0
  172. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/api/tags_test.py +0 -0
  173. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/conftest.py +0 -0
  174. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/construction/__init__.py +0 -0
  175. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/construction/build_test.py +0 -0
  176. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/construction/compile_test.py +0 -0
  177. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/construction/exceptions_test.py +0 -0
  178. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/construction/fixtures.py +0 -0
  179. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/construction/inference_test.py +0 -0
  180. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/construction/utils_test.py +0 -0
  181. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/duckdb.sql +0 -0
  182. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/errors_test.py +0 -0
  183. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/examples.py +0 -0
  184. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/fixes_test.py +0 -0
  185. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/integration/__init__.py +0 -0
  186. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/integration/basic_test.py +0 -0
  187. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/internal/authentication/basic_test.py +0 -0
  188. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/internal/authentication/github_test.py +0 -0
  189. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/internal/authentication/http_test.py +0 -0
  190. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/internal/authentication/token_test.py +0 -0
  191. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/internal/authentication/whoami_test.py +0 -0
  192. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/migrations_test.py +0 -0
  193. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/models/__init__.py +0 -0
  194. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/models/catalog_test.py +0 -0
  195. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/models/hash_test.py +0 -0
  196. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/models/measure_test.py +0 -0
  197. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/models/node_test.py +0 -0
  198. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/models/query_test.py +0 -0
  199. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/service_clients_test.py +0 -0
  200. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/__init__.py +0 -0
  201. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/dag_test.py +0 -0
  202. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/functions_test.py +0 -0
  203. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/__init__.py +0 -0
  204. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/backends/__init__.py +0 -0
  205. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/backends/antlr4_test.py +0 -0
  206. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/backends/types_test.py +0 -0
  207. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/__init__.py +0 -0
  208. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query1.sql +0 -0
  209. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query10.sql +0 -0
  210. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query11.sql +0 -0
  211. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query12.sql +0 -0
  212. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query13.sql +0 -0
  213. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query14.sql +0 -0
  214. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query15.sql +0 -0
  215. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query16.sql +0 -0
  216. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query17.sql +0 -0
  217. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query18.sql +0 -0
  218. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query19.sql +0 -0
  219. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query2.sql +0 -0
  220. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query20.sql +0 -0
  221. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query21.sql +0 -0
  222. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query22.sql +0 -0
  223. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query23.sql +0 -0
  224. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query24.sql +0 -0
  225. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query25.sql +0 -0
  226. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query26.sql +0 -0
  227. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query27.sql +0 -0
  228. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query28.sql +0 -0
  229. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query29.sql +0 -0
  230. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query3.sql +0 -0
  231. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query30.sql +0 -0
  232. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query31.sql +0 -0
  233. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query32.sql +0 -0
  234. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query33.sql +0 -0
  235. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query34.sql +0 -0
  236. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query35.sql +0 -0
  237. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query36.sql +0 -0
  238. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query37.sql +0 -0
  239. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query38.sql +0 -0
  240. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query39.sql +0 -0
  241. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query4.sql +0 -0
  242. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query40.sql +0 -0
  243. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query41.sql +0 -0
  244. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query42.sql +0 -0
  245. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query43.sql +0 -0
  246. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query44.sql +0 -0
  247. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query45.sql +0 -0
  248. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query46.sql +0 -0
  249. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query47.sql +0 -0
  250. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query48.sql +0 -0
  251. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query49.sql +0 -0
  252. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query5.sql +0 -0
  253. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query50.sql +0 -0
  254. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query51.sql +0 -0
  255. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query52.sql +0 -0
  256. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query53.sql +0 -0
  257. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query54.sql +0 -0
  258. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query55.sql +0 -0
  259. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query56.sql +0 -0
  260. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query57.sql +0 -0
  261. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query58.sql +0 -0
  262. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query59.sql +0 -0
  263. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query6.sql +0 -0
  264. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query60.sql +0 -0
  265. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query61.sql +0 -0
  266. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query62.sql +0 -0
  267. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query63.sql +0 -0
  268. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query64.sql +0 -0
  269. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query65.sql +0 -0
  270. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query66.sql +0 -0
  271. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query67.sql +0 -0
  272. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query68.sql +0 -0
  273. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query69.sql +0 -0
  274. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query7.sql +0 -0
  275. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query70.sql +0 -0
  276. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query71.sql +0 -0
  277. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query72.sql +0 -0
  278. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query73.sql +0 -0
  279. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query74.sql +0 -0
  280. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query75.sql +0 -0
  281. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query76.sql +0 -0
  282. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query77.sql +0 -0
  283. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query78.sql +0 -0
  284. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query79.sql +0 -0
  285. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query8.sql +0 -0
  286. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query80.sql +0 -0
  287. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query81.sql +0 -0
  288. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query82.sql +0 -0
  289. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query83.sql +0 -0
  290. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query84.sql +0 -0
  291. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query85.sql +0 -0
  292. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query86.sql +0 -0
  293. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query87.sql +0 -0
  294. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query88.sql +0 -0
  295. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query89.sql +0 -0
  296. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query9.sql +0 -0
  297. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query90.sql +0 -0
  298. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query91.sql +0 -0
  299. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query92.sql +0 -0
  300. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query93.sql +0 -0
  301. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query94.sql +0 -0
  302. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query95.sql +0 -0
  303. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query96.sql +0 -0
  304. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query97.sql +0 -0
  305. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query98.sql +0 -0
  306. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/ansi/query99.sql +0 -0
  307. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query1.sql +0 -0
  308. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query10.sql +0 -0
  309. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query11.sql +0 -0
  310. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query12.sql +0 -0
  311. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query13.sql +0 -0
  312. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query14.sql +0 -0
  313. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query15.sql +0 -0
  314. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query16.sql +0 -0
  315. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query17.sql +0 -0
  316. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query18.sql +0 -0
  317. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query19.sql +0 -0
  318. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query2.sql +0 -0
  319. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query20.sql +0 -0
  320. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query21.sql +0 -0
  321. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query22.sql +0 -0
  322. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query23.sql +0 -0
  323. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query24.sql +0 -0
  324. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query25.sql +0 -0
  325. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query26.sql +0 -0
  326. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query27.sql +0 -0
  327. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query28.sql +0 -0
  328. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query29.sql +0 -0
  329. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query3.sql +0 -0
  330. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query30.sql +0 -0
  331. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query31.sql +0 -0
  332. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query32.sql +0 -0
  333. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query33.sql +0 -0
  334. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query34.sql +0 -0
  335. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query35.sql +0 -0
  336. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query36.sql +0 -0
  337. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query37.sql +0 -0
  338. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query38.sql +0 -0
  339. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query39.sql +0 -0
  340. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query4.sql +0 -0
  341. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query40.sql +0 -0
  342. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query41.sql +0 -0
  343. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query42.sql +0 -0
  344. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query43.sql +0 -0
  345. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query44.sql +0 -0
  346. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query45.sql +0 -0
  347. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query46.sql +0 -0
  348. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query47.sql +0 -0
  349. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query48.sql +0 -0
  350. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query49.sql +0 -0
  351. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query5.sql +0 -0
  352. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query50.sql +0 -0
  353. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query51.sql +0 -0
  354. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query52.sql +0 -0
  355. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query53.sql +0 -0
  356. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query54.sql +0 -0
  357. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query55.sql +0 -0
  358. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query56.sql +0 -0
  359. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query57.sql +0 -0
  360. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query58.sql +0 -0
  361. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query59.sql +0 -0
  362. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query6.sql +0 -0
  363. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query60.sql +0 -0
  364. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query61.sql +0 -0
  365. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query62.sql +0 -0
  366. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query63.sql +0 -0
  367. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query64.sql +0 -0
  368. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query65.sql +0 -0
  369. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query66.sql +0 -0
  370. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query67.sql +0 -0
  371. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query68.sql +0 -0
  372. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query69.sql +0 -0
  373. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query7.sql +0 -0
  374. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query70.sql +0 -0
  375. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query71.sql +0 -0
  376. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query72.sql +0 -0
  377. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query73.sql +0 -0
  378. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query74.sql +0 -0
  379. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query75.sql +0 -0
  380. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query76.sql +0 -0
  381. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query77.sql +0 -0
  382. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query78.sql +0 -0
  383. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query79.sql +0 -0
  384. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query8.sql +0 -0
  385. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query80.sql +0 -0
  386. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query81.sql +0 -0
  387. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query82.sql +0 -0
  388. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query83.sql +0 -0
  389. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query84.sql +0 -0
  390. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query85.sql +0 -0
  391. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query86.sql +0 -0
  392. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query87.sql +0 -0
  393. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query88.sql +0 -0
  394. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query89.sql +0 -0
  395. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query9.sql +0 -0
  396. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query90.sql +0 -0
  397. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query91.sql +0 -0
  398. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query92.sql +0 -0
  399. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query93.sql +0 -0
  400. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query94.sql +0 -0
  401. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query95.sql +0 -0
  402. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query96.sql +0 -0
  403. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query97.sql +0 -0
  404. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query98.sql +0 -0
  405. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/sparksql/query99.sql +0 -0
  406. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/queries/tpcds/test_tpcds.py +0 -0
  407. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/parsing/test_ast.py +0 -0
  408. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/sql/utils.py +0 -0
  409. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/superset_test.py +0 -0
  410. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/transpilation_test.py +0 -0
  411. {datajunction_server-0.0.1a35 → datajunction_server-0.0.1a35.dev1}/tests/utils_test.py +0 -0
@@ -0,0 +1,3 @@
1
+ QUERY_SERVICE=http://host.docker.internal:8002
2
+ INDEX=sqlite:///dj.internal.db?check_same_thread=False
3
+ SECRET=a-fake-secretkey
@@ -117,3 +117,6 @@ djqs.db
117
117
 
118
118
  # oauth credentials
119
119
  client_secret*
120
+
121
+ # random notebooks
122
+ Untitled*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: datajunction-server
3
- Version: 0.0.1a35
3
+ Version: 0.0.1a35.dev1
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>
@@ -22,6 +22,7 @@ Requires-Dist: cachelib<1.0.0,>=0.10.2
22
22
  Requires-Dist: cachetools>=5.3.1
23
23
  Requires-Dist: celery<6.0.0,>=5.2.7
24
24
  Requires-Dist: cryptography>=41.0.3
25
+ Requires-Dist: fastapi-cache2>=0.2.1
25
26
  Requires-Dist: fastapi<0.80.0,>=0.79.0
26
27
  Requires-Dist: google-api-python-client>=2.95.0
27
28
  Requires-Dist: google-auth-httplib2>=0.1.0
@@ -0,0 +1,69 @@
1
+ """Add materialization strategy and job type
2
+
3
+ Revision ID: d1a8716cf2d2
4
+ Revises: 87cf9c00ac00
5
+ Create Date: 2023-11-21 16:11:01.741721+00:00
6
+
7
+ """
8
+ # pylint: disable=no-member, invalid-name, missing-function-docstring, unused-import, no-name-in-module
9
+
10
+ import sqlalchemy as sa
11
+ import sqlmodel
12
+
13
+ from alembic import op
14
+
15
+ # revision identifiers, used by Alembic.
16
+ revision = "d1a8716cf2d2"
17
+ down_revision = "87cf9c00ac00"
18
+ branch_labels = None
19
+ depends_on = None
20
+
21
+
22
+ def upgrade():
23
+ # ### commands auto generated by Alembic - please adjust! ###
24
+ with op.batch_alter_table("materialization", schema=None) as batch_op:
25
+ batch_op.add_column(
26
+ sa.Column(
27
+ "strategy",
28
+ sa.Enum(
29
+ "FULL",
30
+ "SNAPSHOT",
31
+ "INCREMENTAL_TIME",
32
+ "VIEW",
33
+ name="materializationstrategy",
34
+ ),
35
+ nullable=True,
36
+ ),
37
+ )
38
+ # batch_op.drop_constraint("node_revision_engine_uniq", type_="unique")
39
+ batch_op.create_unique_constraint(
40
+ "name_node_revision_uniq",
41
+ ["name", "node_revision_id"],
42
+ )
43
+ batch_op.drop_constraint(
44
+ "fk_materialization_engine_id_engine",
45
+ type_="foreignkey",
46
+ )
47
+ batch_op.drop_column("engine_id")
48
+
49
+ # ### end Alembic commands ###
50
+
51
+
52
+ def downgrade():
53
+ # ### commands auto generated by Alembic - please adjust! ###
54
+ with op.batch_alter_table("materialization", schema=None) as batch_op:
55
+ batch_op.add_column(sa.Column("engine_id", sa.INTEGER(), nullable=False))
56
+ batch_op.create_foreign_key(
57
+ "fk_materialization_engine_id_engine",
58
+ "engine",
59
+ ["engine_id"],
60
+ ["id"],
61
+ )
62
+ batch_op.drop_constraint("name_node_revision_uniq", type_="unique")
63
+ batch_op.create_unique_constraint(
64
+ "node_revision_engine_uniq",
65
+ ["name", "node_revision_id", "engine_id"],
66
+ )
67
+ batch_op.drop_column("strategy")
68
+
69
+ # ### end Alembic commands ###
@@ -0,0 +1,4 @@
1
+ """
2
+ Version for Hatch
3
+ """
4
+ __version__ = "0.0.1a35.dev1"
@@ -21,6 +21,8 @@ _logger = logging.getLogger(__name__)
21
21
  settings = get_settings()
22
22
  router = SecureAPIRouter(tags=["catalogs"])
23
23
 
24
+ UNKNOWN_CATALOG_ID = 0
25
+
24
26
 
25
27
  @router.get("/catalogs/", response_model=List[CatalogInfo])
26
28
  def list_catalogs(*, session: Session = Depends(get_session)) -> List[CatalogInfo]:
@@ -120,3 +122,19 @@ def list_new_engines(
120
122
  if not already_set:
121
123
  new_engines.append(engine)
122
124
  return new_engines
125
+
126
+
127
+ def default_catalog(session: Session = Depends(get_session)):
128
+ """
129
+ Loads a default catalog for nodes that are pure SQL and don't belong in any
130
+ particular catalog. This typically applies to on-the-fly user-defined dimensions.
131
+ """
132
+ statement = select(Catalog).filter(Catalog.id == UNKNOWN_CATALOG_ID)
133
+ catalogs = session.exec(statement).all()
134
+ if not catalogs:
135
+ unknown = Catalog(
136
+ id=UNKNOWN_CATALOG_ID,
137
+ name="unknown",
138
+ )
139
+ session.add(unknown)
140
+ session.commit()
@@ -0,0 +1,155 @@
1
+ """
2
+ Cube related APIs.
3
+ """
4
+ import logging
5
+ from typing import List, Optional
6
+
7
+ from fastapi import Depends, Query
8
+ from sqlmodel import Session
9
+
10
+ from datajunction_server.api.helpers import get_catalog_by_name, get_node_by_name
11
+ from datajunction_server.construction.dimensions import build_dimensions_from_cube_query
12
+ from datajunction_server.internal.access.authentication.http import SecureAPIRouter
13
+ from datajunction_server.internal.access.authorization import validate_access
14
+ from datajunction_server.models import access
15
+ from datajunction_server.models.cube import (
16
+ CubeRevisionMetadata,
17
+ DimensionValue,
18
+ DimensionValues,
19
+ )
20
+ from datajunction_server.models.metric import TranslatedSQL
21
+ from datajunction_server.models.node import NodeType
22
+ from datajunction_server.models.query import QueryCreate
23
+ from datajunction_server.service_clients import QueryServiceClient
24
+ from datajunction_server.utils import (
25
+ from_amenable_name,
26
+ get_query_service_client,
27
+ get_session,
28
+ get_settings,
29
+ )
30
+
31
+ _logger = logging.getLogger(__name__)
32
+ settings = get_settings()
33
+ router = SecureAPIRouter(tags=["cubes"])
34
+
35
+
36
+ @router.get("/cubes/{name}/", response_model=CubeRevisionMetadata, name="Get a Cube")
37
+ def get_cube(
38
+ name: str, *, session: Session = Depends(get_session)
39
+ ) -> CubeRevisionMetadata:
40
+ """
41
+ Get information on a cube
42
+ """
43
+ node = get_node_by_name(session=session, name=name, node_type=NodeType.CUBE)
44
+ return node.current
45
+
46
+
47
+ @router.get("/cubes/{name}/dimensions/sql", name="Dimensions SQL for Cube")
48
+ def get_cube_dimension_sql(
49
+ name: str,
50
+ *,
51
+ dimensions: List[str] = Query([], description="Dimensions to get values for"),
52
+ filters: Optional[str] = Query(
53
+ None,
54
+ description="Filters on dimensional attributes",
55
+ ),
56
+ limit: Optional[int] = Query(
57
+ None,
58
+ description="Number of rows to limit the data retrieved to",
59
+ ),
60
+ include_counts: bool = False,
61
+ session: Session = Depends(get_session),
62
+ validate_access: access.ValidateAccessFn = Depends( # pylint: disable=redefined-outer-name
63
+ validate_access,
64
+ ),
65
+ ) -> TranslatedSQL:
66
+ """
67
+ Generates SQL to retrieve all unique values of a dimension for the cube
68
+ """
69
+ node = get_node_by_name(session=session, name=name, node_type=NodeType.CUBE)
70
+ cube = node.current
71
+ return build_dimensions_from_cube_query(
72
+ session,
73
+ cube,
74
+ dimensions,
75
+ filters,
76
+ limit,
77
+ include_counts,
78
+ validate_access=validate_access,
79
+ )
80
+
81
+
82
+ @router.get(
83
+ "/cubes/{name}/dimensions/data",
84
+ name="Dimensions Values for Cube",
85
+ )
86
+ def get_cube_dimension_values( # pylint: disable=too-many-locals
87
+ name: str,
88
+ *,
89
+ dimensions: List[str] = Query([], description="Dimensions to get values for"),
90
+ filters: Optional[str] = Query(
91
+ None,
92
+ description="Filters on dimensional attributes",
93
+ ),
94
+ limit: Optional[int] = Query(
95
+ None,
96
+ description="Number of rows to limit the data retrieved to",
97
+ ),
98
+ include_counts: bool = False,
99
+ async_: bool = False,
100
+ session: Session = Depends(get_session),
101
+ query_service_client: QueryServiceClient = Depends(get_query_service_client),
102
+ validate_access: access.ValidateAccessFn = Depends( # pylint: disable=redefined-outer-name
103
+ validate_access,
104
+ ),
105
+ ) -> DimensionValues:
106
+ """
107
+ All unique values of a dimension from the cube
108
+ """
109
+ node = get_node_by_name(session=session, name=name, node_type=NodeType.CUBE)
110
+ cube = node.current
111
+ translated_sql = build_dimensions_from_cube_query(
112
+ session,
113
+ cube,
114
+ dimensions,
115
+ filters,
116
+ limit,
117
+ include_counts,
118
+ validate_access,
119
+ )
120
+ if cube.availability:
121
+ catalog = get_catalog_by_name( # pragma: no cover
122
+ session,
123
+ cube.availability.catalog, # type: ignore
124
+ )
125
+ else:
126
+ catalog = cube.catalog
127
+ query_create = QueryCreate(
128
+ engine_name=catalog.engines[0].name,
129
+ catalog_name=catalog.name,
130
+ engine_version=catalog.engines[0].version,
131
+ submitted_query=translated_sql.sql,
132
+ async_=async_,
133
+ )
134
+ result = query_service_client.submit_query(query_create)
135
+ count_column = [
136
+ idx
137
+ for idx, col in enumerate(translated_sql.columns) # type: ignore
138
+ if col.name == "count"
139
+ ]
140
+ dimension_values = [ # pragma: no cover
141
+ DimensionValue(
142
+ value=row[0 : count_column[0]] if count_column else row,
143
+ count=row[count_column[0]] if count_column else None,
144
+ )
145
+ for row in result.results.__root__[0].rows
146
+ ]
147
+ return DimensionValues( # pragma: no cover
148
+ dimensions=[
149
+ from_amenable_name(col.name)
150
+ for col in translated_sql.columns # type: ignore # pylint: disable=not-an-iterable
151
+ if col.name != "count"
152
+ ],
153
+ values=dimension_values,
154
+ cardinality=len(dimension_values),
155
+ )
@@ -195,7 +195,7 @@ def get_data( # pylint: disable=too-many-locals
195
195
  )
196
196
 
197
197
  columns = [
198
- assemble_column_metadata(col, node_name) # type: ignore
198
+ assemble_column_metadata(col) # type: ignore
199
199
  for col in query_ast.select.projection
200
200
  ]
201
201
 
@@ -23,6 +23,7 @@ from datajunction_server.construction.build import (
23
23
  build_metric_nodes,
24
24
  build_node,
25
25
  rename_columns,
26
+ validate_shared_dimensions,
26
27
  )
27
28
  from datajunction_server.construction.dj_query import build_dj_query
28
29
  from datajunction_server.errors import (
@@ -69,7 +70,7 @@ from datajunction_server.sql.parsing import ast
69
70
  from datajunction_server.sql.parsing.backends.antlr4 import SqlSyntaxError, parse
70
71
  from datajunction_server.sql.parsing.backends.exceptions import DJParseException
71
72
  from datajunction_server.typing import END_JOB_STATES, UTCDatetime
72
- from datajunction_server.utils import LOOKUP_CHARS, SEPARATOR, amenable_name
73
+ from datajunction_server.utils import LOOKUP_CHARS, SEPARATOR
73
74
 
74
75
  _logger = logging.getLogger(__name__)
75
76
 
@@ -719,6 +720,11 @@ def validate_cube( # pylint: disable=too-many-locals
719
720
  message=("Metrics and dimensions must be part of a common catalog"),
720
721
  )
721
722
 
723
+ validate_shared_dimensions(
724
+ metric_nodes,
725
+ [dim.full_name() for dim in dimensions],
726
+ [],
727
+ )
722
728
  return metrics, metric_nodes, dimension_nodes, dimensions, catalog
723
729
 
724
730
 
@@ -900,7 +906,7 @@ def build_sql_for_multiple_metrics( # pylint: disable=too-many-arguments,too-ma
900
906
  access_control=access_control,
901
907
  )
902
908
  columns = [
903
- assemble_column_metadata(col, metrics) # type: ignore
909
+ assemble_column_metadata(col) # type: ignore
904
910
  for col in query_ast.select.projection
905
911
  ]
906
912
  return (
@@ -1273,27 +1279,29 @@ def hard_delete_node(
1273
1279
 
1274
1280
  def assemble_column_metadata(
1275
1281
  column: ast.Column,
1276
- node_name: Union[List[str], str],
1282
+ # node_name: Union[List[str], str],
1277
1283
  ) -> ColumnMetadata:
1278
1284
  """
1279
1285
  Extract column metadata from AST
1280
1286
  """
1281
- column_name_on_ast = column.alias_or_name.name
1282
- if not isinstance(node_name, List):
1283
- node_name = [node_name]
1284
- node_name_mapping = {amenable_name(name): name for name in node_name}
1285
- metric_node = node_name_mapping.get(column_name_on_ast)
1286
-
1287
- amenable_separator = f"_{LOOKUP_CHARS.get(SEPARATOR)}_"
1288
- column_name_on_node = column_name_on_ast.split(amenable_separator)[-1]
1289
- reference_node_name = ".".join(column_name_on_ast.split(amenable_separator)[0:-1])
1290
- if metric_node:
1291
- column_name_on_node = column_name_on_ast
1292
- reference_node_name = metric_node
1293
-
1294
- return ColumnMetadata(
1295
- name=column_name_on_ast,
1287
+ metadata = ColumnMetadata(
1288
+ name=column.alias_or_name.name,
1296
1289
  type=str(column.type),
1297
- column=column_name_on_node,
1298
- node=reference_node_name,
1290
+ column=(
1291
+ column.semantic_entity.split(SEPARATOR)[-1]
1292
+ if hasattr(column, "semantic_entity") and column.semantic_entity
1293
+ else None
1294
+ ),
1295
+ node=(
1296
+ SEPARATOR.join(column.semantic_entity.split(SEPARATOR)[:-1])
1297
+ if hasattr(column, "semantic_entity") and column.semantic_entity
1298
+ else None
1299
+ ),
1300
+ semantic_entity=column.semantic_entity
1301
+ if hasattr(column, "semantic_entity")
1302
+ else None,
1303
+ semantic_type=column.semantic_type
1304
+ if hasattr(column, "semantic_type")
1305
+ else None,
1299
1306
  )
1307
+ return metadata
@@ -15,6 +15,8 @@ from typing import TYPE_CHECKING
15
15
 
16
16
  from fastapi import Depends, FastAPI, Request
17
17
  from fastapi.responses import JSONResponse, RedirectResponse, Response
18
+ from fastapi_cache import FastAPICache
19
+ from fastapi_cache.backends.inmemory import InMemoryBackend
18
20
  from jose import JWTError
19
21
  from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
20
22
  from sqlmodel import select
@@ -42,6 +44,7 @@ from datajunction_server.api import (
42
44
  )
43
45
  from datajunction_server.api.access.authentication import whoami
44
46
  from datajunction_server.api.attributes import default_attribute_types
47
+ from datajunction_server.api.catalogs import default_catalog
45
48
  from datajunction_server.api.graphql.main import graphql_app
46
49
  from datajunction_server.constants import AUTH_COOKIE, LOGGED_IN_FLAG_COOKIE
47
50
  from datajunction_server.errors import DJException
@@ -64,7 +67,7 @@ config.fileConfig(
64
67
  disable_existing_loggers=False,
65
68
  )
66
69
 
67
- dependencies = [Depends(default_attribute_types)]
70
+ dependencies = [Depends(default_attribute_types), Depends(default_catalog)]
68
71
 
69
72
  app = FastAPI(
70
73
  title=settings.name,
@@ -105,6 +108,14 @@ app.include_router(graphql_app, prefix="/graphql")
105
108
  app.include_router(whoami.router)
106
109
 
107
110
 
111
+ @app.on_event("startup")
112
+ async def startup():
113
+ """
114
+ Initialize FastAPI cache when the server starts up
115
+ """
116
+ FastAPICache.init(InMemoryBackend(), prefix="inmemory-cache")
117
+
118
+
108
119
  @app.exception_handler(DJException)
109
120
  async def dj_exception_handler( # pylint: disable=unused-argument
110
121
  request: Request,
@@ -14,11 +14,13 @@ from sqlmodel import Session
14
14
  from datajunction_server.api.helpers import get_node_by_name
15
15
  from datajunction_server.errors import DJDoesNotExistException, DJException
16
16
  from datajunction_server.internal.access.authentication.http import SecureAPIRouter
17
+ from datajunction_server.internal.access.authorization import validate_access
17
18
  from datajunction_server.internal.materializations import (
18
19
  create_new_materialization,
19
20
  schedule_materialization_jobs,
20
21
  )
21
22
  from datajunction_server.materialization.jobs import MaterializationJob
23
+ from datajunction_server.models import access
22
24
  from datajunction_server.models.history import ActivityType, EntityType, History
23
25
  from datajunction_server.models.materialization import (
24
26
  MaterializationConfigInfoUnified,
@@ -54,6 +56,9 @@ def upsert_materialization( # pylint: disable=too-many-locals
54
56
  session: Session = Depends(get_session),
55
57
  query_service_client: QueryServiceClient = Depends(get_query_service_client),
56
58
  current_user: Optional[User] = Depends(get_current_user),
59
+ validate_access: access.ValidateAccessFn = Depends( # pylint: disable=W0621
60
+ validate_access,
61
+ ),
57
62
  ) -> JSONResponse:
58
63
  """
59
64
  Add or update a materialization of the specified node. If a node_name is specified
@@ -69,7 +74,12 @@ def upsert_materialization( # pylint: disable=too-many-locals
69
74
  old_materializations = {mat.name: mat for mat in current_revision.materializations}
70
75
 
71
76
  # Create a new materialization
72
- new_materialization = create_new_materialization(session, current_revision, data)
77
+ new_materialization = create_new_materialization(
78
+ session,
79
+ current_revision,
80
+ data,
81
+ validate_access,
82
+ )
73
83
 
74
84
  # Check to see if a materialization for this engine already exists with the exact same config
75
85
  existing_materialization = old_materializations.get(new_materialization.name)
@@ -9,10 +9,12 @@ from typing import List, Optional, Union, cast
9
9
 
10
10
  from fastapi import BackgroundTasks, Depends, Query, Response
11
11
  from fastapi.responses import JSONResponse
12
+ from fastapi_cache.decorator import cache
12
13
  from sqlalchemy.sql.operators import is_
13
14
  from sqlmodel import Session, select
14
15
  from starlette.requests import Request
15
16
 
17
+ from datajunction_server.api.catalogs import UNKNOWN_CATALOG_ID
16
18
  from datajunction_server.api.helpers import (
17
19
  activate_node,
18
20
  deactivate_node,
@@ -214,6 +216,7 @@ def list_nodes(
214
216
 
215
217
 
216
218
  @router.get("/nodes/details/", response_model=List[NodeIndexItem])
219
+ @cache(expire=settings.index_cache_expire)
217
220
  def list_all_nodes_with_details(
218
221
  node_type: Optional[NodeType] = None,
219
222
  *,
@@ -351,6 +354,9 @@ def create_source(
351
354
  session: Session = Depends(get_session),
352
355
  current_user: Optional[User] = Depends(get_current_user),
353
356
  query_service_client: QueryServiceClient = Depends(get_query_service_client),
357
+ validate_access: access.ValidateAccessFn = Depends( # pylint: disable=W0621
358
+ validate_access,
359
+ ),
354
360
  ) -> NodeOutput:
355
361
  """
356
362
  Create a source node. If columns are not provided, the source node's schema
@@ -365,6 +371,7 @@ def create_source(
365
371
  session=session,
366
372
  current_user=current_user,
367
373
  query_service_client=query_service_client,
374
+ validate_access=validate_access,
368
375
  ):
369
376
  return recreated_node
370
377
 
@@ -447,6 +454,9 @@ def create_node(
447
454
  current_user: Optional[User] = Depends(get_current_user),
448
455
  query_service_client: QueryServiceClient = Depends(get_query_service_client),
449
456
  background_tasks: BackgroundTasks,
457
+ validate_access: access.ValidateAccessFn = Depends( # pylint: disable=W0621
458
+ validate_access,
459
+ ),
450
460
  ) -> NodeOutput:
451
461
  """
452
462
  Create a node.
@@ -466,6 +476,7 @@ def create_node(
466
476
  current_user=current_user,
467
477
  query_service_client=query_service_client,
468
478
  background_tasks=background_tasks,
479
+ validate_access=validate_access,
469
480
  ):
470
481
  return recreated_node # pragma: no cover
471
482
 
@@ -528,6 +539,9 @@ def create_cube(
528
539
  query_service_client: QueryServiceClient = Depends(get_query_service_client),
529
540
  current_user: Optional[User] = Depends(get_current_user),
530
541
  background_tasks: BackgroundTasks,
542
+ validate_access: access.ValidateAccessFn = Depends( # pylint: disable=W0621
543
+ validate_access,
544
+ ),
531
545
  ) -> NodeOutput:
532
546
  """
533
547
  Create a cube node.
@@ -542,6 +556,7 @@ def create_cube(
542
556
  current_user=current_user,
543
557
  query_service_client=query_service_client,
544
558
  background_tasks=background_tasks,
559
+ validate_access=validate_access,
545
560
  ):
546
561
  return recreated_node # pragma: no cover
547
562
 
@@ -640,7 +655,8 @@ def link_dimension( # pylint: disable=too-many-arguments
640
655
  node_type=NodeType.DIMENSION,
641
656
  )
642
657
  if (
643
- dimension_node.current.catalog is not None
658
+ dimension_node.current.catalog_id != UNKNOWN_CATALOG_ID
659
+ and dimension_node.current.catalog is not None
644
660
  and node.current.catalog.name != dimension_node.current.catalog.name
645
661
  ):
646
662
  raise DJException(
@@ -909,6 +925,9 @@ def update_node(
909
925
  query_service_client: QueryServiceClient = Depends(get_query_service_client),
910
926
  current_user: Optional[User] = Depends(get_current_user),
911
927
  background_tasks: BackgroundTasks,
928
+ validate_access: access.ValidateAccessFn = Depends( # pylint: disable=W0621
929
+ validate_access,
930
+ ),
912
931
  ) -> NodeOutput:
913
932
  """
914
933
  Update a node.
@@ -920,6 +939,7 @@ def update_node(
920
939
  query_service_client=query_service_client,
921
940
  current_user=current_user,
922
941
  background_tasks=background_tasks,
942
+ validate_access=validate_access,
923
943
  )
924
944
  return node # type: ignore
925
945
 
@@ -103,7 +103,7 @@ def get_sql(
103
103
  access_control=access_control,
104
104
  )
105
105
  columns = [
106
- assemble_column_metadata(col, node_name) # type: ignore
106
+ assemble_column_metadata(col) # type: ignore
107
107
  for col in query_ast.select.projection
108
108
  ]
109
109
  return TranslatedSQL(
@@ -88,6 +88,9 @@ class Settings(
88
88
  # Google OAuth application client secret file
89
89
  google_oauth_client_secret_file: Optional[str] = None
90
90
 
91
+ # Interval in seconds with which to expire caching of any indexes
92
+ index_cache_expire = 60
93
+
91
94
  @property
92
95
  def celery(self) -> Celery:
93
96
  """
@@ -20,4 +20,4 @@ AUTH_COOKIE = "__dj"
20
20
  LOGGED_IN_FLAG_COOKIE = "__djlif"
21
21
 
22
22
  # Maximum amount of nodes to return for requests to list all nodes
23
- NODE_LIST_MAX = 50000
23
+ NODE_LIST_MAX = 1000