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
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
class Search(BaseModel):
    """A general coordinated OPTIMADE search

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

    """

    query_parameters: Annotated[
        OptimadeQueryParameters,
        Field(
            description=(
                "OPTIMADE query parameters for entry listing endpoints used for this "
                "query."
            ),
        ),
    ] = OptimadeQueryParameters()

    database_ids: Annotated[
        set[str],
        Field(
            description=(
                "A list of registered database IDs. Go to `/databases` to get all "
                "registered databases."
            ),
        ),
    ] = set()

    optimade_urls: Annotated[
        list[AnyUrl],
        Field(
            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: Annotated[
        str,
        Field(
            description=(
                "The entry endpoint queried. According to the OPTIMADE specification, "
                "this is the same as the resource's type."
            ),
        ),
    ] = "structures"

    @model_validator(mode="after")
    def either_ids_or_urls(self) -> Search:
        """Either `database_ids` or `optimade_urls` must be defined"""
        if not any(getattr(self, field) for field in ("database_ids", "optimade_urls")):
            raise ValueError(
                "Either 'database_ids' or 'optimade_urls' MUST be specified."
            )
        return self

    @field_validator("query_parameters", mode="after")
    @classmethod
    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: Annotated[set[str], Field(description='A list of registered database IDs. Go to `/databases` to get all registered databases.')] = set() class-attribute instance-attribute

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

optimade_urls: Annotated[list[AnyUrl], Field(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 instance-attribute

query_parameters: Annotated[OptimadeQueryParameters, Field(description='OPTIMADE query parameters for entry listing endpoints used for this query.')] = OptimadeQueryParameters() class-attribute instance-attribute

either_ids_or_urls()

Either database_ids or optimade_urls must be defined

Source code in optimade_gateway/models/search.py
67
68
69
70
71
72
73
74
@model_validator(mode="after")
def either_ids_or_urls(self) -> Search:
    """Either `database_ids` or `optimade_urls` must be defined"""
    if not any(getattr(self, field) for field in ("database_ids", "optimade_urls")):
        raise ValueError(
            "Either 'database_ids' or 'optimade_urls' MUST be specified."
        )
    return self

sort_not_supported(value) classmethod

Warn and reset value if sort is supplied.

Source code in optimade_gateway/models/search.py
76
77
78
79
80
81
82
83
84
85
@field_validator("query_parameters", mode="after")
@classmethod
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