lsst-daf-butler 29.0.0rc1__tar.gz → 29.2025.1100__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 (428) hide show
  1. {lsst_daf_butler-29.0.0rc1/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.1100}/PKG-INFO +1 -1
  2. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/queries.rst +4 -2
  3. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastores/fileDatastore.py +14 -0
  4. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/_driver.py +1 -1
  5. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/_expression_strings.py +7 -0
  6. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/databases/sqlite.py +6 -0
  7. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +10 -0
  8. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_database.py +1 -1
  9. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +26 -19
  10. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/check.py +19 -10
  11. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +4 -0
  12. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +23 -0
  13. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +9 -0
  14. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +20 -15
  15. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +14 -2
  16. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/tests/_registry.py +34 -21
  17. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/butler_queries.py +23 -23
  18. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +10 -0
  19. lsst_daf_butler-29.2025.1100/python/lsst/daf/butler/version.py +2 -0
  20. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
  21. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_butler.py +2 -2
  22. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_exprParserLex.py +23 -0
  23. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_exprParserYacc.py +82 -10
  24. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_expressions.py +5 -5
  25. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_normalFormExpression.py +13 -1
  26. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_simpleButler.py +10 -0
  27. lsst_daf_butler-29.0.0rc1/python/lsst/daf/butler/version.py +0 -2
  28. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/COPYRIGHT +0 -0
  29. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/LICENSE +0 -0
  30. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/MANIFEST.in +0 -0
  31. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/README.md +0 -0
  32. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/bsd_license.txt +0 -0
  33. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/CHANGES.rst +0 -0
  34. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
  35. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/configuring.rst +0 -0
  36. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/datastores.rst +0 -0
  37. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/dimensions.rst +0 -0
  38. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/formatters.rst +0 -0
  39. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/index.rst +0 -0
  40. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/organizing.rst +0 -0
  41. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
  42. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
  43. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/gpl-v3.0.txt +0 -0
  44. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/pyproject.toml +0 -0
  45. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/__init__.py +0 -0
  46. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/__init__.py +0 -0
  47. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/__init__.py +0 -0
  48. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_butler.py +0 -0
  49. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_butler_collections.py +0 -0
  50. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_butler_config.py +0 -0
  51. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
  52. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
  53. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_collection_type.py +0 -0
  54. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_column_categorization.py +0 -0
  55. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_column_tags.py +0 -0
  56. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_column_type_info.py +0 -0
  57. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_config.py +0 -0
  58. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_config_support.py +0 -0
  59. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_dataset_association.py +0 -0
  60. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_dataset_existence.py +0 -0
  61. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
  62. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_dataset_ref.py +0 -0
  63. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_dataset_type.py +0 -0
  64. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
  65. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_exceptions.py +0 -0
  66. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
  67. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_file_dataset.py +0 -0
  68. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_file_descriptor.py +0 -0
  69. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_formatter.py +0 -0
  70. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
  71. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_limited_butler.py +0 -0
  72. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_location.py +0 -0
  73. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_named.py +0 -0
  74. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_quantum.py +0 -0
  75. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_quantum_backed.py +0 -0
  76. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
  77. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_registry_shim.py +0 -0
  78. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_storage_class.py +0 -0
  79. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
  80. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_timespan.py +0 -0
  81. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_topology.py +0 -0
  82. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
  83. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
  84. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
  85. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
  86. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/arrow_utils.py +0 -0
  87. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/__init__.py +0 -0
  88. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/butler.py +0 -0
  89. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/cliLog.py +0 -0
  90. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
  91. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
  92. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
  93. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
  94. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
  95. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
  96. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
  97. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/opt/options.py +0 -0
  98. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/progress.py +0 -0
  99. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/utils.py +0 -0
  100. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/column_spec.py +0 -0
  101. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
  102. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
  103. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
  104. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
  105. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
  106. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
  107. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
  108. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
  109. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
  110. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
  111. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
  112. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
  113. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
  114. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
  115. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/registry.yaml +0 -0
  116. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
  117. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
  118. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/__init__.py +0 -0
  119. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
  120. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
  121. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/composites.py +0 -0
  122. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/constraints.py +0 -0
  123. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
  124. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
  125. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/record_data.py +0 -0
  126. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
  127. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastores/__init__.py +0 -0
  128. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
  129. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -0
  130. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
  131. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
  132. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
  133. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
  134. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/ddl.py +0 -0
  135. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/delegates/__init__.py +0 -0
  136. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
  137. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
  138. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_config.py +0 -0
  139. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
  140. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
  141. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_database.py +0 -0
  142. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
  143. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
  144. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_group.py +0 -0
  145. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
  146. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
  147. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
  148. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_records.py +0 -0
  149. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
  150. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
  151. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
  152. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/construction.py +0 -0
  153. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
  154. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
  155. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_butler/_direct_butler.py +0 -0
  156. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
  157. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
  158. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
  159. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/_predicate_constraints_summary.py +0 -0
  160. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
  161. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
  162. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
  163. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
  164. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
  165. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/__init__.py +0 -0
  166. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
  167. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/file.py +0 -0
  168. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/json.py +0 -0
  169. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/logs.py +0 -0
  170. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
  171. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/packages.py +0 -0
  172. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/parquet.py +0 -0
  173. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/pickle.py +0 -0
  174. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/typeless.py +0 -0
  175. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/yaml.py +0 -0
  176. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/json.py +0 -0
  177. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/logging.py +0 -0
  178. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/mapping_factory.py +0 -0
  179. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/name_shrinker.py +0 -0
  180. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
  181. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/persistence_context.py +0 -0
  182. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/progress.py +0 -0
  183. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/py.typed +0 -0
  184. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/pydantic_utils.py +0 -0
  185. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/__init__.py +0 -0
  186. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/_base.py +0 -0
  187. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
  188. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
  189. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
  190. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
  191. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
  192. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/_query.py +0 -0
  193. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/convert_args.py +0 -0
  194. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/driver.py +0 -0
  195. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
  196. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/overlaps.py +0 -0
  197. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/result_specs.py +0 -0
  198. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
  199. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
  200. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
  201. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
  202. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
  203. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
  204. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
  205. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
  206. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/visitors.py +0 -0
  207. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/__init__.py +0 -0
  208. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
  209. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
  210. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
  211. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
  212. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_config.py +0 -0
  213. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_defaults.py +0 -0
  214. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
  215. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_registry.py +0 -0
  216. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
  217. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/attributes.py +0 -0
  218. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
  219. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
  220. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
  221. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
  222. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
  223. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
  224. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
  225. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/connectionString.py +0 -0
  226. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
  227. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
  228. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
  229. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
  230. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
  231. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
  232. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
  233. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
  234. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
  235. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
  236. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
  237. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
  238. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
  239. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
  240. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
  241. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
  242. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
  243. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
  244. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
  245. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/managers.py +0 -0
  246. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
  247. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
  248. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
  249. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
  250. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
  251. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
  252. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
  253. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
  254. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
  255. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/opaque.py +0 -0
  256. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
  257. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
  258. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
  259. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
  260. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
  261. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
  262. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
  263. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
  264. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
  265. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
  266. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
  267. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
  268. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
  269. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
  270. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
  271. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
  272. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
  273. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
  274. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
  275. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
  276. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
  277. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
  278. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/versions.py +0 -0
  279. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/wildcards.py +0 -0
  280. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
  281. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_authentication.py +0 -0
  282. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
  283. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
  284. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
  285. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
  286. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
  287. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
  288. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
  289. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
  290. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
  291. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
  292. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_remote_butler.py +0 -0
  293. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
  294. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
  295. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
  296. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
  297. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
  298. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
  299. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
  300. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
  301. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
  302. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
  303. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
  304. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
  305. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
  306. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
  307. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
  308. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
  309. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
  310. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
  311. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/repo_relocation.py +0 -0
  312. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/__init__.py +0 -0
  313. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/_associate.py +0 -0
  314. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
  315. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/butlerImport.py +0 -0
  316. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
  317. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/collectionChain.py +0 -0
  318. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/configDump.py +0 -0
  319. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/configValidate.py +0 -0
  320. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/createRepo.py +0 -0
  321. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
  322. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/ingest_files.py +0 -0
  323. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
  324. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/queryCollections.py +0 -0
  325. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
  326. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
  327. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
  328. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
  329. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
  330. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/removeCollections.py +0 -0
  331. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
  332. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/removeRuns.py +0 -0
  333. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
  334. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
  335. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/__init__.py +0 -0
  336. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
  337. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
  338. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
  339. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
  340. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
  341. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
  342. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
  343. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
  344. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
  345. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
  346. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/postgresql.py +0 -0
  347. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/server.py +0 -0
  348. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/server_utils.py +0 -0
  349. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
  350. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/utils.py +0 -0
  351. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/time_utils.py +0 -0
  352. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
  353. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/transfers/__init__.py +0 -0
  354. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/transfers/_context.py +0 -0
  355. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
  356. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
  357. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/utils.py +0 -0
  358. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst_daf_butler.egg-info/SOURCES.txt +0 -0
  359. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
  360. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
  361. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
  362. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
  363. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
  364. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/setup.cfg +0 -0
  365. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_astropyTableFormatter.py +0 -0
  366. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_authentication.py +0 -0
  367. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_butler_factory.py +0 -0
  368. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdAssociate.py +0 -0
  369. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdConfigDump.py +0 -0
  370. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdConfigValidate.py +0 -0
  371. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdCreate.py +0 -0
  372. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdImport.py +0 -0
  373. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdIngestFiles.py +0 -0
  374. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdPruneDatasets.py +0 -0
  375. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdQueryCollections.py +0 -0
  376. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdQueryDataIds.py +0 -0
  377. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
  378. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdQueryDatasets.py +0 -0
  379. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
  380. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdRemoveCollections.py +0 -0
  381. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdRemoveRuns.py +0 -0
  382. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
  383. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliLog.py +0 -0
  384. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliPluginLoader.py +0 -0
  385. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliUtilSplitCommas.py +0 -0
  386. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliUtilSplitKv.py +0 -0
  387. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliUtilToUpper.py +0 -0
  388. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_cliUtils.py +0 -0
  389. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_composites.py +0 -0
  390. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_config.py +0 -0
  391. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_connectionString.py +0 -0
  392. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_constraints.py +0 -0
  393. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_datasets.py +0 -0
  394. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_datastore.py +0 -0
  395. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_ddl.py +0 -0
  396. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_dimension_record_containers.py +0 -0
  397. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_dimensions.py +0 -0
  398. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_formatter.py +0 -0
  399. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_location.py +0 -0
  400. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_logFormatter.py +0 -0
  401. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_logging.py +0 -0
  402. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_matplotlibFormatter.py +0 -0
  403. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_nonempty_mapping.py +0 -0
  404. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_obscore.py +0 -0
  405. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_packages.py +0 -0
  406. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_parquet.py +0 -0
  407. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_postgresql.py +0 -0
  408. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_progress.py +0 -0
  409. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_pydantic_utils.py +0 -0
  410. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_quantum.py +0 -0
  411. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_quantumBackedButler.py +0 -0
  412. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_query_direct_postgresql.py +0 -0
  413. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_query_direct_sqlite.py +0 -0
  414. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_query_interface.py +0 -0
  415. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_query_relations.py +0 -0
  416. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_query_remote.py +0 -0
  417. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_query_utilities.py +0 -0
  418. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_remote_butler.py +0 -0
  419. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_server.py +0 -0
  420. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_sqlite.py +0 -0
  421. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_storageClass.py +0 -0
  422. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_templates.py +0 -0
  423. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_testRepo.py +0 -0
  424. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_thread_utils.py +0 -0
  425. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_time_utils.py +0 -0
  426. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_timespan.py +0 -0
  427. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_utils.py +0 -0
  428. {lsst_daf_butler-29.0.0rc1 → lsst_daf_butler-29.2025.1100}/tests/test_versioning.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: lsst-daf-butler
