lsst-daf-butler 29.2025.2100__tar.gz → 29.2025.2300__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 (434) hide show
  1. {lsst_daf_butler-29.2025.2100/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.2300}/PKG-INFO +1 -1
  2. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/cli/cmd/commands.py +16 -1
  3. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/cli/utils.py +1 -1
  4. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/direct_butler/_direct_butler.py +52 -30
  5. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/direct_query_driver/_driver.py +20 -2
  6. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +74 -17
  7. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/interfaces/_database.py +1 -2
  8. lsst_daf_butler-29.2025.2300/python/lsst/daf/butler/script/queryCollections.py +378 -0
  9. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/butler_queries.py +68 -0
  10. lsst_daf_butler-29.2025.2300/python/lsst/daf/butler/version.py +2 -0
  11. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
  12. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_butler.py +3 -3
  13. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliCmdQueryCollections.py +124 -1
  14. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_simpleButler.py +5 -0
  15. lsst_daf_butler-29.2025.2100/python/lsst/daf/butler/script/queryCollections.py +0 -222
  16. lsst_daf_butler-29.2025.2100/python/lsst/daf/butler/version.py +0 -2
  17. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/COPYRIGHT +0 -0
  18. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/LICENSE +0 -0
  19. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/MANIFEST.in +0 -0
  20. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/README.md +0 -0
  21. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/bsd_license.txt +0 -0
  22. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/doc/lsst.daf.butler/CHANGES.rst +0 -0
  23. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
  24. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/doc/lsst.daf.butler/configuring.rst +0 -0
  25. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/doc/lsst.daf.butler/datastores.rst +0 -0
  26. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/doc/lsst.daf.butler/dimensions.rst +0 -0
  27. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/doc/lsst.daf.butler/formatters.rst +0 -0
  28. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/doc/lsst.daf.butler/index.rst +0 -0
  29. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/doc/lsst.daf.butler/organizing.rst +0 -0
  30. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/doc/lsst.daf.butler/queries.rst +0 -0
  31. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
  32. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
  33. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/gpl-v3.0.txt +0 -0
  34. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/pyproject.toml +0 -0
  35. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/__init__.py +0 -0
  36. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/__init__.py +0 -0
  37. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/__init__.py +0 -0
  38. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_butler.py +0 -0
  39. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_butler_collections.py +0 -0
  40. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_butler_config.py +0 -0
  41. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
  42. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_butler_metrics.py +0 -0
  43. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
  44. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_collection_type.py +0 -0
  45. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_column_categorization.py +0 -0
  46. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_column_tags.py +0 -0
  47. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_column_type_info.py +0 -0
  48. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_config.py +0 -0
  49. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_config_support.py +0 -0
  50. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_dataset_association.py +0 -0
  51. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_dataset_existence.py +0 -0
  52. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
  53. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_dataset_ref.py +0 -0
  54. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_dataset_type.py +0 -0
  55. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
  56. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_exceptions.py +0 -0
  57. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
  58. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_file_dataset.py +0 -0
  59. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_file_descriptor.py +0 -0
  60. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_formatter.py +0 -0
  61. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
  62. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_limited_butler.py +0 -0
  63. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_location.py +0 -0
  64. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_named.py +0 -0
  65. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_quantum.py +0 -0
  66. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_quantum_backed.py +0 -0
  67. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
  68. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_registry_shim.py +0 -0
  69. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_storage_class.py +0 -0
  70. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
  71. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_timespan.py +0 -0
  72. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_topology.py +0 -0
  73. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
  74. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
  75. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
  76. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
  77. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/arrow_utils.py +0 -0
  78. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/cli/__init__.py +0 -0
  79. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/cli/butler.py +0 -0
  80. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/cli/cliLog.py +0 -0
  81. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
  82. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
  83. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
  84. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
  85. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
  86. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
  87. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/cli/opt/options.py +0 -0
  88. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/cli/progress.py +0 -0
  89. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/column_spec.py +0 -0
  90. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
  91. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
  92. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
  93. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
  94. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
  95. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
  96. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
  97. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
  98. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
  99. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
  100. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
  101. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
  102. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
  103. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
  104. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/configs/registry.yaml +0 -0
  105. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
  106. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
  107. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/datastore/__init__.py +0 -0
  108. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
  109. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
  110. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/datastore/composites.py +0 -0
  111. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/datastore/constraints.py +0 -0
  112. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
  113. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
  114. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/datastore/record_data.py +0 -0
  115. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
  116. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/datastores/__init__.py +0 -0
  117. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
  118. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/datastores/fileDatastore.py +0 -0
  119. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -0
  120. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
  121. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
  122. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
  123. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
  124. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/ddl.py +0 -0
  125. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/delegates/__init__.py +0 -0
  126. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
  127. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
  128. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/dimensions/_config.py +0 -0
  129. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
  130. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
  131. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/dimensions/_database.py +0 -0
  132. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
  133. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
  134. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/dimensions/_group.py +0 -0
  135. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
  136. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
  137. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
  138. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/dimensions/_records.py +0 -0
  139. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
  140. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
  141. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
  142. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/dimensions/construction.py +0 -0
  143. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
  144. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
  145. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
  146. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
  147. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
  148. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
  149. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
  150. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
  151. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
  152. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/formatters/__init__.py +0 -0
  153. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
  154. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/formatters/file.py +0 -0
  155. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/formatters/json.py +0 -0
  156. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/formatters/logs.py +0 -0
  157. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
  158. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/formatters/packages.py +0 -0
  159. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/formatters/parquet.py +0 -0
  160. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/formatters/pickle.py +0 -0
  161. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/formatters/typeless.py +0 -0
  162. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/formatters/yaml.py +0 -0
  163. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/json.py +0 -0
  164. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/logging.py +0 -0
  165. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/mapping_factory.py +0 -0
  166. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/name_shrinker.py +0 -0
  167. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
  168. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/persistence_context.py +0 -0
  169. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/progress.py +0 -0
  170. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/py.typed +0 -0
  171. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/pydantic_utils.py +0 -0
  172. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/__init__.py +0 -0
  173. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/_base.py +0 -0
  174. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
  175. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
  176. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
  177. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
  178. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
  179. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
  180. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/_query.py +0 -0
  181. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/convert_args.py +0 -0
  182. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/driver.py +0 -0
  183. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
  184. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/overlaps.py +0 -0
  185. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
  186. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/result_specs.py +0 -0
  187. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
  188. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
  189. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
  190. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
  191. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
  192. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
  193. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
  194. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
  195. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/queries/visitors.py +0 -0
  196. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/__init__.py +0 -0
  197. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
  198. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
  199. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
  200. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
  201. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/_config.py +0 -0
  202. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/_defaults.py +0 -0
  203. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
  204. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/_registry.py +0 -0
  205. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
  206. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/attributes.py +0 -0
  207. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
  208. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
  209. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
  210. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
  211. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
  212. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
  213. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
  214. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/connectionString.py +0 -0
  215. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
  216. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
  217. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
  218. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
  219. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
  220. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
  221. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
  222. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
  223. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
  224. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
  225. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
  226. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
  227. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
  228. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
  229. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
  230. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
  231. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
  232. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
  233. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
  234. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
  235. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
  236. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/managers.py +0 -0
  237. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
  238. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
  239. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
  240. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
  241. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
  242. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
  243. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
  244. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
  245. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
  246. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/opaque.py +0 -0
  247. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
  248. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
  249. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
  250. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
  251. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
  252. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
  253. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
  254. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
  255. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
  256. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
  257. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
  258. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
  259. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
  260. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
  261. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
  262. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
  263. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
  264. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
  265. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
  266. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
  267. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
  268. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
  269. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
  270. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
  271. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
  272. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
  273. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
  274. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
  275. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
  276. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
  277. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/versions.py +0 -0
  278. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/registry/wildcards.py +0 -0
  279. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
  280. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/_authentication.py +0 -0
  281. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
  282. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
  283. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
  284. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
  285. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
  286. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
  287. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
  288. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
  289. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
  290. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
  291. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/_remote_butler.py +0 -0
  292. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
  293. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
  294. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
  295. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
  296. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
  297. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
  298. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
  299. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
  300. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
  301. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
  302. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
  303. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
  304. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
  305. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
  306. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
  307. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
  308. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
  309. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
  310. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
  311. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
  312. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/repo_relocation.py +0 -0
  313. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/__init__.py +0 -0
  314. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/_associate.py +0 -0
  315. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
  316. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/butlerImport.py +0 -0
  317. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
  318. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/collectionChain.py +0 -0
  319. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/configDump.py +0 -0
  320. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/configValidate.py +0 -0
  321. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/createRepo.py +0 -0
  322. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
  323. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/ingest_files.py +0 -0
  324. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
  325. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
  326. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
  327. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
  328. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
  329. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
  330. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/removeCollections.py +0 -0
  331. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
  332. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/removeRuns.py +0 -0
  333. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
  334. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
  335. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/__init__.py +0 -0
  336. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
  337. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
  338. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
  339. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
  340. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
  341. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
  342. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
  343. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
  344. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
  345. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
  346. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
  347. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/postgresql.py +0 -0
  348. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/server.py +0 -0
  349. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/server_utils.py +0 -0
  350. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
  351. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/tests/utils.py +0 -0
  352. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/time_utils.py +0 -0
  353. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
  354. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/transfers/__init__.py +0 -0
  355. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/transfers/_context.py +0 -0
  356. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
  357. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
  358. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst/daf/butler/utils.py +0 -0
  359. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst_daf_butler.egg-info/SOURCES.txt +0 -0
  360. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
  361. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
  362. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
  363. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
  364. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
  365. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/setup.cfg +0 -0
  366. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_astropyTableFormatter.py +0 -0
  367. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_authentication.py +0 -0
  368. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_butler_factory.py +0 -0
  369. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliCmdAssociate.py +0 -0
  370. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliCmdConfigDump.py +0 -0
  371. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliCmdConfigValidate.py +0 -0
  372. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliCmdCreate.py +0 -0
  373. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliCmdImport.py +0 -0
  374. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliCmdIngestFiles.py +0 -0
  375. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliCmdPruneDatasets.py +0 -0
  376. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliCmdQueryDataIds.py +0 -0
  377. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
  378. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliCmdQueryDatasets.py +0 -0
  379. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
  380. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliCmdRemoveCollections.py +0 -0
  381. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliCmdRemoveRuns.py +0 -0
  382. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
  383. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliLog.py +0 -0
  384. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliPluginLoader.py +0 -0
  385. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliUtilSplitCommas.py +0 -0
  386. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliUtilSplitKv.py +0 -0
  387. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliUtilToUpper.py +0 -0
  388. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_cliUtils.py +0 -0
  389. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_column_spec.py +0 -0
  390. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_composites.py +0 -0
  391. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_config.py +0 -0
  392. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_connectionString.py +0 -0
  393. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_constraints.py +0 -0
  394. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_datasets.py +0 -0
  395. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_datastore.py +0 -0
  396. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_ddl.py +0 -0
  397. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_dimension_record_containers.py +0 -0
  398. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_dimensions.py +0 -0
  399. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_exprParserLex.py +0 -0
  400. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_exprParserYacc.py +0 -0
  401. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_expressions.py +0 -0
  402. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_formatter.py +0 -0
  403. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_gafaelfawr.py +0 -0
  404. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_location.py +0 -0
  405. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_logFormatter.py +0 -0
  406. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_logging.py +0 -0
  407. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_matplotlibFormatter.py +0 -0
  408. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_nonempty_mapping.py +0 -0
  409. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_normalFormExpression.py +0 -0
  410. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_obscore.py +0 -0
  411. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_packages.py +0 -0
  412. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_parquet.py +0 -0
  413. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_postgresql.py +0 -0
  414. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_progress.py +0 -0
  415. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_pydantic_utils.py +0 -0
  416. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_quantum.py +0 -0
  417. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_quantumBackedButler.py +0 -0
  418. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_query_direct_postgresql.py +0 -0
  419. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_query_direct_sqlite.py +0 -0
  420. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_query_interface.py +0 -0
  421. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_query_relations.py +0 -0
  422. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_query_remote.py +0 -0
  423. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_query_utilities.py +0 -0
  424. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_remote_butler.py +0 -0
  425. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_server.py +0 -0
  426. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_sqlite.py +0 -0
  427. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_storageClass.py +0 -0
  428. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_templates.py +0 -0
  429. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_testRepo.py +0 -0
  430. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_thread_utils.py +0 -0
  431. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_time_utils.py +0 -0
  432. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_timespan.py +0 -0
  433. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_utils.py +0 -0
  434. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2300}/tests/test_versioning.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-daf-butler
