datajunction-server 0.0.1a49__tar.gz → 0.0.1a49.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 (451) hide show
  1. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/PKG-INFO +2 -2
  2. datajunction_server-0.0.1a49.dev0/datajunction_server/__about__.py +4 -0
  3. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/data.py +5 -1
  4. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/helpers.py +3 -15
  5. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/nodes.py +14 -4
  6. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/sql.py +68 -24
  7. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/construction/build.py +76 -85
  8. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/node.py +16 -3
  9. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/materialization/jobs/cube_materialization.py +0 -2
  10. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/parsing/types.py +2 -2
  11. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/nodes_test.py +44 -7
  12. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/sql_test.py +10 -12
  13. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/examples.py +10 -0
  14. datajunction_server-0.0.1a49/datajunction_server/__about__.py +0 -4
  15. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/.coveragerc +0 -0
  16. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/.env +0 -0
  17. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/.env.integration +0 -0
  18. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/.flake8 +0 -0
  19. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/.gitignore +0 -0
  20. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/.isort.cfg +0 -0
  21. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/.pre-commit-config.yaml +0 -0
  22. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/.pylintrc +0 -0
  23. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/Dockerfile +0 -0
  24. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/Makefile +0 -0
  25. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/README.md +0 -0
  26. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/alembic/README +0 -0
  27. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/alembic/env.py +0 -0
  28. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/alembic/script.py.mako +0 -0
  29. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/alembic/versions/2023_12_20_1829-724445d2b29d_initial_migration.py +0 -0
  30. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/alembic/versions/2024_01_08_2034-945d44abcd32_add_dimension_links.py +0 -0
  31. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/alembic/versions/2024_01_11_2032-c74b11566d82_add_column_order.py +0 -0
  32. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/alembic/versions/2024_01_18_2011-20f060b02772_switch_enum_values.py +0 -0
  33. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/alembic/versions/2024_01_23_0617-c9cef8864ecb_add_missing_table_attribute_to_source_.py +0 -0
  34. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/alembic/versions/2024_01_23_1655-a8e22109be24_availability_state_s_valid_through_ts_.py +0 -0
  35. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/alembic/versions/2024_02_22_0713-d61fb7e48cc3_cascade_deletes_to_dimension_links.py +0 -0
  36. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/alembic/versions/2024_04_30_1556-de7ec1c82fe0_add_query_requests.py +0 -0
  37. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/alembic/versions/2024_05_09_1420-9b1227ff17f4_update_backfill_spec.py +0 -0
  38. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/alembic/versions/2024_05_21_0012-57fc93ef6947_add_query_id_to_queryrequest.py +0 -0
  39. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/alembic.ini +0 -0
  40. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/__init__.py +0 -0
  41. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/__init__.py +0 -0
  42. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/access/authentication/__init__.py +0 -0
  43. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/access/authentication/basic.py +0 -0
  44. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/access/authentication/github.py +0 -0
  45. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/access/authentication/google.py +0 -0
  46. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/access/authentication/whoami.py +0 -0
  47. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/attributes.py +0 -0
  48. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/catalogs.py +0 -0
  49. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/client.py +0 -0
  50. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/cubes.py +0 -0
  51. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/dimensions.py +0 -0
  52. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/djsql.py +0 -0
  53. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/engines.py +0 -0
  54. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/graphql/__init__.py +0 -0
  55. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/graphql/catalogs.py +0 -0
  56. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/graphql/engines.py +0 -0
  57. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/graphql/main.py +0 -0
  58. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/health.py +0 -0
  59. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/history.py +0 -0
  60. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/logging.conf +0 -0
  61. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/main.py +0 -0
  62. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/materializations.py +0 -0
  63. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/measures.py +0 -0
  64. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/metrics.py +0 -0
  65. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/namespaces.py +0 -0
  66. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/api/tags.py +0 -0
  67. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/config.py +0 -0
  68. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/constants.py +0 -0
  69. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/construction/__init__.py +0 -0
  70. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/construction/dimensions.py +0 -0
  71. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/construction/dj_query.py +0 -0
  72. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/construction/exceptions.py +0 -0
  73. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/construction/utils.py +0 -0
  74. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/__init__.py +0 -0
  75. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/attributetype.py +0 -0
  76. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/availabilitystate.py +0 -0
  77. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/backfill.py +0 -0
  78. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/base.py +0 -0
  79. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/catalog.py +0 -0
  80. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/column.py +0 -0
  81. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/database.py +0 -0
  82. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/dimensionlink.py +0 -0
  83. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/engine.py +0 -0
  84. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/history.py +0 -0
  85. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/materialization.py +0 -0
  86. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/measure.py +0 -0
  87. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/metricmetadata.py +0 -0
  88. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/namespace.py +0 -0
  89. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/partition.py +0 -0
  90. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/queryrequest.py +0 -0
  91. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/tag.py +0 -0
  92. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/database/user.py +0 -0
  93. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/enum.py +0 -0
  94. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/errors.py +0 -0
  95. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/internal/__init__.py +0 -0
  96. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/internal/access/__init__.py +0 -0
  97. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/internal/access/authentication/__init__.py +0 -0
  98. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/internal/access/authentication/basic.py +0 -0
  99. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/internal/access/authentication/github.py +0 -0
  100. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/internal/access/authentication/google.py +0 -0
  101. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/internal/access/authentication/http.py +0 -0
  102. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/internal/access/authentication/tokens.py +0 -0
  103. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/internal/access/authorization.py +0 -0
  104. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/internal/engines.py +0 -0
  105. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/internal/materializations.py +0 -0
  106. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/internal/namespaces.py +0 -0
  107. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/internal/nodes.py +0 -0
  108. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/internal/validation.py +0 -0
  109. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/materialization/__init__.py +0 -0
  110. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/materialization/jobs/__init__.py +0 -0
  111. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/materialization/jobs/job_types.py +0 -0
  112. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/materialization/jobs/materialization_job.py +0 -0
  113. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/__init__.py +0 -0
  114. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/access.py +0 -0
  115. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/attribute.py +0 -0
  116. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/base.py +0 -0
  117. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/catalog.py +0 -0
  118. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/column.py +0 -0
  119. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/cube.py +0 -0
  120. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/database.py +0 -0
  121. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/dimensionlink.py +0 -0
  122. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/engine.py +0 -0
  123. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/history.py +0 -0
  124. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/materialization.py +0 -0
  125. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/measure.py +0 -0
  126. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/metric.py +0 -0
  127. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/node.py +0 -0
  128. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/node_type.py +0 -0
  129. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/partition.py +0 -0
  130. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/query.py +0 -0
  131. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/table.py +0 -0
  132. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/tag.py +0 -0
  133. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/models/user.py +0 -0
  134. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/naming.py +0 -0
  135. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/service_clients.py +0 -0
  136. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/__init__.py +0 -0
  137. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/dag.py +0 -0
  138. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/functions.py +0 -0
  139. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/parsing/__init__.py +0 -0
  140. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/parsing/ast.py +0 -0
  141. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/parsing/backends/__init__.py +0 -0
  142. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/parsing/backends/antlr4.py +0 -0
  143. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/parsing/backends/exceptions.py +0 -0
  144. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/parsing/backends/grammar/SqlBaseLexer.g4 +0 -0
  145. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/parsing/backends/grammar/SqlBaseParser.g4 +0 -0
  146. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/parsing/backends/grammar/__init__.py +0 -0
  147. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseLexer.interp +0 -0
  148. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseLexer.py +0 -0
  149. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseLexer.tokens +0 -0
  150. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParser.interp +0 -0
  151. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParser.py +0 -0
  152. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParser.tokens +0 -0
  153. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParserListener.py +0 -0
  154. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParserVisitor.py +0 -0
  155. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/superset.py +0 -0
  156. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/transpilation.py +0 -0
  157. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/typing.py +0 -0
  158. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/datajunction_server/utils.py +0 -0
  159. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/pdm.lock +0 -0
  160. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/pyproject.toml +0 -0
  161. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/requirements/docker.txt +0 -0
  162. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/requirements/test.txt +0 -0
  163. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/scripts/docs-snippets.js +0 -0
  164. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/scripts/docs-snippets.sh +0 -0
  165. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/scripts/generate-openapi.py +0 -0
  166. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/__init__.py +0 -0
  167. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/__init__.py +0 -0
  168. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/attributes_test.py +0 -0
  169. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/catalog_test.py +0 -0
  170. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/client_test.py +0 -0
  171. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/cubes_test.py +0 -0
  172. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/data_test.py +0 -0
  173. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/dimension_links_test.py +0 -0
  174. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/dimensions_test.py +0 -0
  175. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/djql_test.py +0 -0
  176. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/engine_test.py +0 -0
  177. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/druid_measures_cube.full.druid_spec.json +0 -0
  178. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/druid_measures_cube.full.partition.druid_spec.json +0 -0
  179. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/druid_measures_cube.full.partition.query.sql +0 -0
  180. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/druid_measures_cube.full.query.sql +0 -0
  181. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/druid_measures_cube.incremental.categorical.query.sql +0 -0
  182. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/druid_measures_cube.incremental.druid_spec.json +0 -0
  183. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/druid_measures_cube.incremental.patched.query.sql +0 -0
  184. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/druid_measures_cube.incremental.query.sql +0 -0
  185. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/druid_metrics_cube.incremental.categorical.query.sql +0 -0
  186. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/druid_metrics_cube.incremental.druid_spec.json +0 -0
  187. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/druid_metrics_cube.incremental.query.sql +0 -0
  188. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/spark_sql.full.config.json +0 -0
  189. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/spark_sql.full.materializations.json +0 -0
  190. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/spark_sql.full.partition.config.json +0 -0
  191. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/spark_sql.full.partition.materializations.json +0 -0
  192. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/spark_sql.full.partition.query.sql +0 -0
  193. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/spark_sql.full.query.sql +0 -0
  194. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/spark_sql.incremental.additional.query.sql +0 -0
  195. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/spark_sql.incremental.categorical.query.sql +0 -0
  196. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/spark_sql.incremental.config.json +0 -0
  197. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/spark_sql.incremental.lookback.query.sql +0 -0
  198. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/files/materializations_test/spark_sql.incremental.query.sql +0 -0
  199. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/graphql/__init__.py +0 -0
  200. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/graphql/catalog_test.py +0 -0
  201. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/graphql/engine_test.py +0 -0
  202. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/health_test.py +0 -0
  203. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/helpers_test.py +0 -0
  204. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/history_test.py +0 -0
  205. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/materializations_test.py +0 -0
  206. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/measures_test.py +0 -0
  207. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/metrics_test.py +0 -0
  208. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/namespaces_test.py +0 -0
  209. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/node_update_test.py +0 -0
  210. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/routers_test.py +0 -0
  211. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/api/tags_test.py +0 -0
  212. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/conftest.py +0 -0
  213. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/construction/__init__.py +0 -0
  214. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/construction/build_test.py +0 -0
  215. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/construction/compile_test.py +0 -0
  216. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/construction/exceptions_test.py +0 -0
  217. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/construction/fixtures.py +0 -0
  218. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/construction/inference_test.py +0 -0
  219. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/construction/utils_test.py +0 -0
  220. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/default.duckdb +0 -0
  221. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/duckdb.sql +0 -0
  222. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/errors_test.py +0 -0
  223. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/fixes_test.py +0 -0
  224. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/integration/__init__.py +0 -0
  225. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/integration/basic_test.py +0 -0
  226. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/internal/authentication/basic_test.py +0 -0
  227. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/internal/authentication/github_test.py +0 -0
  228. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/internal/authentication/http_test.py +0 -0
  229. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/internal/authentication/token_test.py +0 -0
  230. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/internal/authentication/whoami_test.py +0 -0
  231. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/migrations_test.py +0 -0
  232. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/models/__init__.py +0 -0
  233. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/models/catalog_test.py +0 -0
  234. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/models/hash_test.py +0 -0
  235. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/models/measure_test.py +0 -0
  236. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/models/node_test.py +0 -0
  237. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/models/query_test.py +0 -0
  238. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/pytest.ini +0 -0
  239. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/service_clients_test.py +0 -0
  240. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/__init__.py +0 -0
  241. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/dag_test.py +0 -0
  242. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/functions_test.py +0 -0
  243. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/__init__.py +0 -0
  244. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/backends/__init__.py +0 -0
  245. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/backends/antlr4_test.py +0 -0
  246. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/backends/types_test.py +0 -0
  247. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/__init__.py +0 -0
  248. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query1.sql +0 -0
  249. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query10.sql +0 -0
  250. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query11.sql +0 -0
  251. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query12.sql +0 -0
  252. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query13.sql +0 -0
  253. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query14.sql +0 -0
  254. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query15.sql +0 -0
  255. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query16.sql +0 -0
  256. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query17.sql +0 -0
  257. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query18.sql +0 -0
  258. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query19.sql +0 -0
  259. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query2.sql +0 -0
  260. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query20.sql +0 -0
  261. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query21.sql +0 -0
  262. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query22.sql +0 -0
  263. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query23.sql +0 -0
  264. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query24.sql +0 -0
  265. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query25.sql +0 -0
  266. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query26.sql +0 -0
  267. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query27.sql +0 -0
  268. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query28.sql +0 -0
  269. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query29.sql +0 -0
  270. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query3.sql +0 -0
  271. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query30.sql +0 -0
  272. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query31.sql +0 -0
  273. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query32.sql +0 -0
  274. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query33.sql +0 -0
  275. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query34.sql +0 -0
  276. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query35.sql +0 -0
  277. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query36.sql +0 -0
  278. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query37.sql +0 -0
  279. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query38.sql +0 -0
  280. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query39.sql +0 -0
  281. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query4.sql +0 -0
  282. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query40.sql +0 -0
  283. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query41.sql +0 -0
  284. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query42.sql +0 -0
  285. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query43.sql +0 -0
  286. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query44.sql +0 -0
  287. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query45.sql +0 -0
  288. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query46.sql +0 -0
  289. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query47.sql +0 -0
  290. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query48.sql +0 -0
  291. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query49.sql +0 -0
  292. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query5.sql +0 -0
  293. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query50.sql +0 -0
  294. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query51.sql +0 -0
  295. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query52.sql +0 -0
  296. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query53.sql +0 -0
  297. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query54.sql +0 -0
  298. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query55.sql +0 -0
  299. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query56.sql +0 -0
  300. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query57.sql +0 -0
  301. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query58.sql +0 -0
  302. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query59.sql +0 -0
  303. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query6.sql +0 -0
  304. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query60.sql +0 -0
  305. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query61.sql +0 -0
  306. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query62.sql +0 -0
  307. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query63.sql +0 -0
  308. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query64.sql +0 -0
  309. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query65.sql +0 -0
  310. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query66.sql +0 -0
  311. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query67.sql +0 -0
  312. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query68.sql +0 -0
  313. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query69.sql +0 -0
  314. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query7.sql +0 -0
  315. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query70.sql +0 -0
  316. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query71.sql +0 -0
  317. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query72.sql +0 -0
  318. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query73.sql +0 -0
  319. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query74.sql +0 -0
  320. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query75.sql +0 -0
  321. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query76.sql +0 -0
  322. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query77.sql +0 -0
  323. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query78.sql +0 -0
  324. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query79.sql +0 -0
  325. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query8.sql +0 -0
  326. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query80.sql +0 -0
  327. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query81.sql +0 -0
  328. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query82.sql +0 -0
  329. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query83.sql +0 -0
  330. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query84.sql +0 -0
  331. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query85.sql +0 -0
  332. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query86.sql +0 -0
  333. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query87.sql +0 -0
  334. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query88.sql +0 -0
  335. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query89.sql +0 -0
  336. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query9.sql +0 -0
  337. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query90.sql +0 -0
  338. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query91.sql +0 -0
  339. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query92.sql +0 -0
  340. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query93.sql +0 -0
  341. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query94.sql +0 -0
  342. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query95.sql +0 -0
  343. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query96.sql +0 -0
  344. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query97.sql +0 -0
  345. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query98.sql +0 -0
  346. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/ansi/query99.sql +0 -0
  347. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query1.sql +0 -0
  348. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query10.sql +0 -0
  349. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query11.sql +0 -0
  350. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query12.sql +0 -0
  351. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query13.sql +0 -0
  352. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query14.sql +0 -0
  353. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query15.sql +0 -0
  354. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query16.sql +0 -0
  355. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query17.sql +0 -0
  356. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query18.sql +0 -0
  357. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query19.sql +0 -0
  358. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query2.sql +0 -0
  359. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query20.sql +0 -0
  360. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query21.sql +0 -0
  361. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query22.sql +0 -0
  362. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query23.sql +0 -0
  363. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query24.sql +0 -0
  364. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query25.sql +0 -0
  365. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query26.sql +0 -0
  366. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query27.sql +0 -0
  367. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query28.sql +0 -0
  368. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query29.sql +0 -0
  369. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query3.sql +0 -0
  370. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query30.sql +0 -0
  371. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query31.sql +0 -0
  372. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query32.sql +0 -0
  373. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query33.sql +0 -0
  374. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query34.sql +0 -0
  375. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query35.sql +0 -0
  376. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query36.sql +0 -0
  377. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query37.sql +0 -0
  378. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query38.sql +0 -0
  379. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query39.sql +0 -0
  380. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query4.sql +0 -0
  381. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query40.sql +0 -0
  382. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query41.sql +0 -0
  383. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query42.sql +0 -0
  384. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query43.sql +0 -0
  385. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query44.sql +0 -0
  386. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query45.sql +0 -0
  387. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query46.sql +0 -0
  388. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query47.sql +0 -0
  389. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query48.sql +0 -0
  390. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query49.sql +0 -0
  391. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query5.sql +0 -0
  392. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query50.sql +0 -0
  393. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query51.sql +0 -0
  394. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query52.sql +0 -0
  395. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query53.sql +0 -0
  396. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query54.sql +0 -0
  397. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query55.sql +0 -0
  398. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query56.sql +0 -0
  399. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query57.sql +0 -0
  400. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query58.sql +0 -0
  401. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query59.sql +0 -0
  402. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query6.sql +0 -0
  403. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query60.sql +0 -0
  404. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query61.sql +0 -0
  405. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query62.sql +0 -0
  406. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query63.sql +0 -0
  407. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query64.sql +0 -0
  408. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query65.sql +0 -0
  409. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query66.sql +0 -0
  410. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query67.sql +0 -0
  411. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query68.sql +0 -0
  412. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query69.sql +0 -0
  413. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query7.sql +0 -0
  414. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query70.sql +0 -0
  415. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query71.sql +0 -0
  416. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query72.sql +0 -0
  417. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query73.sql +0 -0
  418. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query74.sql +0 -0
  419. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query75.sql +0 -0
  420. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query76.sql +0 -0
  421. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query77.sql +0 -0
  422. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query78.sql +0 -0
  423. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query79.sql +0 -0
  424. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query8.sql +0 -0
  425. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query80.sql +0 -0
  426. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query81.sql +0 -0
  427. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query82.sql +0 -0
  428. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query83.sql +0 -0
  429. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query84.sql +0 -0
  430. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query85.sql +0 -0
  431. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query86.sql +0 -0
  432. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query87.sql +0 -0
  433. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query88.sql +0 -0
  434. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query89.sql +0 -0
  435. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query9.sql +0 -0
  436. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query90.sql +0 -0
  437. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query91.sql +0 -0
  438. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query92.sql +0 -0
  439. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query93.sql +0 -0
  440. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query94.sql +0 -0
  441. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query95.sql +0 -0
  442. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query96.sql +0 -0
  443. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query97.sql +0 -0
  444. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query98.sql +0 -0
  445. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/sparksql/query99.sql +0 -0
  446. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/queries/tpcds/test_tpcds.py +0 -0
  447. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/parsing/test_ast.py +0 -0
  448. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/sql/utils.py +0 -0
  449. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/superset_test.py +0 -0
  450. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/transpilation_test.py +0 -0
  451. {datajunction_server-0.0.1a49 → datajunction_server-0.0.1a49.dev0}/tests/utils_test.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.1