3
- Version: 29.0.0rc1
3
+ Version: 29.2025.1100
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
@@ -167,6 +167,8 @@ filter query results based on that property of datasets.
167
167
 
168
168
  Registry methods accepting user expressions also accept a ``bind`` parameter, which is a mapping from identifier name to its corresponding value.
169
169
  Identifiers appearing in user expressions will be replaced with the corresponding value from this mapping.
170
+ Bind identifiers in expressions are specified with a preceding colon (e.g. ``:id``).
171
+ The legacy format where bind identifiers can be specified without a colon is still supported, but discouraged, and will be deprecated and removed in the future.
170
172
  Using the ``bind`` parameter is encouraged when possible to simplify rendering of the query strings.
171
173
  A partial example of comparing two approaches, without and with ``bind``:
172
174
 
@@ -186,7 +188,7 @@ A partial example of comparing two approaches, without and with ``bind``:
186
188
  # Same functionality using bind parameter
187
189
  result = butler.query_datasets(
188
190
  dataset_type,
189
- where="instrument = instrument_name AND visit = visit_id",
191
+ where="instrument = :instrument_name AND visit = :visit_id",
190
192
  bind={"instrument_name": instrument_name, "visit_id": visit_id},
191
193
  )
192
194
 
@@ -201,7 +203,7 @@ An example of this feature:
201
203
  visit_ids = (12345, 12346, 12350)
