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