lsst-daf-butler 29.2025.1600__tar.gz → 29.2025.1800__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.1600/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.1800}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/queries.rst +12 -6
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/__init__.py +1 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_butler.py +23 -6
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_butler_instance_options.py +3 -0
- lsst_daf_butler-29.2025.1800/python/lsst/daf/butler/_butler_metrics.py +117 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_dataset_ref.py +99 -16
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_file_dataset.py +78 -3
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_limited_butler.py +34 -2
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_quantum_backed.py +20 -2
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/arrow_utils.py +4 -4
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastores/fileDatastore.py +3 -2
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_group.py +15 -5
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_record_set.py +354 -2
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_universe.py +12 -8
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/record_cache.py +1 -2
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_butler/_direct_butler.py +192 -153
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +9 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/_expression_strings.py +13 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/_identifiers.py +4 -1
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/expression_factory.py +16 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/tree/_predicate.py +3 -1
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/databases/postgresql.py +50 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/databases/sqlite.py +46 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_database.py +21 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +4 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/check.py +5 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +6 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +51 -5
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +22 -8
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_remote_butler.py +34 -24
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/butler_queries.py +71 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/hybrid_butler.py +17 -3
- lsst_daf_butler-29.2025.1800/python/lsst/daf/butler/version.py +2 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst_daf_butler.egg-info/SOURCES.txt +1 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_butler.py +66 -14
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_datasets.py +36 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_dimension_record_containers.py +74 -4
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_dimensions.py +10 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_exprParserYacc.py +39 -2
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_expressions.py +7 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_normalFormExpression.py +3 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_quantumBackedButler.py +18 -3
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_simpleButler.py +4 -1
- lsst_daf_butler-29.2025.1600/python/lsst/daf/butler/version.py +0 -2
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/COPYRIGHT +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/LICENSE +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/MANIFEST.in +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/README.md +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/bsd_license.txt +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/CHANGES.rst +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/configuring.rst +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/datastores.rst +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/dimensions.rst +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/formatters.rst +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/index.rst +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/organizing.rst +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/gpl-v3.0.txt +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/pyproject.toml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_butler_config.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_collection_type.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_column_categorization.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_column_tags.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_column_type_info.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_config_support.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_dataset_association.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_dataset_existence.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_file_descriptor.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_formatter.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_location.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_named.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_quantum.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_registry_shim.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_storage_class.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_timespan.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_topology.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/butler.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/cliLog.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/opt/options.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/progress.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/utils.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/column_spec.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/registry.yaml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/composites.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/constraints.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/record_data.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastores/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/ddl.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/delegates/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_config.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_database.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_records.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/construction.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/file.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/json.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/logs.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/packages.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/parquet.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/pickle.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/typeless.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/yaml.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/json.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/logging.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/mapping_factory.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/name_shrinker.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/persistence_context.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/progress.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/py.typed +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/_base.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/convert_args.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/driver.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/overlaps.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/result_specs.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/visitors.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_config.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_registry.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/attributes.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/connectionString.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/managers.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/opaque.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/versions.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/wildcards.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_authentication.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/repo_relocation.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/_associate.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/butlerImport.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/collectionChain.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/configDump.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/configValidate.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/createRepo.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/ingest_files.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/queryCollections.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/removeCollections.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/removeRuns.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/server.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/server_utils.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/utils.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/time_utils.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/transfers/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/transfers/_context.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/utils.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/setup.cfg +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_astropyTableFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_authentication.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdAssociate.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdConfigDump.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdConfigValidate.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdCreate.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdImport.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdIngestFiles.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdPruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdQueryCollections.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdQueryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdQueryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdRemoveCollections.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdRemoveRuns.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliLog.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliPluginLoader.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliUtilSplitCommas.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliUtilSplitKv.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliUtilToUpper.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_cliUtils.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_column_spec.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_composites.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_config.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_connectionString.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_constraints.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_datastore.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_ddl.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_exprParserLex.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_formatter.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_location.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_logFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_logging.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_matplotlibFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_obscore.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_packages.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_parquet.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_progress.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_quantum.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_query_direct_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_query_direct_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_query_interface.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_query_relations.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_query_remote.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_query_utilities.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_remote_butler.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_server.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_storageClass.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_templates.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_thread_utils.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_time_utils.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_timespan.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/tests/test_utils.py +0 -0
- {lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/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.1800
|
|
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.1600 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/queries.rst
RENAMED
|
@@ -229,7 +229,7 @@ Comparison operators
|
|
|
229
229
|
|
|
230
230
|
Language supports set of regular comparison operators: ``=``, ``!=``, ``<``,
|
|
231
231
|
``<=``, ``>``, ``>=``. This can be used on operands that evaluate to a numeric
|
|
232
|
-
values or
|
|
232
|
+
values, timestamps, or strings.
|
|
233
233
|
|
|
234
234
|
.. note :: The equality comparison operator is a single ``=`` like in SQL, not
|
|
235
235
|
double ``==`` like in Python or C++.
|
|
@@ -272,7 +272,7 @@ as are these:
|
|
|
272
272
|
|
|
273
273
|
Another usage of ``IN`` operator is for checking whether a timestamp or a time
|
|
274
274
|
range is contained wholly in other time range. Time range in this case can be
|
|
275
|
-
specified as a tuple of two time literals or
|
|
275
|
+
specified as a tuple of two time literals or identifiers each representing a
|
|
276
276
|
timestamp, or as a single identifier representing a time range. In case a
|
|
277
277
|
single identifier appears on the right side of ``IN`` it has to be enclosed
|
|
278
278
|
in parentheses.
|
|
@@ -352,11 +352,17 @@ Function call
|
|
|
352
352
|
Function call syntax is similar to other languages, expression for call
|
|
353
353
|
consists of an identifier followed by zero or more comma-separated arguments
|
|
354
354
|
enclosed in parentheses (e.g. ``func(1, 2, 3)``). An argument to a function
|
|
355
|
-
can be any expression.
|
|
355
|
+
can be any expression. Names of the functions are not case-sensitive.
|
|
356
356
|
|
|
357
|
-
Presently
|
|
358
|
-
|
|
359
|
-
|
|
357
|
+
Presently the following functions are implemented in the query language:
|
|
358
|
+
|
|
359
|
+
- ``POINT(ra, dec)`` - function which declares (or returns) sky coordinates
|
|
360
|
+
similarly to ADQL syntax.
|
|
361
|
+
- ``GLOB(expression, pattern)`` - performs case-sensitive match of a string
|
|
362
|
+
``expression`` against ``pattern``. Pattern can include ``*`` and ``?``
|
|
363
|
+
meta-characters, matching any number of characters or a single character
|
|
364
|
+
respectfully. All other characters in pattern are matched literally, and
|
|
365
|
+
whole expression string has to match for ``GLOB()`` to return ``True``.
|
|
360
366
|
|
|
361
367
|
|
|
362
368
|
.. _time-literals-syntax:
|
{lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/__init__.py
RENAMED
|
@@ -38,6 +38,7 @@ from . import ddl, time_utils
|
|
|
38
38
|
from ._butler import *
|
|
39
39
|
from ._butler_collections import *
|
|
40
40
|
from ._butler_config import *
|
|
41
|
+
from ._butler_metrics import *
|
|
41
42
|
from ._butler_repo_index import *
|
|
42
43
|
from ._collection_type import CollectionType
|
|
43
44
|
from ._column_categorization import *
|
{lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_butler.py
RENAMED
|
@@ -46,6 +46,7 @@ from lsst.utils.logging import getLogger
|
|
|
46
46
|
from ._butler_collections import ButlerCollections
|
|
47
47
|
from ._butler_config import ButlerConfig, ButlerType
|
|
48
48
|
from ._butler_instance_options import ButlerInstanceOptions
|
|
49
|
+
from ._butler_metrics import ButlerMetrics
|
|
49
50
|
from ._butler_repo_index import ButlerRepoIndex
|
|
50
51
|
from ._config import Config, ConfigSubset
|
|
51
52
|
from ._exceptions import EmptyQueryResultError, InvalidQueryError
|
|
@@ -154,6 +155,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
154
155
|
writeable: bool | None = None,
|
|
155
156
|
inferDefaults: bool = True,
|
|
156
157
|
without_datastore: bool = False,
|
|
158
|
+
metrics: ButlerMetrics | None = None,
|
|
157
159
|
**kwargs: Any,
|
|
158
160
|
) -> Butler:
|
|
159
161
|
if cls is Butler:
|
|
@@ -165,6 +167,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
165
167
|
writeable=writeable,
|
|
166
168
|
inferDefaults=inferDefaults,
|
|
167
169
|
without_datastore=without_datastore,
|
|
170
|
+
metrics=metrics,
|
|
168
171
|
**kwargs,
|
|
169
172
|
)
|
|
170
173
|
|
|
@@ -183,6 +186,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
183
186
|
writeable: bool | None = None,
|
|
184
187
|
inferDefaults: bool = True,
|
|
185
188
|
without_datastore: bool = False,
|
|
189
|
+
metrics: ButlerMetrics | None = None,
|
|
186
190
|
**kwargs: Any,
|
|
187
191
|
) -> Butler:
|
|
188
192
|
"""Create butler instance from configuration.
|
|
@@ -230,6 +234,8 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
230
234
|
without_datastore : `bool`, optional
|
|
231
235
|
If `True` do not attach a datastore to this butler. Any attempts
|
|
232
236
|
to use a datastore will fail.
|
|
237
|
+
metrics : `ButlerMetrics` or `None`, optional
|
|
238
|
+
Metrics object to record butler usage statistics.
|
|
233
239
|
**kwargs : `Any`
|
|
234
240
|
Default data ID key-value pairs. These may only identify
|
|
235
241
|
"governor" dimensions like ``instrument`` and ``skymap``.
|
|
@@ -300,6 +306,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
300
306
|
# passing the "butler" parameter to its constructor. This has
|
|
301
307
|
# been moved out of the constructor into Butler.clone().
|
|
302
308
|
butler = kwargs.pop("butler", None)
|
|
309
|
+
metrics = metrics if metrics is not None else ButlerMetrics()
|
|
303
310
|
if butler is not None:
|
|
304
311
|
if not isinstance(butler, Butler):
|
|
305
312
|
raise TypeError("'butler' parameter must be a Butler instance")
|
|
@@ -307,10 +314,17 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
307
314
|
raise TypeError(
|
|
308
315
|
"Cannot pass 'config', 'searchPaths', or 'writeable' arguments with 'butler' argument."
|
|
309
316
|
)
|
|
310
|
-
return butler.clone(
|
|
317
|
+
return butler.clone(
|
|
318
|
+
collections=collections, run=run, inferDefaults=inferDefaults, metrics=metrics, dataId=kwargs
|
|
319
|
+
)
|
|
311
320
|
|
|
312
321
|
options = ButlerInstanceOptions(
|
|
313
|
-
collections=collections,
|
|
322
|
+
collections=collections,
|
|
323
|
+
run=run,
|
|
324
|
+
writeable=writeable,
|
|
325
|
+
inferDefaults=inferDefaults,
|
|
326
|
+
metrics=metrics,
|
|
327
|
+
kwargs=kwargs,
|
|
314
328
|
)
|
|
315
329
|
|
|
316
330
|
# Load the Butler configuration. This may involve searching the
|
|
@@ -1741,8 +1755,8 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
1741
1755
|
warn_limit = True
|
|
1742
1756
|
with self.query() as query:
|
|
1743
1757
|
result = (
|
|
1744
|
-
query.
|
|
1745
|
-
.
|
|
1758
|
+
query.data_ids(dimensions)
|
|
1759
|
+
.where(data_id, where, bind=bind, **kwargs)
|
|
1746
1760
|
.order_by(*ensure_iterable(order_by))
|
|
1747
1761
|
.limit(query_limit)
|
|
1748
1762
|
)
|
|
@@ -1979,8 +1993,8 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
1979
1993
|
warn_limit = True
|
|
1980
1994
|
with self.query() as query:
|
|
1981
1995
|
result = (
|
|
1982
|
-
query.
|
|
1983
|
-
.
|
|
1996
|
+
query.dimension_records(element)
|
|
1997
|
+
.where(data_id, where, bind=bind, **kwargs)
|
|
1984
1998
|
.order_by(*ensure_iterable(order_by))
|
|
1985
1999
|
.limit(query_limit)
|
|
1986
2000
|
)
|
|
@@ -2123,6 +2137,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
2123
2137
|
run: str | None | EllipsisType = ...,
|
|
2124
2138
|
inferDefaults: bool | EllipsisType = ...,
|
|
2125
2139
|
dataId: dict[str, str] | EllipsisType = ...,
|
|
2140
|
+
metrics: ButlerMetrics | None = None,
|
|
2126
2141
|
) -> Butler:
|
|
2127
2142
|
"""Return a new Butler instance connected to the same repository
|
|
2128
2143
|
as this one, optionally overriding ``collections``, ``run``,
|
|
@@ -2142,5 +2157,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
2142
2157
|
dataId : `str`
|
|
2143
2158
|
Same as ``kwargs`` passed to the constructor. If omitted, copies
|
|
2144
2159
|
values from original object.
|
|
2160
|
+
metrics : `ButlerMetrics` or `None`, optional
|
|
2161
|
+
Metrics object to record butler statistics.
|
|
2145
2162
|
"""
|
|
2146
2163
|
raise NotImplementedError()
|
|
@@ -30,6 +30,8 @@ __all__ = ("ButlerInstanceOptions",)
|
|
|
30
30
|
import dataclasses
|
|
31
31
|
from typing import Any
|
|
32
32
|
|
|
33
|
+
from ._butler_metrics import ButlerMetrics
|
|
34
|
+
|
|
33
35
|
|
|
34
36
|
@dataclasses.dataclass(frozen=True)
|
|
35
37
|
class ButlerInstanceOptions:
|
|
@@ -43,4 +45,5 @@ class ButlerInstanceOptions:
|
|
|
43
45
|
run: str | None = None
|
|
44
46
|
writeable: bool | None = None
|
|
45
47
|
inferDefaults: bool = True
|
|
48
|
+
metrics: ButlerMetrics = dataclasses.field(default_factory=ButlerMetrics)
|
|
46
49
|
kwargs: dict[str, Any] = dataclasses.field(default_factory=dict)
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# This file is part of daf_butler.
|
|
2
|
+
#
|
|
3
|
+
# Developed for the LSST Data Management System.
|
|
4
|
+
# This product includes software developed by the LSST Project
|
|
5
|
+
# (http://www.lsst.org).
|
|
6
|
+
# See the COPYRIGHT file at the top-level directory of this distribution
|
|
7
|
+
# for details of code ownership.
|
|
8
|
+
#
|
|
9
|
+
# This software is dual licensed under the GNU General Public License and also
|
|
10
|
+
# under a 3-clause BSD license. Recipients may choose which of these licenses
|
|
11
|
+
# to use; please see the files gpl-3.0.txt and/or bsd_license.txt,
|
|
12
|
+
# respectively. If you choose the GPL option then the following text applies
|
|
13
|
+
# (but note that there is still no warranty even if you opt for BSD instead):
|
|
14
|
+
#
|
|
15
|
+
# This program is free software: you can redistribute it and/or modify
|
|
16
|
+
# it under the terms of the GNU General Public License as published by
|
|
17
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
18
|
+
# (at your option) any later version.
|
|
19
|
+
#
|
|
20
|
+
# This program is distributed in the hope that it will be useful,
|
|
21
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
22
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
23
|
+
# GNU General Public License for more details.
|
|
24
|
+
#
|
|
25
|
+
# You should have received a copy of the GNU General Public License
|
|
26
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
27
|
+
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
from collections.abc import Callable, Iterator
|
|
31
|
+
from contextlib import contextmanager
|
|
32
|
+
|
|
33
|
+
from pydantic import BaseModel
|
|
34
|
+
|
|
35
|
+
from lsst.utils.logging import LsstLoggers
|
|
36
|
+
from lsst.utils.timer import time_this
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class ButlerMetrics(BaseModel):
|
|
40
|
+
"""Metrics collected during Butler operations."""
|
|
41
|
+
|
|
42
|
+
time_in_put: float = 0.0
|
|
43
|
+
"""Wall-clock time, in seconds, spent in put()."""
|
|
44
|
+
|
|
45
|
+
time_in_get: float = 0.0
|
|
46
|
+
"""Wall-clock time, in seconds, spent in get()."""
|
|
47
|
+
|
|
48
|
+
n_get: int = 0
|
|
49
|
+
"""Number of datasets retrieved with get()."""
|
|
50
|
+
|
|
51
|
+
n_put: int = 0
|
|
52
|
+
"""Number of datasets stored with put()."""
|
|
53
|
+
|
|
54
|
+
def reset(self) -> None:
|
|
55
|
+
"""Reset all metrics."""
|
|
56
|
+
self.time_in_put = 0.0
|
|
57
|
+
self.time_in_get = 0.0
|
|
58
|
+
self.n_get = 0
|
|
59
|
+
self.n_put = 0
|
|
60
|
+
|
|
61
|
+
def increment_get(self, duration: float) -> None:
|
|
62
|
+
"""Increment time for get().
|
|
63
|
+
|
|
64
|
+
Parameters
|
|
65
|
+
----------
|
|
66
|
+
duration : `float`
|
|
67
|
+
Duration to add to the get() statistics.
|
|
68
|
+
"""
|
|
69
|
+
self.time_in_get += duration
|
|
70
|
+
self.n_get += 1
|
|
71
|
+
|
|
72
|
+
def increment_put(self, duration: float) -> None:
|
|
73
|
+
"""Increment time for put().
|
|
74
|
+
|
|
75
|
+
Parameters
|
|
76
|
+
----------
|
|
77
|
+
duration : `float`
|
|
78
|
+
Duration to add to the put() statistics.
|
|
79
|
+
"""
|
|
80
|
+
self.time_in_put += duration
|
|
81
|
+
self.n_put += 1
|
|
82
|
+
|
|
83
|
+
@contextmanager
|
|
84
|
+
def _timer(
|
|
85
|
+
self, handler: Callable[[float], None], log: LsstLoggers | None = None, msg: str | None = None
|
|
86
|
+
) -> Iterator[None]:
|
|
87
|
+
with time_this(log=log, msg=msg) as timer:
|
|
88
|
+
yield
|
|
89
|
+
handler(timer.duration)
|
|
90
|
+
|
|
91
|
+
@contextmanager
|
|
92
|
+
def instrument_get(self, log: LsstLoggers | None = None, msg: str | None = None) -> Iterator[None]:
|
|
93
|
+
"""Run code and increment get statistics.
|
|
94
|
+
|
|
95
|
+
Parameters
|
|
96
|
+
----------
|
|
97
|
+
log : `logging.Logger` or `None`
|
|
98
|
+
Logger to use for any timing information.
|
|
99
|
+
msg : `str` or `None`
|
|
100
|
+
Any message to be included in log output.
|
|
101
|
+
"""
|
|
102
|
+
with self._timer(self.increment_get, log=log, msg=msg):
|
|
103
|
+
yield
|
|
104
|
+
|
|
105
|
+
@contextmanager
|
|
106
|
+
def instrument_put(self, log: LsstLoggers | None = None, msg: str | None = None) -> Iterator[None]:
|
|
107
|
+
"""Run code and increment put statistics.
|
|
108
|
+
|
|
109
|
+
Parameters
|
|
110
|
+
----------
|
|
111
|
+
log : `logging.Logger` or `None`
|
|
112
|
+
Logger to use for any timing information.
|
|
113
|
+
msg : `str` or `None`
|
|
114
|
+
Any message to be included in log output.
|
|
115
|
+
"""
|
|
116
|
+
with self._timer(self.increment_put, log=log, msg=msg):
|
|
117
|
+
yield
|
{lsst_daf_butler-29.2025.1600 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_dataset_ref.py
RENAMED
|
@@ -66,8 +66,11 @@ from ._named import NamedKeyDict
|
|
|
66
66
|
from .datastore.stored_file_info import StoredDatastoreItemInfo
|
|
67
67
|
from .dimensions import (
|
|
68
68
|
DataCoordinate,
|
|
69
|
+
DimensionDataAttacher,
|
|
70
|
+
DimensionDataExtractor,
|
|
69
71
|
DimensionGroup,
|
|
70
72
|
DimensionUniverse,
|
|
73
|
+
SerializableDimensionData,
|
|
71
74
|
SerializedDataCoordinate,
|
|
72
75
|
SerializedDataId,
|
|
73
76
|
)
|
|
@@ -907,6 +910,62 @@ class MinimalistSerializableDatasetRef(pydantic.BaseModel):
|
|
|
907
910
|
data_id: SerializedDataId
|
|
908
911
|
"""Data coordinate of this dataset."""
|
|
909
912
|
|
|
913
|
+
def to_dataset_ref(
|
|
914
|
+
self,
|
|
915
|
+
id: DatasetId,
|
|
916
|
+
*,
|
|
917
|
+
dataset_type: DatasetType,
|
|
918
|
+
universe: DimensionUniverse,
|
|
919
|
+
attacher: DimensionDataAttacher | None = None,
|
|
920
|
+
) -> DatasetRef:
|
|
921
|
+
"""Convert serialized object to a `DatasetRef`.
|
|
922
|
+
|
|
923
|
+
Parameters
|
|
924
|
+
----------
|
|
925
|
+
id : `DatasetId`
|
|
926
|
+
UUID identifying the dataset.
|
|
927
|
+
dataset_type : `DatasetType`
|
|
928
|
+
`DatasetType` record corresponding to the dataset type name in the
|
|
929
|
+
serialized object.
|
|
930
|
+
universe : `DimensionUniverse`
|
|
931
|
+
Dimension universe for the dataset.
|
|
932
|
+
attacher : `DimensionDataAttacher`, optional
|
|
933
|
+
If provided, will be used to add dimension records to the
|
|
934
|
+
deserialized `DatasetRef` instance.
|
|
935
|
+
|
|
936
|
+
Returns
|
|
937
|
+
-------
|
|
938
|
+
ref : `DatasetRef`
|
|
939
|
+
The deserialized object.
|
|
940
|
+
"""
|
|
941
|
+
assert dataset_type.name == self.dataset_type_name, (
|
|
942
|
+
"Given DatasetType does not match the serialized dataset type name"
|
|
943
|
+
)
|
|
944
|
+
simple_data_id = SerializedDataCoordinate(dataId=self.data_id)
|
|
945
|
+
data_id = DataCoordinate.from_simple(simple=simple_data_id, universe=universe)
|
|
946
|
+
if attacher:
|
|
947
|
+
data_ids = attacher.attach(dataset_type.dimensions, [data_id])
|
|
948
|
+
data_id = data_ids[0]
|
|
949
|
+
return DatasetRef(
|
|
950
|
+
id=id,
|
|
951
|
+
run=self.run,
|
|
952
|
+
datasetType=dataset_type,
|
|
953
|
+
dataId=data_id,
|
|
954
|
+
)
|
|
955
|
+
|
|
956
|
+
@staticmethod
|
|
957
|
+
def from_dataset_ref(ref: DatasetRef) -> MinimalistSerializableDatasetRef:
|
|
958
|
+
"""Serialize a ``DatasetRef` to a simplified format.
|
|
959
|
+
|
|
960
|
+
Parameters
|
|
961
|
+
----------
|
|
962
|
+
ref : `DatasetRef`
|
|
963
|
+
`DatasetRef` object to serialize.
|
|
964
|
+
"""
|
|
965
|
+
return MinimalistSerializableDatasetRef(
|
|
966
|
+
dataset_type_name=ref.datasetType.name, run=ref.run, data_id=dict(ref.dataId.mapping)
|
|
967
|
+
)
|
|
968
|
+
|
|
910
969
|
|
|
911
970
|
class SerializedDatasetRefContainer(pydantic.BaseModel):
|
|
912
971
|
"""Serializable model for a collection of DatasetRef.
|
|
@@ -938,6 +997,9 @@ class SerializedDatasetRefContainerV1(SerializedDatasetRefContainer):
|
|
|
938
997
|
compact_refs: dict[uuid.UUID, MinimalistSerializableDatasetRef]
|
|
939
998
|
"""Minimal dataset ref information indexed by UUID."""
|
|
940
999
|
|
|
1000
|
+
dimension_records: SerializableDimensionData | None = None
|
|
1001
|
+
"""Dimension record information"""
|
|
1002
|
+
|
|
941
1003
|
def __len__(self) -> int:
|
|
942
1004
|
"""Return the number of datasets in the container."""
|
|
943
1005
|
return len(self.compact_refs)
|
|
@@ -957,19 +1019,32 @@ class SerializedDatasetRefContainerV1(SerializedDatasetRefContainer):
|
|
|
957
1019
|
universe: DimensionUniverse | None = None
|
|
958
1020
|
dataset_types: dict[str, SerializedDatasetType] = {}
|
|
959
1021
|
compact_refs: dict[uuid.UUID, MinimalistSerializableDatasetRef] = {}
|
|
1022
|
+
data_ids: list[DataCoordinate] = []
|
|
1023
|
+
dimensions: list[DimensionGroup] = []
|
|
960
1024
|
for ref in refs:
|
|
961
|
-
simple_ref = ref.to_simple()
|
|
962
|
-
dataset_type = simple_ref.datasetType
|
|
963
|
-
assert dataset_type is not None # For mypy
|
|
964
1025
|
if universe is None:
|
|
965
1026
|
universe = ref.datasetType.dimensions.universe
|
|
966
|
-
if (name :=
|
|
967
|
-
dataset_types[name] =
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
1027
|
+
if (name := ref.datasetType.name) not in dataset_types:
|
|
1028
|
+
dataset_types[name] = ref.datasetType.to_simple()
|
|
1029
|
+
compact_refs[ref.id] = MinimalistSerializableDatasetRef.from_dataset_ref(ref)
|
|
1030
|
+
if ref.dataId.hasRecords():
|
|
1031
|
+
dimensions.append(ref.datasetType.dimensions)
|
|
1032
|
+
data_ids.append(ref.dataId)
|
|
1033
|
+
|
|
1034
|
+
# Extract dimension record metadata if present.
|
|
1035
|
+
dimension_records = None
|
|
1036
|
+
if data_ids and len(compact_refs) == len(data_ids):
|
|
1037
|
+
dimension_group = DimensionGroup.union(*dimensions, universe=universe)
|
|
1038
|
+
|
|
1039
|
+
# Records were attached to all refs. Store them.
|
|
1040
|
+
extractor = DimensionDataExtractor.from_dimension_group(
|
|
1041
|
+
dimension_group,
|
|
1042
|
+
ignore_cached=False,
|
|
1043
|
+
include_skypix=False,
|
|
972
1044
|
)
|
|
1045
|
+
extractor.update(data_ids)
|
|
1046
|
+
dimension_records = SerializableDimensionData.from_record_sets(extractor.records.values())
|
|
1047
|
+
|
|
973
1048
|
if universe:
|
|
974
1049
|
universe_version = universe.version
|
|
975
1050
|
universe_namespace = universe.namespace
|
|
@@ -982,6 +1057,7 @@ class SerializedDatasetRefContainerV1(SerializedDatasetRefContainer):
|
|
|
982
1057
|
universe_namespace=universe_namespace,
|
|
983
1058
|
dataset_types=dataset_types,
|
|
984
1059
|
compact_refs=compact_refs,
|
|
1060
|
+
dimension_records=dimension_records,
|
|
985
1061
|
)
|
|
986
1062
|
|
|
987
1063
|
def to_refs(self, universe: DimensionUniverse) -> list[DatasetRef]:
|
|
@@ -1019,15 +1095,22 @@ class SerializedDatasetRefContainerV1(SerializedDatasetRefContainer):
|
|
|
1019
1095
|
name: DatasetType.from_simple(dtype, universe=universe)
|
|
1020
1096
|
for name, dtype in self.dataset_types.items()
|
|
1021
1097
|
}
|
|
1098
|
+
|
|
1099
|
+
# Dimension records can be attached if available.
|
|
1100
|
+
# We assume that all dimension information was stored.
|
|
1101
|
+
attacher = None
|
|
1102
|
+
if self.dimension_records:
|
|
1103
|
+
attacher = DimensionDataAttacher(
|
|
1104
|
+
deserializers=self.dimension_records.make_deserializers(universe)
|
|
1105
|
+
)
|
|
1106
|
+
|
|
1022
1107
|
refs: list[DatasetRef] = []
|
|
1023
1108
|
for id_, minimal in self.compact_refs.items():
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
datasetType=dataset_types[minimal.dataset_type_name],
|
|
1030
|
-
dataId=data_id,
|
|
1109
|
+
ref = minimal.to_dataset_ref(
|
|
1110
|
+
id_,
|
|
1111
|
+
dataset_type=dataset_types[minimal.dataset_type_name],
|
|
1112
|
+
universe=universe,
|
|
1113
|
+
attacher=attacher,
|
|
1031
1114
|
)
|
|
1032
1115
|
refs.append(ref)
|
|
1033
1116
|
return refs
|
|
@@ -27,15 +27,21 @@
|
|
|
27
27
|
|
|
28
28
|
from __future__ import annotations
|
|
29
29
|
|
|
30
|
-
__all__ =
|
|
30
|
+
__all__ = ("FileDataset", "SerializedFileDataset")
|
|
31
31
|
|
|
32
|
+
import uuid
|
|
33
|
+
from collections.abc import Callable
|
|
32
34
|
from dataclasses import dataclass
|
|
33
|
-
from typing import Any
|
|
35
|
+
from typing import Any, TypeAlias
|
|
36
|
+
|
|
37
|
+
import pydantic
|
|
34
38
|
|
|
35
39
|
from lsst.resources import ResourcePath, ResourcePathExpression
|
|
36
40
|
|
|
37
|
-
from ._dataset_ref import DatasetRef
|
|
41
|
+
from ._dataset_ref import DatasetRef, MinimalistSerializableDatasetRef
|
|
42
|
+
from ._dataset_type import DatasetType
|
|
38
43
|
from ._formatter import FormatterParameter
|
|
44
|
+
from .dimensions import DimensionUniverse
|
|
39
45
|
|
|
40
46
|
|
|
41
47
|
@dataclass
|
|
@@ -87,3 +93,72 @@ class FileDataset:
|
|
|
87
93
|
if not isinstance(other, type(self)):
|
|
88
94
|
return NotImplemented
|
|
89
95
|
return str(self.path) < str(other.path)
|
|
96
|
+
|
|
97
|
+
def to_simple(self) -> SerializedFileDataset:
|
|
98
|
+
"""
|
|
99
|
+
Convert this instance to a simplified, JSON-serializable object.
|
|
100
|
+
|
|
101
|
+
Returns
|
|
102
|
+
-------
|
|
103
|
+
serialized : `SerializedFileDataset`
|
|
104
|
+
Serializable representation of this `FileDataset` instance.
|
|
105
|
+
"""
|
|
106
|
+
if self.formatter is None:
|
|
107
|
+
formatter = None
|
|
108
|
+
elif isinstance(self.formatter, str):
|
|
109
|
+
formatter = self.formatter
|
|
110
|
+
else:
|
|
111
|
+
formatter = self.formatter.name()
|
|
112
|
+
|
|
113
|
+
refs = {ref.id: MinimalistSerializableDatasetRef.from_dataset_ref(ref) for ref in self.refs}
|
|
114
|
+
|
|
115
|
+
return SerializedFileDataset(
|
|
116
|
+
refs=refs,
|
|
117
|
+
path=str(self.path),
|
|
118
|
+
formatter=formatter,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
@staticmethod
|
|
122
|
+
def from_simple(
|
|
123
|
+
dataset: SerializedFileDataset, *, dataset_type_loader: DatasetTypeLoader, universe: DimensionUniverse
|
|
124
|
+
) -> FileDataset:
|
|
125
|
+
"""
|
|
126
|
+
Deserialize a `SerializedFileDataset` into a `FileDataset`.
|
|
127
|
+
|
|
128
|
+
Parameters
|
|
129
|
+
----------
|
|
130
|
+
dataset : `SerializedFileDataset`
|
|
131
|
+
Object to deserialize.
|
|
132
|
+
dataset_type_loader : `Callable` [[ `str` ], `DatasetType` ]
|
|
133
|
+
Function that takes a string dataset type name as its
|
|
134
|
+
only parameter, and returns an instance of `DatasetType`.
|
|
135
|
+
Used to deserialize the `DatasetRef` instances contained
|
|
136
|
+
in the serialized `FileDataset`.
|
|
137
|
+
universe : `DimensionUniverse`
|
|
138
|
+
Dimension universe associated with the `Butler` instance that
|
|
139
|
+
created the serialized `FileDataset` instance.
|
|
140
|
+
|
|
141
|
+
Returns
|
|
142
|
+
-------
|
|
143
|
+
file_dataset : `FileDataset`
|
|
144
|
+
Deserialized equivalent of the input dataset.
|
|
145
|
+
"""
|
|
146
|
+
refs = [
|
|
147
|
+
ref.to_dataset_ref(id, universe=universe, dataset_type=dataset_type_loader(ref.dataset_type_name))
|
|
148
|
+
for id, ref in dataset.refs.items()
|
|
149
|
+
]
|
|
150
|
+
return FileDataset(path=dataset.path, refs=refs, formatter=dataset.formatter)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
DatasetTypeLoader: TypeAlias = Callable[[str], DatasetType]
|
|
154
|
+
"""Type signature for a function that takes a string dataset type name as its
|
|
155
|
+
only parameter, and returns an instance of `DatasetType`.
|
|
156
|
+
"""
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class SerializedFileDataset(pydantic.BaseModel):
|
|
160
|
+
"""Serializable format of `FileDataset` object."""
|
|
161
|
+
|
|
162
|
+
refs: dict[uuid.UUID, MinimalistSerializableDatasetRef]
|
|
163
|
+
path: str
|
|
164
|
+
formatter: str | None = None
|
|
@@ -31,11 +31,13 @@ __all__ = ("LimitedButler",)
|
|
|
31
31
|
|
|
32
32
|
import logging
|
|
33
33
|
from abc import ABC, abstractmethod
|
|
34
|
-
from collections.abc import Iterable
|
|
34
|
+
from collections.abc import Iterable, Iterator
|
|
35
|
+
from contextlib import contextmanager
|
|
35
36
|
from typing import Any, ClassVar
|
|
36
37
|
|
|
37
38
|
from lsst.resources import ResourcePath
|
|
38
39
|
|
|
40
|
+
from ._butler_metrics import ButlerMetrics
|
|
39
41
|
from ._dataset_provenance import DatasetProvenance
|
|
40
42
|
from ._dataset_ref import DatasetRef
|
|
41
43
|
from ._deferredDatasetHandle import DeferredDatasetHandle
|
|
@@ -138,7 +140,8 @@ class LimitedButler(ABC):
|
|
|
138
140
|
to use a resolved `DatasetRef`. Subclasses can support more options.
|
|
139
141
|
"""
|
|
140
142
|
log.debug("Butler get: %s, parameters=%s, storageClass: %s", ref, parameters, storageClass)
|
|
141
|
-
|
|
143
|
+
with self._metrics.instrument_get(log, msg="Retrieved dataset"):
|
|
144
|
+
return self._datastore.get(ref, parameters=parameters, storageClass=storageClass)
|
|
142
145
|
|
|
143
146
|
def getDeferred(
|
|
144
147
|
self,
|
|
@@ -415,6 +418,30 @@ class LimitedButler(ABC):
|
|
|
415
418
|
"""
|
|
416
419
|
raise NotImplementedError()
|
|
417
420
|
|
|
421
|
+
@contextmanager
|
|
422
|
+
def record_metrics(self, metrics: ButlerMetrics | None = None) -> Iterator[ButlerMetrics]:
|
|
423
|
+
"""Enable new metrics recording context.
|
|
424
|
+
|
|
425
|
+
Parameters
|
|
426
|
+
----------
|
|
427
|
+
metrics : `lsst.daf.butler.ButlerMetrics`
|
|
428
|
+
Optional override metrics object. If given, this will be the
|
|
429
|
+
same object returned by the context manager.
|
|
430
|
+
|
|
431
|
+
Yields
|
|
432
|
+
------
|
|
433
|
+
metrics : `lsst.daf.butler.ButlerMetrics`
|
|
434
|
+
Metrics recorded within this context. This temporarily replaces
|
|
435
|
+
any existing metrics object associated with this butler.
|
|
436
|
+
"""
|
|
437
|
+
old_metrics = self._metrics
|
|
438
|
+
new_metrics = metrics if metrics is not None else ButlerMetrics()
|
|
439
|
+
try:
|
|
440
|
+
self._metrics = new_metrics
|
|
441
|
+
yield new_metrics
|
|
442
|
+
finally:
|
|
443
|
+
self._metrics = old_metrics
|
|
444
|
+
|
|
418
445
|
@property
|
|
419
446
|
@abstractmethod
|
|
420
447
|
def dimensions(self) -> DimensionUniverse:
|
|
@@ -430,3 +457,8 @@ class LimitedButler(ABC):
|
|
|
430
457
|
"""An object that maps known storage class names to objects that fully
|
|
431
458
|
describe them (`StorageClassFactory`).
|
|
432
459
|
"""
|
|
460
|
+
|
|
461
|
+
_metrics: ButlerMetrics
|
|
462
|
+
"""An object for recording metrics associated with this butler.
|
|
463
|
+
(`ButlerMetrics`)
|
|
464
|
+
"""
|