202
204
  result = butler.query_datasets(
203
205
  dataset_type,
204
- where="instrument = instrument_name AND visit IN (visit_ids)",
206
+ where="instrument = :instrument_name AND visit IN (:visit_ids)",
205
207
  bind={"instrument_name": instrument_name, "visit_ids": visit_ids},
206
208
  )
207
209
 
@@ -2649,6 +2649,7 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
2649
2649
  artifact_existence: dict[ResourcePath, bool] | None = None,
2650
2650
  dry_run: bool = False,
2651
2651
  ) -> tuple[set[DatasetRef], set[DatasetRef]]:
2652
+ log.verbose("transfer_from %s to %s", source_datastore.name, self.name)
2652
2653
  # Docstring inherited
2653
2654
  if type(self) is not type(source_datastore):
2654
2655
  raise TypeError(
@@ -2693,6 +2694,7 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
2693
2694
  # What we really want is all the records in the source datastore
2694
2695
  # associated with these refs. Or derived ones if they don't exist
2695
2696
  # in the source.
2697
+ log.verbose("Looking up source datastore records in %s", source_datastore.name)
2696
2698
  source_records = source_datastore._get_stored_records_associated_with_refs(
2697
2699
  refs, ignore_datastore_records=True
2698
2700
  )
@@ -2726,6 +2728,9 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
2726
2728
  source_records.update(found_records)
2727
2729
 
2728
2730
  # See if we already have these records
2731
+ log.verbose(
2732
+ "Looking up existing datastore records in target %s for %d refs", self.name, len(requested_ids)
2733
+ )
2729
2734
  target_records = self._get_stored_records_associated_with_refs(refs, ignore_datastore_records=True)
2730
2735
 
2731
2736
  # The artifacts to register
@@ -2744,6 +2749,7 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
2744
2749
  direct_transfers = []
2745
2750
 
2746
2751
  # Now can transfer the artifacts
2752
+ log.verbose("Transferring artifacts")
2747
2753
  for ref in refs:
2748
2754
  if not self.constraints.isAcceptable(ref):
2749
2755
  # This datastore should not be accepting this dataset.
@@ -2818,6 +2824,7 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
2818
2824
  # to difficulties if the dataset has previously been ingested
2819
2825
  # disassembled and is somehow now assembled, or vice versa.
2820
2826
  if not dry_run:
2827
+ log.verbose("Registering datastore records in database")
2821
2828
  self._register_datasets(artifacts, insert_mode=DatabaseInsertMode.REPLACE)
2822
2829
 
2823
2830
  if already_present:
@@ -2828,6 +2835,13 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
2828
2835
  "" if n_skipped == 1 else "s",
2829
2836
  )
