lsst-daf-butler 29.2025.1500__tar.gz → 29.2025.1700__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.1500/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.1700}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_config.py +1 -1
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/configs/datastores/formatters.yaml +1 -1
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/configs/storageClasses.yaml +3 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/dimensions/_universe.py +12 -8
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/direct_butler/_direct_butler.py +142 -120
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/direct_query_driver/_driver.py +1 -1
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/_query.py +48 -1
- lsst_daf_butler-29.2025.1500/python/lsst/daf/butler/direct_query_driver/_predicate_constraints_summary.py → lsst_daf_butler-29.2025.1700/python/lsst/daf/butler/queries/predicate_constraints_summary.py +2 -2
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/_remote_butler.py +1 -8
- lsst_daf_butler-29.2025.1700/python/lsst/daf/butler/version.py +2 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst_daf_butler.egg-info/SOURCES.txt +1 -1
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_config.py +3 -3
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_query_interface.py +39 -1
- lsst_daf_butler-29.2025.1500/python/lsst/daf/butler/version.py +0 -2
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/COPYRIGHT +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/LICENSE +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/MANIFEST.in +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/README.md +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/bsd_license.txt +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/doc/lsst.daf.butler/CHANGES.rst +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/doc/lsst.daf.butler/configuring.rst +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/doc/lsst.daf.butler/datastores.rst +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/doc/lsst.daf.butler/dimensions.rst +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/doc/lsst.daf.butler/formatters.rst +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/doc/lsst.daf.butler/index.rst +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/doc/lsst.daf.butler/organizing.rst +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/doc/lsst.daf.butler/queries.rst +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/gpl-v3.0.txt +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/pyproject.toml +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_butler.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_butler_config.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_collection_type.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_column_categorization.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_column_tags.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_column_type_info.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_config_support.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_dataset_association.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_dataset_existence.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_dataset_ref.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_file_dataset.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_file_descriptor.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_formatter.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_limited_butler.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_location.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_named.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_quantum.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_quantum_backed.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_registry_shim.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_storage_class.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_timespan.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_topology.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/arrow_utils.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/cli/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/cli/butler.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/cli/cliLog.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/cli/opt/options.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/cli/progress.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/cli/utils.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/column_spec.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/configs/registry.yaml +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/datastore/composites.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/datastore/constraints.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/datastore/record_data.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/datastores/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/datastores/fileDatastore.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/ddl.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/delegates/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/dimensions/_config.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/dimensions/_database.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/dimensions/_group.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/dimensions/_records.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/dimensions/construction.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/formatters/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/formatters/file.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/formatters/json.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/formatters/logs.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/formatters/packages.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/formatters/parquet.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/formatters/pickle.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/formatters/typeless.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/formatters/yaml.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/json.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/logging.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/mapping_factory.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/name_shrinker.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/persistence_context.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/progress.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/py.typed +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/_base.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/convert_args.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/driver.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/overlaps.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/result_specs.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/queries/visitors.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/_config.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/_registry.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/attributes.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/connectionString.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/managers.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/opaque.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/versions.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/registry/wildcards.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/_authentication.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/repo_relocation.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/_associate.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/butlerImport.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/collectionChain.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/configDump.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/configValidate.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/createRepo.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/ingest_files.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/queryCollections.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/removeCollections.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/removeRuns.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/butler_queries.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/server.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/server_utils.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/tests/utils.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/time_utils.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/transfers/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/transfers/_context.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/utils.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/setup.cfg +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_astropyTableFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_authentication.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_butler.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliCmdAssociate.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliCmdConfigDump.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliCmdConfigValidate.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliCmdCreate.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliCmdImport.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliCmdIngestFiles.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliCmdPruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliCmdQueryCollections.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliCmdQueryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliCmdQueryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliCmdRemoveCollections.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliCmdRemoveRuns.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliLog.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliPluginLoader.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliUtilSplitCommas.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliUtilSplitKv.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliUtilToUpper.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_cliUtils.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_column_spec.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_composites.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_connectionString.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_constraints.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_datastore.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_ddl.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_dimension_record_containers.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_exprParserLex.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_exprParserYacc.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_expressions.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_formatter.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_location.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_logFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_logging.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_matplotlibFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_normalFormExpression.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_obscore.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_packages.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_parquet.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_progress.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_quantum.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_quantumBackedButler.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_query_direct_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_query_direct_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_query_relations.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_query_remote.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_query_utilities.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_remote_butler.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_server.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_simpleButler.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_storageClass.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_templates.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_thread_utils.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_time_utils.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_timespan.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_utils.py +0 -0
- {lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/tests/test_versioning.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lsst-daf-butler
|
|
3
|
-
Version: 29.2025.
|
|
3
|
+
Version: 29.2025.1700
|
|
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
|
{lsst_daf_butler-29.2025.1500 → lsst_daf_butler-29.2025.1700}/python/lsst/daf/butler/_config.py
RENAMED
|
@@ -1254,7 +1254,7 @@ class ConfigSubset(Config):
|
|
|
1254
1254
|
|
|
1255
1255
|
Global defaults, at lowest priority, are found in the ``config``
|
|
1256
1256
|
directory of the butler source tree. Additional defaults can be
|
|
1257
|
-
defined using the environment variable ``$
|
|
1257
|
+
defined using the environment variable ``$DAF_BUTLER_CONFIG_PATH``
|
|
1258
1258
|
which is a PATH-like variable where paths at the front of the list
|
|
1259
1259
|
have priority over those later.
|
|
1260
1260
|
|
|
@@ -86,7 +86,7 @@ TaskMetadata: lsst.daf.butler.formatters.json.JsonFormatter
|
|
|
86
86
|
SpectractorSpectrum: lsst.atmospec.formatters.SpectractorSpectrumFormatter
|
|
87
87
|
SpectractorImage: lsst.atmospec.formatters.SpectractorImageFormatter
|
|
88
88
|
SpectractorFitParameters: lsst.atmospec.formatters.SpectractorFitParametersFormatter
|
|
89
|
-
ScarletModelData: lsst.
|
|
89
|
+
ScarletModelData: lsst.meas.extensions.scarlet.io.ScarletModelFormatter
|
|
90
90
|
MetricMeasurementBundle: lsst.daf.butler.formatters.json.JsonFormatter
|
|
91
91
|
MultipleCellCoadd: lsst.cell_coadds.CellCoaddFitsFormatter
|
|
92
92
|
NNModelPackagePayload: lsst.meas.transiNet.modelPackages.NNModelPackageFormatter
|
|
@@ -409,6 +409,9 @@ storageClasses:
|
|
|
409
409
|
pytype: spectractor.fit.fitter.FitParameters
|
|
410
410
|
ScarletModelData:
|
|
411
411
|
pytype: lsst.scarlet.lite.io.ScarletModelData
|
|
412
|
+
parameters:
|
|
413
|
+
- blend_id
|
|
414
|
+
delegate: lsst.meas.extensions.scarlet.io.ScarletModelDelegate
|
|
412
415
|
MetricMeasurementBundle:
|
|
413
416
|
pytype: lsst.analysis.tools.interfaces.MetricMeasurementBundle
|
|
414
417
|
MultipleCellCoadd:
|
|
@@ -31,6 +31,7 @@ __all__ = ["DimensionUniverse"]
|
|
|
31
31
|
|
|
32
32
|
import logging
|
|
33
33
|
import pickle
|
|
34
|
+
import warnings
|
|
34
35
|
from collections import defaultdict
|
|
35
36
|
from collections.abc import Iterable, Mapping, Sequence
|
|
36
37
|
from typing import TYPE_CHECKING, Any, ClassVar, TypeVar, overload
|
|
@@ -117,6 +118,13 @@ class DimensionUniverse: # numpydoc ignore=PR02
|
|
|
117
118
|
else:
|
|
118
119
|
version = builder.version
|
|
119
120
|
|
|
121
|
+
if use_cache is not True:
|
|
122
|
+
warnings.warn(
|
|
123
|
+
"use_cache parameter is no longer supported and is ignored. Will be removed after v30.",
|
|
124
|
+
category=FutureWarning,
|
|
125
|
+
stacklevel=2,
|
|
126
|
+
)
|
|
127
|
+
|
|
120
128
|
# Then a namespace.
|
|
121
129
|
if namespace is None:
|
|
122
130
|
if builder is None:
|
|
@@ -129,10 +137,9 @@ class DimensionUniverse: # numpydoc ignore=PR02
|
|
|
129
137
|
namespace = _DEFAULT_NAMESPACE
|
|
130
138
|
|
|
131
139
|
# See if an equivalent instance already exists.
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
return existing_instance
|
|
140
|
+
existing_instance = cls._instances.get((version, namespace))
|
|
141
|
+
if existing_instance is not None:
|
|
142
|
+
return existing_instance
|
|
136
143
|
|
|
137
144
|
# Ensure we have a builder, building one from config if necessary.
|
|
138
145
|
if builder is None:
|
|
@@ -183,10 +190,7 @@ class DimensionUniverse: # numpydoc ignore=PR02
|
|
|
183
190
|
if element.populated_by is not None:
|
|
184
191
|
self._populates[element.populated_by.name].add(element)
|
|
185
192
|
|
|
186
|
-
|
|
187
|
-
return cls._instances.set_or_get((self._version, self._namespace), self)
|
|
188
|
-
else:
|
|
189
|
-
return self
|
|
193
|
+
return cls._instances.set_or_get((self._version, self._namespace), self)
|
|
190
194
|
|
|
191
195
|
@property
|
|
192
196
|
def version(self) -> int:
|
|
@@ -1587,30 +1587,24 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
1587
1587
|
def _ingest_file_datasets(
|
|
1588
1588
|
self,
|
|
1589
1589
|
datasets: Sequence[FileDataset],
|
|
1590
|
+
*,
|
|
1591
|
+
dry_run: bool = False,
|
|
1590
1592
|
) -> None:
|
|
1591
|
-
# Docstring inherited.
|
|
1592
1593
|
if not datasets:
|
|
1593
1594
|
return
|
|
1594
1595
|
|
|
1595
1596
|
progress = Progress("lsst.daf.butler.Butler.ingest", level=logging.DEBUG)
|
|
1596
1597
|
|
|
1597
|
-
# We need to reorganize all the inputs so that they are grouped
|
|
1598
|
-
# by dataset type and run. Multiple refs in a single FileDataset
|
|
1599
|
-
# are required to share the run and dataset type.
|
|
1600
|
-
groupedData: MutableMapping[tuple[DatasetType, str], list[FileDataset]] = defaultdict(list)
|
|
1601
|
-
|
|
1602
1598
|
# Track DataIDs that are being ingested so we can spot issues early
|
|
1603
1599
|
# with duplication. Retain previous FileDataset so we can report it.
|
|
1604
1600
|
groupedDataIds: MutableMapping[tuple[DatasetType, str], dict[DataCoordinate, FileDataset]] = (
|
|
1605
1601
|
defaultdict(dict)
|
|
1606
1602
|
)
|
|
1607
1603
|
|
|
1608
|
-
#
|
|
1609
|
-
|
|
1610
|
-
# Somewhere to store pre-existing refs if we have an
|
|
1611
|
-
# execution butler.
|
|
1612
|
-
existingRefs: list[DatasetRef] = []
|
|
1604
|
+
# All the refs we need to import.
|
|
1605
|
+
refs: list[DatasetRef] = []
|
|
1613
1606
|
|
|
1607
|
+
for dataset in progress.wrap(datasets, desc="Validating dataIDs"):
|
|
1614
1608
|
for ref in dataset.refs:
|
|
1615
1609
|
group_key = (ref.datasetType, ref.run)
|
|
1616
1610
|
|
|
@@ -1623,54 +1617,29 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
1623
1617
|
)
|
|
1624
1618
|
|
|
1625
1619
|
groupedDataIds[group_key][ref.dataId] = dataset
|
|
1620
|
+
refs.extend(dataset.refs)
|
|
1626
1621
|
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
# Store expanded form in the original FileDataset.
|
|
1638
|
-
dataset.refs = existingRefs
|
|
1639
|
-
else:
|
|
1640
|
-
groupedData[group_key].append(dataset)
|
|
1641
|
-
|
|
1642
|
-
# Now we can bulk-insert into Registry for each DatasetType.
|
|
1643
|
-
for (datasetType, this_run), grouped_datasets in progress.iter_item_chunks(
|
|
1644
|
-
groupedData.items(), desc="Bulk-inserting datasets by type"
|
|
1645
|
-
):
|
|
1646
|
-
refs_to_import = []
|
|
1647
|
-
for dataset in grouped_datasets:
|
|
1648
|
-
refs_to_import.extend(dataset.refs)
|
|
1649
|
-
|
|
1650
|
-
n_refs = len(refs_to_import)
|
|
1651
|
-
_LOG.verbose(
|
|
1652
|
-
"Importing %d ref%s of dataset type %r into run %r",
|
|
1653
|
-
n_refs,
|
|
1654
|
-
"" if n_refs == 1 else "s",
|
|
1655
|
-
datasetType.name,
|
|
1656
|
-
this_run,
|
|
1657
|
-
)
|
|
1622
|
+
# Bulk insert.
|
|
1623
|
+
import_info = self._prepare_for_import_refs(
|
|
1624
|
+
self,
|
|
1625
|
+
refs,
|
|
1626
|
+
skip_missing=False,
|
|
1627
|
+
register_dataset_types=True,
|
|
1628
|
+
dry_run=dry_run,
|
|
1629
|
+
transfer_dimensions=False,
|
|
1630
|
+
)
|
|
1658
1631
|
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1632
|
+
self._import_dimension_records(import_info.dimension_records, dry_run=dry_run)
|
|
1633
|
+
imported_refs = self._import_grouped_refs(
|
|
1634
|
+
import_info.grouped_refs, self, progress, dry_run=dry_run, expand_refs=True
|
|
1635
|
+
)
|
|
1663
1636
|
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1637
|
+
# The expanded refs need to be attached back to the original
|
|
1638
|
+
# FileDatasets for datastore to use.
|
|
1639
|
+
id_to_ref = {ref.id: ref for ref in imported_refs}
|
|
1667
1640
|
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
for dataset in grouped_datasets:
|
|
1671
|
-
n_dataset_refs = len(dataset.refs)
|
|
1672
|
-
dataset.refs = imported_refs[:n_dataset_refs]
|
|
1673
|
-
del imported_refs[:n_dataset_refs]
|
|
1641
|
+
for dataset in progress.wrap(datasets, desc="Re-attaching expanded refs"):
|
|
1642
|
+
dataset.refs = [id_to_ref[ref.id] for ref in dataset.refs]
|
|
1674
1643
|
|
|
1675
1644
|
@transactional
|
|
1676
1645
|
def ingest(
|
|
@@ -1933,20 +1902,19 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
1933
1902
|
|
|
1934
1903
|
return dimension_records
|
|
1935
1904
|
|
|
1936
|
-
def
|
|
1905
|
+
def _prepare_for_import_refs(
|
|
1937
1906
|
self,
|
|
1938
1907
|
source_butler: LimitedButler,
|
|
1939
1908
|
source_refs: Iterable[DatasetRef],
|
|
1940
|
-
|
|
1909
|
+
*,
|
|
1941
1910
|
skip_missing: bool = True,
|
|
1942
1911
|
register_dataset_types: bool = False,
|
|
1943
1912
|
transfer_dimensions: bool = False,
|
|
1944
1913
|
dry_run: bool = False,
|
|
1945
|
-
) ->
|
|
1914
|
+
) -> _ImportDatasetsInfo:
|
|
1946
1915
|
# Docstring inherited.
|
|
1947
1916
|
if not self.isWriteable():
|
|
1948
1917
|
raise TypeError("Butler is read-only.")
|
|
1949
|
-
progress = Progress("lsst.daf.butler.Butler.transfer_from", level=VERBOSE)
|
|
1950
1918
|
|
|
1951
1919
|
# Will iterate through the refs multiple times so need to convert
|
|
1952
1920
|
# to a list if this isn't a collection.
|
|
@@ -1954,7 +1922,7 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
1954
1922
|
source_refs = list(source_refs)
|
|
1955
1923
|
|
|
1956
1924
|
original_count = len(source_refs)
|
|
1957
|
-
_LOG.info("
|
|
1925
|
+
_LOG.info("Importing %d datasets into %s", original_count, str(self))
|
|
1958
1926
|
|
|
1959
1927
|
# In some situations the datastore artifact may be missing
|
|
1960
1928
|
# and we do not want that registry entry to be imported.
|
|
@@ -1996,7 +1964,7 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
1996
1964
|
# might result in additional unwanted dataset types being
|
|
1997
1965
|
# registered.
|
|
1998
1966
|
try:
|
|
1999
|
-
if self._registry.registerDatasetType(datasetType):
|
|
1967
|
+
if not dry_run and self._registry.registerDatasetType(datasetType):
|
|
2000
1968
|
newly_registered_dataset_types.add(datasetType)
|
|
2001
1969
|
except ConflictingDefinitionError as e:
|
|
2002
1970
|
# Be safe and require that conversions be bidirectional
|
|
@@ -2076,86 +2044,132 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
2076
2044
|
dimension_records = self._extract_all_dimension_records_from_data_ids(
|
|
2077
2045
|
source_butler, dataIds, elements
|
|
2078
2046
|
)
|
|
2047
|
+
return _ImportDatasetsInfo(grouped_refs, dimension_records, artifact_existence)
|
|
2079
2048
|
|
|
2049
|
+
def _import_dimension_records(
|
|
2050
|
+
self,
|
|
2051
|
+
dimension_records: dict[DimensionElement, dict[DataCoordinate, DimensionRecord]],
|
|
2052
|
+
*,
|
|
2053
|
+
dry_run: bool,
|
|
2054
|
+
) -> None:
|
|
2055
|
+
"""Import dimension records collected during import pre-process."""
|
|
2056
|
+
if dimension_records and not dry_run:
|
|
2057
|
+
_LOG.verbose("Ensuring that dimension records exist for transferred datasets.")
|
|
2058
|
+
# Order matters.
|
|
2059
|
+
for element in self.dimensions.sorted(dimension_records.keys()):
|
|
2060
|
+
records = list(dimension_records[element].values())
|
|
2061
|
+
# Assume that if the record is already present that we can
|
|
2062
|
+
# use it without having to check that the record metadata
|
|
2063
|
+
# is consistent.
|
|
2064
|
+
self._registry.insertDimensionData(element, *records, skip_existing=True)
|
|
2065
|
+
|
|
2066
|
+
def _import_grouped_refs(
|
|
2067
|
+
self,
|
|
2068
|
+
grouped_refs: defaultdict[_RefGroup, list[DatasetRef]],
|
|
2069
|
+
source_butler: LimitedButler,
|
|
2070
|
+
progress: Progress,
|
|
2071
|
+
*,
|
|
2072
|
+
dry_run: bool = False,
|
|
2073
|
+
expand_refs: bool = False,
|
|
2074
|
+
) -> list[DatasetRef]:
|
|
2080
2075
|
handled_collections: set[str] = set()
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
# same order between different processes, to mitigate an issue
|
|
2098
|
-
# where Postgres can deadlock due to the unique index on collection
|
|
2099
|
-
# name. (See DM-47543).
|
|
2100
|
-
groups = sorted(grouped_refs.items(), key=lambda item: item[0].run)
|
|
2101
|
-
for (dimension_group, run), refs_to_import in progress.iter_item_chunks(
|
|
2102
|
-
groups, desc="Importing to registry by run and dataset type"
|
|
2103
|
-
):
|
|
2104
|
-
if run not in handled_collections:
|
|
2105
|
-
# May need to create output collection. If source butler
|
|
2106
|
-
# has a registry, ask for documentation string.
|
|
2107
|
-
run_doc = None
|
|
2108
|
-
if registry := getattr(source_butler, "registry", None):
|
|
2109
|
-
run_doc = registry.getCollectionDocumentation(run)
|
|
2110
|
-
if not dry_run:
|
|
2111
|
-
registered = self.collections.register(run, doc=run_doc)
|
|
2112
|
-
else:
|
|
2113
|
-
registered = True
|
|
2114
|
-
handled_collections.add(run)
|
|
2115
|
-
if registered:
|
|
2116
|
-
_LOG.verbose("Creating output run %s", run)
|
|
2117
|
-
|
|
2118
|
-
n_refs = len(refs_to_import)
|
|
2119
|
-
_LOG.verbose(
|
|
2120
|
-
"Importing %d ref%s with dimensions %s into run %s",
|
|
2121
|
-
n_refs,
|
|
2122
|
-
"" if n_refs == 1 else "s",
|
|
2123
|
-
dimension_group.names,
|
|
2124
|
-
run,
|
|
2125
|
-
)
|
|
2126
|
-
|
|
2127
|
-
# Assume we are using UUIDs and the source refs will match
|
|
2128
|
-
# those imported.
|
|
2076
|
+
n_to_import = 0
|
|
2077
|
+
all_imported_refs: list[DatasetRef] = []
|
|
2078
|
+
# Sort by run collection name to ensure Postgres takes locks in the
|
|
2079
|
+
# same order between different processes, to mitigate an issue
|
|
2080
|
+
# where Postgres can deadlock due to the unique index on collection
|
|
2081
|
+
# name. (See DM-47543).
|
|
2082
|
+
groups = sorted(grouped_refs.items(), key=lambda item: item[0].run)
|
|
2083
|
+
for (dimension_group, run), refs_to_import in progress.iter_item_chunks(
|
|
2084
|
+
groups, desc="Importing to registry by run and dataset type"
|
|
2085
|
+
):
|
|
2086
|
+
if run not in handled_collections:
|
|
2087
|
+
# May need to create output collection. If source butler
|
|
2088
|
+
# has a registry, ask for documentation string.
|
|
2089
|
+
run_doc = None
|
|
2090
|
+
if registry := getattr(source_butler, "registry", None):
|
|
2091
|
+
run_doc = registry.getCollectionDocumentation(run)
|
|
2129
2092
|
if not dry_run:
|
|
2130
|
-
|
|
2093
|
+
registered = self.collections.register(run, doc=run_doc)
|
|
2131
2094
|
else:
|
|
2132
|
-
|
|
2095
|
+
registered = True
|
|
2096
|
+
handled_collections.add(run)
|
|
2097
|
+
if registered:
|
|
2098
|
+
_LOG.verbose("Creating output run %s", run)
|
|
2099
|
+
|
|
2100
|
+
n_refs = len(refs_to_import)
|
|
2101
|
+
n_to_import += n_refs
|
|
2102
|
+
_LOG.verbose(
|
|
2103
|
+
"Importing %d ref%s with dimensions %s into run %s",
|
|
2104
|
+
n_refs,
|
|
2105
|
+
"" if n_refs == 1 else "s",
|
|
2106
|
+
dimension_group.names,
|
|
2107
|
+
run,
|
|
2108
|
+
)
|
|
2109
|
+
|
|
2110
|
+
# Assume we are using UUIDs and the source refs will match
|
|
2111
|
+
# those imported.
|
|
2112
|
+
if not dry_run:
|
|
2113
|
+
imported_refs = self._registry._importDatasets(refs_to_import, expand=expand_refs)
|
|
2114
|
+
else:
|
|
2115
|
+
imported_refs = refs_to_import
|
|
2116
|
+
|
|
2117
|
+
all_imported_refs.extend(imported_refs)
|
|
2118
|
+
|
|
2119
|
+
assert n_to_import == len(all_imported_refs)
|
|
2120
|
+
_LOG.verbose("Imported %d datasets into destination butler", n_to_import)
|
|
2121
|
+
return all_imported_refs
|
|
2122
|
+
|
|
2123
|
+
def transfer_from(
|
|
2124
|
+
self,
|
|
2125
|
+
source_butler: LimitedButler,
|
|
2126
|
+
source_refs: Iterable[DatasetRef],
|
|
2127
|
+
transfer: str = "auto",
|
|
2128
|
+
skip_missing: bool = True,
|
|
2129
|
+
register_dataset_types: bool = False,
|
|
2130
|
+
transfer_dimensions: bool = False,
|
|
2131
|
+
dry_run: bool = False,
|
|
2132
|
+
) -> collections.abc.Collection[DatasetRef]:
|
|
2133
|
+
# Docstring inherited.
|
|
2134
|
+
if not self.isWriteable():
|
|
2135
|
+
raise TypeError("Butler is read-only.")
|
|
2133
2136
|
|
|
2134
|
-
|
|
2137
|
+
progress = Progress("lsst.daf.butler.Butler.transfer_from", level=VERBOSE)
|
|
2135
2138
|
|
|
2136
|
-
|
|
2137
|
-
|
|
2139
|
+
import_info = self._prepare_for_import_refs(
|
|
2140
|
+
source_butler,
|
|
2141
|
+
source_refs,
|
|
2142
|
+
skip_missing=skip_missing,
|
|
2143
|
+
register_dataset_types=register_dataset_types,
|
|
2144
|
+
dry_run=dry_run,
|
|
2145
|
+
transfer_dimensions=transfer_dimensions,
|
|
2146
|
+
)
|
|
2147
|
+
|
|
2148
|
+
# Do all the importing in a single transaction.
|
|
2149
|
+
with self.transaction():
|
|
2150
|
+
self._import_dimension_records(import_info.dimension_records, dry_run=dry_run)
|
|
2151
|
+
imported_refs = self._import_grouped_refs(
|
|
2152
|
+
import_info.grouped_refs, source_butler, progress, dry_run=dry_run
|
|
2153
|
+
)
|
|
2138
2154
|
|
|
2139
2155
|
# Ask the datastore to transfer. The datastore has to check that
|
|
2140
2156
|
# the source datastore is compatible with the target datastore.
|
|
2141
2157
|
accepted, rejected = self._datastore.transfer_from(
|
|
2142
2158
|
source_butler._datastore,
|
|
2143
|
-
|
|
2159
|
+
imported_refs,
|
|
2144
2160
|
transfer=transfer,
|
|
2145
|
-
artifact_existence=artifact_existence,
|
|
2161
|
+
artifact_existence=import_info.artifact_existence,
|
|
2146
2162
|
dry_run=dry_run,
|
|
2147
2163
|
)
|
|
2148
2164
|
if rejected:
|
|
2149
2165
|
# For now, accept the registry entries but not the files.
|
|
2150
2166
|
_LOG.warning(
|
|
2151
|
-
"%d datasets were rejected and %d accepted for
|
|
2167
|
+
"%d datasets were rejected and %d accepted for transfer.",
|
|
2152
2168
|
len(rejected),
|
|
2153
2169
|
len(accepted),
|
|
2154
|
-
datasetType,
|
|
2155
|
-
run,
|
|
2156
2170
|
)
|
|
2157
2171
|
|
|
2158
|
-
return
|
|
2172
|
+
return imported_refs
|
|
2159
2173
|
|
|
2160
2174
|
def validateConfiguration(
|
|
2161
2175
|
self,
|
|
@@ -2382,3 +2396,11 @@ class _RefGroup(NamedTuple):
|
|
|
2382
2396
|
|
|
2383
2397
|
dimensions: DimensionGroup
|
|
2384
2398
|
run: str
|
|
2399
|
+
|
|
2400
|
+
|
|
2401
|
+
class _ImportDatasetsInfo(NamedTuple):
|
|
2402
|
+
"""Information extracted from datasets to be imported."""
|
|
2403
|
+
|
|
2404
|
+
grouped_refs: defaultdict[_RefGroup, list[DatasetRef]]
|
|
2405
|
+
dimension_records: dict[DimensionElement, dict[DataCoordinate, DimensionRecord]]
|
|
2406
|
+
artifact_existence: dict[ResourcePath, bool]
|
|
@@ -56,6 +56,7 @@ from ..queries.driver import (
|
|
|
56
56
|
QueryDriver,
|
|
57
57
|
ResultPage,
|
|
58
58
|
)
|
|
59
|
+
from ..queries.predicate_constraints_summary import PredicateConstraintsSummary
|
|
59
60
|
from ..queries.result_specs import (
|
|
60
61
|
DataCoordinateResultSpec,
|
|
61
62
|
DatasetRefResultSpec,
|
|
@@ -68,7 +69,6 @@ from ..registry.interfaces import ChainedCollectionRecord, CollectionRecord
|
|
|
68
69
|
from ..registry.managers import RegistryManagerInstances
|
|
69
70
|
from ..registry.wildcards import CollectionWildcard
|
|
70
71
|
from ._postprocessing import Postprocessing
|
|
71
|
-
from ._predicate_constraints_summary import PredicateConstraintsSummary
|
|
72
72
|
from ._query_analysis import (
|
|
73
73
|
QueryCollectionAnalysis,
|
|
74
74
|
QueryFindFirstAnalysis,
|
|
@@ -33,6 +33,8 @@ from collections.abc import Iterable, Mapping, Set
|
|
|
33
33
|
from types import EllipsisType
|
|
34
34
|
from typing import Any, final
|
|
35
35
|
|
|
36
|
+
import astropy.table
|
|
37
|
+
|
|
36
38
|
from lsst.utils.iteration import ensure_iterable
|
|
37
39
|
|
|
38
40
|
from .._dataset_type import DatasetType
|
|
@@ -49,6 +51,7 @@ from ._identifiers import IdentifierContext, interpret_identifier
|
|
|
49
51
|
from .convert_args import convert_where_args
|
|
50
52
|
from .driver import QueryDriver
|
|
51
53
|
from .expression_factory import ExpressionFactory
|
|
54
|
+
from .predicate_constraints_summary import PredicateConstraintsSummary
|
|
52
55
|
from .result_specs import (
|
|
53
56
|
DataCoordinateResultSpec,
|
|
54
57
|
DatasetRefResultSpec,
|
|
@@ -586,7 +589,7 @@ class Query(QueryBase):
|
|
|
586
589
|
return query
|
|
587
590
|
|
|
588
591
|
def join_data_coordinates(self, iterable: Iterable[DataCoordinate]) -> Query:
|
|
589
|
-
"""Return a new query that joins in an explicit
|
|
592
|
+
"""Return a new query that joins in an explicit iterable of data IDs.
|
|
590
593
|
|
|
591
594
|
Parameters
|
|
592
595
|
----------
|
|
@@ -618,6 +621,50 @@ class Query(QueryBase):
|
|
|
618
621
|
driver=self._driver,
|
|
619
622
|
)
|
|
620
623
|
|
|
624
|
+
def join_data_coordinate_table(self, table: astropy.table.Table) -> Query:
|
|
625
|
+
"""Return a new query that joins in an explicit table of data IDs.
|
|
626
|
+
|
|
627
|
+
Parameters
|
|
628
|
+
----------
|
|
629
|
+
table : `astropy.table.Table`
|
|
630
|
+
A table of data IDs to join. Columns must be dimension names, and
|
|
631
|
+
columns for dimensions whose values that are implied by others are
|
|
632
|
+
ignored. If there is no column for a required dimension is missing
|
|
633
|
+
but is fully constrained to a literal by a previous `where` call, a
|
|
634
|
+
constant-valued column will be added.
|
|
635
|
+
|
|
636
|
+
Returns
|
|
637
|
+
-------
|
|
638
|
+
query : `Query`
|
|
639
|
+
A new query object with the data IDs joined in.
|
|
640
|
+
"""
|
|
641
|
+
if not len(table):
|
|
642
|
+
raise InvalidQueryError("Cannot upload an empty data coordinate set.")
|
|
643
|
+
column_names = set(table.colnames)
|
|
644
|
+
dimensions = self._driver.universe.conform(column_names)
|
|
645
|
+
# To avoid numpy scalar types that will upset SQLAlchemy, we turn the
|
|
646
|
+
# columns we care about into lists of regular Python scalars. We do
|
|
647
|
+
# this in dimensions.required order so we can zip the values of this
|
|
648
|
+
# dict later to make data ID 'required_values' tuples.
|
|
649
|
+
column_lists = {d: table[d].data.tolist() if d in column_names else None for d in dimensions.required}
|
|
650
|
+
if not column_names.issuperset(dimensions.required):
|
|
651
|
+
# If columns are missing, see if they're fixed by a previous
|
|
652
|
+
# `where` call or equivalent.
|
|
653
|
+
predicate_summary = PredicateConstraintsSummary(self._tree.predicate)
|
|
654
|
+
missing = dimensions.required - column_names
|
|
655
|
+
provided_by_predicate = predicate_summary.constraint_data_id.keys() & missing
|
|
656
|
+
missing -= provided_by_predicate
|
|
657
|
+
if missing:
|
|
658
|
+
raise InvalidQueryError(f"Data coordinate table is missing required dimension(s) {missing}.")
|
|
659
|
+
if provided_by_predicate:
|
|
660
|
+
for k in provided_by_predicate:
|
|
661
|
+
column_lists[k] = [predicate_summary.constraint_data_id[k]] * len(table)
|
|
662
|
+
key = self._driver.upload_data_coordinates(dimensions, zip(*column_lists.values(), strict=True))
|
|
663
|
+
return Query(
|
|
664
|
+
tree=self._tree.join_data_coordinate_upload(dimensions=dimensions, key=key),
|
|
665
|
+
driver=self._driver,
|
|
666
|
+
)
|
|
667
|
+
|
|
621
668
|
def join_dimensions(self, dimensions: Iterable[str] | DimensionGroup) -> Query:
|
|
622
669
|
"""Return a new query that joins the logical tables for additional
|
|
623
670
|
dimensions.
|
|
@@ -31,8 +31,8 @@ from typing import Any
|
|
|
31
31
|
|
|
32
32
|
from .._exceptions import InvalidQueryError
|
|
33
33
|
from ..dimensions import DataCoordinate, DataIdValue, DimensionGroup, DimensionUniverse
|
|
34
|
-
from
|
|
35
|
-
from
|
|
34
|
+
from . import tree as qt
|
|
35
|
+
from .visitors import ColumnExpressionVisitor, PredicateVisitFlags, SimplePredicateVisitor
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
class PredicateConstraintsSummary:
|
|
@@ -187,14 +187,7 @@ class RemoteButler(Butler): # numpydoc ignore=PR02
|
|
|
187
187
|
model = parse_model(response, GetUniverseResponseModel)
|
|
188
188
|
|
|
189
189
|
config = DimensionConfig.from_simple(model.universe)
|
|
190
|
-
universe = DimensionUniverse(
|
|
191
|
-
config,
|
|
192
|
-
# The process-global cache internal to DimensionUniverse can mask
|
|
193
|
-
# problems in unit tests, since client and server live in the same
|
|
194
|
-
# process for these tests. We are doing our own caching, so we
|
|
195
|
-
# don't benefit from it. So just disable it.
|
|
196
|
-
use_cache=False,
|
|
197
|
-
)
|
|
190
|
+
universe = DimensionUniverse(config)
|
|
198
191
|
with self._cache.access() as cache:
|
|
199
192
|
if cache.dimensions is None:
|
|
200
193
|
cache.dimensions = universe
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lsst-daf-butler
|
|
3
|
-
Version: 29.2025.
|
|
3
|
+
Version: 29.2025.1700
|
|
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
|
|
@@ -147,7 +147,6 @@ python/lsst/daf/butler/direct_butler/_direct_butler_collections.py
|
|
|
147
147
|
python/lsst/daf/butler/direct_query_driver/__init__.py
|
|
148
148
|
python/lsst/daf/butler/direct_query_driver/_driver.py
|
|
149
149
|
python/lsst/daf/butler/direct_query_driver/_postprocessing.py
|
|
150
|
-
python/lsst/daf/butler/direct_query_driver/_predicate_constraints_summary.py
|
|
151
150
|
python/lsst/daf/butler/direct_query_driver/_query_analysis.py
|
|
152
151
|
python/lsst/daf/butler/direct_query_driver/_query_builder.py
|
|
153
152
|
python/lsst/daf/butler/direct_query_driver/_result_page_converter.py
|
|
@@ -177,6 +176,7 @@ python/lsst/daf/butler/queries/convert_args.py
|
|
|
177
176
|
python/lsst/daf/butler/queries/driver.py
|
|
178
177
|
python/lsst/daf/butler/queries/expression_factory.py
|
|
179
178
|
python/lsst/daf/butler/queries/overlaps.py
|
|
179
|
+
python/lsst/daf/butler/queries/predicate_constraints_summary.py
|
|
180
180
|
python/lsst/daf/butler/queries/result_specs.py
|
|
181
181
|
python/lsst/daf/butler/queries/visitors.py
|
|
182
182
|
python/lsst/daf/butler/queries/tree/__init__.py
|
|
@@ -42,11 +42,11 @@ TESTDIR = os.path.abspath(os.path.dirname(__file__))
|
|
|
42
42
|
def modified_environment(**environ):
|
|
43
43
|
"""Temporarily set environment variables.
|
|
44
44
|
|
|
45
|
-
>>> with modified_environment(
|
|
46
|
-
... os.environ["
|
|
45
|
+
>>> with modified_environment(DAF_BUTLER_CONFIG_PATH="/somewhere"):
|
|
46
|
+
... os.environ["DAF_BUTLER_CONFIG_PATH"] == "/somewhere"
|
|
47
47
|
True
|
|
48
48
|
|
|
49
|
-
>>> "
|
|
49
|
+
>>> "DAF_BUTLER_CONFIG_PATH" != "/somewhere"
|
|
50
50
|
True
|
|
51
51
|
|
|
52
52
|
Parameters
|