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 |
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 (property)
¶
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.