httk.serve.optimade.backend¶
Public backend adapters, stores, and filter translation helpers.
Submodules¶
- httk.serve.optimade.backend.adapter
- httk.serve.optimade.backend.execution
- httk.serve.optimade.backend.handlers
- httk.serve.optimade.backend.memory_store
- httk.serve.optimade.backend.partial
- httk.serve.optimade.backend.protocols
- httk.serve.optimade.backend.providers
- httk.serve.optimade.backend.stores
- httk.serve.optimade.backend.translation
Classes¶
Bind a store to the OPTIMADE entry endpoints it serves. |
|
Describe one queryable source behind an OPTIMADE entry endpoint. |
|
Results of a query over one or more searchers. |
|
Provide a store over dictionary rows. |
|
Describe one list axis of a |
|
Describe a property value provided lazily, one slice at a time. |
|
The callback seam through which the request engine runs queries on a backend. |
|
The results of a query against a backend, as consumed by the entry endpoints. |
|
Serve one data federation per OPTIMADE entry type. |
Functions¶
|
Execute a translated query across the adapter's sources. |
|
Build a |
Return the registered entry-provider factories keyed by their registered name. |
|
|
Build a lazy OPTIMADE adapter from every described family in one store. |
|
Build a lazy store-backed adapter from durable entry sources. |
|
Build one searcher per entry source, with the filter applied to each. |
|
Translate one filter node against an OPTIMADE entry-info property mapping. |
Package Contents¶
- class httk.serve.optimade.backend.BackendAdapter[source]¶
Bind a store to the OPTIMADE entry endpoints it serves.
sourcesmaps entry endpoint names (e.g.'structures') to the sources queried for that endpoint; an endpoint with several sources (e.g. several calculation result types) is queried across all of them.schemais required: it declares the served entry types and properties.field_handlersmaps each entry type to its filter-handler table. When omitted (left empty) it is derived fromschemaviasimple_property_handlers(), using an identity property-key map (each property is filtered against a backend field of the same name); a backend whose field names differ, or that wants finer control, supplies its own tables instead.- Parameters:
store – Store implementing the neutral query protocol.
sources – Queryable sources keyed by entry endpoint.
schema – Required schema describing served entries and properties.
field_handlers – Optional filter handlers keyed by entry endpoint.
- store: httk.store.query.Store¶
- field_handlers: collections.abc.Mapping[str, httk.store.query.optimade_filters.HandlerTable]¶
- class httk.serve.optimade.backend.EntrySource[source]¶
Describe one queryable source behind an OPTIMADE entry endpoint.
targetis what gets passed tosearcher.variable();fieldsmaps OPTIMADE response-field names to extractors applied to matched row objects.relationships, when set, is an extractor mapping a matched row to a dictionary keyed by related entry type, each value a list of{'id': str, 'description': str?, 'role': str?}dictionaries.sort_keysmaps response-field names to the backend field names to sort on.property_metadatamaps response-field names to extractors returning the per-property metadata dictionary for a matched row (orNonewhen there is no metadata for that row).- Parameters:
target – Store-specific target passed to
searcher.variable.fields – Response-field extractors applied to matched rows.
sort_keys – Response-field to backend-sort-field mappings.
relationships – Optional extractor for related-resource data.
property_metadata – Optional per-property metadata extractors.
- target: Any¶
- fields: collections.abc.Mapping[str, FieldExtractor]¶
- sort_keys: collections.abc.Mapping[str, str]¶
- relationships: FieldExtractor | None = None¶
- property_metadata: collections.abc.Mapping[str, FieldExtractor]¶
- class httk.serve.optimade.backend.StoreResults(pairs, response_fields, unknown_response_fields, limit, offset, total_count, recognized_prefixes)[source]¶
Results of a query over one or more searchers.
Implements the
QueryResultsprotocol. Iteration yields oneResultRowper entry, whose values map response-field names to values extracted from the matched row objects.- Parameters:
pairs (list[tuple[httk.serve.optimade.backend.adapter.EntrySource, httk.store.query.Searcher]]) – Sources and already-configured searchers to iterate.
unknown_response_fields (list[str]) – Unknown fields to return as null.
limit (int | None) – Maximum number of results to yield.
offset (int) – Number of results to skip.
total_count (int) – Total matches before pagination.
recognized_prefixes (tuple[str, Ellipsis]) – Prefixes for dynamic row attributes.
- pairs¶
- recognized_prefixes¶
- limit¶
- response_fields¶
- unknown_response_fields¶
- offset¶
- more_data_available = True¶
- httk.serve.optimade.backend.execute_query(adapter, entries, response_fields, unknown_response_fields, response_limit, response_offset, filter_ast=None, *, sort=None, debug=False)[source]¶
Execute a translated query across the adapter’s sources.
- Parameters:
adapter (httk.serve.optimade.backend.adapter.BackendAdapter) – Backend adapter providing sources and schema.
unknown_response_fields (list[str]) – Unknown fields to return as null.
response_limit (int | None) – Maximum number of returned rows.
response_offset (int | None) – Number of matching rows to skip.
filter_ast (httk.core.optimade.FilterAst | None) – Parsed filter, when one was requested.
sort (collections.abc.Sequence[tuple[str, bool]] | None) – Fields and directions to sort by.
debug (bool) – Enable backend diagnostics.
- Returns:
Lazy results for the requested page.
- Raises:
httk.serve.optimade.model.errors.TranslatorError – If sorting across multiple sources is requested.
- Return type:
- class httk.serve.optimade.backend.InMemoryStore(tables)[source]¶
Provide a store over dictionary rows.
- tables¶
- searcher(*, as_of=None)[source]¶
Create a searcher over this store’s tables.
- Parameters:
as_of (object) – Optional historic timestamp cutoff; unsupported here.
- Returns:
Fresh in-memory searcher.
- Raises:
ValueError – If a historic cutoff is requested.
- Return type:
- class httk.serve.optimade.backend.PartialDimension[source]¶
Describe one list axis of a
PartialValue.lengthis the number of items along the axis (Nonewhen unknown or entry-dependent and not declared).sliceableindicates whether the server can honour a slice request for this axis.- Parameters:
name – Dimension name used in response metadata.
length – Number of items, or
Nonewhen unknown.sliceable – Whether the server accepts slices on this axis.
- class httk.serve.optimade.backend.PartialValue[source]¶
Describe a property value provided lazily, one slice at a time.
fetchtakes a tuple of Python slices (one per dimension, with the usual exclusive stop) and returns the corresponding nested lists.- Parameters:
dimensions – Axes describing the value.
fetch – Slice retrieval operation.
- dimensions: tuple[PartialDimension, Ellipsis]¶
- fetch: collections.abc.Callable[[tuple[slice, Ellipsis]], Any]¶
- class httk.serve.optimade.backend.QueryFunction[source]¶
Bases:
ProtocolThe callback seam through which the request engine runs queries on a backend.
- class httk.serve.optimade.backend.QueryResults[source]¶
Bases:
ProtocolThe results of a query against a backend, as consumed by the entry endpoints.
Iteration yields one
ResultRowper entry; itsvaluesmap OPTIMADE response-field names to values, and theidandtypekeys are always present.
- httk.serve.optimade.backend.adapter_from_providers(providers, **options)[source]¶
Build a
BackendAdapterserving the given entry providers.Every provider’s
entry_types()become served entry types (described by theirEntryTypeDefinition), itsproperty_keys()name the served subset and drive both the filter handlers (viasimple_property_handlers()) and the response-field extractors, and itsrecords()are loaded into anInMemoryStore. Every served property MUST be described by the entry type’s definition (a custom property must therefore live in anextended()definition); aValueErrornames any offender. All served properties beyondid/typeare marked default-response. Extra keywordoptions(e.g.sortable,recognized_prefixes) are forwarded tobuild_served_schema(); every served property is sortable-capable, since the provider’s property-key map is passed through as the source’ssort_keys.Declared relationships (
relationships()) are fully auto-wired for serving and filtering: for each entry type with declared relationships, a synthetic__rel_<related_type>id-list field is materialized on EVERY row of that entry type (an empty list when the row has no related entries of that type, so inverse set semantics are well-defined), and a'<related_type>.id'entry built withrelationship_id_handler()is merged into the entry type’s derived filter-handler table (never overwriting an entry already present, mirroring howBackendAdapterrespects explicitly supplied handler tables).<related_type>.id HAS ...filters — and, through the related-property resolver oftranslate_filter(), depth-1 relationship-property filters such asreferences.doi CONTAINS "10.1"— therefore work without any hand-wiring.- Parameters:
providers (collections.abc.Iterable[httk.core.EntryProvider]) – Generic entry providers supplying definitions, keys, records, and relationships.
**options (Any) – Schema options forwarded to
build_served_schema().
- Returns:
Fully wired in-memory backend adapter.
- Raises:
ValueError – If provider keys or served properties are invalid.
- Return type:
- httk.serve.optimade.backend.providers_from_registry()[source]¶
Return the registered entry-provider factories keyed by their registered name.
Resolves each factory registered via
httk.core.register_entry_provider()(throughhttk.registry.*self-registration) into a callable. Providers need data, so applications instantiate them:providers_from_registry()["atomistic-structures"](data).- Returns:
Registered provider factories keyed by registry name.
- Return type:
dict[str, collections.abc.Callable[Ellipsis, httk.core.EntryProvider]]
- class httk.serve.optimade.backend.StoredBackendAdapter[source]¶
Serve one data federation per OPTIMADE entry type.
- Parameters:
federations – Durable federations keyed by entry endpoint.
schema – Schema describing the federations’ served entries.
- federations: collections.abc.Mapping[str, Any]¶
- snapshot_cutoff_ns(entry_type, now_ns)[source]¶
Return the resolution-aware snapshot cutoff for one entry type.
- httk.serve.optimade.backend.adapter_from_store(store, **options)[source]¶
Build a lazy OPTIMADE adapter from every described family in one store.
Families declared without an entry-type definition are deliberately ignored. This lets application-specific records, such as DSP publication declarations, coexist with OPTIMADE records in one durable layout.
- Parameters:
store (httk.store.EntryStore) – Entry store whose configured layout is discovered.
**options (Any) – Schema options forwarded to
adapter_from_stores().
- Returns:
Lazy adapter over all configured OPTIMADE families.
- Raises:
TypeError – If
storedoes not implementEntryStore.ValueError – If the store contains no OPTIMADE-described family.
- Return type:
- httk.serve.optimade.backend.adapter_from_stores(sources, **options)[source]¶
Build a lazy store-backed adapter from durable entry sources.
Sources with the same exact logical family are federated under one entry endpoint. The data layer owns all source/backing traversal and global pagination; this adapter advertises the family’s definition and turns only the returned page into OPTIMADE result rows.
- Parameters:
sources (collections.abc.Sequence[httk.store.db.StoredEntrySource]) – Durable entry sources to federate by entry type.
**options (Any) – Schema options forwarded to
build_served_schema().
- Returns:
Lazy adapter over the supplied durable sources.
- Raises:
ValueError – If sources conflict or expose incomplete sort mappings.
TypeError – If a source is not a stored entry source.
- Return type:
- httk.serve.optimade.backend.translate_filter(filter_ast, entries, adapter, sort=None)[source]¶
Build one searcher per entry source, with the filter applied to each.
Relationship-property filters (dotted identifiers over served entry types) are resolved through the adapter’s related-property resolver (built by
_related_property_resolver), so filteringreferences.doibehaves exactly like filtering/referencesdirectly.- Parameters:
filter_ast (httk.core.optimade.FilterAst | None) – Parsed filter, or
Nonefor an unfiltered query.adapter (httk.serve.optimade.backend.adapter.BackendAdapter) – Backend adapter supplying sources and handlers.
sort (collections.abc.Sequence[tuple[str, bool]] | None) – Response fields and descending flags for sorting.
- Returns:
Source/searcher pairs with the filter and sort applied.
- Raises:
httk.serve.optimade.model.errors.TranslatorError – If the filter cannot be translated.
- Return type:
list[tuple[httk.serve.optimade.backend.adapter.EntrySource, httk.store.query.Searcher]]
- httk.serve.optimade.backend.translate_filter_node(node, search_variable, entry, entry_info, handlers, recognized_prefixes, served_entries=())[source]¶
Translate one filter node against an OPTIMADE entry-info property mapping.
An OPTIMADE-side adaptation of
translate_filter_ast():entry_infomaps property names to their property dictionaries (only their'fulltype'keys are read) rather than straight to fulltypes,served_entriesnames the relationship targets, and failures surface asTranslatorErrorinstead of the upstream neutralFilterTranslationError.No related-property resolver is threaded through, so relationship-property filters other than
<type>.id HAS ...raise a not-implemented (501) error. Usetranslate_filter()(which builds the resolver from its adapter) for full relationship-property filtering.- Parameters:
node (httk.core.optimade.FilterAst) – Filter node to translate.
search_variable (httk.store.query.SearchVariable) – Backend variable used by the expression.
entry (str) – Entry endpoint being filtered.
entry_info (collections.abc.Mapping[str, Any]) – Simplified property metadata for the entry.
handlers (httk.store.query.optimade_filters.HandlerTable) – Property handlers used for translation.
recognized_prefixes (tuple[str, Ellipsis]) – Property-definition prefixes accepted by the filter.
served_entries (tuple[str, Ellipsis]) – Entry types available as relationship targets.
- Returns:
Backend search expression.
- Raises:
httk.serve.optimade.model.errors.TranslatorError – If the filter cannot be translated.
- Return type: