lsst-daf-butler 29.2025.2700__tar.gz → 29.2025.2900__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.2700/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.2900}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/queries.rst +30 -3
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/writing-subcommands.rst +2 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_butler.py +1 -1
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/_transfer.py +4 -4
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_group.py +25 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/_expression_strings.py +71 -6
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/collections/_base.py +13 -5
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -2
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +34 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/check.py +20 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +27 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +153 -6
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +66 -1
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/tests/_registry.py +25 -1
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/butler_queries.py +30 -14
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/registry_data/spatial.py +54 -9
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +1 -1
- lsst_daf_butler-29.2025.2900/python/lsst/daf/butler/version.py +2 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_dimensions.py +18 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_exprParserYacc.py +202 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_normalFormExpression.py +12 -0
- lsst_daf_butler-29.2025.2700/python/lsst/daf/butler/version.py +0 -2
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/COPYRIGHT +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/LICENSE +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/MANIFEST.in +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/README.md +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/bsd_license.txt +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/CHANGES.rst +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/configuring.rst +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/datastores.rst +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/dimensions.rst +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/formatters.rst +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/index.rst +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/organizing.rst +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/gpl-v3.0.txt +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/pyproject.toml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_butler_config.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_butler_metrics.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_collection_type.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_column_categorization.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_column_tags.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_column_type_info.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_config_support.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_dataset_association.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_dataset_existence.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_dataset_ref.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_file_dataset.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_file_descriptor.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_formatter.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_limited_butler.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_location.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_named.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_quantum.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_quantum_backed.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_registry_shim.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_storage_class.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_timespan.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_topology.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/arrow_utils.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/butler.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/cliLog.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/opt/options.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/progress.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/utils.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/column_spec.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/registry.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/composites.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/constraints.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/record_data.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/fileDatastore.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/ddl.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/delegates/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_config.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_database.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_records.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/construction.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_butler/_direct_butler.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/file.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/json.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/logs.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/packages.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/parquet.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/pickle.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/typeless.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/yaml.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/json.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/logging.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/mapping_factory.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/name_shrinker.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/persistence_context.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/progress.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/py.typed +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/_base.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/convert_args.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/driver.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/overlaps.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/result_specs.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/visitors.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_config.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_registry.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/attributes.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/connectionString.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/managers.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/opaque.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/versions.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/wildcards.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_authentication.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_remote_butler.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/repo_relocation.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/_associate.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/butlerImport.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/collectionChain.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/configDump.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/configValidate.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/createRepo.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/ingest_files.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/queryCollections.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/removeCollections.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/removeRuns.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/server.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/server_utils.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/utils.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/time_utils.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/transfers/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/transfers/_context.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/utils.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst_daf_butler.egg-info/SOURCES.txt +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/setup.cfg +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_astropyTableFormatter.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_authentication.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_butler.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdAssociate.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdConfigDump.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdConfigValidate.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdCreate.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdImport.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdIngestFiles.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdPruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdQueryCollections.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdQueryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdQueryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdRemoveCollections.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdRemoveRuns.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliLog.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliPluginLoader.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliUtilSplitCommas.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliUtilSplitKv.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliUtilToUpper.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliUtils.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_column_spec.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_composites.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_config.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_connectionString.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_constraints.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_datasets.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_datastore.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_ddl.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_dimension_record_containers.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_exprParserLex.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_expressions.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_formatter.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_gafaelfawr.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_location.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_logFormatter.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_logging.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_matplotlibFormatter.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_obscore.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_packages.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_parquet.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_progress.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_quantum.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_quantumBackedButler.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_query_direct_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_query_direct_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_query_interface.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_query_relations.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_query_remote.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_query_utilities.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_remote_butler.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_server.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_simpleButler.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_storageClass.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_templates.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_thread_utils.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_time_utils.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_timespan.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_utils.py +0 -0
- {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/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.2900
|
|
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.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/queries.rst
RENAMED
|
@@ -327,6 +327,12 @@ where ``ra`` and ``dec`` are specified as an ICRS sky position in degrees.
|
|
|
327
327
|
|
|
328
328
|
visit.region OVERLAPS POINT(53.6, -32.7)
|
|
329
329
|
|
|
330
|
+
All types of regions supported by the language will work with ``OVERLAP`` as well.
|
|
331
|
+
|
|
332
|
+
.. code-block:: sql
|
|
333
|
+
|
|
334
|
+
visit.region OVERLAPS BOX(53.6, -32.7, 1, 1)
|
|
335
|
+
|
|
330
336
|
You can check overlaps with arbitrary sky regions by binding values (see
|
|
331
337
|
:ref:`daf_butler_dimension_expressions_identifiers`). Bound region values may
|
|
332
338
|
be specified as the following object types:
|
|
@@ -364,16 +370,37 @@ consists of an identifier followed by zero or more comma-separated arguments
|
|
|
364
370
|
enclosed in parentheses (e.g. ``func(1, 2, 3)``). An argument to a function
|
|
365
371
|
can be any expression. Names of the functions are not case-sensitive.
|
|
366
372
|
|
|
367
|
-
|
|
373
|
+
A small set of functions is implemented in the query language presently.
|
|
374
|
+
|
|
375
|
+
Functions supporting operations on strings:
|
|
368
376
|
|
|
369
|
-
- ``POINT(ra, dec)`` - function which declares (or returns) sky coordinates
|
|
370
|
-
similarly to ADQL syntax.
|
|
371
377
|
- ``GLOB(expression, pattern)`` - performs case-sensitive match of a string
|
|
372
378
|
``expression`` against ``pattern``. Pattern can include ``*`` and ``?``
|
|
373
379
|
meta-characters, matching any number of characters or a single character
|
|
374
380
|
respectfully. All other characters in pattern are matched literally, and
|
|
375
381
|
whole expression string has to match for ``GLOB()`` to return ``True``.
|
|
376
382
|
|
|
383
|
+
Functions for defining sky coordinates or regions. All these functions accept
|
|
384
|
+
either numeric literals or bind identifiers (``:name`` syntax):
|
|
385
|
+
|
|
386
|
+
- ``POINT(ra, dec)`` - function which declares (or returns) sky coordinates
|
|
387
|
+
similarly to ADQL syntax, arguments are in degrees.
|
|
388
|
+
- ``CIRCLE(ra, dec, radius)`` - function which returns circular sky region,
|
|
389
|
+
all arguments are in degrees.
|
|
390
|
+
- ``BOX(center_ra, center_dec, width, height)`` - function which returns box
|
|
391
|
+
sky region, all arguments are in degrees.
|
|
392
|
+
- ``POLYGON(ra1, dec1, ra2, dec2, ...)`` - function which returns polygonal
|
|
393
|
+
sky region, all arguments are in degrees, at least three pairs of coordinates
|
|
394
|
+
have to be provided. Note that implementation for this function is based on
|
|
395
|
+
``lsst.sphgeom.ConvexPolygon`` class which builds a convex hull out of all
|
|
396
|
+
vertices, thus ignoring their order. This is not strictly consistent with
|
|
397
|
+
ADQL definition that relies on ordering of the vertices and allows non-convex
|
|
398
|
+
polygons.
|
|
399
|
+
- ``REGION('string')`` - function returning sky region, string argument uses
|
|
400
|
+
`IVOA SIAv2 POS`_ syntax. Same caveat applies as for ``POLYGON`` function.
|
|
401
|
+
|
|
402
|
+
.. _IVOA SIAv2 POS: https://ivoa.net/documents/SIA/20151223/REC-SIA-2.0-20151223.html#toc12
|
|
403
|
+
|
|
377
404
|
|
|
378
405
|
.. _time-literals-syntax:
|
|
379
406
|
|
{lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_butler.py
RENAMED
|
@@ -1828,7 +1828,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
1828
1828
|
provided, the default collections are used. Can be a wildcard if
|
|
1829
1829
|
``find_first`` is `False` (if find first is requested the order
|
|
1830
1830
|
of collections matters and wildcards make the order indeterminate).
|
|
1831
|
-
|
|
1831
|
+
See :ref:`daf_butler_collection_expressions` for more information.
|
|
1832
1832
|
find_first : `bool`, optional
|
|
1833
1833
|
If `True` (default), for each result data ID, only yield one
|
|
1834
1834
|
`DatasetRef` of each `DatasetType`, from the first collection in
|
|
@@ -56,8 +56,8 @@ class FileTransferSource(Protocol):
|
|
|
56
56
|
dataset_ids : `~collections.abc.Iterable` [ `DatasetId` ]
|
|
57
57
|
List of dataset IDs for which we will retrieve file information.
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
Returns
|
|
60
|
+
-------
|
|
61
61
|
transfer_map : `FileTransferMap`
|
|
62
62
|
Dictionary from `DatasetId` to a list of files found for that
|
|
63
63
|
dataset. If information about any given dataset IDs could not
|
|
@@ -78,8 +78,8 @@ class FileTransferSource(Protocol):
|
|
|
78
78
|
Optional mapping of datastore artifact to existence. Updated by
|
|
79
79
|
this method with details of all artifacts tested.
|
|
80
80
|
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
Returns
|
|
82
|
+
-------
|
|
83
83
|
transfer_map : `FileTransferMap`
|
|
84
84
|
Dictionary from `DatasetId` to a list of files found for that
|
|
85
85
|
dataset. If information about any given dataset IDs could not
|
|
@@ -414,12 +414,37 @@ class DimensionGroup: # numpydoc ignore=PR02
|
|
|
414
414
|
names = set(self.names).intersection(*[other.names for other in others])
|
|
415
415
|
return DimensionGroup(self.universe, names=names)
|
|
416
416
|
|
|
417
|
+
def difference(self, other: DimensionGroup) -> DimensionGroup:
|
|
418
|
+
"""Construct a new group with dimensions that are in ``self`` but not
|
|
419
|
+
``other`` OR dependencies of those in ``self`` but not in ``other``.
|
|
420
|
+
|
|
421
|
+
Parameters
|
|
422
|
+
----------
|
|
423
|
+
other : `DimensionGroup`
|
|
424
|
+
Other group to compare with.
|
|
425
|
+
|
|
426
|
+
Returns
|
|
427
|
+
-------
|
|
428
|
+
diff : `DimensionGroup`
|
|
429
|
+
Difference of the two groups.
|
|
430
|
+
|
|
431
|
+
Notes
|
|
432
|
+
-----
|
|
433
|
+
This is not exactly equivalent to a true `set` difference, because the
|
|
434
|
+
result must be expanded to include required and implied dependencies,
|
|
435
|
+
and those may be common to ``self`` and ``other``.
|
|
436
|
+
"""
|
|
437
|
+
return DimensionGroup(self.universe, names=self.names - other.names)
|
|
438
|
+
|
|
417
439
|
def __or__(self, other: DimensionGroup) -> DimensionGroup:
|
|
418
440
|
return self.union(other)
|
|
419
441
|
|
|
420
442
|
def __and__(self, other: DimensionGroup) -> DimensionGroup:
|
|
421
443
|
return self.intersection(other)
|
|
422
444
|
|
|
445
|
+
def __sub__(self, other: DimensionGroup) -> DimensionGroup:
|
|
446
|
+
return self.difference(other)
|
|
447
|
+
|
|
423
448
|
@property
|
|
424
449
|
def data_coordinate_keys(self) -> Set[str]:
|
|
425
450
|
"""A set of dimensions ordered like `DataCoordinate.mapping`.
|
|
@@ -40,7 +40,17 @@ from .._timespan import Timespan
|
|
|
40
40
|
from ..column_spec import ColumnType
|
|
41
41
|
from ..dimensions import DimensionUniverse
|
|
42
42
|
from ..registry.queries.expressions.categorize import ExpressionConstant, categorizeConstant
|
|
43
|
-
from ..registry.queries.expressions.parser import
|
|
43
|
+
from ..registry.queries.expressions.parser import (
|
|
44
|
+
BoxNode,
|
|
45
|
+
CircleNode,
|
|
46
|
+
Node,
|
|
47
|
+
PointNode,
|
|
48
|
+
PolygonNode,
|
|
49
|
+
RangeLiteral,
|
|
50
|
+
RegionNode,
|
|
51
|
+
TreeVisitor,
|
|
52
|
+
parse_expression,
|
|
53
|
+
)
|
|
44
54
|
from ._identifiers import IdentifierContext, interpret_identifier
|
|
45
55
|
from .tree import (
|
|
46
56
|
BinaryExpression,
|
|
@@ -251,12 +261,67 @@ class _ConversionVisitor(TreeVisitor[_VisitorResult]):
|
|
|
251
261
|
return expression
|
|
252
262
|
|
|
253
263
|
def visitPointNode(self, ra: _VisitorResult, dec: _VisitorResult, node: PointNode) -> _VisitorResult:
|
|
254
|
-
ra_value = _get_float_literal_value(ra, node.ra)
|
|
255
|
-
dec_value = _get_float_literal_value(dec, node.dec)
|
|
264
|
+
ra_value = _get_float_literal_value(ra, node.ra, "POINT")
|
|
265
|
+
dec_value = _get_float_literal_value(dec, node.dec, "POINT")
|
|
256
266
|
|
|
257
267
|
lon_lat = lsst.sphgeom.LonLat.fromDegrees(ra_value, dec_value)
|
|
258
268
|
return _make_literal(lon_lat)
|
|
259
269
|
|
|
270
|
+
def visitCircleNode(
|
|
271
|
+
self, ra: _VisitorResult, dec: _VisitorResult, radius: _VisitorResult, node: CircleNode
|
|
272
|
+
) -> _VisitorResult:
|
|
273
|
+
ra_value = _get_float_literal_value(ra, node.ra, "CIRCLE")
|
|
274
|
+
dec_value = _get_float_literal_value(dec, node.dec, "CIRCLE")
|
|
275
|
+
radius_value = _get_float_literal_value(radius, node.radius, "CIRCLE")
|
|
276
|
+
|
|
277
|
+
lon_lat = lsst.sphgeom.LonLat.fromDegrees(ra_value, dec_value)
|
|
278
|
+
open_angle = lsst.sphgeom.Angle.fromDegrees(radius_value * 2)
|
|
279
|
+
vec = lsst.sphgeom.UnitVector3d(lon_lat)
|
|
280
|
+
circle = lsst.sphgeom.Circle(vec, open_angle)
|
|
281
|
+
return _make_literal(circle)
|
|
282
|
+
|
|
283
|
+
def visitBoxNode(
|
|
284
|
+
self,
|
|
285
|
+
ra: _VisitorResult,
|
|
286
|
+
dec: _VisitorResult,
|
|
287
|
+
width: _VisitorResult,
|
|
288
|
+
height: _VisitorResult,
|
|
289
|
+
node: BoxNode,
|
|
290
|
+
) -> _VisitorResult:
|
|
291
|
+
ra_value = _get_float_literal_value(ra, node.ra, "BOX")
|
|
292
|
+
dec_value = _get_float_literal_value(dec, node.dec, "BOX")
|
|
293
|
+
width_value = _get_float_literal_value(width, node.width, "BOX")
|
|
294
|
+
height_value = _get_float_literal_value(height, node.height, "BOX")
|
|
295
|
+
|
|
296
|
+
lon_lat = lsst.sphgeom.LonLat.fromDegrees(ra_value, dec_value)
|
|
297
|
+
half_width = lsst.sphgeom.Angle.fromDegrees(width_value / 2)
|
|
298
|
+
half_height = lsst.sphgeom.Angle.fromDegrees(height_value / 2)
|
|
299
|
+
box = lsst.sphgeom.Box(lon_lat, half_width, half_height)
|
|
300
|
+
return _make_literal(box)
|
|
301
|
+
|
|
302
|
+
def visitPolygonNode(
|
|
303
|
+
self, vertices: list[tuple[_VisitorResult, _VisitorResult]], node: PolygonNode
|
|
304
|
+
) -> _VisitorResult:
|
|
305
|
+
sphgeom_vertices = []
|
|
306
|
+
for ra, dec in vertices:
|
|
307
|
+
ra_value = _get_float_literal_value(ra, node, "POLYGON")
|
|
308
|
+
dec_value = _get_float_literal_value(dec, node, "POLYGON")
|
|
309
|
+
lon_lat = lsst.sphgeom.LonLat.fromDegrees(ra_value, dec_value)
|
|
310
|
+
sphgeom_vertices.append(lsst.sphgeom.UnitVector3d(lon_lat))
|
|
311
|
+
|
|
312
|
+
polygon = lsst.sphgeom.ConvexPolygon(sphgeom_vertices)
|
|
313
|
+
return _make_literal(polygon)
|
|
314
|
+
|
|
315
|
+
def visitRegionNode(self, pos: _VisitorResult, node: RegionNode) -> _VisitorResult:
|
|
316
|
+
if isinstance(pos, _ColExpr):
|
|
317
|
+
expr = pos.value
|
|
318
|
+
if expr.expression_type == "string":
|
|
319
|
+
pos_str = expr.value
|
|
320
|
+
region = lsst.sphgeom.Region.from_ivoa_pos(pos_str)
|
|
321
|
+
return _make_literal(region)
|
|
322
|
+
|
|
323
|
+
raise InvalidQueryError(f"Expression '{node.pos}' in REGION() is not a literal string.")
|
|
324
|
+
|
|
260
325
|
def visitRangeLiteral(
|
|
261
326
|
self, start: int, stop: int, stride: int | None, node: RangeLiteral
|
|
262
327
|
) -> _VisitorResult:
|
|
@@ -379,7 +444,7 @@ def _get_boolean_column_reference(predicate: Predicate) -> ColumnReference | Non
|
|
|
379
444
|
return None
|
|
380
445
|
|
|
381
446
|
|
|
382
|
-
def _get_float_literal_value(value: _VisitorResult, node: Node) -> float:
|
|
447
|
+
def _get_float_literal_value(value: _VisitorResult, node: Node, name: str) -> float:
|
|
383
448
|
"""If the given ``value`` is a literal `float` or `int` expression, return
|
|
384
449
|
it as a float. Otherwise raise an `InvalidQueryError` identifying a
|
|
385
450
|
problem with the given ``node``.
|
|
@@ -391,6 +456,6 @@ def _get_float_literal_value(value: _VisitorResult, node: Node) -> float:
|
|
|
391
456
|
elif expr.expression_type == "int":
|
|
392
457
|
return float(expr.value)
|
|
393
458
|
elif expr.expression_type == "unary" and expr.operator == "-":
|
|
394
|
-
return -1 * _get_float_literal_value(_ColExpr(expr.operand), node)
|
|
459
|
+
return -1 * _get_float_literal_value(_ColExpr(expr.operand), node, name)
|
|
395
460
|
|
|
396
|
-
raise InvalidQueryError(f"Expression '{node}' in
|
|
461
|
+
raise InvalidQueryError(f"Expression '{node}' in {name}() is not a literal number.")
|
|
@@ -427,11 +427,13 @@ class DefaultCollectionManager(CollectionManager[K]):
|
|
|
427
427
|
cache: CollectionRecordCache | None = None
|
|
428
428
|
result: list[CollectionRecord[K]] = []
|
|
429
429
|
done_keys: set[K] = set()
|
|
430
|
+
explicit_names = list(wildcard.strings)
|
|
430
431
|
if wildcard.patterns:
|
|
431
|
-
if
|
|
432
|
+
if explicit_names or flatten_chains:
|
|
432
433
|
# To be efficient in case both patterns and strings are
|
|
433
434
|
# specified we want to have caching enabled for at least the
|
|
434
|
-
# duration of this call.
|
|
435
|
+
# duration of this call. Chains flattening can also produce
|
|
436
|
+
# additional names to look for.
|
|
435
437
|
cache = self._caching_context.collection_records or CollectionRecordCache()
|
|
436
438
|
all_records = self._fetch_all(cache)
|
|
437
439
|
for record in filter_types(all_records):
|
|
@@ -439,11 +441,17 @@ class DefaultCollectionManager(CollectionManager[K]):
|
|
|
439
441
|
if any(p.fullmatch(record.name) for p in wildcard.patterns):
|
|
440
442
|
result.append(record)
|
|
441
443
|
done_keys.add(record.key)
|
|
442
|
-
|
|
443
|
-
|
|
444
|
+
if flatten_chains:
|
|
445
|
+
# If flattening include children names of all matching chains.
|
|
446
|
+
for record in all_records:
|
|
447
|
+
if isinstance(record, ChainedCollectionRecord):
|
|
448
|
+
if any(p.fullmatch(record.name) for p in wildcard.patterns):
|
|
449
|
+
explicit_names.extend(record.children)
|
|
450
|
+
|
|
451
|
+
if explicit_names:
|
|
444
452
|
# _find_many() returns correctly ordered records, but there may be
|
|
445
453
|
# duplicates.
|
|
446
|
-
for record in filter_types(self._find_many(
|
|
454
|
+
for record in filter_types(self._find_many(explicit_names, flatten_chains, cache)):
|
|
447
455
|
if record.key not in done_keys:
|
|
448
456
|
result.append(record)
|
|
449
457
|
done_keys.add(record.key)
|
|
@@ -457,6 +457,40 @@ class PredicateConversionVisitor(TreeVisitor[VisitorResult]):
|
|
|
457
457
|
# do not support actual use just yet.
|
|
458
458
|
raise NotImplementedError("POINT() function is not supported yet")
|
|
459
459
|
|
|
460
|
+
def visitCircleNode(
|
|
461
|
+
self, ra: VisitorResult, dec: VisitorResult, radius: VisitorResult, node: Node
|
|
462
|
+
) -> VisitorResult:
|
|
463
|
+
# Docstring inherited.
|
|
464
|
+
|
|
465
|
+
# this is a placeholder for future extension, we enabled syntax but
|
|
466
|
+
# do not support actual use just yet.
|
|
467
|
+
raise NotImplementedError("CIRCLE() function is not supported yet")
|
|
468
|
+
|
|
469
|
+
def visitBoxNode(
|
|
470
|
+
self, ra: VisitorResult, dec: VisitorResult, width: VisitorResult, height: VisitorResult, node: Node
|
|
471
|
+
) -> VisitorResult:
|
|
472
|
+
# Docstring inherited.
|
|
473
|
+
|
|
474
|
+
# this is a placeholder for future extension, we enabled syntax but
|
|
475
|
+
# do not support actual use just yet.
|
|
476
|
+
raise NotImplementedError("BOX() function is not supported yet")
|
|
477
|
+
|
|
478
|
+
def visitPolygonNode(
|
|
479
|
+
self, vertices: list[tuple[VisitorResult, VisitorResult]], node: Node
|
|
480
|
+
) -> VisitorResult:
|
|
481
|
+
# Docstring inherited.
|
|
482
|
+
|
|
483
|
+
# this is a placeholder for future extension, we enabled syntax but
|
|
484
|
+
# do not support actual use just yet.
|
|
485
|
+
raise NotImplementedError("POLYGON() function is not supported yet")
|
|
486
|
+
|
|
487
|
+
def visitRegionNode(self, pos: VisitorResult, node: Node) -> VisitorResult:
|
|
488
|
+
# Docstring inherited.
|
|
489
|
+
|
|
490
|
+
# this is a placeholder for future extension, we enabled syntax but
|
|
491
|
+
# do not support actual use just yet.
|
|
492
|
+
raise NotImplementedError("REGION() function is not supported yet")
|
|
493
|
+
|
|
460
494
|
def visitRangeLiteral(self, start: int, stop: int, stride: int | None, node: Node) -> VisitorResult:
|
|
461
495
|
# Docstring inherited.
|
|
462
496
|
return ColumnContainer.range_literal(range(start, stop + 1, stride or 1))
|
|
@@ -285,6 +285,26 @@ class InspectionVisitor(TreeVisitor[TreeSummary]):
|
|
|
285
285
|
# Docstring inherited from base class
|
|
286
286
|
return TreeSummary()
|
|
287
287
|
|
|
288
|
+
def visitCircleNode(
|
|
289
|
+
self, ra: TreeSummary, dec: TreeSummary, radius: TreeSummary, node: Node
|
|
290
|
+
) -> TreeSummary:
|
|
291
|
+
# Docstring inherited from base class
|
|
292
|
+
return TreeSummary()
|
|
293
|
+
|
|
294
|
+
def visitPolygonNode(self, vertices: list[tuple[TreeSummary, TreeSummary]], node: Node) -> TreeSummary:
|
|
295
|
+
# Docstring inherited from base class
|
|
296
|
+
return TreeSummary()
|
|
297
|
+
|
|
298
|
+
def visitRegionNode(self, pos: TreeSummary, node: Node) -> TreeSummary:
|
|
299
|
+
# Docstring inherited from base class
|
|
300
|
+
return TreeSummary()
|
|
301
|
+
|
|
302
|
+
def visitBoxNode(
|
|
303
|
+
self, ra: TreeSummary, dec: TreeSummary, width: TreeSummary, height: TreeSummary, node: Node
|
|
304
|
+
) -> TreeSummary:
|
|
305
|
+
# Docstring inherited from base class
|
|
306
|
+
return TreeSummary()
|
|
307
|
+
|
|
288
308
|
def visitGlobNode(self, expression: TreeSummary, pattern: TreeSummary, node: Node) -> TreeSummary:
|
|
289
309
|
# Docstring inherited from base class
|
|
290
310
|
# pattern is a literal, but expression should refer to a dimension.
|
|
@@ -1098,6 +1098,33 @@ class TransformationVisitor(TreeVisitor[TransformationWrapper]):
|
|
|
1098
1098
|
# Docstring inherited from TreeVisitor.visitPointNode
|
|
1099
1099
|
raise NotImplementedError("POINT() function is not supported yet")
|
|
1100
1100
|
|
|
1101
|
+
def visitCircleNode(
|
|
1102
|
+
self, ra: TransformationWrapper, dec: TransformationWrapper, radius: TransformationWrapper, node: Node
|
|
1103
|
+
) -> TransformationWrapper:
|
|
1104
|
+
# Docstring inherited from TreeVisitor.visitCircleNode
|
|
1105
|
+
raise NotImplementedError("CIRCLE() function is not supported yet")
|
|
1106
|
+
|
|
1107
|
+
def visitBoxNode(
|
|
1108
|
+
self,
|
|
1109
|
+
ra: TransformationWrapper,
|
|
1110
|
+
dec: TransformationWrapper,
|
|
1111
|
+
width: TransformationWrapper,
|
|
1112
|
+
height: TransformationWrapper,
|
|
1113
|
+
node: Node,
|
|
1114
|
+
) -> TransformationWrapper:
|
|
1115
|
+
# Docstring inherited from TreeVisitor.visitBoxNode
|
|
1116
|
+
raise NotImplementedError("BOX() function is not supported yet")
|
|
1117
|
+
|
|
1118
|
+
def visitPolygonNode(
|
|
1119
|
+
self, vertices: list[tuple[TransformationWrapper, TransformationWrapper]], node: Node
|
|
1120
|
+
) -> TransformationWrapper:
|
|
1121
|
+
# Docstring inherited from TreeVisitor.visitPolygonNode
|
|
1122
|
+
raise NotImplementedError("POLYGON() function is not supported yet")
|
|
1123
|
+
|
|
1124
|
+
def visitRegionNode(self, pos: TransformationWrapper, node: Node) -> TransformationWrapper:
|
|
1125
|
+
# Docstring inherited from TreeVisitor.visitRegionNode
|
|
1126
|
+
raise NotImplementedError("REGION() function is not supported yet")
|
|
1127
|
+
|
|
1101
1128
|
def visitGlobNode(
|
|
1102
1129
|
self, expression: TransformationWrapper, pattern: TransformationWrapper, node: Node
|
|
1103
1130
|
) -> TransformationWrapper:
|
|
@@ -39,6 +39,8 @@ from __future__ import annotations
|
|
|
39
39
|
|
|
40
40
|
__all__ = [
|
|
41
41
|
"BinaryOp",
|
|
42
|
+
"BoxNode",
|
|
43
|
+
"CircleNode",
|
|
42
44
|
"FunctionCall",
|
|
43
45
|
"Identifier",
|
|
44
46
|
"IsIn",
|
|
@@ -46,7 +48,9 @@ __all__ = [
|
|
|
46
48
|
"NumericLiteral",
|
|
47
49
|
"Parens",
|
|
48
50
|
"PointNode",
|
|
51
|
+
"PolygonNode",
|
|
49
52
|
"RangeLiteral",
|
|
53
|
+
"RegionNode",
|
|
50
54
|
"StringLiteral",
|
|
51
55
|
"TimeLiteral",
|
|
52
56
|
"TupleNode",
|
|
@@ -218,7 +222,7 @@ class TimeLiteral(LiteralNode):
|
|
|
218
222
|
return visitor.visitTimeLiteral(self.value, self)
|
|
219
223
|
|
|
220
224
|
def __str__(self) -> str:
|
|
221
|
-
return "'{value}'".format(**vars(self))
|
|
225
|
+
return "T'{value}'".format(**vars(self))
|
|
222
226
|
|
|
223
227
|
|
|
224
228
|
class NumericLiteral(LiteralNode):
|
|
@@ -263,7 +267,7 @@ class UuidLiteral(LiteralNode):
|
|
|
263
267
|
return visitor.visitUuidLiteral(self.value, self)
|
|
264
268
|
|
|
265
269
|
def __str__(self) -> str:
|
|
266
|
-
return
|
|
270
|
+
return f"UUID('{self.value}')"
|
|
267
271
|
|
|
268
272
|
|
|
269
273
|
class Identifier(Node):
|
|
@@ -310,7 +314,7 @@ class BindName(Node):
|
|
|
310
314
|
return visitor.visitBind(self.name, self)
|
|
311
315
|
|
|
312
316
|
def __str__(self) -> str:
|
|
313
|
-
return "{name}".format(**vars(self))
|
|
317
|
+
return ":{name}".format(**vars(self))
|
|
314
318
|
|
|
315
319
|
|
|
316
320
|
class RangeLiteral(LiteralNode):
|
|
@@ -488,6 +492,115 @@ class PointNode(Node):
|
|
|
488
492
|
return f"POINT({self.ra}, {self.dec})"
|
|
489
493
|
|
|
490
494
|
|
|
495
|
+
class CircleNode(Node):
|
|
496
|
+
"""Node representing a circle, (ra, dec, radius) pair.
|
|
497
|
+
|
|
498
|
+
Parameters
|
|
499
|
+
----------
|
|
500
|
+
ra : `Node`
|
|
501
|
+
Node representing circle center ra value.
|
|
502
|
+
dec : `Node`
|
|
503
|
+
Node representing circle center dec value.
|
|
504
|
+
radius : `Node`
|
|
505
|
+
Node representing circle radius value.
|
|
506
|
+
"""
|
|
507
|
+
|
|
508
|
+
def __init__(self, ra: Node, dec: Node, radius: Node):
|
|
509
|
+
super().__init__((ra, dec, radius))
|
|
510
|
+
self.ra = ra
|
|
511
|
+
self.dec = dec
|
|
512
|
+
self.radius = radius
|
|
513
|
+
|
|
514
|
+
def visit(self, visitor: TreeVisitor) -> Any:
|
|
515
|
+
# Docstring inherited from Node.visit
|
|
516
|
+
ra = self.ra.visit(visitor)
|
|
517
|
+
dec = self.dec.visit(visitor)
|
|
518
|
+
radius = self.radius.visit(visitor)
|
|
519
|
+
return visitor.visitCircleNode(ra, dec, radius, self)
|
|
520
|
+
|
|
521
|
+
def __str__(self) -> str:
|
|
522
|
+
return f"CIRCLE({self.ra}, {self.dec}, {self.radius})"
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
class BoxNode(Node):
|
|
526
|
+
"""Node representing box region in ADQL notation (ra, dec, width, height).
|
|
527
|
+
|
|
528
|
+
Parameters
|
|
529
|
+
----------
|
|
530
|
+
ra : `Node`
|
|
531
|
+
Node representing box center ra value.
|
|
532
|
+
dec : `Node`
|
|
533
|
+
Node representing box center dec value.
|
|
534
|
+
width : `Node`
|
|
535
|
+
Node representing box ra width value.
|
|
536
|
+
height : `Node`
|
|
537
|
+
Node representing box dec height value.
|
|
538
|
+
"""
|
|
539
|
+
|
|
540
|
+
def __init__(self, ra: Node, dec: Node, width: Node, height: Node):
|
|
541
|
+
super().__init__((ra, dec, width, height))
|
|
542
|
+
self.ra = ra
|
|
543
|
+
self.dec = dec
|
|
544
|
+
self.width = width
|
|
545
|
+
self.height = height
|
|
546
|
+
|
|
547
|
+
def visit(self, visitor: TreeVisitor) -> Any:
|
|
548
|
+
# Docstring inherited from Node.visit
|
|
549
|
+
ra = self.ra.visit(visitor)
|
|
550
|
+
dec = self.dec.visit(visitor)
|
|
551
|
+
width = self.width.visit(visitor)
|
|
552
|
+
height = self.height.visit(visitor)
|
|
553
|
+
return visitor.visitBoxNode(ra, dec, width, height, self)
|
|
554
|
+
|
|
555
|
+
def __str__(self) -> str:
|
|
556
|
+
return f"BOX({self.ra}, {self.dec}, {self.width}, {self.height})"
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
class PolygonNode(Node):
|
|
560
|
+
"""Node representing polygon region in ADQL notation.
|
|
561
|
+
|
|
562
|
+
Parameters
|
|
563
|
+
----------
|
|
564
|
+
vertices : `list`[`tuple`[`Node`, `Node`]]
|
|
565
|
+
Node representing vertices of polygon.
|
|
566
|
+
"""
|
|
567
|
+
|
|
568
|
+
def __init__(self, vertices: list[tuple[Node, Node]]):
|
|
569
|
+
super().__init__(sum(vertices, start=()))
|
|
570
|
+
self.vertices = vertices
|
|
571
|
+
|
|
572
|
+
def visit(self, visitor: TreeVisitor) -> Any:
|
|
573
|
+
# Docstring inherited from Node.visit
|
|
574
|
+
vertices = [(ra.visit(visitor), dec.visit(visitor)) for ra, dec in self.vertices]
|
|
575
|
+
return visitor.visitPolygonNode(vertices, self)
|
|
576
|
+
|
|
577
|
+
def __str__(self) -> str:
|
|
578
|
+
params = ", ".join(str(param) for param in self.children)
|
|
579
|
+
return f"POLYGON({params})"
|
|
580
|
+
|
|
581
|
+
|
|
582
|
+
class RegionNode(Node):
|
|
583
|
+
"""Node representing region using IVOA SIAv2 POS notation.
|
|
584
|
+
|
|
585
|
+
Parameters
|
|
586
|
+
----------
|
|
587
|
+
pos : `Node`
|
|
588
|
+
IVOA SIAv2 POS string representation of a region.
|
|
589
|
+
"""
|
|
590
|
+
|
|
591
|
+
def __init__(self, pos: Node):
|
|
592
|
+
super().__init__((pos,))
|
|
593
|
+
self.pos = pos
|
|
594
|
+
|
|
595
|
+
def visit(self, visitor: TreeVisitor) -> Any:
|
|
596
|
+
# Docstring inherited from Node.visit
|
|
597
|
+
pos = self.pos.visit(visitor)
|
|
598
|
+
return visitor.visitRegionNode(pos, self)
|
|
599
|
+
|
|
600
|
+
def __str__(self) -> str:
|
|
601
|
+
return f"REGION({self.pos})"
|
|
602
|
+
|
|
603
|
+
|
|
491
604
|
class GlobNode(Node):
|
|
492
605
|
"""Node representing a call to GLOB(pattern, expression) function.
|
|
493
606
|
|
|
@@ -536,11 +649,45 @@ def function_call(function: str, args: list[Node]) -> Node:
|
|
|
536
649
|
functions. Tree visitors will most likely raise an error when visiting
|
|
537
650
|
`FunctionCall` nodes.
|
|
538
651
|
"""
|
|
539
|
-
|
|
652
|
+
function_name = function.upper()
|
|
653
|
+
if function_name == "POINT":
|
|
540
654
|
if len(args) != 2:
|
|
541
655
|
raise ValueError("POINT requires two arguments (ra, dec)")
|
|
542
656
|
return PointNode(*args)
|
|
543
|
-
elif
|
|
657
|
+
elif function_name == "CIRCLE":
|
|
658
|
+
if len(args) != 3:
|
|
659
|
+
raise ValueError("CIRCLE requires three arguments (ra, dec, radius)")
|
|
660
|
+
# Check types of arguments, we want to support expressions too.
|
|
661
|
+
for name, arg in zip(("ra", "dec", "radius"), args, strict=True):
|
|
662
|
+
if not isinstance(arg, NumericLiteral | BindName | Identifier | BinaryOp | UnaryOp):
|
|
663
|
+
raise ValueError(f"CIRCLE {name} argument must be either numeric expression or bind value.")
|
|
664
|
+
return CircleNode(*args)
|
|
665
|
+
elif function_name == "BOX":
|
|
666
|
+
if len(args) != 4:
|
|
667
|
+
raise ValueError("CIRCLE requires four arguments (ra, dec, width, height)")
|
|
668
|
+
# Check types of arguments, we want to support expressions too.
|
|
669
|
+
for name, arg in zip(("ra", "dec", "width", "height"), args, strict=True):
|
|
670
|
+
if not isinstance(arg, NumericLiteral | BindName | Identifier | BinaryOp | UnaryOp):
|
|
671
|
+
raise ValueError(f"BOX {name} argument must be either numeric expression or bind value.")
|
|
672
|
+
return BoxNode(*args)
|
|
673
|
+
elif function_name == "POLYGON":
|
|
674
|
+
if len(args) % 2 != 0:
|
|
675
|
+
raise ValueError("POLYGON requires even number of arguments")
|
|
676
|
+
if len(args) < 6:
|
|
677
|
+
raise ValueError("POLYGON requires at least three vertices")
|
|
678
|
+
# Check types of arguments, we want to support expressions too.
|
|
679
|
+
for arg in args:
|
|
680
|
+
if not isinstance(arg, NumericLiteral | BindName | Identifier | BinaryOp | UnaryOp):
|
|
681
|
+
raise ValueError("POLYGON argument must be either numeric expression or bind value.")
|
|
682
|
+
vertices = list(zip(args[::2], args[1::2]))
|
|
683
|
+
return PolygonNode(vertices)
|
|
684
|
+
elif function_name == "REGION":
|
|
685
|
+
if len(args) != 1:
|
|
686
|
+
raise ValueError("REGION requires a single string argument")
|
|
687
|
+
if not isinstance(args[0], StringLiteral | BindName | Identifier):
|
|
688
|
+
raise ValueError("REGION argument must be either a string or a bind value")
|
|
689
|
+
return RegionNode(args[0])
|
|
690
|
+
elif function_name == "GLOB":
|
|
544
691
|
if len(args) != 2:
|
|
545
692
|
raise ValueError("GLOB requires two arguments (pattern, expression)")
|
|
546
693
|
expression, pattern = (_strip_parens(arg) for arg in args)
|
|
@@ -549,7 +696,7 @@ def function_call(function: str, args: list[Node]) -> Node:
|
|
|
549
696
|
if not isinstance(pattern, StringLiteral | BindName):
|
|
550
697
|
raise TypeError("glob() second argument must be a string or a bind name (prefixed with colon)")
|
|
551
698
|
return GlobNode(expression, pattern)
|
|
552
|
-
elif
|
|
699
|
+
elif function_name == "UUID":
|
|
553
700
|
if len(args) != 1:
|
|
554
701
|
raise ValueError("UUID() requires a single arguments (uuid-string)")
|
|
555
702
|
argument = _strip_parens(args[0])
|