2830
2837
 
2838
+ log.verbose(
2839
+ "Finished transfer_from %s to %s with %d accepted, %d rejected",
2840
+ source_datastore.name,
2841
+ self.name,
2842
+ len(accepted),
2843
+ len(rejected),
2844
+ )
2831
2845
  return accepted, rejected
2832
2846
 
2833
2847
  @transactional
@@ -156,7 +156,7 @@ class DirectQueryDriver(QueryDriver):
156
156
  self._exit_stack: ExitStack | None = None
157
157
  self._raw_page_size = raw_page_size
158
158
  self._postprocessing_filter_factor = postprocessing_filter_factor
159
- self._constant_rows_limit = constant_rows_limit
159
+ self._constant_rows_limit = min(constant_rows_limit, db.get_constant_rows_max())
160
160
  self._cursors: set[_Cursor] = set()
161
161
 
162
162
  def __enter__(self) -> None:
@@ -230,6 +230,13 @@ class _ConversionVisitor(TreeVisitor[_VisitorResult]):
230
230
  else:
231
231
  return _ColExpr(column_expression)
232
232
 
233
+ def visitBind(self, name: str, node: Node) -> _VisitorResult:
234
+ name = name.lower()
235
+ if name not in self.context.bind:
236
+ raise InvalidQueryError("Name {name!r} is not in the bind map.")
237
+ # Logic in visitIdentifier handles binds.
238
+ return self.visitIdentifier(name, node)
239
+
233
240
  def visitNumericLiteral(self, value: str, node: Node) -> _VisitorResult:
234
241
  numeric: int | float
235
242
  try:
@@ -398,6 +398,12 @@ class SqliteDatabase(Database):
398
398
  ]
399
399
  return sqlalchemy.sql.union_all(*selects).alias(name)
400
400
 
401
+ def get_constant_rows_max(self) -> int:
402
+ # Docstring inherited.
403
+ # This is the default SQLITE_MAX_COMPOUND_SELECT (see
404
+ # https://www.sqlite.org/limits.html):
405
+ return 500
406
+
401
407
  @property
402
408
  def has_distinct_on(self) -> bool:
403
409
  # Docstring inherited.
@@ -317,6 +317,16 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
317
317
  raise ValueError(
318
318
  f"Component dataset types can not be stored in registry. Rejecting {dataset_type.name}"
319
319
  )
320
+
321
+ # If database universe and dimension group universe are different it
322
+ # can cause unexpected effects.
323
+ if dataset_type.dimensions.universe is not self._dimensions.universe:
324
+ raise ValueError(
325
+ "Incompatible dimension universe versions - "
326
+ f"database universe: {self._dimensions.universe}, "
327
+ f"dataset type universe: {dataset_type.dimensions.universe}."
328
+ )
329
+
320
330
  record = self._fetch_dataset_type_record(dataset_type.name)
321
331
  if record is None:
322
332
  if (dynamic_tables := self._cache.get_by_dimensions(dataset_type.dimensions)) is None:
@@ -1918,7 +1918,7 @@ class Database(ABC):
1918
1918
  This should reflect typical performance profiles (or a guess at these),
1919
1919
  not just hard database engine limits.