3
- Version: 29.2025.2100
3
+ Version: 29.2025.2300
4
4
  Summary: An abstraction layer for reading and writing astronomical data to datastores.
5
5
  Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
6
6
  License: BSD 3-Clause License
@@ -424,6 +424,21 @@ def prune_datasets(**kwargs: Any) -> None:
424
424
  case_sensitive=False,
425
425
  ),
426
426
  )
427
+ @click.option(
428
+ "-t",
429
+ "--show-dataset-types",
430
+ is_flag=True,
431
+ help="Also show the dataset types registered within each collection.",
432
+ )
433
+ @click.option(
434
+ "--exclude-dataset-types",
435
+ type=click.STRING,
436
+ multiple=True,
437
+ default=["*_config,*_log,*_metadata,packages"],
438
+ callback=split_commas,
439
+ show_default=True,
440
+ help="Dataset types (comma-separated) to exclude. Only valid with --show-dataset-types.",
441
+ )
427
442
  @options_file_option()
428
443
  def query_collections(*args: Any, **kwargs: Any) -> None:
429
444
  """Get the collections whose names match an expression."""
@@ -454,7 +469,7 @@ def query_dataset_types(*args: Any, **kwargs: Any) -> None:
454
469
  """Get the dataset types in a repository."""
455
470
  table = script.queryDatasetTypes(*args, **kwargs)
