lsst-daf-butler 29.2025.1000__tar.gz → 29.2025.1200__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.
- {lsst_daf_butler-29.2025.1000/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.1200}/PKG-INFO +3 -2
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/doc/lsst.daf.butler/queries.rst +4 -2
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/cli/cmd/commands.py +3 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/datastore/_datastore.py +4 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/datastores/fileDatastore.py +30 -15
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/direct_query_driver/_driver.py +1 -1
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/formatters/parquet.py +2 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/_expression_strings.py +7 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/databases/sqlite.py +6 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/interfaces/_database.py +1 -1
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +26 -19
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/expressions/check.py +19 -10
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +4 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +23 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +9 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +20 -15
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +14 -2
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/tests/_registry.py +22 -20
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/transferDatasets.py +5 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/butler_queries.py +23 -23
- lsst_daf_butler-29.2025.1200/python/lsst/daf/butler/version.py +2 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200/python/lsst_daf_butler.egg-info}/PKG-INFO +3 -2
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_butler.py +2 -2
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_exprParserLex.py +23 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_exprParserYacc.py +82 -10
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_expressions.py +5 -5
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_normalFormExpression.py +13 -1
- lsst_daf_butler-29.2025.1000/python/lsst/daf/butler/version.py +0 -2
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/COPYRIGHT +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/LICENSE +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/MANIFEST.in +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/README.md +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/bsd_license.txt +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/doc/lsst.daf.butler/CHANGES.rst +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/doc/lsst.daf.butler/configuring.rst +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/doc/lsst.daf.butler/datastores.rst +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/doc/lsst.daf.butler/dimensions.rst +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/doc/lsst.daf.butler/formatters.rst +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/doc/lsst.daf.butler/index.rst +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/doc/lsst.daf.butler/organizing.rst +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/gpl-v3.0.txt +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/pyproject.toml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_butler.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_butler_config.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_collection_type.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_column_categorization.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_column_tags.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_column_type_info.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_config_support.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_dataset_association.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_dataset_existence.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_dataset_ref.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_file_dataset.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_file_descriptor.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_formatter.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_limited_butler.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_location.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_named.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_quantum.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_quantum_backed.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_registry_shim.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_storage_class.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_timespan.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_topology.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/arrow_utils.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/cli/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/cli/butler.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/cli/cliLog.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/cli/opt/options.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/cli/progress.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/cli/utils.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/column_spec.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/configs/registry.yaml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/datastore/composites.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/datastore/constraints.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/datastore/record_data.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/datastores/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/ddl.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/delegates/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/dimensions/_config.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/dimensions/_database.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/dimensions/_group.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/dimensions/_records.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/dimensions/construction.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/direct_butler/_direct_butler.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/direct_query_driver/_predicate_constraints_summary.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/formatters/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/formatters/file.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/formatters/json.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/formatters/logs.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/formatters/packages.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/formatters/pickle.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/formatters/typeless.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/formatters/yaml.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/json.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/logging.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/mapping_factory.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/name_shrinker.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/persistence_context.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/progress.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/py.typed +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/_base.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/convert_args.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/driver.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/overlaps.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/result_specs.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/queries/visitors.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/_config.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/_registry.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/attributes.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/connectionString.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/managers.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/opaque.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/versions.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/registry/wildcards.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/_authentication.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/_remote_butler.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/repo_relocation.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/_associate.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/butlerImport.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/collectionChain.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/configDump.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/configValidate.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/createRepo.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/ingest_files.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/queryCollections.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/removeCollections.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/removeRuns.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/server.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/server_utils.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/tests/utils.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/time_utils.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/transfers/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/transfers/_context.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst/daf/butler/utils.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst_daf_butler.egg-info/SOURCES.txt +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/setup.cfg +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_astropyTableFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_authentication.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliCmdAssociate.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliCmdConfigDump.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliCmdConfigValidate.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliCmdCreate.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliCmdImport.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliCmdIngestFiles.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliCmdPruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliCmdQueryCollections.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliCmdQueryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliCmdQueryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliCmdRemoveCollections.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliCmdRemoveRuns.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliLog.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliPluginLoader.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliUtilSplitCommas.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliUtilSplitKv.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliUtilToUpper.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_cliUtils.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_composites.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_config.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_connectionString.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_constraints.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_datastore.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_ddl.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_dimension_record_containers.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_formatter.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_location.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_logFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_logging.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_matplotlibFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_obscore.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_packages.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_parquet.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_progress.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_quantum.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_quantumBackedButler.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_query_direct_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_query_direct_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_query_interface.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_query_relations.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_query_remote.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_query_utilities.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_remote_butler.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_server.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_simpleButler.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_storageClass.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_templates.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_thread_utils.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_time_utils.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_timespan.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_utils.py +0 -0
- {lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/tests/test_versioning.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: lsst-daf-butler
|
|
3
|
-
Version: 29.2025.
|
|
3
|
+
Version: 29.2025.1200
|
|
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
|
|
@@ -51,6 +51,7 @@ Provides-Extra: https
|
|
|
51
51
|
Requires-Dist: lsst-resources[https]; extra == "https"
|
|
52
52
|
Provides-Extra: gs
|
|
53
53
|
Requires-Dist: lsst-resources[gs]; extra == "gs"
|
|
54
|
+
Dynamic: license-file
|
|
54
55
|
|
|
55
56
|
# lsst-daf-butler
|
|
56
57
|
|
{lsst_daf_butler-29.2025.1000 → lsst_daf_butler-29.2025.1200}/doc/lsst.daf.butler/queries.rst
RENAMED
|
@@ -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
|
|
|
@@ -638,6 +638,9 @@ def retrieve_artifacts(**kwargs: Any) -> None:
|
|
|
638
638
|
@transfer_option()
|
|
639
639
|
@register_dataset_types_option()
|
|
640
640
|
@transfer_dimensions_option()
|
|
641
|
+
@click.option(
|
|
642
|
+
"--dry-run/--no-dry-run", default=False, help="Enable dry run mode and do not transfer any datasets."
|
|
643
|
+
)
|
|
641
644
|
@options_file_option()
|
|
642
645
|
def transfer_datasets(**kwargs: Any) -> None:
|
|
643
646
|
"""Transfer datasets from a source butler to a destination butler.
|
|
@@ -2158,10 +2158,15 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
|
|
|
2158
2158
|
target_uri = to_transfer[cleaned_source_uri]
|
|
2159
2159
|
artifact_map[target_uri].append(ref.id)
|
|
2160
2160
|
|
|
2161
|
-
#
|
|
2161
|
+
# Parallelize the transfer. Re-raise as a single exception if
|
|
2162
|
+
# a FileExistsError is encountered anywhere.
|
|
2162
2163
|
log.debug("Number of artifacts to transfer to %s: %d", str(destination), len(to_transfer))
|
|
2163
|
-
|
|
2164
|
-
|
|
2164
|
+
try:
|
|
2165
|
+
ResourcePath.mtransfer(transfer, tuple(to_transfer.items()), overwrite=overwrite)
|
|
2166
|
+
except* FileExistsError as egroup:
|
|
2167
|
+
raise FileExistsError(
|
|
2168
|
+
"Some files already exist in destination directory and overwrite is False"
|
|
2169
|
+
) from egroup
|
|
2165
2170
|
|
|
2166
2171
|
# Transfer the Zip files and unpack them.
|
|
2167
2172
|
zipped_artifacts = unpack_zips(zips_to_transfer, requested_ids, destination, preserve_path, overwrite)
|
|
@@ -2748,6 +2753,9 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
|
|
|
2748
2753
|
# Record each time we have done a "direct" transfer.
|
|
2749
2754
|
direct_transfers = []
|
|
2750
2755
|
|
|
2756
|
+
# Keep track of all the file transfers that are required.
|
|
2757
|
+
from_to: list[tuple[ResourcePath, ResourcePath]] = []
|
|
2758
|
+
|
|
2751
2759
|
# Now can transfer the artifacts
|
|
2752
2760
|
log.verbose("Transferring artifacts")
|
|
2753
2761
|
for ref in refs:
|
|
@@ -2796,21 +2804,28 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
|
|
|
2796
2804
|
info = info.update(path=target_location.pathInStore.path)
|
|
2797
2805
|
|
|
2798
2806
|
# Need to transfer it to the new location.
|
|
2799
|
-
|
|
2800
|
-
# is there this might indicate that a previous transfer
|
|
2801
|
-
# was interrupted but was not able to be rolled back
|
|
2802
|
-
# completely (eg pre-emption) so follow Datastore default
|
|
2803
|
-
# and overwrite. Do not copy if we are in dry-run mode.
|
|
2804
|
-
if not dry_run:
|
|
2805
|
-
target_location.uri.transfer_from(
|
|
2806
|
-
source_location.uri,
|
|
2807
|
-
transfer=transfer,
|
|
2808
|
-
overwrite=True,
|
|
2809
|
-
transaction=self._transaction,
|
|
2810
|
-
)
|
|
2807
|
+
from_to.append((source_location.uri, target_location.uri))
|
|
2811
2808
|
|
|
2812
2809
|
artifacts.append((ref, info))
|
|
2813
2810
|
|
|
2811
|
+
# Do the file transfers in bulk.
|
|
2812
|
+
# Assume we should always overwrite. If the artifact
|
|
2813
|
+
# is there this might indicate that a previous transfer
|
|
2814
|
+
# was interrupted but was not able to be rolled back
|
|
2815
|
+
# completely (eg pre-emption) so follow Datastore default
|
|
2816
|
+
# and overwrite. Do not copy if we are in dry-run mode.
|
|
2817
|
+
if dry_run:
|
|
2818
|
+
log.info("Would be copying %d file artifacts", len(from_to))
|
|
2819
|
+
else:
|
|
2820
|
+
log.verbose("Copying %d file artifacts", len(from_to))
|
|
2821
|
+
with time_this(log, msg="Transferring datasets into datastore", level=VERBOSE):
|
|
2822
|
+
ResourcePath.mtransfer(
|
|
2823
|
+
transfer,
|
|
2824
|
+
from_to,
|
|
2825
|
+
overwrite=True,
|
|
2826
|
+
transaction=self._transaction,
|
|
2827
|
+
)
|
|
2828
|
+
|
|
2814
2829
|
if direct_transfers:
|
|
2815
2830
|
log.info(
|
|
2816
2831
|
"Transfer request for an outside-datastore artifact with absolute URI done %d time%s",
|
|
@@ -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:
|
|
@@ -1222,8 +1222,10 @@ def _append_numpy_string_metadata(metadata: dict[bytes, str], name: str, dtype:
|
|
|
1222
1222
|
|
|
1223
1223
|
if dtype.type is np.str_:
|
|
1224
1224
|
metadata[f"lsst::arrow::len::{name}".encode()] = str(dtype.itemsize // 4)
|
|
1225
|
+
metadata[f"table::len::{name}".encode()] = str(dtype.itemsize // 4)
|
|
1225
1226
|
elif dtype.type is np.bytes_:
|
|
1226
1227
|
metadata[f"lsst::arrow::len::{name}".encode()] = str(dtype.itemsize)
|
|
1228
|
+
metadata[f"table::len::{name}".encode()] = str(dtype.itemsize)
|
|
1227
1229
|
|
|
1228
1230
|
|
|
1229
1231
|
def _append_numpy_multidim_metadata(metadata: dict[bytes, str], name: str, dtype: np.dtype) -> 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.
|
|
@@ -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
|
-
|
|
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
|
-
|
|
216
|
-
|
|
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 '{
|
|
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
|
-
|
|
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
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
3573
|
+
"detector", where="instrument=:instr", bind={"instr": "NotCam1"}
|
|
3572
3574
|
)
|
|
3573
3575
|
result.count()
|
|
3574
3576
|
|
|
@@ -49,6 +49,7 @@ def transferDatasets(
|
|
|
49
49
|
transfer: str,
|
|
50
50
|
register_dataset_types: bool,
|
|
51
51
|
transfer_dimensions: bool = True,
|
|
52
|
+
dry_run: bool = False,
|
|
52
53
|
) -> int:
|
|
53
54
|
"""Transfer datasets from run in source to dest.
|
|
54
55
|
|
|
@@ -84,6 +85,9 @@ def transferDatasets(
|
|
|
84
85
|
Indicate whether dimensions should be transferred along with
|
|
85
86
|
datasets. It can be more efficient to disable this if it is known
|
|
86
87
|
that all dimensions exist.
|
|
88
|
+
dry_run : `bool`, optional
|
|
89
|
+
If `True` no transfers are done but the number of transfers that
|
|
90
|
+
would be done is reported.
|
|
87
91
|
"""
|
|
88
92
|
source_butler = Butler.from_config(source, writeable=False)
|
|
89
93
|
dest_butler = Butler.from_config(dest, writeable=True)
|
|
@@ -112,5 +116,6 @@ def transferDatasets(
|
|
|
112
116
|
transfer=transfer,
|
|
113
117
|
register_dataset_types=register_dataset_types,
|
|
114
118
|
transfer_dimensions=transfer_dimensions,
|
|
119
|
+
dry_run=dry_run,
|
|
115
120
|
)
|
|
116
121
|
return len(transferred)
|