1920
1920
  """
1921
- return 100
1921
+ return 1000
1922
1922
 
1923
1923
  @property
1924
1924
  @abstractmethod
@@ -353,25 +353,7 @@ class PredicateConversionVisitor(TreeVisitor[VisitorResult]):
353
353
  def visitIdentifier(self, name: str, node: Node) -> VisitorResult:
354
354
  # Docstring inherited.
355
355
  if name in self.bind:
356
- value = self.bind[name]
357
- if isinstance(value, list | tuple | Set):
358
- elements = []
359
- all_dtypes = set()
360
- for item in value:
361
- dtype = type(item)
362
- all_dtypes.add(dtype)
363
- elements.append(ColumnExpression.literal(item, dtype=dtype))
364
- if len(all_dtypes) > 1:
365
- raise ExpressionTypeError(
366
- f"Mismatched types in bind iterable: {value} has a mix of {all_dtypes}."
367
- )
368
- elif not elements:
369
- # Empty container
370
- return ColumnContainer.sequence([])
371
- else:
372
- (dtype,) = all_dtypes
373
- return ColumnContainer.sequence(elements, dtype=dtype)
374
- return ColumnExpression.literal(value, dtype=type(value))
356
+ return self.visitBind(name, node)
375
357
  tag: ColumnTag
376
358
  match categorizeConstant(name):
377
359
  case ExpressionConstant.INGEST_DATE:
@@ -403,6 +385,31 @@ class PredicateConversionVisitor(TreeVisitor[VisitorResult]):
403
385
  assert isinstance(element, Dimension)
404
386
  return ColumnExpression.reference(tag, element.primaryKey.getPythonType())
405
387
 
388
+ def visitBind(self, name: str, node: Node) -> VisitorResult:
389
+ # Docstring inherited.
390
+ if name not in self.bind:
391
+ raise UserExpressionError(f"Name {name!r} is not in the bind map.")
392
+
393
+ value = self.bind[name]
394
+ if isinstance(value, list | tuple | Set):
395
+ elements = []
396
+ all_dtypes = set()
397
+ for item in value:
398
+ dtype = type(item)
399
+ all_dtypes.add(dtype)
400
+ elements.append(ColumnExpression.literal(item, dtype=dtype))
401
+ if len(all_dtypes) > 1:
402
+ raise ExpressionTypeError(
403
+ f"Mismatched types in bind iterable: {value} has a mix of {all_dtypes}."
404
+ )
405
+ elif not elements:
406
+ # Empty container
407
+ return ColumnContainer.sequence([])
408
+ else:
409
+ (dtype,) = all_dtypes
410
+ return ColumnContainer.sequence(elements, dtype=dtype)
411
+ return ColumnExpression.literal(value, dtype=type(value))
412
+
406
413
  def visitIsIn(
407
414
  self, lhs: VisitorResult, values: list[VisitorResult], not_in: bool, node: Node
408
415
  ) -> VisitorResult:
@@ -212,16 +212,8 @@ class InspectionVisitor(TreeVisitor[TreeSummary]):
212
212
  def visitIdentifier(self, name: str, node: Node) -> TreeSummary:
213
213
  # Docstring inherited from TreeVisitor.visitIdentifier
214
214
  if name in self.bind:
215
- value = self.bind[name]
216
- if isinstance(value, list | tuple | Set):
217
- # This can happen on rhs of IN operator, if there is only one
218
- # element in the list then take it.
219
- if len(value) == 1:
220
- return TreeSummary(dataIdValue=next(iter(value)))
221
- else:
222
- return TreeSummary()
223
- else:
224
- return TreeSummary(dataIdValue=value)
215
+ return self.visitBind(name, node)
216
+
225
217
  constant = categorizeConstant(name)
226
218
  if constant is ExpressionConstant.INGEST_DATE:
227
219
  return TreeSummary(hasIngestDate=True)
@@ -238,6 +230,23 @@ class InspectionVisitor(TreeVisitor[TreeSummary]):
238
230
  else:
239
231
  return TreeSummary(dimensions=set(element.minimal_group.names), columns={element.name: {column}})
240
232
 
233
+ def visitBind(self, name: str, node: Node) -> TreeSummary:
234
+ if name not in self.bind:
235
+ raise UserExpressionError(f"Name {name!r} is not in the bind map.")
236
+ value = self.bind[name]
237
+ match value:
238
+ case list() | tuple() | Set():
239
+ # This can happen on rhs of IN operator, if there is only one
240
+ # element in the list then take it.
241
+ match len(value):
242
+ case 1:
243
+ (value,) = value
244
+ return TreeSummary(dataIdValue=value)
245
+ case _:
246
+ return TreeSummary()
247
+ case _:
248
+ return TreeSummary(dataIdValue=value)
249
+
241
250
  def visitUnaryOp(self, operator: str, operand: TreeSummary, node: Node) -> TreeSummary:
242
251
  # Docstring inherited from TreeVisitor.visitUnaryOp
243
252
  return operand
@@ -1040,6 +1040,10 @@ class TransformationVisitor(TreeVisitor[TransformationWrapper]):
1040
1040
  # Docstring inherited from TreeVisitor.visitIdentifier
1041
1041
  return Opaque(node, PrecedenceTier.TOKEN)
1042
1042
 
1043
+ def visitBind(self, name: str, node: Node) -> TransformationWrapper:
1044
+ # Docstring inherited from TreeVisitor.visitBind
1045
+ return Opaque(node, PrecedenceTier.TOKEN)
1046
+
1043
1047
  def visitUnaryOp(
1044
1048
  self,
1045
1049
  operator: str,
@@ -256,6 +256,29 @@ class Identifier(Node):
256
256
  return "{name}".format(**vars(self))
257
257
 
258
258
 
259
+ class BindName(Node):
260
+ """Node representing a bind name.
261
+
262
+ Value of the bind is its name, which is a simple identifier.
263
+
264
+ Parameters
265
+ ----------
266
+ name : str
267
+ Bind name.
268
+ """
269
+
270
+ def __init__(self, name: str):
271
+ Node.__init__(self)
272
+ self.name = name
273
+
274
+ def visit(self, visitor: TreeVisitor) -> Any:
275
+ # Docstring inherited from Node.visit
276
+ return visitor.visitBind(self.name, self)
277
+
278
+ def __str__(self) -> str:
279
+ return "{name}".format(**vars(self))
280
+
281
+
259
282
  class RangeLiteral(Node):
260
283
  """Node representing range literal appearing in `IN` list.
261
284
 