456
471
  if table:
457
- table.pprint_all()
472
+ table.pprint_all(align="<")
458
473
  else:
459
474
  print("No results. Try --help for more information.")
460
475
 
@@ -1057,7 +1057,7 @@ class MWCommand(click.Command):
1057
1057
  return ret
1058
1058
 
1059
1059
  @epilog.setter
1060
- def epilog(self, val: str) -> None:
1060
+ def epilog(self, val: str | None) -> None:
1061
1061
  self._epilog = val
1062
1062
 
1063
1063
 
@@ -44,7 +44,7 @@ import os
44
44
  import uuid
45
45
  import warnings
46
46
  from collections import Counter, defaultdict
47
- from collections.abc import Iterable, Iterator, MutableMapping, Sequence
47
+ from collections.abc import Collection, Iterable, Iterator, MutableMapping, Sequence
48
48
  from types import EllipsisType
49
49
  from typing import TYPE_CHECKING, Any, ClassVar, NamedTuple, TextIO, cast
50
50
 
@@ -1491,36 +1491,15 @@ class DirectButler(Butler): # numpydoc ignore=PR02
1491
1491
  # Get all the datasets from these runs.
1492
1492
  refs = self._query_all_datasets(names, find_first=False, limit=None)
1493
1493
 
1494
- # Chunk the deletions using a size that is reasonably efficient whilst
1495
- # also giving reasonable feedback to the user. Chunking also minimizes
1496
- # what needs to rollback if there is a failure and should allow
1497
- # incremental re-running of the command. The only issue will be if the
1498
- # Ctrl-C comes during emptyTrash since an admin command would need to
1499
- # run to finish the emptying of that chunk.
1500
- progress = Progress("lsst.daf.butler.Butler.ingest", level=_LOG.INFO)
1501
- chunk_size = 50_000
1502
- n_chunks = math.ceil(len(refs) / chunk_size)
1503
- chunk_num = 0
1504
- for chunked_refs in progress.wrap(
1505
- chunk_iterable(refs, chunk_size=chunk_size), desc="Deleting datasets from RUNs", total=n_chunks
1494
+ # Call pruneDatasets since we are deliberately removing
1495
+ # datasets in chunks from the RUN collections rather than
1496
+ # attempting to remove everything at once.
1497
+ with time_this(
1498
+ _LOG,
1499
+ msg="Removing %d dataset%s from %s",
1500
+ args=(len(refs), "s" if len(refs) != 1 else "", ", ".join(names)),
1506
1501
  ):
1507
- chunk_num += 1
1508
- _LOG.verbose(
1509
- "Deleting %d dataset%s from requested RUN collections in chunk %d/%d",
1510
- len(chunked_refs),
1511
- "s" if len(chunked_refs) != 1 else "",
1512
- chunk_num,
1513
- n_chunks,
1514
- )
1515
- # Call pruneDatasets since we are deliberately removing
1516
- # datasets in chunks from the RUN collections rather than
1517
- # attempting to remove everything at once.
1518
- with time_this(
1519
- _LOG,
1520
- msg="Removing %d datasets for chunk %d/%d",
1521
- args=(len(chunked_refs), chunk_num, n_chunks),
1522
- ):
1523
- self.pruneDatasets(chunked_refs, unstore=True, purge=True, disassociate=True)
1502
+ self.pruneDatasets(refs, unstore=True, purge=True, disassociate=True)
1524
1503
 
1525
1504
  # Now can remove the actual RUN collection and unlink from chains.
1526
1505
  with self._registry.transaction():
@@ -1577,6 +1556,49 @@ class DirectButler(Butler): # numpydoc ignore=PR02
1577
1556
  for ref in refs:
1578
1557
  if ref.datasetType.component():
1579
1558
  raise ValueError(f"Can not prune a component of a dataset (ref={ref})")
1559
+
1560
+ # Chunk the deletions using a size that is reasonably efficient whilst
1561
+ # also giving reasonable feedback to the user. Chunking also minimizes
1562
+ # what needs to rollback if there is a failure and should allow
1563
+ # incremental re-running of the pruning (assuming the query is
1564
+ # repeated). The only issue will be if the Ctrl-C comes during
1565
+ # emptyTrash since an admin command would need to run to finish the
1566
+ # emptying of that chunk.
1567
+ progress = Progress("lsst.daf.butler.Butler.pruneDatasets", level=_LOG.INFO)
1568
+ chunk_size = 50_000
1569
+ n_chunks = math.ceil(len(refs) / chunk_size)
1570
+ if n_chunks > 1:
1571
+ _LOG.verbose("Pruning a total of %d datasets", len(refs))
1572
+ chunk_num = 0
1573
+ for chunked_refs in progress.wrap(
1574
+ chunk_iterable(refs, chunk_size=chunk_size), desc="Deleting datasets", total=n_chunks
1575
+ ):
1576
+ chunk_num += 1
1577
+ _LOG.verbose(
1578
+ "Pruning %d dataset%s in chunk %d/%d",
1579
+ len(chunked_refs),
1580
+ "s" if len(chunked_refs) != 1 else "",
1581
+ chunk_num,
1582
+ n_chunks,
1583
+ )
1584
+ with time_this(
1585
+ _LOG,
1586
+ msg="Removing %d datasets for chunk %d/%d",
1587
+ args=(len(chunked_refs), chunk_num, n_chunks),
1588
+ ):
1589
+ self._prune_datasets(
1590
+ chunked_refs, tags=tags, unstore=unstore, purge=purge, disassociate=disassociate
1591
+ )
1592
+
1593
+ def _prune_datasets(
1594
+ self,
1595
+ refs: Collection[DatasetRef],
1596
+ *,
1597
+ disassociate: bool = True,
1598
+ unstore: bool = False,
1599
+ tags: Iterable[str] = (),
1600
+ purge: bool = False,
1601
+ ) -> None:
1580
1602
  # We don't need an unreliable Datastore transaction for this, because
1581
1603
  # we've been extra careful to ensure that Datastore.trash only involves
1582
1604
  # mutating the Registry (it can _look_ at Datastore-specific things,
@@ -571,12 +571,15 @@ class DirectQueryDriver(QueryDriver):
571
571
  union_dataset_dimensions=tree.any_dataset.dimensions,
572
572
  projection_columns=projection_columns,
573
573
  final_columns=final_columns,
574
+ find_first_dataset=find_first_dataset,
574
575
  )