2
2
  Name: datajunction-server
3
- Version: 0.0.1a49
3
+ Version: 0.0.1a49.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.1a49.dev0"
@@ -5,7 +5,7 @@ Data related APIs.
5
5
  from http import HTTPStatus
6
6
  from typing import Annotated, Dict, List, Optional
7
7
 
8
- from fastapi import Depends, Header, Query, Request
8
+ from fastapi import BackgroundTasks, Depends, Header, Query, Request
9
9
  from fastapi.responses import JSONResponse
10
10
  from sqlalchemy.ext.asyncio import AsyncSession
11
11
  from sqlalchemy.orm import joinedload, selectinload
@@ -181,6 +181,7 @@ async def get_data( # pylint: disable=too-many-locals
181
181
  validate_access: access.ValidateAccessFn = Depends( # pylint: disable=W0621
182
182
  validate_access,
183
183
  ),
184
+ background_tasks: BackgroundTasks,
184
185
  ) -> QueryWithResults:
185
186
  """
186
187
  Gets data for a node
@@ -196,6 +197,7 @@ async def get_data( # pylint: disable=too-many-locals
196
197
  engine_version=engine_version,
197
198
  current_user=current_user,
198
199
  validate_access=validate_access,
200
+ background_tasks=background_tasks,
199
201
  )
200
202
  node = await Node.get_by_name(session, node_name, raise_if_not_exists=True)
201
203
  available_engines = node.current.catalog.engines # type: ignore
@@ -250,6 +252,7 @@ async def get_data_stream_for_node( # pylint: disable=R0914, R0913
250
252
  validate_access: access.ValidateAccessFn = Depends( # pylint: disable=W0621
251
253
  validate_access,
252
254
  ),
255
+ background_tasks: BackgroundTasks,
253
256
  ) -> QueryWithResults:
254
257
  """
