diff --git a/graphene_django/elasticsearch/filter/filters.py b/graphene_django/elasticsearch/filter/filters.py index 2c55785..27aaca6 100644 --- a/graphene_django/elasticsearch/filter/filters.py +++ b/graphene_django/elasticsearch/filter/filters.py @@ -1,6 +1,6 @@ """Filters to ElasticSearch""" 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): @@ -31,26 +31,14 @@ class FilterES(object): self.processor = None if self.lookup_expressions: for variant in self.lookup_expressions: - if variant in PROCESSORS: - self.processor = self.build_processor(variant) - else: - raise ValueError('We do not have processor: %s.' % variant) + self.processor = ProcessorFactory.make_processor(variant, self, self.processor) 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.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): """ Generating a query based on the arguments passed to graphene field diff --git a/graphene_django/elasticsearch/filter/processors.py b/graphene_django/elasticsearch/filter/processors.py index 8a6e8e3..03acbfd 100644 --- a/graphene_django/elasticsearch/filter/processors.py +++ b/graphene_django/elasticsearch/filter/processors.py @@ -234,14 +234,31 @@ class GteProcessor(Processor): return Q("range", **{name: {'gte': value}}) -PROCESSORS = { - "contains": ContainsProcessor, - "term": TermProcessor, - "regex": RegexProcessor, - "phrase": PhraseProcessor, - "prefix": PrefixProcessor, - "in": InProcessor, - "exits": ExitsProcessor, - "lte": LteProcessor, - "gte": GteProcessor, -} +class ProcessorFactory(object): + processors = { + "contains": ContainsProcessor, + "term": TermProcessor, + "regex": RegexProcessor, + "phrase": PhraseProcessor, + "prefix": PrefixProcessor, + "in": InProcessor, + "exits": ExitsProcessor, + "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)