575
576
  else:
577
+ assert find_first_dataset != qt.AnyDatasetType.ANY_DATASET
576
578
  builder = SingleSelectQueryBuilder(
577
579
  tree_analysis=query_tree_analysis,
578
580
  projection_columns=projection_columns,
579
581
  final_columns=final_columns,
582
+ find_first_dataset=find_first_dataset,
580
583
  )
581
584
  # Finish setting up the projection part of the builder.
582
585
  builder.analyze_projection()
@@ -590,7 +593,7 @@ class DirectQueryDriver(QueryDriver):
590
593
  builder.joins_analysis.columns.update(builder.projection_columns)
591
594
  # Set up the find-first part of the builder.
592
595
  if find_first_dataset is not None:
593
- builder.analyze_find_first(find_first_dataset)
596
+ builder.analyze_find_first()
594
597
  # At this point, analysis is complete, and we can proceed to making
595
598
  # the select_builder(s) reflect that analysis.
596
599
  if not analyze_only:
@@ -1060,6 +1063,7 @@ class DirectQueryDriver(QueryDriver):
1060
1063
  # it depends on the kinds of collection(s) we're searching and whether
1061
1064
  # it's a find-first query.
1062
1065
  for dataset_type, fields_for_dataset in projection_columns.dataset_fields.items():
