lsst-daf-butler 29.2025.1000__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.2025.1000/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.1100}/PKG-INFO +1 -1
  2. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/queries.rst +4 -2
  3. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/_driver.py +1 -1
  4. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/_expression_strings.py +7 -0
  5. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/databases/sqlite.py +6 -0
  6. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_database.py +1 -1
  7. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +26 -19
  8. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/check.py +19 -10
  9. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +4 -0
  10. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +23 -0
  11. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +9 -0
  12. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +20 -15
  13. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +14 -2
  14. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/tests/_registry.py +22 -20
  15. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/butler_queries.py +23 -23
  16. lsst_daf_butler-29.2025.1100/python/lsst/daf/butler/version.py +2 -0
  17. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
  18. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_butler.py +2 -2
  19. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_exprParserLex.py +23 -0
  20. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_exprParserYacc.py +82 -10
  21. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_expressions.py +5 -5
  22. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_normalFormExpression.py +13 -1
  23. lsst_daf_butler-29.2025.1000/python/lsst/daf/butler/version.py +0 -2
  24. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/COPYRIGHT +0 -0
  25. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/LICENSE +0 -0
  26. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/MANIFEST.in +0 -0
  27. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/README.md +0 -0
  28. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/bsd_license.txt +0 -0
  29. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/CHANGES.rst +0 -0
  30. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
  31. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/configuring.rst +0 -0
  32. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/datastores.rst +0 -0
  33. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/dimensions.rst +0 -0
  34. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/formatters.rst +0 -0
  35. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/index.rst +0 -0
  36. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/organizing.rst +0 -0
  37. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
  38. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
  39. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/gpl-v3.0.txt +0 -0
  40. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/pyproject.toml +0 -0
  41. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/__init__.py +0 -0
  42. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/__init__.py +0 -0
  43. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/__init__.py +0 -0
  44. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_butler.py +0 -0
  45. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_butler_collections.py +0 -0
  46. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_butler_config.py +0 -0
  47. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
  48. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
  49. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_collection_type.py +0 -0
  50. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_column_categorization.py +0 -0
  51. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_column_tags.py +0 -0
  52. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_column_type_info.py +0 -0
  53. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_config.py +0 -0
  54. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_config_support.py +0 -0
  55. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_dataset_association.py +0 -0
  56. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_dataset_existence.py +0 -0
  57. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
  58. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_dataset_ref.py +0 -0
  59. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_dataset_type.py +0 -0
  60. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
  61. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_exceptions.py +0 -0
  62. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
  63. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_file_dataset.py +0 -0
  64. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_file_descriptor.py +0 -0
  65. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_formatter.py +0 -0
  66. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
  67. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_limited_butler.py +0 -0
  68. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_location.py +0 -0
  69. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_named.py +0 -0
  70. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_quantum.py +0 -0
  71. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_quantum_backed.py +0 -0
  72. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
  73. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_registry_shim.py +0 -0
  74. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_storage_class.py +0 -0
  75. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
  76. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_timespan.py +0 -0
  77. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_topology.py +0 -0
  78. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
  79. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
  80. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
  81. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
  82. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/arrow_utils.py +0 -0
  83. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/__init__.py +0 -0
  84. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/butler.py +0 -0
  85. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/cliLog.py +0 -0
  86. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
  87. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
  88. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
  89. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
  90. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
  91. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
  92. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
  93. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/opt/options.py +0 -0
  94. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/progress.py +0 -0
  95. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/cli/utils.py +0 -0
  96. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/column_spec.py +0 -0
  97. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
  98. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
  99. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
  100. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
  101. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
  102. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
  103. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
  104. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
  105. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
  106. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
  107. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
  108. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
  109. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
  110. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
  111. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/registry.yaml +0 -0
  112. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
  113. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
  114. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/__init__.py +0 -0
  115. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
  116. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
  117. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/composites.py +0 -0
  118. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/constraints.py +0 -0
  119. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
  120. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
  121. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/record_data.py +0 -0
  122. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
  123. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastores/__init__.py +0 -0
  124. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
  125. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastores/fileDatastore.py +0 -0
  126. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -0
  127. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
  128. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
  129. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
  130. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
  131. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/ddl.py +0 -0
  132. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/delegates/__init__.py +0 -0
  133. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
  134. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
  135. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_config.py +0 -0
  136. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
  137. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
  138. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_database.py +0 -0
  139. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
  140. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
  141. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_group.py +0 -0
  142. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
  143. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
  144. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
  145. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_records.py +0 -0
  146. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
  147. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
  148. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
  149. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/construction.py +0 -0
  150. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
  151. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
  152. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_butler/_direct_butler.py +0 -0
  153. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
  154. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
  155. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
  156. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/_predicate_constraints_summary.py +0 -0
  157. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
  158. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
  159. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
  160. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
  161. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
  162. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/__init__.py +0 -0
  163. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
  164. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/file.py +0 -0
  165. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/json.py +0 -0
  166. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/logs.py +0 -0
  167. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
  168. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/packages.py +0 -0
  169. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/parquet.py +0 -0
  170. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/pickle.py +0 -0
  171. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/typeless.py +0 -0
  172. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/formatters/yaml.py +0 -0
  173. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/json.py +0 -0
  174. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/logging.py +0 -0
  175. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/mapping_factory.py +0 -0
  176. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/name_shrinker.py +0 -0
  177. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
  178. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/persistence_context.py +0 -0
  179. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/progress.py +0 -0
  180. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/py.typed +0 -0
  181. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/pydantic_utils.py +0 -0
  182. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/__init__.py +0 -0
  183. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/_base.py +0 -0
  184. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
  185. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
  186. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
  187. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
  188. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
  189. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/_query.py +0 -0
  190. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/convert_args.py +0 -0
  191. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/driver.py +0 -0
  192. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
  193. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/overlaps.py +0 -0
  194. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/result_specs.py +0 -0
  195. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
  196. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
  197. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
  198. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
  199. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
  200. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
  201. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
  202. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
  203. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/queries/visitors.py +0 -0
  204. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/__init__.py +0 -0
  205. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
  206. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
  207. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
  208. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
  209. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_config.py +0 -0
  210. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_defaults.py +0 -0
  211. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
  212. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_registry.py +0 -0
  213. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
  214. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/attributes.py +0 -0
  215. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
  216. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
  217. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
  218. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
  219. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
  220. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
  221. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
  222. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/connectionString.py +0 -0
  223. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
  224. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
  225. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
  226. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
  227. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
  228. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
  229. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
  230. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
  231. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
  232. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
  233. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
  234. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
  235. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
  236. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
  237. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
  238. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
  239. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
  240. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
  241. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
  242. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
  243. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/managers.py +0 -0
  244. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
  245. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
  246. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
  247. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
  248. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
  249. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
  250. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
  251. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
  252. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
  253. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/opaque.py +0 -0
  254. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
  255. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
  256. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
  257. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
  258. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
  259. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
  260. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
  261. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
  262. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
  263. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
  264. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
  265. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
  266. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
  267. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
  268. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
  269. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
  270. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
  271. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
  272. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
  273. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
  274. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
  275. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
  276. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/versions.py +0 -0
  277. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/registry/wildcards.py +0 -0
  278. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
  279. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_authentication.py +0 -0
  280. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
  281. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
  282. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
  283. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
  284. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
  285. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
  286. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
  287. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
  288. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
  289. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
  290. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_remote_butler.py +0 -0
  291. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
  292. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
  293. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
  294. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
  295. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
  296. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
  297. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
  298. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
  299. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
  300. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
  301. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
  302. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
  303. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
  304. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
  305. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
  306. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
  307. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
  308. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
  309. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/repo_relocation.py +0 -0
  310. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/__init__.py +0 -0
  311. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/_associate.py +0 -0
  312. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
  313. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/butlerImport.py +0 -0
  314. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
  315. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/collectionChain.py +0 -0
  316. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/configDump.py +0 -0
  317. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/configValidate.py +0 -0
  318. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/createRepo.py +0 -0
  319. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
  320. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/ingest_files.py +0 -0
  321. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
  322. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/queryCollections.py +0 -0
  323. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
  324. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
  325. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
  326. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
  327. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
  328. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/removeCollections.py +0 -0
  329. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
  330. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/removeRuns.py +0 -0
  331. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
  332. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
  333. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/__init__.py +0 -0
  334. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
  335. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
  336. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
  337. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
  338. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
  339. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
  340. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
  341. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
  342. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
  343. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
  344. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
  345. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/postgresql.py +0 -0
  346. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/server.py +0 -0
  347. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/server_utils.py +0 -0
  348. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
  349. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/tests/utils.py +0 -0
  350. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/time_utils.py +0 -0
  351. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
  352. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/transfers/__init__.py +0 -0
  353. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/transfers/_context.py +0 -0
  354. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
  355. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
  356. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst/daf/butler/utils.py +0 -0
  357. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst_daf_butler.egg-info/SOURCES.txt +0 -0
  358. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
  359. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
  360. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
  361. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
  362. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
  363. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/setup.cfg +0 -0
  364. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_astropyTableFormatter.py +0 -0
  365. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_authentication.py +0 -0
  366. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_butler_factory.py +0 -0
  367. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdAssociate.py +0 -0
  368. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdConfigDump.py +0 -0
  369. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdConfigValidate.py +0 -0
  370. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdCreate.py +0 -0
  371. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdImport.py +0 -0
  372. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdIngestFiles.py +0 -0
  373. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdPruneDatasets.py +0 -0
  374. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdQueryCollections.py +0 -0
  375. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdQueryDataIds.py +0 -0
  376. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
  377. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdQueryDatasets.py +0 -0
  378. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
  379. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdRemoveCollections.py +0 -0
  380. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdRemoveRuns.py +0 -0
  381. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
  382. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliLog.py +0 -0
  383. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliPluginLoader.py +0 -0
  384. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliUtilSplitCommas.py +0 -0
  385. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliUtilSplitKv.py +0 -0
  386. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliUtilToUpper.py +0 -0
  387. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_cliUtils.py +0 -0
  388. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_composites.py +0 -0
  389. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_config.py +0 -0
  390. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_connectionString.py +0 -0
  391. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_constraints.py +0 -0
  392. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_datasets.py +0 -0
  393. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_datastore.py +0 -0
  394. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_ddl.py +0 -0
  395. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_dimension_record_containers.py +0 -0
  396. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_dimensions.py +0 -0
  397. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_formatter.py +0 -0
  398. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_location.py +0 -0
  399. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_logFormatter.py +0 -0
  400. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_logging.py +0 -0
  401. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_matplotlibFormatter.py +0 -0
  402. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_nonempty_mapping.py +0 -0
  403. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_obscore.py +0 -0
  404. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_packages.py +0 -0
  405. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_parquet.py +0 -0
  406. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_postgresql.py +0 -0
  407. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_progress.py +0 -0
  408. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_pydantic_utils.py +0 -0
  409. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_quantum.py +0 -0
  410. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_quantumBackedButler.py +0 -0
  411. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_query_direct_postgresql.py +0 -0
  412. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_query_direct_sqlite.py +0 -0
  413. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_query_interface.py +0 -0
  414. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_query_relations.py +0 -0
  415. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_query_remote.py +0 -0
  416. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_query_utilities.py +0 -0
  417. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_remote_butler.py +0 -0
  418. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_server.py +0 -0
  419. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_simpleButler.py +0 -0
  420. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_sqlite.py +0 -0
  421. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_storageClass.py +0 -0
  422. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_templates.py +0 -0
  423. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_testRepo.py +0 -0
  424. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_thread_utils.py +0 -0
  425. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_time_utils.py +0 -0
  426. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_timespan.py +0 -0
  427. {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1100}/tests/test_utils.py +0 -0
  428. {lsst_daf_butler-29.2025.1000 → 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.2025.1000
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
 
@@ -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.
@@ -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.
@@ -2812,7 +2812,7 @@ class RegistryTests(ABC):
2812
2812
  self.assertEqual(len(datasets), expect_len)
2813
2813
 
2814
2814
  # same with bind using datetime or astropy Time
2815
- where = f"ingest_date {op} ingest_time"
2815
+ where = f"ingest_date {op} :ingest_time"
2816
2816
  datasets = list(
2817
2817
  registry.queryDatasets(..., collections=..., where=where, bind={"ingest_time": dt})
2818
2818
  )
@@ -2881,33 +2881,33 @@ class RegistryTests(ABC):
2881
2881
  # the expression.
2882
2882
 
2883
2883
  # t1 is before the start of i1, so this should not include i1.
2884
- self.assertEqual(ids[:i1], query("visit.timespan OVERLAPS (null, t1)"))
2884
+ self.assertEqual(ids[:i1], query("visit.timespan OVERLAPS (null, :t1)"))
2885
2885
  # t2 is exactly at the start of i2, but ends are exclusive, so these
2886
2886
  # should not include i2.
2887
- self.assertEqual(ids[i1:i2], query("(t1, t2) OVERLAPS visit.timespan"))
2887
+ self.assertEqual(ids[i1:i2], query("(:t1, :t2) OVERLAPS visit.timespan"))
2888
2888
  if self.supportsExtendedTimeQueryOperators:
2889
- self.assertEqual(ids[:i2], query("visit.timespan < (t2, t4)"))
2889
+ self.assertEqual(ids[:i2], query("visit.timespan < (:t2, :t4)"))
2890
2890
  # t3 is in the middle of i3, so this should include i3.
2891
- self.assertEqual(ids[i2 : i3 + 1], query("visit.timespan OVERLAPS ts23"))
2891
+ self.assertEqual(ids[i2 : i3 + 1], query("visit.timespan OVERLAPS :ts23"))
2892
2892
  # This one should not include t3 by the same reasoning.
2893
2893
  if self.supportsExtendedTimeQueryOperators:
2894
- self.assertEqual(ids[i3 + 1 :], query("visit.timespan > (t1, t3)"))
2894
+ self.assertEqual(ids[i3 + 1 :], query("visit.timespan > (:t1, :t3)"))
2895
2895
  # t4 is exactly at the end of i4, so this should include i4.
2896
- 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)"))
2897
2897
  # i4's upper bound of t4 is exclusive so this should not include t4.
