mirror of
https://github.com/graphql-python/graphene-django.git
synced 2025-07-13 17:52:19 +03:00
change decorator of query generator by a observable of processors
This commit is contained in:
parent
721894fe1a
commit
fa0de7b334
|
@ -51,13 +51,12 @@ class FilterES(object):
|
||||||
processor_class = PROCESSORS[variant]
|
processor_class = PROCESSORS[variant]
|
||||||
return processor_class(self, self.processor)
|
return processor_class(self, self.processor)
|
||||||
|
|
||||||
def generate_es_query(self, arguments):
|
def attach_processor(self, observer):
|
||||||
"""
|
"""
|
||||||
Generating a query based on the arguments passed to graphene field
|
Generating a query based on the arguments passed to graphene field
|
||||||
:param arguments: parameters of the query.
|
:param observer: observer to attach the processors.
|
||||||
:return: Returns a elasticsearch_dsl.Q query object.
|
|
||||||
"""
|
"""
|
||||||
return self.processor.generate_es_query(arguments)
|
return self.processor.to_attach(observer)
|
||||||
|
|
||||||
|
|
||||||
class StringFilterES(FilterES):
|
class StringFilterES(FilterES):
|
||||||
|
|
|
@ -10,6 +10,7 @@ from django.utils import six
|
||||||
from django_filters.utils import try_dbfield
|
from django_filters.utils import try_dbfield
|
||||||
from django_filters.filterset import BaseFilterSet
|
from django_filters.filterset import BaseFilterSet
|
||||||
|
|
||||||
|
from graphene_django.elasticsearch.filter.observable import FieldResolverObservable
|
||||||
from .filters import StringFilterES, FilterES, BoolFilterES, NumberFilterES
|
from .filters import StringFilterES, FilterES, BoolFilterES, NumberFilterES
|
||||||
|
|
||||||
# Basic conversion from ES fields to FilterES fields
|
# Basic conversion from ES fields to FilterES fields
|
||||||
|
@ -153,12 +154,13 @@ class FilterSetESMetaclass(type):
|
||||||
meta_filters = mcs.get_meta_filters(new_class._meta)
|
meta_filters = mcs.get_meta_filters(new_class._meta)
|
||||||
|
|
||||||
declared_filters.update(meta_filters)
|
declared_filters.update(meta_filters)
|
||||||
new_class.filters_es = declared_filters
|
|
||||||
|
|
||||||
# recollecting registered graphene fields
|
# recollecting registered graphene fields and attaching to observable
|
||||||
base_filters = OrderedDict()
|
base_filters = OrderedDict()
|
||||||
|
observable = FieldResolverObservable()
|
||||||
for filter_name, filter_field in six.iteritems(declared_filters):
|
for filter_name, filter_field in six.iteritems(declared_filters):
|
||||||
base_filters.update(filter_field.fields)
|
base_filters.update(filter_field.fields)
|
||||||
|
filter_field.attach_processor(observable)
|
||||||
|
|
||||||
# adding sort field
|
# adding sort field
|
||||||
sort_fields = {}
|
sort_fields = {}
|
||||||
|
@ -169,6 +171,7 @@ class FilterSetESMetaclass(type):
|
||||||
|
|
||||||
new_class.sort_fields = sort_fields
|
new_class.sort_fields = sort_fields
|
||||||
new_class.base_filters = base_filters
|
new_class.base_filters = base_filters
|
||||||
|
new_class.observable = observable
|
||||||
|
|
||||||
return new_class
|
return new_class
|
||||||
|
|
||||||
|
@ -380,13 +383,13 @@ class FilterSetES(six.with_metaclass(FilterSetESMetaclass, object)):
|
||||||
# if the query have data
|
# if the query have data
|
||||||
if len(self.data):
|
if len(self.data):
|
||||||
# for each field passed to the query
|
# for each field passed to the query
|
||||||
for name, filter in six.iteritems(self.filters_es):
|
for name, value in six.iteritems(self.data):
|
||||||
# If a target filter is en FilterEs
|
# ignore sort field
|
||||||
if isinstance(filter, FilterES):
|
if name == "sort":
|
||||||
# It is generated a query or response None if the filter don't have data
|
continue
|
||||||
query_filter = filter.generate_es_query(self.data)
|
|
||||||
|
|
||||||
if query_filter is not None:
|
# dispatch observable resolve
|
||||||
query_base += query_filter
|
resolve = self.observable.resolve(name, value)
|
||||||
|
query_base += resolve
|
||||||
|
|
||||||
return query_base
|
return query_base
|
||||||
|
|
18
graphene_django/elasticsearch/filter/observable.py
Normal file
18
graphene_django/elasticsearch/filter/observable.py
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
|
||||||
|
class FieldResolverObservable(object):
|
||||||
|
"""Observable to attach processor by field and resolve it with the field value"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
"""A new Observable by filterset"""
|
||||||
|
super(FieldResolverObservable).__init__()
|
||||||
|
self._fields = {}
|
||||||
|
|
||||||
|
def attach(self, field, processor):
|
||||||
|
"""Add processor to fields"""
|
||||||
|
self._fields[field] = processor
|
||||||
|
|
||||||
|
def resolve(self, field, value):
|
||||||
|
"""Execute processor of the specific field with the value"""
|
||||||
|
if field in self._fields:
|
||||||
|
processor = self._fields[field]
|
||||||
|
return processor.build_query(value)
|
|
@ -33,24 +33,15 @@ class Processor(object):
|
||||||
"""Define the argument for graphene field"""
|
"""Define the argument for graphene field"""
|
||||||
return self.filter_es.argument
|
return self.filter_es.argument
|
||||||
|
|
||||||
def generate_es_query(self, data):
|
def to_attach(self, observer):
|
||||||
"""
|
"""
|
||||||
Define the argument for graphene field
|
Add this processor to FieldResolverObservable
|
||||||
:param data: Data passed to field in the query
|
:param observer: observer to attach the processors.
|
||||||
"""
|
"""
|
||||||
if self.variant_name in data:
|
observer.attach(self.variant_name, self)
|
||||||
value = data.get(self.variant_name)
|
|
||||||
self_query = self._build_query(value)
|
|
||||||
else:
|
|
||||||
self_query = Q("bool")
|
|
||||||
|
|
||||||
if self.parent_processor is not None:
|
if self.parent_processor is not None:
|
||||||
parent_query = self.parent_processor.generate_es_query(data)
|
self.parent_processor.to_attach(observer)
|
||||||
parent_query += self_query
|
|
||||||
return parent_query
|
|
||||||
|
|
||||||
else:
|
|
||||||
return self_query
|
|
||||||
|
|
||||||
def _build_field(self):
|
def _build_field(self):
|
||||||
"""
|
"""
|
||||||
|
@ -74,7 +65,7 @@ class Processor(object):
|
||||||
|
|
||||||
return variant_name
|
return variant_name
|
||||||
|
|
||||||
def _build_query(self, value):
|
def build_query(self, value):
|
||||||
"""
|
"""
|
||||||
Make a query based on specific processor query
|
Make a query based on specific processor query
|
||||||
:param value: Value passed to this processor
|
:param value: Value passed to this processor
|
||||||
|
|
Loading…
Reference in New Issue
Block a user