1066
+ is_find_first = dataset_type == find_first_dataset
1063
1067
  dataset_search: ResolvedDatasetSearch[Any]
1064
1068
  if dataset_type is qt.ANY_DATASET:
1065
1069
  assert union_datasets is not None
@@ -1077,7 +1081,7 @@ class DirectQueryDriver(QueryDriver):
1077
1081
  derived_fields.append((dataset_type, "collection_key"))
1078
1082
  elif dataset_field == "timespan" and dataset_search.is_calibration_search:
1079
1083
  # The timespan is also a unique key...
1080
- if dataset_type == find_first_dataset:
1084
+ if is_find_first:
1081
1085
  # ...unless we're doing a find-first search on this
1082
1086
  # dataset, in which case we need to use ANY_VALUE on
1083
1087
  # the timespan and check that _VALIDITY_MATCH_COUNT
@@ -1096,6 +1100,20 @@ class DirectQueryDriver(QueryDriver):
1096
1100
  ].apply_any_aggregate(self.db.apply_any_aggregate)
1097
1101
  else:
1098
1102
  unique_keys.extend(select_builder.joins.timespans[dataset_type].flatten())
1103
+ elif (
1104
+ dataset_field == "dataset_id"
1105
+ and len(dataset_search.collection_records) > 1
1106
+ and not is_find_first
1107
+ ):
1108
+ # If we have more than one collection in the search, we can
1109
+ # find multiple dataset IDs with the same data ID, in
1110
+ # different collections.
1111
+ # In a non-find-first search, we have to make dataset ID a
1112
+ # unique key to prevent de-duplication for rows with the
1113
+ # same data ID but different dataset IDs.
1114
+ # We don't do this for a find-first search because the
1115
+ # window function will take care of it.
1116
+ unique_keys.append(select_builder.joins.fields[dataset_type]["dataset_id"])
1099
1117
  else:
