entries¶
BaseResourceMapper
¶
Generic Resource Mapper that defines and performs the mapping between objects in the database and the resource objects defined by the specification.
Attributes:
Name | Type | Description |
---|---|---|
ALIASES |
Tuple[Tuple[str, str]] |
a tuple of aliases between
OPTIMADE field names and the field names in the database ,
e.g. |
LENGTH_ALIASES |
Tuple[Tuple[str, str]] |
a tuple of aliases between
a field name and another field that defines its length, to be used
when querying, e.g. |
ENTRY_RESOURCE_CLASS |
Type[optimade.models.entries.EntryResource] |
The entry type that this mapper corresponds to. |
PROVIDER_FIELDS |
Tuple[str] |
a tuple of extra field names that this mapper should support when querying with the database prefix. |
TOP_LEVEL_NON_ATTRIBUTES_FIELDS |
Set[str] |
the set of top-level field names common to all endpoints. |
SUPPORTED_PREFIXES |
Set[str] |
The set of prefixes registered by this mapper. |
ALL_ATTRIBUTES |
Set[str] |
The set of attributes defined across the entry resource class and the server configuration. |
ENTRY_RESOURCE_ATTRIBUTES |
Dict[str, Any] |
A dictionary of attributes and their definitions defined by the schema of the entry resource class. |
ENDPOINT |
str |
The expected endpoint name for this resource, as defined by
the |
ENTRY_RESOURCE_CLASS
pydantic-model
¶
The base model for an entry resource.
alias_for(field)
classmethod
¶
Return aliased field name.
Deprecated
This method is deprecated could be removed without further warning. Please use
get_backend_field()
.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
field |
str |
OPTIMADE field name. |
required |
Returns:
Type | Description |
---|---|
str |
Aliased field as found in |
Source code in optimade/server/mappers/entries.py
@classmethod
def alias_for(cls, field: str) -> str:
"""Return aliased field name.
!!! warning "Deprecated"
This method is deprecated could be removed without further warning. Please use
[`get_backend_field()`][optimade.server.mappers.entries.BaseResourceMapper.get_backend_field].
Parameters:
field: OPTIMADE field name.
Returns:
Aliased field as found in [`all_aliases()`][optimade.server.mappers.entries.BaseResourceMapper.all_aliases].
"""
warnings.warn(
"The `.alias_for(...)` method is deprecated, please use `.get_backend_field(...)`.",
DeprecationWarning,
)
return cls.get_backend_field(field)
alias_of(field)
classmethod
¶
Return de-aliased field name, if it exists, otherwise return the input field name.
Deprecated
This method is deprecated could be removed without further warning. Please use
get_optimade_field()
.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
field |
str |
Field name to be de-aliased. |
required |
Returns:
Type | Description |
---|---|
str |
De-aliased field name, falling back to returning |
Source code in optimade/server/mappers/entries.py
@classmethod
def alias_of(cls, field: str) -> str:
"""Return de-aliased field name, if it exists,
otherwise return the input field name.
!!! warning "Deprecated"
This method is deprecated could be removed without further warning. Please use
[`get_optimade_field()`][optimade.server.mappers.entries.BaseResourceMapper.get_optimade_field].
Parameters:
field: Field name to be de-aliased.
Returns:
De-aliased field name, falling back to returning `field`.
"""
warnings.warn(
"The `.alias_of(...)` method is deprecated, please use `.get_optimade_field(...)`.",
DeprecationWarning,
)
return cls.get_optimade_field(field)
all_aliases()
classmethod
¶
Returns all of the associated aliases for this entry type, including those defined by the server config. The first member of each tuple is the OPTIMADE-compliant field name, the second is the backend-specific field name.
Returns:
Type | Description |
---|---|
Tuple[Tuple[str, str]] |
A tuple of alias tuples. |
Source code in optimade/server/mappers/entries.py
@classmethod
def all_aliases(cls) -> Tuple[Tuple[str, str]]:
"""Returns all of the associated aliases for this entry type,
including those defined by the server config. The first member
of each tuple is the OPTIMADE-compliant field name, the second
is the backend-specific field name.
Returns:
A tuple of alias tuples.
"""
from optimade.server.config import CONFIG
return (
tuple(
(f"_{CONFIG.provider.prefix}_{field}", field)
for field in CONFIG.provider_fields.get(cls.ENDPOINT, [])
)
+ tuple(
(f"_{CONFIG.provider.prefix}_{field}", field)
for field in cls.PROVIDER_FIELDS
)
+ tuple(CONFIG.aliases.get(cls.ENDPOINT, {}).items())
+ cls.ALIASES
)
all_length_aliases()
classmethod
¶
Returns all of the associated length aliases for this class, including those defined by the server config.
Returns:
Type | Description |
---|---|
Tuple[Tuple[str, str]] |
A tuple of length alias tuples. |
Source code in optimade/server/mappers/entries.py
@classmethod
def all_length_aliases(cls) -> Tuple[Tuple[str, str]]:
"""Returns all of the associated length aliases for this class,
including those defined by the server config.
Returns:
A tuple of length alias tuples.
"""
from optimade.server.config import CONFIG
return cls.LENGTH_ALIASES + tuple(
CONFIG.length_aliases.get(cls.ENDPOINT, {}).items()
)
get_backend_field(optimade_field)
classmethod
¶
Return the field name configured for the particular underlying database for the passed OPTIMADE field name, that would be used in an API filter.
Aliases are read from
all_aliases()
.
If a dot-separated OPTIMADE field is provided, e.g., species.mass
, only the first part will be mapped.
This means for an (OPTIMADE, DB) alias of (species
, kinds
), get_backend_fields("species.mass")
will return kinds.mass
.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
optimade_field |
str |
The OPTIMADE field to attempt to map to the backend-specific field. |
required |
Examples:
>>> get_backend_field("chemical_formula_anonymous")
'formula_anon'
>>> get_backend_field("formula_anon")
'formula_anon'
>>> get_backend_field("_exmpl_custom_provider_field")
'custom_provider_field'
Returns:
Type | Description |
---|---|
str |
The mapped field name to be used in the query to the backend. |
Source code in optimade/server/mappers/entries.py
@classmethod
def get_backend_field(cls, optimade_field: str) -> str:
"""Return the field name configured for the particular
underlying database for the passed OPTIMADE field name, that would
be used in an API filter.
Aliases are read from
[`all_aliases()`][optimade.server.mappers.entries.BaseResourceMapper.all_aliases].
If a dot-separated OPTIMADE field is provided, e.g., `species.mass`, only the first part will be mapped.
This means for an (OPTIMADE, DB) alias of (`species`, `kinds`), `get_backend_fields("species.mass")`
will return `kinds.mass`.
Arguments:
optimade_field: The OPTIMADE field to attempt to map to the backend-specific field.
Examples:
>>> get_backend_field("chemical_formula_anonymous")
'formula_anon'
>>> get_backend_field("formula_anon")
'formula_anon'
>>> get_backend_field("_exmpl_custom_provider_field")
'custom_provider_field'
Returns:
The mapped field name to be used in the query to the backend.
"""
split = optimade_field.split(".")
alias = dict(cls.all_aliases()).get(split[0], None)
if alias is not None:
return alias + ("." + ".".join(split[1:]) if len(split) > 1 else "")
return optimade_field
get_optimade_field(backend_field)
classmethod
¶
Return the corresponding OPTIMADE field name for the underlying database field, ready to be used to construct the OPTIMADE-compliant JSON response.
Aliases are read from
all_aliases()
.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
backend_field |
str |
The backend field to attempt to map to an OPTIMADE field. |
required |
Examples:
>>> get_optimade_field("chemical_formula_anonymous")
'chemical_formula_anonymous'
>>> get_optimade_field("formula_anon")
'chemical_formula_anonymous'
>>> get_optimade_field("custom_provider_field")
'_exmpl_custom_provider_field'
Returns:
Type | Description |
---|---|
str |
The mapped field name to be used in an OPTIMADE-compliant response. |
Source code in optimade/server/mappers/entries.py
@classmethod
def get_optimade_field(cls, backend_field: str) -> str:
"""Return the corresponding OPTIMADE field name for the underlying database field,
ready to be used to construct the OPTIMADE-compliant JSON response.
Aliases are read from
[`all_aliases()`][optimade.server.mappers.entries.BaseResourceMapper.all_aliases].
Arguments:
backend_field: The backend field to attempt to map to an OPTIMADE field.
Examples:
>>> get_optimade_field("chemical_formula_anonymous")
'chemical_formula_anonymous'
>>> get_optimade_field("formula_anon")
'chemical_formula_anonymous'
>>> get_optimade_field("custom_provider_field")
'_exmpl_custom_provider_field'
Returns:
The mapped field name to be used in an OPTIMADE-compliant response.
"""
return {alias: real for real, alias in cls.all_aliases()}.get(
backend_field, backend_field
)
get_required_fields()
classmethod
¶
Get REQUIRED response fields.
Returns:
Type | Description |
---|---|
set |
REQUIRED response fields. |
Source code in optimade/server/mappers/entries.py
@classmethod
def get_required_fields(cls) -> set:
"""Get REQUIRED response fields.
Returns:
REQUIRED response fields.
"""
return cls.TOP_LEVEL_NON_ATTRIBUTES_FIELDS
length_alias_for(field)
classmethod
¶
Returns the length alias for the particular field,
or None
if no such alias is found.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
field |
str |
OPTIMADE field name. |
required |
Returns:
Type | Description |
---|---|
Optional[str] |
Aliased field as found in |
Source code in optimade/server/mappers/entries.py
@classmethod
def length_alias_for(cls, field: str) -> Optional[str]:
"""Returns the length alias for the particular field,
or `None` if no such alias is found.
Parameters:
field: OPTIMADE field name.
Returns:
Aliased field as found in [`all_length_aliases()`][optimade.server.mappers.entries.BaseResourceMapper.all_length_aliases].
"""
return dict(cls.all_length_aliases()).get(field, None)
map_back(doc)
classmethod
¶
Map properties from MongoDB to OPTIMADE.
Starting from a MongoDB document doc
, map the DB fields to the corresponding OPTIMADE fields.
Then, the fields are all added to the top-level field "attributes",
with the exception of other top-level fields, defined in cls.TOP_LEVEL_NON_ATTRIBUTES_FIELDS
.
All fields not in cls.TOP_LEVEL_NON_ATTRIBUTES_FIELDS
+ "attributes" will be removed.
Finally, the type
is given the value of the specified cls.ENDPOINT
.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
doc |
dict |
A resource object in MongoDB format. |
required |
Returns:
Type | Description |
---|---|
dict |
A resource object in OPTIMADE format. |
Source code in optimade/server/mappers/entries.py
@classmethod
def map_back(cls, doc: dict) -> dict:
"""Map properties from MongoDB to OPTIMADE.
Starting from a MongoDB document `doc`, map the DB fields to the corresponding OPTIMADE fields.
Then, the fields are all added to the top-level field "attributes",
with the exception of other top-level fields, defined in `cls.TOP_LEVEL_NON_ATTRIBUTES_FIELDS`.
All fields not in `cls.TOP_LEVEL_NON_ATTRIBUTES_FIELDS` + "attributes" will be removed.
Finally, the `type` is given the value of the specified `cls.ENDPOINT`.
Parameters:
doc: A resource object in MongoDB format.
Returns:
A resource object in OPTIMADE format.
"""
mapping = ((real, alias) for alias, real in cls.all_aliases())
newdoc = {}
reals = {real for alias, real in cls.all_aliases()}
for key in doc:
if key not in reals:
newdoc[key] = doc[key]
for real, alias in mapping:
if real in doc:
newdoc[alias] = doc[real]
if "attributes" in newdoc:
raise Exception("Will overwrite doc field!")
attributes = newdoc.copy()
for field in cls.TOP_LEVEL_NON_ATTRIBUTES_FIELDS:
value = attributes.pop(field, None)
if value is not None:
newdoc[field] = value
for field in list(newdoc.keys()):
if field not in cls.TOP_LEVEL_NON_ATTRIBUTES_FIELDS:
del newdoc[field]
newdoc["type"] = cls.ENDPOINT
newdoc["attributes"] = attributes
return newdoc
classproperty
¶
A simple extension of the property decorator that binds to types rather than instances.
Modelled on this StackOverflow answer with some tweaks to allow mkdocstrings to do its thing.