Models

from typing import Any, Dict, List, Literal, Optional, Union

Order = Literal["asc", "desc"]

OrderType = Literal["count", "key"]

Type = Literal[
    "day",
    "hour",
    "minute",
    "month",
    "quater",
    "second",
    "week",
    "year",
]

UniqueAggregationType = Literal[
    "argMax",
    "avg",
    "cardinality",
    "count",
    "max",
    "min",
    "sum",
    "top_hits",
]

Condition = Literal["AND", "OR"]

Operator = Literal[
    "between",
    "equal",
    "greater",
    "greater_or_equal",
    "hasAny",
    "in",
    "last_n_days",
    "last_n_hours",
    "last_n_weeks",
    "less",
    "less_or_equal",
    "not_equal",
    "not_in",
    "starts_with",
]

EiolteUniqueAggregationType = Literal[
    "array",
    "boolean",
    "date",
    "double",
    "int",
    "long",
    "number",
    "specialString",
    "string",
]


class DbQueryAggregationFieldObject:
    property: Any
    size: int
    order: Optional[Order]
    order_type: Optional[OrderType]
    sequence: Optional[int]
    type_: Optional[str]


class DbQueryAggregationHistogramObject:
    order: Order  # pytype: disable=annotation-type-mismatch
    property: Any
    type_: Type
    interval: Optional[int]
    mindoccount: Optional[int]


class DbQueryAggregationMetricObject:
    property: Any
    type_: UniqueAggregationType
    order: Optional[str]
    sequence: Optional[str]
    size: Optional[str]


class DbQueryAggregationObject:
    field: Optional[List[DbQueryAggregationFieldObject]]
    histogram: Optional[DbQueryAggregationHistogramObject]
    metrics: Optional[List[DbQueryAggregationMetricObject]]


class DbQueryRuleObject:
    condition: Optional[Condition]
    field: Optional[Any]
    operator: Optional[Operator]
    rules: Optional[List["DbQueryRuleObject"]]
    type_: Optional[EiolteUniqueAggregationType]
    value: Optional[List[str]]


class DbQuerySpecObject:
    rules: List[DbQueryRuleObject]
    condition: Optional[Condition]
    field: Optional[Any]
    operator: Optional[Operator]
    type_: Optional[EiolteUniqueAggregationType]
    value: Optional[List[str]]


class DbQuerySortObject:
    field: Any
    order: Order  # pytype: disable=annotation-type-mismatch
    type_: Optional[EiolteUniqueAggregationType]


class StatisticsDbQueryParam:
    """
    Statistics search DB Query JSON object
    """

    aggregation: Optional[DbQueryAggregationObject]
    category: Optional[str]
    fields: Optional[List[Any]]
    plot_data: Optional[List[str]]
    query: Optional[DbQuerySpecObject]
    size: Optional[int]
    sort: Optional[List[DbQuerySortObject]]