1100
1118
  # Other dataset fields derive their uniqueness from key
1101
1119
  # fields.
@@ -78,6 +78,10 @@ class QueryBuilder(ABC):
78
78
  or DISTINCT may be performed.
79
79
  final_columns : `.queries.tree.ColumnSet`
80
80
  Columns to include in the final query.
81
+ find_first_dataset : `str` or ``...`` or None
82
+ Name of the dataset type that needs a find-first search. ``...``
83
+ is used to indicate the dataset types in a union dataset query.
84
+ `None` means find-first is not used.
81
85
  """
82
86
 
83
87
  def __init__(
@@ -86,13 +90,14 @@ class QueryBuilder(ABC):
86
90
  *,
87
91
  projection_columns: qt.ColumnSet,
88
92
  final_columns: qt.ColumnSet,
93
+ find_first_dataset: str | qt.AnyDatasetType | None,
89
94
  ):
90
95
  self.joins_analysis = tree_analysis.joins
91
96
  self.postprocessing = tree_analysis.postprocessing
92
97
  self.projection_columns = projection_columns
93
98
  self.final_columns = final_columns
94
99
  self.needs_dimension_distinct = False
95
- self.find_first_dataset = None
100
+ self.find_first_dataset = find_first_dataset
96
101
 
97
102
  joins_analysis: QueryJoinsAnalysis
98
103
  """Description of the "joins" stage of query construction."""
@@ -161,7 +166,7 @@ class QueryBuilder(ABC):
161
166
  self.needs_dimension_distinct = True
162
167
 
163
168
  @abstractmethod
164
- def analyze_find_first(self, find_first_dataset: str | qt.AnyDatasetType) -> None:
169
+ def analyze_find_first(self) -> None:
165
170
  """Analyze the "find first" stage of query construction, in which a
166
171
  Common Table Expression with PARTITION ON may be used to find the first
167
172
  dataset for each data ID and dataset type in an ordered collection
@@ -169,12 +174,6 @@ class QueryBuilder(ABC):
169
174
 
170
175
  This modifies the builder in place, and should be called immediately
171
176
  after `analyze_projection`.
