From 4547ca9cdb6b92257637323c7f17a9ecf6921975 Mon Sep 17 00:00:00 2001 From: esoteric-ephemera Date: Fri, 3 Apr 2026 09:09:38 -0700 Subject: [PATCH 1/3] add sorting to some endpoints --- .../emmet/api/query_operator/pagination.py | 7 +++++-- .../insertion_electrodes/resources.py | 20 +++++++++++++++++-- .../materials/robocrys/query_operators.py | 4 ++-- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/emmet-api/emmet/api/query_operator/pagination.py b/emmet-api/emmet/api/query_operator/pagination.py index ca22ced9d6..f218fd1dae 100644 --- a/emmet-api/emmet/api/query_operator/pagination.py +++ b/emmet-api/emmet/api/query_operator/pagination.py @@ -3,11 +3,14 @@ from emmet.api.query_operator import QueryOperator from emmet.api.utils import STORE_PARAMS +DEFAULT_LIMIT: int = 100 +MAX_LIMIT: int = 1000 + class AtlasPaginationQuery(QueryOperator): """Query operators to provides pagination for Atlas Search queries.""" - def __init__(self, default_limit: int = 100, max_limit: int = 1000): + def __init__(self, default_limit: int = DEFAULT_LIMIT, max_limit: int = MAX_LIMIT): """ Args: default_limit: the default number of documents to return @@ -71,7 +74,7 @@ def meta(self) -> dict: class PaginationQuery(QueryOperator): """Query operators to provides Pagination.""" - def __init__(self, default_limit: int = 100, max_limit: int = 1000): + def __init__(self, default_limit: int = DEFAULT_LIMIT, max_limit: int = MAX_LIMIT): """ Args: default_limit: the default number of documents to return diff --git a/emmet-api/emmet/api/routes/materials/insertion_electrodes/resources.py b/emmet-api/emmet/api/routes/materials/insertion_electrodes/resources.py index c05c8d12e6..9929f6f132 100644 --- a/emmet-api/emmet/api/routes/materials/insertion_electrodes/resources.py +++ b/emmet-api/emmet/api/routes/materials/insertion_electrodes/resources.py @@ -1,9 +1,13 @@ -from emmet.api.query_operator.dynamic import NumericQuery +from emmet.api.query_operator import ( + NumericQuery, + PaginationQuery, + SortQuery, + SparseFieldsQuery, +) from emmet.api.resource import ReadOnlyResource from emmet.core.electrode import InsertionElectrodeDoc from emmet.api.core.global_header import GlobalHeaderProcessor -from emmet.api.query_operator import PaginationQuery, SparseFieldsQuery from emmet.api.routes.materials.insertion_electrodes.query_operators import ( ElectrodeFormulaQuery, ElectrodeElementsQuery, @@ -14,6 +18,17 @@ from emmet.api.core.settings import MAPISettings +sort_fields = [ + "max_delta_volume", + "average_voltage", + "capacity_grav", + "capacity_vol", + "energy_grav", + "energy_vol", + "stability_charge", + "stability_discharge", +] + def insertion_electrodes_resource(insertion_electrodes_store): resource = ReadOnlyResource( @@ -31,6 +46,7 @@ def insertion_electrodes_resource(insertion_electrodes_store): InsertionElectrodeDoc, default_fields=["battery_id", "last_updated"], ), + SortQuery(fields=sort_fields, max_num=1), ], header_processor=GlobalHeaderProcessor(), tags=["Materials Electrodes"], diff --git a/emmet-api/emmet/api/routes/materials/robocrys/query_operators.py b/emmet-api/emmet/api/routes/materials/robocrys/query_operators.py index ac7d44fbde..b4c22a07e3 100644 --- a/emmet-api/emmet/api/routes/materials/robocrys/query_operators.py +++ b/emmet-api/emmet/api/routes/materials/robocrys/query_operators.py @@ -5,7 +5,7 @@ class RoboTextSearchQuery(QueryOperator): """ - Method to generate a robocrystallographer text search query + Method to generate a robocrystallographer text search query. """ def query( @@ -32,7 +32,7 @@ def query( "path": "description", "allowAnalyzedField": True, }, - "sort": {"score": {"$meta": "searchScore"}, "description": 1}, + "sort": {"score": {"$meta": "searchScore"}, "material_id": 1}, "count": {"type": "total"}, } }, From 40575a35259066cbd60f1664cd1c7e5958c4cc60 Mon Sep 17 00:00:00 2001 From: esoteric-ephemera Date: Tue, 7 Apr 2026 13:24:26 -0700 Subject: [PATCH 2/3] fix robocrys test --- emmet-api/tests/materials/robocrys/test_query_operators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emmet-api/tests/materials/robocrys/test_query_operators.py b/emmet-api/tests/materials/robocrys/test_query_operators.py index 9eeae07a35..6a205a3e37 100644 --- a/emmet-api/tests/materials/robocrys/test_query_operators.py +++ b/emmet-api/tests/materials/robocrys/test_query_operators.py @@ -13,7 +13,7 @@ def test_robocrys_search_query(): "path": "description", "allowAnalyzedField": True, }, - "sort": {"score": {"$meta": "searchScore"}, "description": 1}, + "sort": {"score": {"$meta": "searchScore"}, "material_id": 1}, "count": {"type": "total"}, } }, From 2f879ce13eef2f0dbaa1a9d634c7bb8c0541378c Mon Sep 17 00:00:00 2001 From: esoteric-ephemera Date: Tue, 7 Apr 2026 14:22:00 -0700 Subject: [PATCH 3/3] add sorting for other explorer endpoints --- emmet-api/emmet/api/routes/legacy/jcesr/resources.py | 10 +++++++++- .../materials/insertion_electrodes/resources.py | 1 + .../emmet/api/routes/materials/xas/resources.py | 11 ++++++++++- .../emmet/api/routes/molecules/summary/resources.py | 12 +++++++++++- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/emmet-api/emmet/api/routes/legacy/jcesr/resources.py b/emmet-api/emmet/api/routes/legacy/jcesr/resources.py index d5aa1bbc5c..31b1395442 100644 --- a/emmet-api/emmet/api/routes/legacy/jcesr/resources.py +++ b/emmet-api/emmet/api/routes/legacy/jcesr/resources.py @@ -1,7 +1,7 @@ from emmet.api.resource import ReadOnlyResource from emmet.core.molecules_jcesr import MoleculesDoc -from emmet.api.query_operator import PaginationQuery, SparseFieldsQuery +from emmet.api.query_operator import PaginationQuery, SortQuery, SparseFieldsQuery from emmet.api.routes.legacy.jcesr.query_operators import ( MoleculeBaseQuery, MoleculeElementsQuery, @@ -11,6 +11,13 @@ from emmet.api.core.global_header import GlobalHeaderProcessor from emmet.api.core.settings import MAPISettings +JCESR_SORT_FIELDS = [ + "task_id", + "EA", + "IE", + "charge", +] + def jcesr_resource(molecules_store): resource = ReadOnlyResource( @@ -22,6 +29,7 @@ def jcesr_resource(molecules_store): MoleculeFormulaQuery(), MultipleTaskIDsQuery(), PaginationQuery(), + SortQuery(fields=JCESR_SORT_FIELDS, max_num=1), SparseFieldsQuery(MoleculesDoc, default_fields=["task_id"]), ], header_processor=GlobalHeaderProcessor(), diff --git a/emmet-api/emmet/api/routes/materials/insertion_electrodes/resources.py b/emmet-api/emmet/api/routes/materials/insertion_electrodes/resources.py index 9929f6f132..ae59f2195b 100644 --- a/emmet-api/emmet/api/routes/materials/insertion_electrodes/resources.py +++ b/emmet-api/emmet/api/routes/materials/insertion_electrodes/resources.py @@ -19,6 +19,7 @@ from emmet.api.core.settings import MAPISettings sort_fields = [ + "battery_id", "max_delta_volume", "average_voltage", "capacity_grav", diff --git a/emmet-api/emmet/api/routes/materials/xas/resources.py b/emmet-api/emmet/api/routes/materials/xas/resources.py index 77b4945c3f..fac281332c 100644 --- a/emmet-api/emmet/api/routes/materials/xas/resources.py +++ b/emmet-api/emmet/api/routes/materials/xas/resources.py @@ -1,7 +1,7 @@ from emmet.api.resource import ReadOnlyResource from emmet.core.xas import XASDoc -from emmet.api.query_operator import PaginationQuery, SparseFieldsQuery +from emmet.api.query_operator import PaginationQuery, SortQuery, SparseFieldsQuery from emmet.api.routes.materials.materials.query_operators import MultiMaterialIDQuery from emmet.api.routes.materials.materials.query_operators import ( ElementsQuery, @@ -12,6 +12,14 @@ from emmet.api.routes.materials.xas.query_operators import XASQuery, XASIDQuery from emmet.api.core.settings import MAPISettings +XAS_SORT_FIELDS = [ + "material_id", + "absorbing_element", + "edge", + "spectrum_type", + "spectrum_id", +] + def xas_resource(xas_store): resource = ReadOnlyResource( @@ -37,6 +45,7 @@ def xas_resource(xas_store): "last_updated", ], ), + SortQuery(fields=XAS_SORT_FIELDS, max_num=1), ], header_processor=GlobalHeaderProcessor(), tags=["Materials XAS"], diff --git a/emmet-api/emmet/api/routes/molecules/summary/resources.py b/emmet-api/emmet/api/routes/molecules/summary/resources.py index d9cd1fc193..d79e410b98 100644 --- a/emmet-api/emmet/api/routes/molecules/summary/resources.py +++ b/emmet-api/emmet/api/routes/molecules/summary/resources.py @@ -2,8 +2,9 @@ from emmet.api.query_operator import ( PaginationQuery, - SparseFieldsQuery, NumericQuery, + SortQuery, + SparseFieldsQuery, ) from emmet.api.resource import ReadOnlyResource from emmet.api.routes.molecules.molecules.query_operators import ( @@ -22,6 +23,14 @@ timeout = MAPISettings().TIMEOUT +MOLECULES_SUMMARY_SORT_FIELDS = [ + "molecule_id", + "redox.NONE.electron_affinity", + "redox.NONE.ionization_energy", + "charge", + "spin_multiplicity", +] + def summary_resource(summary_store): resource = ReadOnlyResource( @@ -43,6 +52,7 @@ def summary_resource(summary_store): "nelements", ], ), + SortQuery(fields=MOLECULES_SUMMARY_SORT_FIELDS, max_num=1), SparseFieldsQuery(MoleculeSummaryDoc, default_fields=["molecule_id"]), ], hint_scheme=SummaryHintScheme(),