255
258
  Return data for a node using server side events
@@ -265,6 +268,7 @@ async def get_data_stream_for_node( # pylint: disable=R0914, R0913
265
268
  engine_version=engine_version,
266
269
  current_user=current_user,
267
270
  validate_access=validate_access,
271
+ background_tasks=background_tasks,
268
272
  )
269
273
  if query_request and query_request.query_id:
270
274
  return EventSourceResponse(
@@ -21,6 +21,7 @@ from datajunction_server.construction.build import (
21
21
  build_materialized_cube_node,
22
22
  build_metric_nodes,
23
23
  build_node,
24
+ get_default_criteria,
24
25
  rename_columns,
25
26
  validate_shared_dimensions,
26
27
  )
@@ -50,10 +51,9 @@ from datajunction_server.errors import (
50
51
  from datajunction_server.internal.engines import get_engine
51
52
  from datajunction_server.models import access
52
53
  from datajunction_server.models.attribute import RESERVED_ATTRIBUTE_NAMESPACE
53
- from datajunction_server.models.engine import Dialect
54
54
  from datajunction_server.models.history import status_change_history
55
55
  from datajunction_server.models.metric import TranslatedSQL
56
- from datajunction_server.models.node import BuildCriteria, NodeStatus
56
+ from datajunction_server.models.node import NodeStatus
57
57
  from datajunction_server.models.node_type import NodeType
58
58
  from datajunction_server.models.query import ColumnMetadata, QueryWithResults
59
59
  from datajunction_server.naming import LOOKUP_CHARS
@@ -204,19 +204,7 @@ async def get_query( # pylint: disable=too-many-arguments
204
204
  Get a query for a metric, dimensions, and filters
205
205
  """
206
206
  node = await Node.get_by_name(session, node_name)
207
-
208
- # Builds the node for the engine's dialect if one is set or defaults to Spark
209
- if (
210
- not engine
211
- and node.current # type: ignore
212
- and node.current.catalog # type: ignore
213
- and node.current.catalog.engines # type: ignore
214
- ):
215
- engine = node.current.catalog.engines[0] # type: ignore
216
- build_criteria = BuildCriteria(
217
- dialect=(engine.dialect if engine and engine.dialect else Dialect.SPARK),
218
- )
219
-
207
+ build_criteria = get_default_criteria(node.current, engine) # type: ignore
220
208
  query_ast = await build_node(
221
209
  session=session,
222
210
  node=node.current, # type: ignore
@@ -26,6 +26,7 @@ from datajunction_server.api.helpers import (
26
26
  from datajunction_server.api.namespaces import create_node_namespace
27
27
  from datajunction_server.api.tags import get_tags_by_name
28
28
  from datajunction_server.constants import NODE_LIST_MAX
29
+ from datajunction_server.database import DimensionLink
29
30
  from datajunction_server.database.attributetype import ColumnAttribute
30
31
  from datajunction_server.database.column import Column
31
32
  from datajunction_server.database.history import ActivityType, EntityType, History
@@ -103,7 +104,7 @@ from datajunction_server.sql.dag import (
103
104
  get_downstream_nodes,
104
105
  get_upstream_nodes,
105
106
  )
106
- from datajunction_server.sql.parsing.backends.antlr4 import parse
107
+ from datajunction_server.sql.parsing.backends.antlr4 import parse, parse_rule
107
108
  from datajunction_server.utils import (
108
109
  Version,
109
110
  get_current_user,
@@ -967,11 +968,10 @@ async def refresh_source_node(
967
968
  if new_columns:
968
969
  # check if any of the columns have changed (only continue with update if they have)
969
970
  column_changes = {col.identifier() for col in current_revision.columns} != {
970
- col.identifier() for col in new_columns
971
+ (col.name, str(parse_rule(str(col.type), "dataType")))
972
+ for col in new_columns
971
973
  }
972
974
 
973
- # FIXME: there is a bug with type translation (bigint != long) - fix it. # pylint: disable=fixme
974
-
975
975
  # if the columns haven't changed and the node has a table, we can skip the update
976
976
  if not column_changes:
977
977
  if not source_node.missing_table: # type: ignore
@@ -998,6 +998,16 @@ async def refresh_source_node(
998
998
  schema_=current_revision.schema_,
999
999
  table=current_revision.table,
1000
1000
  status=current_revision.status,
1001
+ dimension_links=[
1002
+ DimensionLink(
1003
+ dimension_id=link.dimension_id,
1004
+ join_sql=link.join_sql,
1005
+ join_type=link.join_type,
1006
+ join_cardinality=link.join_cardinality,
1007
+ materialization_conf=link.materialization_conf,
1008
+ )
1009
+ for link in current_revision.dimension_links
1010
+ ],
1001
1011
  )
1002
1012
  new_revision.version = str(old_version.next_major_version())
1003
1013
  new_revision.columns = [
@@ -5,7 +5,7 @@ SQL related APIs.
5
5
  import logging
6
6
  from typing import List, Optional, Tuple
7
7
 
8
- from fastapi import Depends, Query
8
+ from fastapi import BackgroundTasks, Depends, Query
9
9
  from sqlalchemy.ext.asyncio import AsyncSession
10
10
 
11
11
  from datajunction_server.api.helpers import (
@@ -15,12 +15,14 @@ from datajunction_server.api.helpers import (
15
15
  validate_orderby,
16
16
  )
17
17
  from datajunction_server.construction.build import get_measures_query
18
+ from datajunction_server.database import Engine
18
19
  from datajunction_server.database.queryrequest import QueryBuildType, QueryRequest
19
20
  from datajunction_server.database.user import User
20
21
  from datajunction_server.internal.access.authentication.http import SecureAPIRouter
21
22
  from datajunction_server.internal.access.authorization import validate_access
22
23
  from datajunction_server.internal.engines import get_engine
23
24
  from datajunction_server.models import access
25
+ from datajunction_server.models.access import AccessControlStore
24
26
  from datajunction_server.models.metric import TranslatedSQL
25
27
  from datajunction_server.models.user import UserOutput
26
28
  from datajunction_server.utils import get_current_user, get_session, get_settings
@@ -108,6 +110,51 @@ async def get_measures_sql_for_cube(
108
110
  return measures_query
109
111
 
110
112
 
113
+ async def build_and_save_node_sql( # pylint: disable=too-many-locals
114
+ node_name: str,
115
+ dimensions: List[str] = Query([]),
116
+ filters: List[str] = Query([]),
117
+ orderby: List[str] = Query([]),
118
+ limit: Optional[int] = None,
119
+ *,
120
+ session: AsyncSession = Depends(get_session),
121
+ engine: Engine,
122
+ access_control: AccessControlStore,
123
+ ) -> QueryRequest:
124
+ """
125
+ Build node SQL and save it to query requests
126
+ """
127
+ query_ast = await get_query(
128
+ session=session,
129
+ node_name=node_name,
130
+ dimensions=dimensions,
131
+ filters=filters,
132
+ orderby=orderby,
133
+ limit=limit,
134
+ engine=engine,
135
+ access_control=access_control,
136
+ )
137
+ columns = [
138
+ assemble_column_metadata(col) # type: ignore
139
+ for col in query_ast.select.projection
140
+ ]
141
+ query = str(query_ast)
142
+ query_request = await QueryRequest.save_query_request(
143
+ session=session,
144
+ nodes=[node_name],
145
+ dimensions=dimensions,
146
+ filters=filters,
147
+ orderby=orderby,
148
+ limit=limit,
149
+ engine_name=engine.name if engine else None,
150
+ engine_version=engine.version if engine else None,
151
+ query_type=QueryBuildType.NODE,
152
+ query=query,
153
+ columns=[col.dict() for col in columns],
154
+ )
155
+ return query_request
156
+
157
+
111
158
  async def get_node_sql( # pylint: disable=too-many-locals
112
159
  node_name: str,
113
160
  dimensions: List[str] = Query([]),
@@ -120,6 +167,7 @@ async def get_node_sql( # pylint: disable=too-many-locals
120
167
  engine_version: Optional[str] = None,
121
168
  current_user: Optional[User],
122
169
  validate_access: access.ValidateAccessFn, # pylint: disable=redefined-outer-name
170
+ background_tasks: BackgroundTasks,
123
171
  ) -> Tuple[TranslatedSQL, QueryRequest]:
124
172
  """
125
173
  Return SQL for a node.
@@ -149,6 +197,18 @@ async def get_node_sql( # pylint: disable=too-many-locals
149
197
  engine_version=engine.version if engine else None,
150
198
  query_type=QueryBuildType.NODE,
151
199
  ):
200
+ # Update the node SQL in a background task to keep it up-to-date
201
+ background_tasks.add_task(
202
+ build_and_save_node_sql,
203
+ node_name=node_name,
204
+ dimensions=dimensions,
205
+ filters=filters,
206
+ orderby=orderby,
207
+ limit=limit,
208
+ session=session,
209
+ engine=engine,
210
+ access_control=access_control,
211
+ )
152
212
  return (
153
213
  TranslatedSQL(
154
214
  sql=query_request.query,
@@ -158,38 +218,20 @@ async def get_node_sql( # pylint: disable=too-many-locals
158
218
  query_request,
159
219
  )
160
220
 
161
- query_ast = await get_query(
162
- session=session,
221
+ query_request = await build_and_save_node_sql(
163
222
  node_name=node_name,
164
223
  dimensions=dimensions,
165
224
  filters=filters,
166
225
  orderby=orderby,
167
226
  limit=limit,
168
- engine=engine,
169
- access_control=access_control,
170
- )
171
- columns = [
172
- assemble_column_metadata(col) # type: ignore
173
- for col in query_ast.select.projection
174
- ]
175
- query = str(query_ast)
176
- query_request = await QueryRequest.save_query_request(
177
227
  session=session,
178
- nodes=[node_name],
179
- dimensions=dimensions,
180
- filters=filters,
181
- orderby=orderby,
182
- limit=limit,
183
- engine_name=engine.name if engine else None,
184
- engine_version=engine.version if engine else None,
185
- query_type=QueryBuildType.NODE,
186
- query=query,
187
- columns=[col.dict() for col in columns],
228
+ engine=engine, # type: ignore
229
+ access_control=access_control,
188
230
  )
189
231
  return (
190
232
  TranslatedSQL(
191
- sql=query,
192
- columns=columns,
233
+ sql=query_request.query,
234
+ columns=query_request.columns,
193
235
  dialect=engine.dialect if engine else None,
194
236
  ),
195
237
  query_request,
@@ -215,6 +257,7 @@ async def get_sql( # pylint: disable=too-many-locals
215
257
  validate_access: access.ValidateAccessFn = Depends( # pylint: disable=W0621
216
258
  validate_access,
217
259
  ),
260
+ background_tasks: BackgroundTasks,
218
261
  ) -> TranslatedSQL:
219
262
  """
220
263
  Return SQL for a node.
@@ -230,6 +273,7 @@ async def get_sql( # pylint: disable=too-many-locals
230
273
  engine_version=engine_version,
231
274
  current_user=current_user,
232
275
  validate_access=validate_access,
276
+ background_tasks=background_tasks,
233
277
  )
234
278
  return translated_sql
235
279
 
@@ -7,9 +7,9 @@ import time
7
7
  from typing import DefaultDict, Deque, Dict, List, Optional, Set, Tuple, Union, cast
8
8
 
9
9
  from sqlalchemy.ext.asyncio import AsyncSession
10
- from sqlalchemy.orm import joinedload
11
10
 
12
11
  from datajunction_server.construction.utils import to_namespaced_name
12
+ from datajunction_server.database import Engine
13
13
  from datajunction_server.database.column import Column
14
14
  from datajunction_server.database.node import Node, NodeRevision
15
15
  from datajunction_server.database.user import User
@@ -382,6 +382,42 @@ async def join_tables_for_dimensions(
382
382
  )
383
383
 
384
384
 
385
+ def build_filters(
386
+ node: NodeRevision,
387
+ node_table: Optional[ast.Table],
388
+ filters: Optional[List[str]],
389
+ ) -> List[ast.Expression]:
390
+ """
391
+ Returns a list of built filter expressions based on the provided node
392
+ and its table expression.
393
+ """
394
+ filter_asts: List[ast.Expression] = []
395
+ if not filters:
396
+ return filter_asts
397
+ dimensions_to_columns_map = node.dimensions_to_columns_map()
398
+ for filter_ in filters:
399
+ temp_select = parse(f"select * where {filter_}").select
400
+ referenced_dimensions = list(temp_select.find_all(ast.Column))
401
+ # We can only push down the filter if all dimensions referenced by the filter
402
+ # are available as foreign key columns on the node
403
+ all_referenced_dimensions_available_on_node = all(
404
+ dim.identifier() in dimensions_to_columns_map
405
+ for dim in referenced_dimensions
406
+ )
407
+ if all_referenced_dimensions_available_on_node:
408
+ # Renames the columns from dimension attributes to columns that match those
409
+ # dimension attributes on the node
410
+ for dim in referenced_dimensions:
411
+ col_name = dimensions_to_columns_map[dim.identifier()].alias_or_name
412
+ dim.name = ast.Name(name=col_name)
413
+ if node_table:
414
+ dim.add_table(node_table)
415
+ filter_asts.append(
416
+ temp_select.where, # type: ignore
417
+ )
418
+ return filter_asts
419
+
420
+
385
421
  async def _build_tables_on_select(
386
422
  session: AsyncSession,
387
423
  select: ast.SelectExpression,
@@ -395,87 +431,25 @@ async def _build_tables_on_select(
395
431
  """
396
432
  Add all nodes not agg or filter dimensions to the select
397
433
  """
434
+ context = CompileContext(session=session, exception=DJException())
435
+
398
436
  for node, tbls in tables.items():
399
- node_table = cast(
437
+ await session.refresh(node, ["dimension_links"])
438
+ # Save any existing filters on the query
439
+ filter_asts = [select.where] if select.where else []
440
+
441
+ # Try to find a physical table attached to this node, if one exists.
442
+ physical_table = cast(
400
443
  Optional[ast.Table],
401
444
  _get_node_table(node, build_criteria),
402
- ) # got a materialization
403
- fk_column_mapping = {}
404
- for col in node.columns:
405
- if col.dimension_id:
406
- col_dimension = await Node.get_by_id(
407
- session,
408
- col.dimension_id,
409
- joinedload(Node.current).options(
410
- *NodeRevision.default_load_options()
411
- ),
412
- )
413
- fk_column_mapping[
414
- ",".join(
415
- sorted(
416
- [
417
- pk.name for pk in col_dimension.current.primary_key() # type: ignore # pylint: disable=line-too-long
418
- ],
419
- ),
420
- )
421
- ] = col
445
+ )
422
446
 
423
- if node_table is None: # no materialization - recurse to node first
447
+ # If no attached physical table was found, recursively build the node
448
+ if physical_table is None:
424
449
  node_query = parse(cast(str, node.query))
425
450
  if hash(node_query) in memoized_queries: # pragma: no cover
426
- node_table = memoized_queries[hash(node_query)].select # type: ignore
451
+ query_ast = memoized_queries[hash(node_query)] # type: ignore
427
452
  else:
428
- if filters:
429
- filter_asts = ( # pylint: disable=consider-using-ternary
430
- node_query.select.where and [node_query.select.where] or []
431
- )
432
- foreign_keys_map = {
433
- left.alias_or_name.name: right
434
- for link in node.dimension_links
435
- for left, right in link.foreign_key_mapping().items()
436
- }
437
- foreign_keys_alias_map = {
438
- col.alias_or_name.name: col # type: ignore
439
- for col in node_query.select.projection
440
- }
441
- for filter_ in filters:
442
- temp_select = parse(f"select * where {filter_}").select
443
- referenced_cols = list(temp_select.find_all(ast.Column))
444
-
445
- # We can only push down the filter if all columns referenced by the filter
446
- # are available as foreign key columns on the node
447
- if all(
448
- col.alias_or_name.name in fk_column_mapping
449
- or col.alias_or_name.name in foreign_keys_map
450
- for col in referenced_cols
451
- ):
452
- # Renames the columns to the foreign key columns
453
- for col in referenced_cols:
454
- ref_col_name = (
455
- fk_column_mapping[col.alias_or_name.name].name
456
- if col.alias_or_name.name in fk_column_mapping
457
- else foreign_keys_map[
458
- col.alias_or_name.name
459
- ].alias_or_name
460
- )
461
- col.name = ast.Name(name=ref_col_name)
462
- if ( # pragma: no cover
463
- col.alias_or_name.name in foreign_keys_alias_map
464
- ):
465
- key = foreign_keys_alias_map[ # type: ignore
466
- col.alias_or_name.name
467
- ]
468
- col.name = (
469
- key.name
470
- if isinstance(key, ast.Named)
471
- else key.alias_or_name # type: ignore
472
- )
473
- filter_asts.append(
474
- temp_select.where, # type: ignore
475
- )
476
- if filter_asts:
477
- node_query.select.where = ast.BinaryOp.And(*filter_asts)
478
-
479
453
  query_ast = await build_ast( # type: ignore
480
454
  session,
481
455
  node_query,
@@ -485,16 +459,26 @@ async def _build_tables_on_select(
485
459
  dimensions,
486
460
  access_control,
487
461
  )
488
- node_table = query_ast.select # type: ignore
489
- node_table.parenthesized = True # type: ignore
490
462
  memoized_queries[hash(node_query)] = query_ast
491
463
 
492
- alias = amenable_name(node.name)
493
- context = CompileContext(session=session, exception=DJException())
464
+ alias = amenable_name(node.name)
465
+ node_ast = ast.Alias(ast.Name(alias), child=query_ast.select, as_=True) # type: ignore
466
+ query_ast.select.parenthesized = True # type: ignore
467
+
468
+ filter_asts.extend(build_filters(node, node_ast, filters)) # type: ignore
469
+ else:
470
+ alias = amenable_name(node.name)
471
+ node_ast = ast.Alias(ast.Name(alias), child=physical_table, as_=True) # type: ignore
472
+ filter_asts.extend(build_filters(node, physical_table, filters))
473
+
474
+ if filter_asts:
475
+ print("filter_asts", node.name, filter_asts, select)
476
+ select.where = ast.BinaryOp.And(*filter_asts)
477
+ await select.compile(context)
494
478
 
495
- node_ast = ast.Alias(ast.Name(alias), child=node_table, as_=True) # type: ignore
496
479
  for tbl in tbls:
497
- if isinstance(node_ast.child, ast.Select) and isinstance(tbl, ast.Alias):
480
+ print("node_ast", type(node_ast), node_ast)
481
+ if isinstance(node_ast.child, ast.Select) and isinstance(tbl, ast.Alias): # type: ignore
498
482
  node_ast.child.projection = [
499
483
  col
500
484
  for col in node_ast.child.projection
@@ -831,17 +815,24 @@ def _get_node_table(
831
815
 
832
816
  def get_default_criteria(
833
817
  node: NodeRevision,
818
+ engine: Optional[Engine] = None,
834
819
  ) -> BuildCriteria:
835
820
  """
836
821
  Get the default build criteria for a node.
837
822
  """
838
- return BuildCriteria(
839
- # set the dialect by finding available engines for this node, or default to Spark
840
- dialect=(
823
+ # Set the dialect by using the provided engine, if any. If no engine is specified,
824
+ # set the dialect by finding available engines for this node, or default to Spark
825
+ dialect = (
826
+ engine.dialect
827
+ if engine
828
+ else (
841
829
  node.catalog.engines[0].dialect
842
830
  if node.catalog and node.catalog.engines and node.catalog.engines[0].dialect
843
831
  else Dialect.SPARK
844
- ),
832
+ )
833
+ )
834
+ return BuildCriteria(
835
+ dialect=dialect,
845
836
  target_node_name=node.name,
846
837
  )
847
838
 
@@ -330,9 +330,11 @@ class Node(Base): # pylint: disable=too-few-public-methods
330
330
  """
331
331
  Get a node by id
332
332
  """
333
- statement = select(Node).where(Node.id == node_id).options(*options)
334
- result = await session.execute(statement)
335
- node = result.unique().scalar_one_or_none()
333
+ statement = (
334
+ select(Node).where(Node.id == node_id).options(*options)
335
+ ) # pragma: no cover
336
+ result = await session.execute(statement) # pragma: no cover
337
+ node = result.unique().scalar_one_or_none() # pragma: no cover
336
338
  return node
337
339
 
338
340
  @classmethod
@@ -741,6 +743,17 @@ class NodeRevision(
741
743
  if col.partition and col.partition.type_ == PartitionType.CATEGORICAL
742
744
  ]
743
745
 
746
+ def dimensions_to_columns_map(self):
747
+ """
748
+ A mapping between each of the dimension attributes linked to this node to the columns
749
+ that they're linked to.
750
+ """
751
+ return {
752
+ left.identifier(): right
753
+ for link in self.dimension_links
754
+ for left, right in link.foreign_key_mapping().items()
755
+ }
756
+
744
757
  def __deepcopy__(self, memo):
745
758
  """
746
759
  Note: We should not use copy or deepcopy to copy any SQLAlchemy objects.
@@ -147,7 +147,6 @@ def build_materialization_query(
147
147
  )
148
148
 
149
149
  categorical_partitions = node_revision.categorical_partition_columns()
150
- print("categorical_partitions", categorical_partitions)
151
150
  if categorical_partitions:
152
151
  categorical_partition_col = [
153
152
  col
@@ -181,5 +180,4 @@ def build_materialization_query(
181
180
  final_query.select.from_ = ast.From(
182
181
  relations=[ast.Relation(primary=ast.Table(name=ast.Name("combiner_query")))],
183
182
  )
184
- print("final_queryfinal_query", final_query)
185
183
  return final_query
@@ -291,7 +291,7 @@ class NestedField(ColumnType):
291
291
  doc_string = "" if doc is None else f", doc={repr(doc)}"
292
292
  super().__init__(
293
293
  (
294
- f"{name}: {field_type}"
294
+ f"{name} {field_type}"
295
295
  f"{' NOT NULL' if not is_optional else ''}"
296
296
  + ("" if doc is None else f" {doc}")
297
297
  ),
@@ -364,7 +364,7 @@ field_type=IntegerType(), is_optional=True, doc='an optional field'))
364
364
  def __init__(self, *fields: NestedField):
365
365
  if not self._initialized:
366
366
  super().__init__(
367
- f"struct<{', '.join(map(str, fields))}>",
367
+ f"struct<{','.join(map(str, fields))}>",
368
368
  f"StructType{repr(fields)}",
369
369
  )
370
370
  self._fields = fields
@@ -1639,7 +1639,12 @@ class TestNodeCRUD: # pylint: disable=too-many-public-methods
1639
1639
  history = response.json()
1640
1640
  assert [
1641
1641
  (activity["activity_type"], activity["entity_type"]) for activity in history
1642
- ] == [("refresh", "node"), ("create", "link"), ("create", "node")]
1642
+ ] == [
1643
+ ("refresh", "node"),
1644
+ ("create", "link"),
1645
+ ("create", "link"),
1646
+ ("create", "node"),
1647
+ ]
1643
1648
 
1644
1649
  # Refresh it again, but this time no columns will have changed so
1645
1650
  # verify that the node revision stays the same
@@ -1651,6 +1656,33 @@ class TestNodeCRUD: # pylint: disable=too-many-public-methods
1651
1656
  assert data_second["node_revision_id"] == data["node_revision_id"]
1652
1657
  assert data_second["columns"] == new_columns
1653
1658
 
1659
+ # The refreshed source node should retain the existing dimension links
1660
+ response = await custom_client.get("/nodes/default.repair_orders")
1661
+ assert response.json()["dimension_links"] == [
1662
+ {
1663
+ "dimension": {"name": "default.repair_order"},
1664
+ "foreign_keys": {
1665
+ "default.repair_orders.repair_order_id": "default.repair_order.repair_order_id",
1666
+ },
1667
+ "join_cardinality": "many_to_one",
1668
+ "join_sql": "default.repair_orders.repair_order_id = "
1669
+ "default.repair_order.repair_order_id",
1670
+ "join_type": "left",
1671
+ "role": None,
1672
+ },
1673
+ {
1674
+ "dimension": {"name": "default.dispatcher"},
1675
+ "foreign_keys": {
1676
+ "default.repair_orders.dispatcher_id": "default.dispatcher.dispatcher_id",
1677
+ },
1678
+ "join_cardinality": "many_to_one",
1679
+ "join_sql": "default.repair_orders.dispatcher_id = "
1680
+ "default.dispatcher.dispatcher_id",
1681
+ "join_type": "left",
1682
+ "role": None,
1683
+ },
1684
+ ]
1685
+
1654
1686
  @pytest.mark.asyncio
1655
1687
  async def test_refresh_source_node_with_problems(
1656
1688
  self,
@@ -1684,7 +1716,12 @@ class TestNodeCRUD: # pylint: disable=too-many-public-methods
1684
1716
  history = response.json()
1685
1717
  assert [
1686
1718
  (activity["activity_type"], activity["entity_type"]) for activity in history
1687
- ] == [("refresh", "node"), ("create", "link"), ("create", "node")]
1719
+ ] == [
1720
+ ("refresh", "node"),
1721
+ ("create", "link"),
1722
+ ("create", "link"),
1723
+ ("create", "node"),
1724
+ ]
1688
1725
 
1689
1726
  # Refresh it again, but this time no columns are found
1690
1727
  mocker.patch.object(
@@ -2692,11 +2729,11 @@ GROUP BY
2692
2729
  "attributes": [],
2693
2730
  "dimension": None,
2694
2731
  "name": "measures",
2695
- "type": "struct<completed_repairs: bigint, "
2696
- "total_repairs_dispatched: bigint, "
2697
- "total_amount_in_region: double, "
2698
- "avg_repair_amount_in_region: double, "
2699
- "avg_dispatch_delay: double, unique_contractors: "
2732
+ "type": "struct<completed_repairs bigint,"
2733
+ "total_repairs_dispatched bigint,"
2734
+ "total_amount_in_region double,"
2735
+ "avg_repair_amount_in_region double,"
2736
+ "avg_dispatch_delay double,unique_contractors "
2700
2737
  "bigint>",
2701
2738
  "display_name": "Measures",
2702
2739
  "partition": None,