172
-
173
- Parameters
174
- ----------
175
- find_first_dataset : `str` or ``...``
176
- Name of the dataset type that needs a find-first search. ``...``
177
- is used to indicate the dataset types in a union dataset query.
178
177
  """
179
178
  raise NotImplementedError()
180
179
 
@@ -284,6 +283,47 @@ class QueryBuilder(ABC):
284
283
  """
285
284
  raise NotImplementedError()
286
285
 
286
+ def _needs_collection_key_field(
287
+ self, dataset_search: ResolvedDatasetSearch, fields_for_dataset: set[str]
288
+ ) -> bool:
289
+ """Return `True` if the ``collection_key`` dataset field is needed to
290
+ provide uniqueness for rows.
291
+ """
292
+ # For a dataset search, we sometimes want just one row for each dataset
293
+ # and sometimes we need multiple rows, one for each collection that
294
+ # the dataset was found in.
295
+ #
296
+ # We need multiple rows if any of the following are true:
297
+ # - This is a find-first dataset search. The rows will be ranked using
298
+ # a window function to determine the first collection containing a
299
+ # matching dataset, so we need a row for each collection to feed into
300
+ # the window.
301
+ # - The user requested dataset fields that differ depending on which
302
+ # collection the dataset was found in, so we need a row for each
303
+ # collection to get all the possible values for the dataset fields.
304
+ #
305
+ # To ensure that we keep the necessary rows after DISTINCT or GROUP BY
306
+ # is applied, we add a "collection_key" field that is unique for each
307
+ # collection.
308
+
309
+ # If there is only one collection, there will only be one row per
310
+ # dataset, so we don't need to disambiguate.
311
+ if len(dataset_search.collection_records) > 1:
312
+ if (
313
+ # We need a row for each collection, which will later
314
+ # be filtered down using the window function.
315
+ self.find_first_dataset is not None
316
+ # We might have multiple calibration collections containing the
317
+ # same dataset with the same timespan.
318
+ or "timespan" in fields_for_dataset
319
+ # The user specifically asked for a row for each collection we
320
+ # found the dataset in.
321
+ or "collection" in fields_for_dataset
322
+ ):
323
+ return True
324
+
325
+ return False
326
+
287
327
 
288
328
  class SingleSelectQueryBuilder(QueryBuilder):
289
329
  """An implementation of `QueryBuilder` for queries that are structured as
@@ -304,6 +344,9 @@ class SingleSelectQueryBuilder(QueryBuilder):
304
344
  or DISTINCT may be performed.
305
345
  final_columns : `.queries.tree.ColumnSet`
306
346
  Columns to include in the final query.
347
+ find_first_dataset : `str` or None
348
+ Name of the dataset type that needs a find-first search.
349
+ `None` means find-first is not used.
307
350
  """
308
351
 
309
352
  def __init__(
@@ -312,11 +355,13 @@ class SingleSelectQueryBuilder(QueryBuilder):
312
355
  *,
313
356
  projection_columns: qt.ColumnSet,
314
357
  final_columns: qt.ColumnSet,
358
+ find_first_dataset: str | None,
315
359
  ) -> None:
316
360
  super().__init__(
317
361
  tree_analysis=tree_analysis,
318
362
  projection_columns=projection_columns,
319
363
  final_columns=final_columns,
364
+ find_first_dataset=find_first_dataset,
320
365
  )
321
366
  assert not tree_analysis.union_datasets, "UnionQueryPlan should be used instead."
322
367
  self._select_builder = tree_analysis.initial_select_builder
@@ -359,13 +404,16 @@ class SingleSelectQueryBuilder(QueryBuilder):
359
404
  # or GROUP BY columns.
360
405
  for dataset_type, fields_for_dataset in self.projection_columns.dataset_fields.items():
361
406
  assert dataset_type is not qt.ANY_DATASET, "Union dataset in non-dataset-union query."
362
- if len(self.joins_analysis.datasets[dataset_type].collection_records) > 1:
407
+ if self._needs_collection_key_field(
408
+ self.joins_analysis.datasets[dataset_type], fields_for_dataset
409
+ ):
363
410
  fields_for_dataset.add("collection_key")
364
411
 
365
- def analyze_find_first(self, find_first_dataset: str | qt.AnyDatasetType) -> None:
412
+ def analyze_find_first(self) -> None:
366
413
  # Docstring inherited.