2898
- self.assertEqual(ids[i4 + 1 :], query("visit.timespan OVERLAPS (t4, NULL)"))
2898
+ self.assertEqual(ids[i4 + 1 :], query("visit.timespan OVERLAPS (:t4, NULL)"))
2899
2899
 
2900
2900
  # Now some timespan vs. time scalar queries.
2901
- self.assertEqual(ids[i3 : i3 + 1], query("visit.timespan OVERLAPS t3"))
2901
+ self.assertEqual(ids[i3 : i3 + 1], query("visit.timespan OVERLAPS :t3"))
2902
2902
  self.assertEqual(ids[i3 : i3 + 1], query(f"T'{t3.tai.isot}' OVERLAPS visit.timespan"))
2903
2903
  if self.supportsExtendedTimeQueryOperators:
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"))
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"))
2908
2908
 
2909
2909
  # Empty timespans should not overlap anything.
2910
- self.assertEqual([], query("visit.timespan OVERLAPS (t3, t2)"))
2910
+ self.assertEqual([], query("visit.timespan OVERLAPS (:t3, :t2)"))
2911
2911
 
2912
2912
  # Make sure that expanded data IDs include the timespans.
2913
2913
  results = list(
@@ -2984,7 +2984,9 @@ class RegistryTests(ABC):
2984
2984
  self.load_data(butler, "base.yaml", "datasets.yaml")
2985
2985
  self.assertEqual(
2986
2986
  set(registry.queryDatasets("flat", band="r", collections=...)),
2987
- 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
+ ),
2988
2990
  )
