create a ProcessorFactory

This commit is contained in:
Alejandro Nunez Capote 2019-06-10 12:15:14 -04:00
parent fa0de7b334
commit 3778806bae
2 changed files with 31 additions and 26 deletions

View File

@ -1,6 +1,6 @@
"""Filters to ElasticSearch""" """Filters to ElasticSearch"""
from graphene import String, Boolean, Int from graphene import String, Boolean, Int
from graphene_django.elasticsearch.filter.processors import PROCESSORS from graphene_django.elasticsearch.filter.processors import ProcessorFactory
class FilterES(object): class FilterES(object):
@ -31,26 +31,14 @@ class FilterES(object):
self.processor = None self.processor = None
if self.lookup_expressions: if self.lookup_expressions:
for variant in self.lookup_expressions: for variant in self.lookup_expressions:
if variant in PROCESSORS: self.processor = ProcessorFactory.make_processor(variant, self, self.processor)
self.processor = self.build_processor(variant)
else:
raise ValueError('We do not have processor: %s.' % variant)
else: else:
self.processor = self.build_processor(self.default_processor) self.processor = ProcessorFactory.make_processor(self.default_processor, self, self.processor)
self.argument = argument or self.default_argument self.argument = argument or self.default_argument
self.fields = self.processor.generate_field() self.fields = self.processor.generate_field()
def build_processor(self, variant):
"""
Create a new processor based on the name
:param variant: Processor name
:return: Returns a Processor instance
"""
processor_class = PROCESSORS[variant]
return processor_class(self, self.processor)
def attach_processor(self, observer): 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

View File

@ -234,14 +234,31 @@ class GteProcessor(Processor):
return Q("range", **{name: {'gte': value}}) return Q("range", **{name: {'gte': value}})
PROCESSORS = { class ProcessorFactory(object):
"contains": ContainsProcessor, processors = {
"term": TermProcessor, "contains": ContainsProcessor,
"regex": RegexProcessor, "term": TermProcessor,
"phrase": PhraseProcessor, "regex": RegexProcessor,
"prefix": PrefixProcessor, "phrase": PhraseProcessor,
"in": InProcessor, "prefix": PrefixProcessor,
"exits": ExitsProcessor, "in": InProcessor,
"lte": LteProcessor, "exits": ExitsProcessor,
"gte": GteProcessor, "lte": LteProcessor,
} "gte": GteProcessor,
}
@classmethod
def make_processor(cls, variant, filter_es, parent_processor):
"""
Create a new processor based on the name
:param variant: Processor name
:param filter_es: Target filter
:param parent_processor: Parent in the chain
:return: Returns a Processor instance
"""
if variant in cls.processors:
processor_class = cls.processors[variant]
return processor_class(filter_es, parent_processor)
else:
raise ValueError('We do not have processor: %s.' % variant)