@@ -128,6 +128,7 @@ class ParserLex:
128
128
  # 'DURATION_LITERAL',
129
129
  "QUALIFIED_IDENTIFIER",
130
130
  "SIMPLE_IDENTIFIER",
131
+ "BIND_NAME",
131
132
  "LPAREN",
132
133
  "RPAREN",
133
134
  "EQ",
@@ -221,6 +222,14 @@ class ParserLex:
221
222
  t.type = "SIMPLE_IDENTIFIER"
222
223
  return t
223
224
 
225
+ # we only support ASCII in identifier names
226
+ def t_BIND_NAME(self, t: LexToken) -> LexToken:
227
+ """[:][a-zA-Z_][a-zA-Z0-9_]*"""
228
+ # Drop colon to get the name.
229
+ t.value = t.value[1:]
230
+ t.type = "BIND_NAME"
231
+ return t
232
+
224
233
  def t_error(self, t: LexToken) -> None:
225
234
  """Error handling rule"""
226
235
  lexer = t.lexer
@@ -47,6 +47,7 @@ except ImportError:
47
47
 
48
48
  from .exprTree import (
49
49
  BinaryOp,
50
+ BindName,
50
51
  Identifier,
51
52
  IsIn,
52
53
  Node,
@@ -59,7 +60,7 @@ from .exprTree import (
59
60
  UnaryOp,
60
61
  function_call,
61
62
  )
62
- from .parserLex import LexToken, ParserLex
63
+ from .parserLex import LexToken, ParserLex, ParserLexError
63
64
  from .ply import yacc
64
65
 
65
66
 
@@ -223,8 +224,7 @@ class ParseError(ParserYaccError):
223
224
  self.pos = pos
224
225
  self.lineno = lineno
225
226
  self.posInLine = self._posInLine()
226
- msg = "Syntax error at or near '{0}' (line: {1}, pos: {2})"
227
- msg = msg.format(token, lineno, self.posInLine + 1)
227
+ msg = f"Syntax error at or near '{token}' (line: {lineno}, pos: {self.posInLine + 1})"
228
228
  ParserYaccError.__init__(self, msg)
229
229
 
230
230
  def _posInLine(self) -> int:
@@ -288,7 +288,11 @@ class ParserYacc:
288
288
  # make lexer
289
289
  if lexer is None:
290
290
  lexer = ParserLex.make_lexer()
291
- tree = self.parser.parse(input=input, lexer=lexer, debug=debug, tracking=tracking)
291
+ try:
292
+ tree = self.parser.parse(input=input, lexer=lexer, debug=debug, tracking=tracking)
293
+ except ParserLexError as exc:
294
+ # Convert it into ParserYaccError
295
+ raise ParserYaccError(str(exc)) from exc
292
296
  return tree
293
297
 
294
298
  tokens = ParserLex.tokens[:]
@@ -371,14 +375,21 @@ class ParserYacc:
371
375
  def p_literal_or_id_list(cls, p: YaccProduction) -> None:
372
376
  """literal_or_id_list : literal_or_id_list COMMA literal
373
377
  | literal_or_id_list COMMA identifier
378
+ | literal_or_id_list COMMA bind_name
374
379
  | literal
375
380
  | identifier
381
+ | bind_name
376
382
  """
377
383
  if len(p) == 2:
378
384
  p[0] = [p[1]]
379
385
  else:
380
386
  p[0] = p[1] + [p[3]]
381
387
 
388
+ @classmethod
389
+ def p_bind_name(cls, p: YaccProduction) -> None:
390
+ """bind_name : BIND_NAME"""
391
+ p[0] = BindName(p[1])
392
+
382
393
  @classmethod
383
394
  def p_bit_expr(cls, p: YaccProduction) -> None:
384
395
  """bit_expr : bit_expr ADD bit_expr
@@ -395,17 +406,11 @@ class ParserYacc:
395
406
 
396
407
  @classmethod
397
408
  def p_simple_expr_lit(cls, p: YaccProduction) -> None:
398
- """simple_expr : literal"""
399
- p[0] = p[1]
400
-
401
- @classmethod
402
- def p_simple_expr_id(cls, p: YaccProduction) -> None:
403
- """simple_expr : identifier"""
404
- p[0] = p[1]
405
-
406
- @classmethod
407
- def p_simple_expr_function_call(cls, p: YaccProduction) -> None:
408
- """simple_expr : function_call"""
409
+ """simple_expr : literal
410
+ | identifier
411
+ | bind_name
412
+ | function_call
413
+ """
409
414
  p[0] = p[1]
410
415
 
411
416
  @classmethod
@@ -29,7 +29,7 @@ from __future__ import annotations
29
29
 
30
30
  __all__ = ["TreeVisitor"]
31
31
 
32
- from abc import abstractmethod
32
+ from abc import ABC, abstractmethod
33
33
  from typing import TYPE_CHECKING, Generic, TypeVar
34
34
 
35
35
  if TYPE_CHECKING:
@@ -41,7 +41,7 @@ if TYPE_CHECKING:
41
41
  T = TypeVar("T")
42
42
 
43
43
 
44
- class TreeVisitor(Generic[T]):
44
+ class TreeVisitor(Generic[T], ABC):
45
45
  """Definition of interface for visitor classes.
46
46
 
47
47
  Visitors and tree node classes implement Visitor pattern for tree
@@ -121,6 +121,18 @@ class TreeVisitor(Generic[T]):
121
121
  Corresponding tree node, mostly useful for diagnostics.
122
122
  """
123
123
 
124
+ @abstractmethod
125
+ def visitBind(self, name: str, node: Node) -> T:
126
+ """Visit BindName node.
127
+
128
+ Parameters
129
+ ----------
130
+ name : `str`
131
+ Bind name.
132
+ node : `Node`
133
+ Corresponding tree node, mostly useful for diagnostics.
134
+ """
135
+
124
136
  @abstractmethod
125
137
  def visitUnaryOp(self, operator: str, operand: T, node: Node) -> T:
126
138
  """Visit UnaryOp node.
@@ -75,7 +75,7 @@ from ..._exceptions import (
75
75
  from ..._exceptions_legacy import DatasetTypeError
76
76
  from ..._storage_class import StorageClass
77
77
  from ..._timespan import Timespan
78
- from ...dimensions import DataCoordinate, DataCoordinateSet, SkyPixDimension
78
+ from ...dimensions import DataCoordinate, DataCoordinateSet, DimensionUniverse, SkyPixDimension
79
79
  from .._collection_summary import CollectionSummary
80
80
  from .._config import RegistryConfig
81
81
  from .._exceptions import (
@@ -326,6 +326,17 @@ class RegistryTests(ABC):
326
326
  self.assertCountEqual([dt.name for dt in types], ["test", "testNoneTemplate"])
327
327
  self.assertEqual(missing, ["notarealdatasettype"])
328
328
 
329
+ # Trying to register a dataset type with different universe version or
330
+ # namespace will raise.
331
+ wrong_universes = (DimensionUniverse(version=-1), DimensionUniverse(namespace="🔭"))
332
+ for universe in wrong_universes:
333
+ storageClass = StorageClass("testDatasetType")
334
+ dataset_type = DatasetType(
335
+ "wrong_universe", ("instrument", "visit"), storageClass, universe=universe
336
+ )
337
+ with self.assertRaisesRegex(ValueError, "Incompatible dimension universe versions"):
338
+ registry.registerDatasetType(dataset_type)
339
+
329
340
  def testDatasetTypeCache(self):
330
341
  """Test for dataset type cache update logic after a cache miss."""
331
342
  butler1 = self.make_butler()
@@ -2801,7 +2812,7 @@ class RegistryTests(ABC):
2801
2812
  self.assertEqual(len(datasets), expect_len)
2802
2813
 
2803
2814
  # same with bind using datetime or astropy Time
2804
- where = f"ingest_date {op} ingest_time"
2815
+ where = f"ingest_date {op} :ingest_time"
2805
2816
  datasets = list(
2806
2817
  registry.queryDatasets(..., collections=..., where=where, bind={"ingest_time": dt})
2807
2818
  )
@@ -2870,33 +2881,33 @@ class RegistryTests(ABC):
2870
2881
  # the expression.
2871
2882
 
2872
2883
  # t1 is before the start of i1, so this should not include i1.
2873
- self.assertEqual(ids[:i1], query("visit.timespan OVERLAPS (null, t1)"))
2884
+ self.assertEqual(ids[:i1], query("visit.timespan OVERLAPS (null, :t1)"))
2874
2885
  # t2 is exactly at the start of i2, but ends are exclusive, so these
2875
2886
  # should not include i2.
2876
- self.assertEqual(ids[i1:i2], query("(t1, t2) OVERLAPS visit.timespan"))
2887
+ self.assertEqual(ids[i1:i2], query("(:t1, :t2) OVERLAPS visit.timespan"))
2877
2888
  if self.supportsExtendedTimeQueryOperators:
2878
- self.assertEqual(ids[:i2], query("visit.timespan < (t2, t4)"))
2889
+ self.assertEqual(ids[:i2], query("visit.timespan < (:t2, :t4)"))
2879
2890
  # t3 is in the middle of i3, so this should include i3.
2880
- self.assertEqual(ids[i2 : i3 + 1], query("visit.timespan OVERLAPS ts23"))
2891
+ self.assertEqual(ids[i2 : i3 + 1], query("visit.timespan OVERLAPS :ts23"))
2881
2892
  # This one should not include t3 by the same reasoning.
2882
2893
  if self.supportsExtendedTimeQueryOperators:
2883
- self.assertEqual(ids[i3 + 1 :], query("visit.timespan > (t1, t3)"))
2894
+ self.assertEqual(ids[i3 + 1 :], query("visit.timespan > (:t1, :t3)"))
2884
2895
  # t4 is exactly at the end of i4, so this should include i4.
2885
- self.assertEqual(ids[i3 : i4 + 1], query(f"visit.timespan OVERLAPS (T'{t3.tai.isot}', t4)"))
2896
+ self.assertEqual(ids[i3 : i4 + 1], query(f"visit.timespan OVERLAPS (T'{t3.tai.isot}', :t4)"))
2886
2897
  # i4's upper bound of t4 is exclusive so this should not include t4.
2887
- self.assertEqual(ids[i4 + 1 :], query("visit.timespan OVERLAPS (t4, NULL)"))
2898
+ self.assertEqual(ids[i4 + 1 :], query("visit.timespan OVERLAPS (:t4, NULL)"))
2888
2899
 
2889
2900
  # Now some timespan vs. time scalar queries.
2890
- self.assertEqual(ids[i3 : i3 + 1], query("visit.timespan OVERLAPS t3"))
2901
+ self.assertEqual(ids[i3 : i3 + 1], query("visit.timespan OVERLAPS :t3"))
2891
2902
  self.assertEqual(ids[i3 : i3 + 1], query(f"T'{t3.tai.isot}' OVERLAPS visit.timespan"))
2892
2903
  if self.supportsExtendedTimeQueryOperators:
2893
- self.assertEqual(ids[:i2], query("visit.timespan < t2"))
2894
- self.assertEqual(ids[:i2], query("t2 > visit.timespan"))
2895
- self.assertEqual(ids[i3 + 1 :], query("visit.timespan > t3"))
2896
- self.assertEqual(ids[i3 + 1 :], query("t3 < visit.timespan"))
2904
+ self.assertEqual(ids[:i2], query("visit.timespan < :t2"))
2905
+ self.assertEqual(ids[:i2], query(":t2 > visit.timespan"))
2906
+ self.assertEqual(ids[i3 + 1 :], query("visit.timespan > :t3"))
2907
+ self.assertEqual(ids[i3 + 1 :], query(":t3 < visit.timespan"))
2897
2908
 
2898
2909
  # Empty timespans should not overlap anything.
2899
- self.assertEqual([], query("visit.timespan OVERLAPS (t3, t2)"))
2910
+ self.assertEqual([], query("visit.timespan OVERLAPS (:t3, :t2)"))
2900
2911
 
2901
2912
  # Make sure that expanded data IDs include the timespans.
2902
2913
  results = list(
@@ -2973,7 +2984,9 @@ class RegistryTests(ABC):
2973
2984
  self.load_data(butler, "base.yaml", "datasets.yaml")
2974
2985
  self.assertEqual(
2975
2986
  set(registry.queryDatasets("flat", band="r", collections=...)),
2976
- set(registry.queryDatasets("flat", where="band=my_band", bind={"my_band": "r"}, collections=...)),
2987
+ set(
2988
+ registry.queryDatasets("flat", where="band=:my_band", bind={"my_band": "r"}, collections=...)
2989
+ ),
2977
2990
  )
2978
2991
 
2979
2992
  def testQueryIntRangeExpressions(self):
@@ -3212,7 +3225,7 @@ class RegistryTests(ABC):
3212
3225
  "(Dimension element name cannot be inferred in this context.)"
3213
3226
  "|(Unrecognized identifier 'timespan')",
3214
3227
  ):
3215
- list(registry.queryDataIds(["detector"], where="timespan.end < time", bind=bind))
3228
+ list(registry.queryDataIds(["detector"], where="timespan.end < :time", bind=bind))
3216
3229
 
3217
3230
  def testQueryDataIdsOrderBy(self):
3218
3231
  """Test order_by and limit on result returned by queryDataIds()."""
@@ -3390,13 +3403,13 @@ class RegistryTests(ABC):
3390
3403
  Test("tract,visit", where="instrument='Cam1' AND skymap='SkyMap5'", exception=DataIdValueError),
3391
3404
  Test(
3392
3405
  "tract,visit",
3393
- where="instrument=cam AND skymap=map",
3406
+ where="instrument=:cam AND skymap=:map",
3394
3407
  bind={"cam": "Cam1", "map": "SkyMap1"},
3395
3408
  count=6,
3396
3409
  ),
3397
3410
  Test(
3398
3411
  "tract,visit",
3399
- where="instrument=cam AND skymap=map",
3412
+ where="instrument=:cam AND skymap=:map",
3400
3413
  bind={"cam": "Cam", "map": "SkyMap"},
3401
3414
  exception=DataIdValueError,
3402
3415
  ),
@@ -3530,7 +3543,7 @@ class RegistryTests(ABC):
3530
3543
 
3531
3544
  result = registry.queryDimensionRecords("detector", where="instrument='Cam1'")
3532
3545
  self.assertEqual(result.count(), 4)
3533
- result = registry.queryDimensionRecords("detector", where="instrument=instr", bind={"instr": "Cam1"})
3546
+ result = registry.queryDimensionRecords("detector", where="instrument=:instr", bind={"instr": "Cam1"})
3534
3547
  self.assertTrue(result.any())
3535
3548
  self.assertEqual(result.count(), 4)
3536
3549
 
@@ -3557,7 +3570,7 @@ class RegistryTests(ABC):
3557
3570
  DataIdValueError, "Unknown values specified for governor dimension"
3558
3571
  ):
3559
3572
  result = registry.queryDimensionRecords(
3560
- "detector", where="instrument=instr", bind={"instr": "NotCam1"}
3573
+ "detector", where="instrument=:instr", bind={"instr": "NotCam1"}
3561
3574
  )
3562
3575
  result.count()
3563
3576