datajunction 0.0.211__tar.gz → 0.0.213__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 (184) hide show
  1. {datajunction-0.0.211 → datajunction-0.0.213}/PKG-INFO +2 -2
  2. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/__about__.py +1 -1
  3. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/skills/datajunction-repo/SKILL.md +67 -2
  4. {datajunction-0.0.211 → datajunction-0.0.213}/tests/conftest.py +27 -0
  5. {datajunction-0.0.211 → datajunction-0.0.213}/.coveragerc +0 -0
  6. {datajunction-0.0.211 → datajunction-0.0.213}/.gitignore +0 -0
  7. {datajunction-0.0.211 → datajunction-0.0.213}/.pre-commit-config.yaml +0 -0
  8. {datajunction-0.0.211 → datajunction-0.0.213}/LICENSE.txt +0 -0
  9. {datajunction-0.0.211 → datajunction-0.0.213}/Makefile +0 -0
  10. {datajunction-0.0.211 → datajunction-0.0.213}/README.md +0 -0
  11. {datajunction-0.0.211 → datajunction-0.0.213}/claude_desktop_config.example.json +0 -0
  12. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/__init__.py +0 -0
  13. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/_base.py +0 -0
  14. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/_internal.py +0 -0
  15. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/admin.py +0 -0
  16. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/builder.py +0 -0
  17. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/cli.py +0 -0
  18. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/client.py +0 -0
  19. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/compile.py +0 -0
  20. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/deployment.py +0 -0
  21. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/exceptions.py +0 -0
  22. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/mcp/__init__.py +0 -0
  23. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/mcp/cli.py +0 -0
  24. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/mcp/config.py +0 -0
  25. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/models.py +0 -0
  26. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/nodes.py +0 -0
  27. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/rendering.py +0 -0
  28. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/init_system_nodes.py +0 -0
  29. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/date.yaml +0 -0
  30. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/deployment.yaml +0 -0
  31. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/dimension_link.yaml +0 -0
  32. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/distinct_node_authors.yaml +0 -0
  33. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/distinct_node_editors.yaml +0 -0
  34. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/dj.yaml +0 -0
  35. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/is_active.yaml +0 -0
  36. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/materialization.yaml +0 -0
  37. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/median_deployment_duration_seconds.yaml +0 -0
  38. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/median_dim_links_per_node.yaml +0 -0
  39. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/median_dimension_indegree.yaml +0 -0
  40. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/median_downstream_count.yaml +0 -0
  41. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/median_revisions_per_node.yaml +0 -0
  42. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/median_upstream_count.yaml +0 -0
  43. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/namespace.yaml +0 -0
  44. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/node_revision.yaml +0 -0
  45. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/node_type.yaml +0 -0
  46. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/nodes.yaml +0 -0
  47. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/number_of_branches.yaml +0 -0
  48. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/number_of_deployments.yaml +0 -0
  49. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/number_of_materializations.yaml +0 -0
  50. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/number_of_namespaces.yaml +0 -0
  51. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/number_of_nodes.yaml +0 -0
  52. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/number_of_orphan_nodes.yaml +0 -0
  53. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/number_of_unused_dimensions.yaml +0 -0
  54. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/repo.yaml +0 -0
  55. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/seed/nodes/user.yaml +0 -0
  56. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/skills/datajunction/SKILL.md +0 -0
  57. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/skills/datajunction-api/SKILL.md +0 -0
  58. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/skills/datajunction-query/SKILL.md +0 -0
  59. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/skills/datajunction-semantic-model/SKILL.md +0 -0
  60. {datajunction-0.0.211 → datajunction-0.0.213}/datajunction/tags.py +0 -0
  61. {datajunction-0.0.211 → datajunction-0.0.213}/pyproject.toml +0 -0
  62. {datajunction-0.0.211 → datajunction-0.0.213}/setup.cfg +0 -0
  63. {datajunction-0.0.211 → datajunction-0.0.213}/tests/__init__.py +0 -0
  64. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/deploy0/dj.yaml +0 -0
  65. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/deploy0/roads/companies.yaml +0 -0
  66. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/deploy0/roads/companies_dim.yaml +0 -0
  67. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/deploy0/roads/contractor.yaml +0 -0
  68. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/deploy0/roads/contractors.yaml +0 -0
  69. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/deploy0/roads/us_state.yaml +0 -0
  70. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/deploy0/roads/us_states.yaml +0 -0
  71. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/dj.yaml +0 -0
  72. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/avg_length_of_employment.metric.yaml +0 -0
  73. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/avg_repair_price.metric.yaml +0 -0
  74. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/avg_time_to_dispatch.metric.yaml +0 -0
  75. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/contractor.dimension.yaml +0 -0
  76. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/contractors.source.yaml +0 -0
  77. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/date.source.yaml +0 -0
  78. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/date_dim.dimension.yaml +0 -0
  79. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/dispatcher.dimension.yaml +0 -0
  80. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/dispatchers.source.yaml +0 -0
  81. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/hard_hat.dimension.yaml +0 -0
  82. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/hard_hat_state.source.yaml +0 -0
  83. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/hard_hats.source.yaml +0 -0
  84. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/local_hard_hats.dimension.yaml +0 -0
  85. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/municipality.source.yaml +0 -0
  86. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/municipality_dim.dimension.yaml +0 -0
  87. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/municipality_municipality_type.source.yaml +0 -0
  88. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/municipality_type.source.yaml +0 -0
  89. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/national_level_agg.transform.yaml +0 -0
  90. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/num_repair_orders.metric.yaml +0 -0
  91. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/regional_level_agg.transform.yaml +0 -0
  92. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/regional_repair_efficiency.metric.yaml +0 -0
  93. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/repair_order.dimension.yaml +0 -0
  94. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/repair_order_details.source.yaml +0 -0
  95. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/repair_order_transform.transform.yaml +0 -0
  96. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/repair_orders.source.yaml +0 -0
  97. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/repair_orders_cube.cube.yaml +0 -0
  98. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/repair_type.source.yaml +0 -0
  99. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/total_repair_cost.metric.yaml +0 -0
  100. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/total_repair_order_discounts.metric.yaml +0 -0
  101. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/us_region.source.yaml +0 -0
  102. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/us_state.dimension.yaml +0 -0
  103. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project1/roads/us_states.source.yaml +0 -0
  104. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project10/dj.yaml +0 -0
  105. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/avg_length_of_employment.metric.yaml +0 -0
  106. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/avg_repair_price.metric.yaml +0 -0
  107. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/avg_time_to_dispatch.metric.yaml +0 -0
  108. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/contractor.dimension.yaml +0 -0
  109. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/contractors.source.yaml +0 -0
  110. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/date.source.yaml +0 -0
  111. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/date_dim.dimension.yaml +0 -0
  112. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/dispatcher.dimension.yaml +0 -0
  113. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/dispatchers.source.yaml +0 -0
  114. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/dj.yaml +0 -0
  115. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/hard_hat.dimension.yaml +0 -0
  116. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/hard_hat_state.source.yaml +0 -0
  117. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/hard_hats.source.yaml +0 -0
  118. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/local_hard_hats.dimension.yaml +0 -0
  119. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/municipality.source.yaml +0 -0
  120. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/municipality_dim.dimension.yaml +0 -0
  121. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/municipality_municipality_type.source.yaml +0 -0
  122. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/municipality_type.source.yaml +0 -0
  123. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/national_level_agg.transform.yaml +0 -0
  124. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/num_repair_orders.metric.yaml +0 -0
  125. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/regional_level_agg.transform.yaml +0 -0
  126. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/regional_repair_efficiency.metric.yaml +0 -0
  127. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/repair_order.dimension.yaml +0 -0
  128. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/repair_order_details.source.yaml +0 -0
  129. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/repair_order_transform.transform.yaml +0 -0
  130. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/repair_orders.source.yaml +0 -0
  131. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/repair_orders_cube.cube.yaml +0 -0
  132. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/repair_type.source.yaml +0 -0
  133. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/total_repair_cost.metric.yaml +0 -0
  134. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/total_repair_order_discounts.metric.yaml +0 -0
  135. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/us_region.source.yaml +0 -0
  136. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/us_state.dimension.yaml +0 -0
  137. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project11/us_states.source.yaml +0 -0
  138. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project12/dj.yaml +0 -0
  139. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project12/roads/companies.source.yaml +0 -0
  140. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project12/roads/companies_dim.dimension.yaml +0 -0
  141. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project12/roads/contractor.dimension.yaml +0 -0
  142. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project12/roads/contractors.source.yaml +0 -0
  143. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project12/roads/us_state.dimension.yaml +0 -0
  144. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project12/roads/us_states.source.yaml +0 -0
  145. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project2/dj.yaml +0 -0
  146. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project2/some_node.source.yaml +0 -0
  147. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project3/dj.yaml +0 -0
  148. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project3/some_node.yaml +0 -0
  149. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project4/dj.yaml +0 -0
  150. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project4/very/very/deeply/nested/namespace/some_node.source.yaml +0 -0
  151. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project5/dj.yaml +0 -0
  152. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project5/some_node.a.b.c.source.yaml +0 -0
  153. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project6/dj.yaml +0 -0
  154. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project6/roads/contractor.dimension.yaml +0 -0
  155. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project6/roads/contractors.source.yaml +0 -0
  156. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project7/dj.yaml +0 -0
  157. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project7/roads/contractor.dimension.yaml +0 -0
  158. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project7/roads/contractors.source.yaml +0 -0
  159. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project8/dj.yaml +0 -0
  160. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project9/dj.yaml +0 -0
  161. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project9/roads/companies.source.yaml +0 -0
  162. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project9/roads/companies_dim.dimension.yaml +0 -0
  163. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project9/roads/contractor.dimension.yaml +0 -0
  164. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project9/roads/contractors.source.yaml +0 -0
  165. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project9/roads/us_state.dimension.yaml +0 -0
  166. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples/project9/roads/us_states.source.yaml +0 -0
  167. {datajunction-0.0.211 → datajunction-0.0.213}/tests/examples.py +0 -0
  168. {datajunction-0.0.211 → datajunction-0.0.213}/tests/mcp/README.md +0 -0
  169. {datajunction-0.0.211 → datajunction-0.0.213}/tests/mcp/__init__.py +0 -0
  170. {datajunction-0.0.211 → datajunction-0.0.213}/tests/mcp/test_cli.py +0 -0
  171. {datajunction-0.0.211 → datajunction-0.0.213}/tests/test__internal.py +0 -0
  172. {datajunction-0.0.211 → datajunction-0.0.213}/tests/test_admin.py +0 -0
  173. {datajunction-0.0.211 → datajunction-0.0.213}/tests/test_base.py +0 -0
  174. {datajunction-0.0.211 → datajunction-0.0.213}/tests/test_builder.py +0 -0
  175. {datajunction-0.0.211 → datajunction-0.0.213}/tests/test_cli.py +0 -0
  176. {datajunction-0.0.211 → datajunction-0.0.213}/tests/test_client.py +0 -0
  177. {datajunction-0.0.211 → datajunction-0.0.213}/tests/test_compile.py +0 -0
  178. {datajunction-0.0.211 → datajunction-0.0.213}/tests/test_deploy.py +0 -0
  179. {datajunction-0.0.211 → datajunction-0.0.213}/tests/test_generated_client.py +0 -0
  180. {datajunction-0.0.211 → datajunction-0.0.213}/tests/test_integration.py +0 -0
  181. {datajunction-0.0.211 → datajunction-0.0.213}/tests/test_models.py +0 -0
  182. {datajunction-0.0.211 → datajunction-0.0.213}/tests/test_plugin_mirror.py +0 -0
  183. {datajunction-0.0.211 → datajunction-0.0.213}/tests/test_skills.py +0 -0
  184. {datajunction-0.0.211 → datajunction-0.0.213}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: datajunction
