Skip to content

Commit 6a2acef

Browse files
committed
Generate query classes from query names, include all the queries
1 parent 2bffd04 commit 6a2acef

File tree

1 file changed

+59
-33
lines changed

1 file changed

+59
-33
lines changed

elasticsearch_dsl/query.py

Lines changed: 59 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -44,32 +44,6 @@ def __or__(self, other):
4444

4545
EMPTY_QUERY = MatchAll()
4646

47-
class Match(Query):
48-
name = 'match'
49-
50-
class MultiMatch(Query):
51-
name = 'multi_match'
52-
53-
class QueryString(Query):
54-
name = 'query_string'
55-
56-
class Fuzzy(Query):
57-
name = 'fuzzy'
58-
59-
class Prefix(Query):
60-
name = 'prefix'
61-
62-
class Term(Query):
63-
name = 'term'
64-
65-
class HasChild(Query):
66-
name = 'has_child'
67-
_param_defs = {'query': {'type': 'query'}}
68-
69-
class HasParent(Query):
70-
name = 'has_parent'
71-
_param_defs = {'query': {'type': 'query'}}
72-
7347
class Bool(BoolMixin, Query):
7448
name = 'bool'
7549
_param_defs = {
@@ -81,13 +55,6 @@ class Bool(BoolMixin, Query):
8155
# register this as Bool for Query
8256
Query._bool = Bool
8357

84-
class Filtered(Query):
85-
name = 'filtered'
86-
_param_defs = {
87-
'query': {'type': 'query'},
88-
'filter': {'type': 'filter'},
89-
}
90-
9158
class FunctionScore(Query):
9259
name = 'function_score'
9360
_param_defs = {
@@ -105,3 +72,62 @@ def __init__(self, **kwargs):
10572
if name in kwargs:
10673
fns.append({name: kwargs.pop(name)})
10774
super(FunctionScore, self).__init__(**kwargs)
75+
76+
QUERIES = (
77+
# compound queries
78+
('boosting', {'positive': {'type': 'query'}, 'negative': {'type': 'query'}}),
79+
('constant_score', {'query': {'type': 'query'}, 'filter': {'type': 'filter'}}),
80+
('dis_max', {'queries': {'type': 'query', 'multi': True}}),
81+
('filtered', {'query': {'type': 'query'}, 'filter': {'type': 'filter'}}),
82+
('indices', {'query': {'type': 'query'}, 'no_match_query': {'type': 'query'}}),
83+
84+
# relationship queries
85+
('nested', {'query': {'type': 'query'}}),
86+
('has_child', {'query': {'type': 'query'}}),
87+
('has_parent', {'query': {'type': 'query'}}),
88+
('top_children', {'query': {'type': 'query'}}),
89+
90+
# compount span queries
91+
('span_first', {'match': {'type': 'query'}}),
92+
('span_multi', {'match': {'type': 'query'}}),
93+
('span_near', {'clauses': {'type': 'query', 'multi': True}}),
94+
('span_not', {'exclude': {'type': 'query'}, 'include': {'type': 'query'}}),
95+
('span_or', {'clauses': {'type': 'query', 'multi': True}}),
96+
97+
# core queries
98+
('common_terms', None),
99+
('fuzzy', None),
100+
('fuzzy_like_this', None),
101+
('fuzzy_like_this_field', None),
102+
('geo_shape', None),
103+
('ids', None),
104+
('match', None),
105+
('more_like_this', None),
106+
('more_like_this_field', None),
107+
('multi_match', None),
108+
('prefix', None),
109+
('query_string', None),
110+
('range', None),
111+
('regexp', None),
112+
('simple_query_string', None),
113+
('span_term', None),
114+
('template', None),
115+
('term', None),
116+
('terms', None),
117+
('wildcard', None),
118+
)
119+
120+
def _make_query_class(name, params_def=None):
121+
"""
122+
Generate a query class based on the name of the query and it's parameters
123+
"""
124+
attrs = {'name': name}
125+
if params_def:
126+
attrs['_param_defs'] = params_def
127+
cls_name = ''.join(s.title() for s in name.split('_'))
128+
globals()[cls_name] = type(cls_name, (Query, ), attrs)
129+
130+
# generate the query classes dynamicaly
131+
for qname, params_def in QUERIES:
132+
_make_query_class(qname, params_def)
133+

0 commit comments

Comments
 (0)