2989
2991
 
2990
2992
  def testQueryIntRangeExpressions(self):
@@ -3223,7 +3225,7 @@ class RegistryTests(ABC):
3223
3225
  "(Dimension element name cannot be inferred in this context.)"
3224
3226
  "|(Unrecognized identifier 'timespan')",
3225
3227
  ):
3226
- list(registry.queryDataIds(["detector"], where="timespan.end < time", bind=bind))
3228
+ list(registry.queryDataIds(["detector"], where="timespan.end < :time", bind=bind))
3227
3229
 
3228
3230
  def testQueryDataIdsOrderBy(self):
3229
3231
  """Test order_by and limit on result returned by queryDataIds()."""
@@ -3401,13 +3403,13 @@ class RegistryTests(ABC):
3401
3403
  Test("tract,visit", where="instrument='Cam1' AND skymap='SkyMap5'", exception=DataIdValueError),
3402
3404
  Test(
3403
3405
  "tract,visit",
3404
- where="instrument=cam AND skymap=map",
3406
+ where="instrument=:cam AND skymap=:map",
3405
3407
  bind={"cam": "Cam1", "map": "SkyMap1"},
3406
3408
  count=6,
3407
3409
  ),
3408
3410
  Test(
3409
3411
  "tract,visit",
3410
- where="instrument=cam AND skymap=map",
3412
+ where="instrument=:cam AND skymap=:map",
3411
3413
  bind={"cam": "Cam", "map": "SkyMap"},
3412
3414
  exception=DataIdValueError,
3413
3415
  ),
@@ -3541,7 +3543,7 @@ class RegistryTests(ABC):
3541
3543
 
3542
3544
  result = registry.queryDimensionRecords("detector", where="instrument='Cam1'")
3543
3545
  self.assertEqual(result.count(), 4)
3544
- result = registry.queryDimensionRecords("detector", where="instrument=instr", bind={"instr": "Cam1"})
3546
+ result = registry.queryDimensionRecords("detector", where="instrument=:instr", bind={"instr": "Cam1"})
3545
3547
  self.assertTrue(result.any())
3546
3548
  self.assertEqual(result.count(), 4)
3547
3549
 
@@ -3568,7 +3570,7 @@ class RegistryTests(ABC):
3568
3570
  DataIdValueError, "Unknown values specified for governor dimension"
3569
3571
  ):
3570
3572
  result = registry.queryDimensionRecords(
3571
- "detector", where="instrument=instr", bind={"instr": "NotCam1"}
3573
+ "detector", where="instrument=:instr", bind={"instr": "NotCam1"}
3572
3574
  )
3573
3575
  result.count()
3574
3576