Skip to content

search

Pydantic models/schemas for the Search resource.

Search

Bases: BaseModel

A general coordinated OPTIMADE search

Important

Either database_ids or optimade_urls MUST be specified.

Source code in optimade_gateway/models/search.py
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
class Search(BaseModel):
    """A general coordinated OPTIMADE search

    !!! important
        Either `database_ids` or `optimade_urls` MUST be specified.

    """

    query_parameters: OptimadeQueryParameters = Field(
        {},
        description=(
            "OPTIMADE query parameters for entry listing endpoints used for this query."
        ),
    )
    database_ids: Set[str] = Field(
        set(),
        description=(
            "A list of registered database IDs. Go to `/databases` to get all registered"
            " databases."
        ),
    )
    optimade_urls: Set[AnyUrl] = Field(
        set(),
        description=(
            "A list of OPTIMADE base URLs. If a versioned base URL is supplied it will be"
            " used as is, as long as it represents a supported version. If an "
            "un-versioned base URL, standard version negotiation will be conducted to get"
            " the versioned base URL, which will be used as long as it represents a "
            "supported version. Note, a single URL can be supplied as well, and it will "
            "automatically be wrapped in a list in the server logic."
        ),
    )
    endpoint: str = Field(
        "structures",
        description=(
            "The entry endpoint queried. According to the OPTIMADE specification, this is"
            " the same as the resource's type."
        ),
    )

    @root_validator
    def either_ids_or_urls(cls, values: dict) -> dict:
        """Either `database_ids` or `optimade_urls` must be defined"""
        if not any(values.get(field) for field in ("database_ids", "optimade_urls")):
            raise ValueError(
                "Either 'database_ids' or 'optimade_urls' MUST be specified."
            )
        return values

    @validator("query_parameters")
    def sort_not_supported(
        cls, value: OptimadeQueryParameters
    ) -> OptimadeQueryParameters:
        """Warn and reset value if `sort` is supplied."""
        if value.sort:
            warnings.warn(SortNotSupported())
            value.sort = None
        return value

database_ids: Set[str] = Field(set(), description='A list of registered database IDs. Go to `/databases` to get all registered databases.') class-attribute

endpoint: str = Field('structures', description="The entry endpoint queried. According to the OPTIMADE specification, this is the same as the resource's type.") class-attribute

optimade_urls: Set[AnyUrl] = Field(set(), description='A list of OPTIMADE base URLs. If a versioned base URL is supplied it will be used as is, as long as it represents a supported version. If an un-versioned base URL, standard version negotiation will be conducted to get the versioned base URL, which will be used as long as it represents a supported version. Note, a single URL can be supplied as well, and it will automatically be wrapped in a list in the server logic.') class-attribute

query_parameters: OptimadeQueryParameters = Field({}, description='OPTIMADE query parameters for entry listing endpoints used for this query.') class-attribute

either_ids_or_urls(values)

Either database_ids or optimade_urls must be defined

Source code in optimade_gateway/models/search.py
52
53
54
55
56
57
58
59
@root_validator
def either_ids_or_urls(cls, values: dict) -> dict:
    """Either `database_ids` or `optimade_urls` must be defined"""
    if not any(values.get(field) for field in ("database_ids", "optimade_urls")):
        raise ValueError(
            "Either 'database_ids' or 'optimade_urls' MUST be specified."
        )
    return values

sort_not_supported(value)

Warn and reset value if sort is supplied.

Source code in optimade_gateway/models/search.py
61
62
63
64
65
66
67
68
69
@validator("query_parameters")
def sort_not_supported(
    cls, value: OptimadeQueryParameters
) -> OptimadeQueryParameters:
    """Warn and reset value if `sort` is supplied."""
    if value.sort:
        warnings.warn(SortNotSupported())
        value.sort = None
    return value