3
- Version: 0.0.211
3
+ Version: 0.0.213
4
4
  Summary: DataJunction client library for connecting to a DataJunction server
5
5
  Project-URL: repository, https://github.com/DataJunction/dj
6
6
  Author-email: DataJunction Authors <yian.shang@gmail.com>
@@ -2,4 +2,4 @@
2
2
  Version for Hatch
3
3
  """
4
4
 
5
- __version__ = "0.0.211"
5
+ __version__ = "0.0.213"
@@ -3,8 +3,9 @@ name: datajunction-repo
3
3
  description: |
4
4
  Activate this skill when authoring DataJunction (DJ) nodes via YAML files
5
5
  in a git repository — the repo-backed workflow. Covers YAML schemas per
6
- node type, branch-based development, temporal partitions on cubes, and
7
- the full PR-driven deployment flow. For modeling decisions (how to
6
+ node type, branch-based development, temporal partitions on cubes,
7
+ registering pre-aggregations / aggregate awareness, and the full
8
+ PR-driven deployment flow. For modeling decisions (how to
8
9
  structure metrics, decomposition workflow), invoke `datajunction-semantic-model`.
9
10
  For direct API authoring, invoke `datajunction-api`. For concepts,
10
11
  invoke `datajunction`.
@@ -16,6 +17,13 @@ description: |
16
17
  - create metric, create dimension, create cube, build cube
17
18
  - temporal partition, partition pushdown
18
19
  - pre-commit, push.sh
20
+ - pre-aggregation, pre-agg, preagg, kind: preagg
21
+ - aggregate awareness, aggregate navigation, query routing
22
+ - external pre-aggregation, externally-built aggregate, registered aggregate
23
+ - multiple tables for a metric, fact table and agg table, fact/agg hierarchy
24
+ - summary table, rollup table, agg table, materialized aggregate
25
+ - measure_columns, dimension_columns, valid_through_ts, availability
26
+ - freshness, join back, retained key
19
27
  user-invocable: false
20
28
  ---
21
29
 
@@ -557,6 +565,63 @@ columns:
557
565
 
558
566
  ---
559
567
 
568
+ ## Pre-Aggregations / Aggregate Awareness
569
+
570
+ One concept, many names — all of these mean the same thing: **aggregate awareness**,
571
+ **aggregate navigation**, **query routing**, **pre-aggregations** / **pre-aggs**,
572
+ **external** or **registered aggregates**, **multiple tables for a metric** (a raw
573
+ fact table plus coarser aggregates), **summary tables**, **rollup tables**, **agg
574
+ tables**, **materialized aggregates**, **fact/agg hierarchy**, **last-mile** and
575
+ **intermediate aggregates**.
576
+
577
+ A metric is defined once against its fact table; the same numbers often exist
578
+ pre-summed in coarser tables. Register those tables and DJ picks per query which to
579
+ read, falling back to the fact table when no aggregate can answer correctly.
580
+
581
+ **The rules live in the docs, not here** — see
582
+ [Query Routing & Aggregate Awareness](https://datajunction.io/docs/0.1.0/dj-concepts/query-routing-aggregate-awareness/)
583
+ for the `kind: preagg` schema (`metrics` and `dimensions` are maps from each
584
+ reference to the physical column holding it), what makes a metric mappable,
585
+ role-qualified dimension references, freshness reporting, and the current limitations. Read it before registering anything; the rules that decide
586
+ whether your table actually gets used are not guessable.
587
+
588
+ ### The one thing to get right before you author metrics
589
+
590
+ A pre-agg's `metrics` map binds a **metric to one column**, so a metric decomposing
591
+ into more than one component can never be bound to an aggregate — and its components are
592
+ auto-named with a hash suffix that YAML cannot address. `SUM(revenue) /
593
+ COUNT(DISTINCT view_id)` as a single node is unmappable forever; fixing it means
594
+ refactoring a node other teams may already query.
595
+
596
+ So **give every aggregation primitive its own metric node** and compose ratios as
597
+ derived metrics referencing them. Free if done from the start, expensive to retrofit,
598
+ worth doing even before an aggregate table exists.
599
+
600
+ ### Repo-specific traps
601
+
602
+ **Declare partitions in YAML, never through the API.** A temporal partition on the
603
+ parent's date column is what lets DJ reason about when an aggregate's data ends:
604
+
605
+ ```yaml
606
+ columns:
607
+ - name: activity_date
608
+ type: int
609
+ partition:
610
+ type: temporal
611
+ granularity: day
612
+ format: yyyyMMdd
613
+ ```
614
+
615
+ `POST /nodes/{node}/columns/{col}/partition/` works, but the next deploy recreates
616
+ the node from YAML and reverts it — and without a temporal partition column,
617
+ freshness checks have no axis and silently do nothing.
618
+
619
+ **A parent-node edit strands its aggregates.** Registrations are keyed by node
620
+ revision, so even a description-only change re-registers them at a new revision. A
621
+ repo deploy re-creates the binding, but **availability is not restored** — until the
622
+ pipeline re-reports it, the aggregate is unused and every query silently reverts to
623
+ the fact table.
624
+
560
625
  ## Complete Workflow Example
561
626
 
562
627
  **Scenario**: Add a new metric to the finance namespace.
@@ -28,6 +28,7 @@ from datajunction_server.models.query import (
28
28
  QueryCreate,
29
29
  QueryWithResults,
30
30
  )
31
+ from datajunction_server.models.table_metadata import TableMetadata
31
32
  from datajunction_server.service_clients import QueryServiceClient
32
33
  from datajunction_server.typing import QueryState
33
34
  from datajunction_server.utils import (
@@ -210,6 +211,32 @@ def module__query_service_client(
210
211
  mock_get_columns_for_table,
211
212
  )
212
213
 
214
+ async def mock_get_table_metadata(
215
+ catalog: str,
216
+ schema: str,
217
+ table: str,
218
+ request_headers: dict[str, str] | None = None,
219
+ engine: Engine | None = None,
220
+ ) -> TableMetadata:
221
+ # Resolved through get_columns_for_table above rather than duplicating the
222
+ # mapping, and stubbed at all so that refresh does not fall through to the
223
+ # HTTP implementation and issue a real request to the scheme-less test URI.
224
+ return TableMetadata(
225
+ columns=await qs_client.get_columns_for_table(
226
+ catalog,
227
+ schema,
228
+ table,
229
+ request_headers,
230
+ engine,
231
+ ),
232
+ )
233
+
234
+ module_mocker.patch.object(
235
+ qs_client,
236
+ "get_table_metadata",
237
+ mock_get_table_metadata,
238
+ )
239
+
213
240
  async def mock_submit_query(
214
241
  query_create: QueryCreate,
215
242
  request_headers: None
File without changes
File without changes
File without changes
File without changes