Source code for graphene_elastic.filter_backends.queries

import graphene
from ..enums import NoValue

__author__ = "Artur Barseghyan <artur.barseghyan@gmail.com>"
__copyright__ = "2019-2022 Artur Barseghyan"
__license__ = "GPL-2.0-only OR LGPL-2.1-or-later"
__all__ = (
    'Contains',
    'Direction',
    'EndsWith',
    'Exclude',
    'Exists',
    'GeoBoundingBox',
    'GeoDistance',
    'GeoPolygon',
    'Gt',
    'Gte',
    'In',
    'IsNull',
    'Lt',
    'Lte',
    'Point',
    'Prefix',
    'Range',
    'StartsWith',
    'Term',
    'Terms',
    'Wildcard',
)


class _ListOfTypeString(graphene.List):
    """List of type string."""

    required = True

    def __init__(self, *args, **kwargs):
        super(_ListOfTypeString, self).__init__(
            of_type=graphene.String,
            *args,
            **kwargs
        )


_number_or_date_types = (
    graphene.Decimal,
    graphene.Float,
    graphene.Int,
    graphene.Date,
    graphene.DateTime,
)


class _NumberOrDate(graphene.InputObjectType):
    """Number or Date."""

    decimal = graphene.Decimal(required=False)
    float = graphene.Float(required=False)
    int = graphene.Int(required=False)
    datetime = graphene.DateTime(required=False)
    date = graphene.Date(required=False)

# ***************************************************************
# ************************* Filtering ***************************
# ***************************************************************


[docs]class Term(graphene.String): """Terms. filter:[ {category: {term: "Python"}]}} ] """ required = True
[docs]class Terms(_ListOfTypeString): """Terms. filter:[ {category: {terms: ["Python", "Django"]}} ] """
[docs]class Range(graphene.InputObjectType): """Range. filter:[ {range: {lower: "1000", upper: "2000", boost: "2.0"}]}} ] """ lower = graphene.Field(_NumberOrDate, required=True) upper = graphene.Field(_NumberOrDate) boost = graphene.Decimal()
[docs]class Exists(graphene.Boolean): """Exists. filter:[ {category: {exist: true}]}} ] """ required = True
[docs]class Prefix(graphene.String): """Prefix. filter:[ {category: {prefix: "bio"}]}} ] """ required = True
[docs]class StartsWith(Prefix): """Starts with (alias of prefix)."""
[docs]class Wildcard(graphene.String): """Wildcard. filter:[ {category: {wildcard: "*bio*"}]}} ] """ required = True
[docs]class GeoDistance(graphene.InputObjectType): """Geo distance. filter:[ {place: {geoDistance: {distance: "9km", lat: "40.0", lon="70.0"}}} ] """ distance = graphene.String(required=True) lat = graphene.Decimal(required=True) lon = graphene.Decimal(required=True)
[docs]class Point(graphene.InputObjectType): """Point. Helper for many geo lookups.""" lat = graphene.Decimal(required=True) lon = graphene.Decimal(required=True)
[docs]class GeoPolygon(graphene.InputObjectType): """Geo polygon. filter:[ {place: {geoPolygon: {points: [{lat: "40.0", lon="70.0"}]}}} ] """ points = graphene.List(Point, required=True)
[docs]class GeoBoundingBox(graphene.InputObjectType): """Geo polygon. filter:[ {place: {geoBoundingBox: { topLeft: {lat: "40.0", lon="70.0"}, bottomRight: {lat: "80.0", lon: "90.0"} }}} ] """ top_left = graphene.Field(Point, required=True) bottom_right = graphene.Field(Point, required=True)
[docs]class Contains(graphene.String): """Wildcard. filter:[ {category: {contains: "lish"}]}} ] """ required = True
[docs]class In(_ListOfTypeString): """In. filter:[ {category: {in: ["Python", "Django"]}} ] """
[docs]class Gt(_NumberOrDate): """Gt. filter:[ {category: {gt: "1"}]}} ] """ class Meta: types = list(_number_or_date_types) required = True
[docs]class Gte(_NumberOrDate): """Gte. filter:[ {category: {gte: "1"}]}} ] """ class Meta: types = list(_number_or_date_types) required = True
[docs]class Lt(_NumberOrDate): """Lt. filter:[ {category: {lt: "1"}]}} ] """ class Meta: types = list(_number_or_date_types) required = True
[docs]class Lte(_NumberOrDate): """Lte. filter:[ {category: {lte: "1"}]}} ] """ class Meta: types = list(_number_or_date_types) required = True
[docs]class EndsWith(graphene.String): """Ends with. filter:[ {category: {endsWith: "dren"}]}} ] """ required = True
[docs]class IsNull(graphene.Boolean): """Is null. filter:[ {category: {isNull: true}]}} ] """ required = True
[docs]class Exclude(_ListOfTypeString): """Exclude. filter:[ {category: {exclude: ["Python", "Django"]}} ] """
# *************************************************************** # ************************** Ordering *************************** # *************************************************************** @graphene.Enum.from_enum class Direction(NoValue): """Ordering direction.""" ASC = 'asc' DESC = 'desc'