367
- assert find_first_dataset is not qt.ANY_DATASET, "No dataset union in this query"
368
- self.find_first = QueryFindFirstAnalysis(self.joins_analysis.datasets[find_first_dataset])
414
+ assert self.find_first_dataset is not qt.ANY_DATASET, "No dataset union in this query"
415
+ assert self.find_first_dataset is not None
416
+ self.find_first = QueryFindFirstAnalysis(self.joins_analysis.datasets[self.find_first_dataset])
369
417
  # If we're doing a find-first search and there's a calibration
370
418
  # collection in play, we need to make sure the rows coming out of
371
419
  # the base query have only one timespan for each data ID +
@@ -502,6 +550,10 @@ class UnionQueryBuilder(QueryBuilder):
502
550
  Columns to include in the final query.
503
551
  union_dataset_dimensions : `DimensionGroup`
504
552
  Dimensions of the dataset types that comprise the union.
553
+ find_first_dataset : `str` or ``...`` or None
554
+ Name of the dataset type that needs a find-first search. ``...``
555
+ is used to indicate the dataset types in a union dataset query.
556
+ `None` means find-first is not used.
505
557
 
506
558
  Notes
507
559
  -----
@@ -522,11 +574,13 @@ class UnionQueryBuilder(QueryBuilder):
522
574
  projection_columns: qt.ColumnSet,
523
575
  final_columns: qt.ColumnSet,
524
576
  union_dataset_dimensions: DimensionGroup,
577
+ find_first_dataset: str | qt.AnyDatasetType | None,
525
578
  ):
526
579
  super().__init__(
527
580
  tree_analysis=tree_analysis,
528
581
  projection_columns=projection_columns,
529
582
  final_columns=final_columns,
583
+ find_first_dataset=find_first_dataset,
530
584
  )
531
585
  self._initial_select_builder: SqlSelectBuilder | None = tree_analysis.initial_select_builder
532
586
  self.union_dataset_dimensions = union_dataset_dimensions
@@ -580,15 +634,18 @@ class UnionQueryBuilder(QueryBuilder):
580
634
  # If there is more than one collection for one union term,
581
635
  # we need to add collection_key to all of them to keep the
582
636
  # SELECT columns uniform.
583
- if len(union_term.datasets.collection_records) > 1:
637
+ if self._needs_collection_key_field(union_term.datasets, fields_for_dataset):
584
638
  fields_for_dataset.add("collection_key")
585
639
  break
586
- elif len(self.joins_analysis.datasets[dataset_type].collection_records) > 1:
640
+ elif self._needs_collection_key_field(
641
+ self.joins_analysis.datasets[dataset_type], fields_for_dataset
642
+ ):
587
643
  fields_for_dataset.add("collection_key")
588
644
 
589
- def analyze_find_first(self, find_first_dataset: str | qt.AnyDatasetType) -> None:
645
+ def analyze_find_first(self) -> None:
590
646
  # Docstring inherited.
591
- if find_first_dataset is qt.ANY_DATASET:
647
+ assert self.find_first_dataset is not None
648
+ if self.find_first_dataset is qt.ANY_DATASET:
592
649
  for union_term in self.union_terms:
593
650
  union_term.find_first = QueryFindFirstAnalysis(union_term.datasets)
594
651
  # If we're doing a find-first search and there's a calibration
@@ -609,7 +666,7 @@ class UnionQueryBuilder(QueryBuilder):
609
666
  # like it'd be useful, so it's better not to have to maintain that
610
667
  # logic branch.
611
668
  raise NotImplementedError(
612
- f"Additional dataset search {find_first_dataset!r} can only be joined into a "
669
+ f"Additional dataset search {self.find_first_dataset!r} can only be joined into a "
613
670
  "union dataset query as a constraint in data IDs, not as a find-first result."
614
671
  )
615
672
 
@@ -1696,9 +1696,8 @@ class Database(ABC):
1696
1696
  for k, v in content.items():
1697
1697
  if k == name:
1698
1698
  continue
1699
- column = table.columns[k]
1700
1699
  # The set only has one element
1701
- clauses.append(column == v.pop())
1700
+ clauses.append(table.columns[k] == v.pop())
1702
1701
 
1703
1702
  # The IN operator will not work for "infinite" numbers of
1704
1703
  # rows so must batch it up into distinct calls.