@@ -63,6 +63,11 @@ class InstrumentedExpression:
63
63
def __init__ (self , expr : str ):
64
64
self ._expr = expr
65
65
66
+ def _render_value (self , value : Any ):
67
+ if isinstance (value , InstrumentedExpression ):
68
+ return str (value )
69
+ return json .dumps (value )
70
+
66
71
def __str__ (self ) -> str :
67
72
return self ._expr
68
73
@@ -76,61 +81,127 @@ def __neg__(self) -> "InstrumentedExpression":
76
81
return InstrumentedExpression (f"-({ self ._expr } )" )
77
82
78
83
def __eq__ (self , value : Any ) -> "InstrumentedExpression" : # type: ignore[override]
79
- return InstrumentedExpression (f"{ self ._expr } == { json . dumps (value )} " )
84
+ return InstrumentedExpression (f"{ self ._expr } == { self . _render_value (value )} " )
80
85
81
86
def __ne__ (self , value : Any ) -> "InstrumentedExpression" : # type: ignore[override]
82
- return InstrumentedExpression (f"{ self ._expr } != { json . dumps (value )} " )
87
+ return InstrumentedExpression (f"{ self ._expr } != { self . _render_value (value )} " )
83
88
84
89
def __lt__ (self , value : Any ) -> "InstrumentedExpression" :
85
- return InstrumentedExpression (f"{ self ._expr } < { json . dumps (value )} " )
90
+ return InstrumentedExpression (f"{ self ._expr } < { self . _render_value (value )} " )
86
91
87
92
def __gt__ (self , value : Any ) -> "InstrumentedExpression" :
88
- return InstrumentedExpression (f"{ self ._expr } > { json . dumps (value )} " )
93
+ return InstrumentedExpression (f"{ self ._expr } > { self . _render_value (value )} " )
89
94
90
95
def __le__ (self , value : Any ) -> "InstrumentedExpression" :
91
- return InstrumentedExpression (f"{ self ._expr } <= { json . dumps (value )} " )
96
+ return InstrumentedExpression (f"{ self ._expr } <= { self . _render_value (value )} " )
92
97
93
98
def __ge__ (self , value : Any ) -> "InstrumentedExpression" :
94
- return InstrumentedExpression (f"{ self ._expr } >= { json . dumps (value )} " )
99
+ return InstrumentedExpression (f"{ self ._expr } >= { self . _render_value (value )} " )
95
100
96
101
def __add__ (self , value : Any ) -> "InstrumentedExpression" :
97
- return InstrumentedExpression (f"{ self ._expr } + { json . dumps (value )} " )
102
+ return InstrumentedExpression (f"{ self ._expr } + { self . _render_value (value )} " )
98
103
99
104
def __radd__ (self , value : Any ) -> "InstrumentedExpression" :
100
- return InstrumentedExpression (f"{ json . dumps (value )} + { self ._expr } " )
105
+ return InstrumentedExpression (f"{ self . _render_value (value )} + { self ._expr } " )
101
106
102
107
def __sub__ (self , value : Any ) -> "InstrumentedExpression" :
103
- return InstrumentedExpression (f"{ self ._expr } - { json . dumps (value )} " )
108
+ return InstrumentedExpression (f"{ self ._expr } - { self . _render_value (value )} " )
104
109
105
110
def __rsub__ (self , value : Any ) -> "InstrumentedExpression" :
106
- return InstrumentedExpression (f"{ json . dumps (value )} - { self ._expr } " )
111
+ return InstrumentedExpression (f"{ self . _render_value (value )} - { self ._expr } " )
107
112
108
113
def __mul__ (self , value : Any ) -> "InstrumentedExpression" :
109
- return InstrumentedExpression (f"{ self ._expr } * { json . dumps (value )} " )
114
+ return InstrumentedExpression (f"{ self ._expr } * { self . _render_value (value )} " )
110
115
111
116
def __rmul__ (self , value : Any ) -> "InstrumentedExpression" :
112
- return InstrumentedExpression (f"{ json . dumps (value )} * { self ._expr } " )
117
+ return InstrumentedExpression (f"{ self . _render_value (value )} * { self ._expr } " )
113
118
114
119
def __truediv__ (self , value : Any ) -> "InstrumentedExpression" :
115
- return InstrumentedExpression (f"{ self ._expr } / { json . dumps (value )} " )
120
+ return InstrumentedExpression (f"{ self ._expr } / { self . _render_value (value )} " )
116
121
117
122
def __rtruediv__ (self , value : Any ) -> "InstrumentedExpression" :
118
- return InstrumentedExpression (f"{ json . dumps (value )} / { self ._expr } " )
123
+ return InstrumentedExpression (f"{ self . _render_value (value )} / { self ._expr } " )
119
124
120
125
def __mod__ (self , value : Any ) -> "InstrumentedExpression" :
121
- return InstrumentedExpression (f"{ self ._expr } % { json . dumps (value )} " )
126
+ return InstrumentedExpression (f"{ self ._expr } % { self . _render_value (value )} " )
122
127
123
128
def __rmod__ (self , value : Any ) -> "InstrumentedExpression" :
124
- return InstrumentedExpression (f"{ json .dumps (value )} % { self ._expr } " )
129
+ return InstrumentedExpression (f"{ self ._render_value (value )} % { self ._expr } " )
130
+
131
+ def is_null (self ):
132
+ """Compare the expression against NULL."""
133
+ return InstrumentedExpression (f"{ self ._expr } IS NULL" )
134
+
135
+ def is_not_null (self ):
136
+ """Compare the expression against NOT NULL."""
137
+ return InstrumentedExpression (f"{ self ._expr } IS NOT NULL" )
138
+
139
+ def in_ (self , * values : Any ):
140
+ """Test if the expression equals one of the given values."""
141
+ rendered_values = ", " .join ([f"{ value } " for value in values ])
142
+ return InstrumentedExpression (f"{ self ._expr } IN ({ rendered_values } )" )
143
+
144
+ def like (self , * patterns : str ):
145
+ """Filter the expression using a string pattern."""
146
+ if len (patterns ) == 1 :
147
+ return InstrumentedExpression (f'{ self ._expr } LIKE { self ._render_value (patterns [0 ])} ' )
148
+ else :
149
+ return InstrumentedExpression (f'{ self ._expr } LIKE ({ ", " .join ([self ._render_value (p ) for p in patterns ])} )' )
150
+
151
+ def rlike (self , * patterns : str ):
152
+ """Filter the expression using a regular expression."""
153
+ if len (patterns ) == 1 :
154
+ return InstrumentedExpression (f'{ self ._expr } RLIKE { self ._render_value (patterns [0 ])} ' )
155
+ else :
156
+ return InstrumentedExpression (f'{ self ._expr } RLIKE ({ ", " .join ([self ._render_value (p ) for p in patterns ])} )' )
157
+
158
+ def match (self , query ):
159
+ """Perform a match query on the field."""
160
+ return InstrumentedExpression (f"{ self ._expr } :{ self ._render_value (query )} " )
161
+
162
+ def asc (self ) -> "InstrumentedExpression" :
163
+ """Return the field name representation for ascending sort order.
164
+
165
+ For use in ES|QL queries only.
166
+ """
167
+ return InstrumentedExpression (f"{ self ._expr } ASC" )
168
+
169
+ def desc (self ) -> "InstrumentedExpression" :
170
+ """Return the field name representation for descending sort order.
171
+
172
+ For use in ES|QL queries only.
173
+ """
174
+ return InstrumentedExpression (f"{ self ._expr } DESC" )
175
+
176
+ def nulls_first (self ) -> "InstrumentedExpression" :
177
+ """Return the field name representation for nulls first sort order.
178
+
179
+ For use in ES|QL queries only.
180
+ """
181
+ return InstrumentedExpression (f"{ self ._expr } NULLS FIRST" )
182
+
183
+ def nulls_last (self ) -> "InstrumentedExpression" :
184
+ """Return the field name representation for nulls last sort order.
185
+
186
+ For use in ES|QL queries only.
187
+ """
188
+ return InstrumentedExpression (f"{ self ._expr } NULLS LAST" )
125
189
126
190
def where (
127
- self , expr : Union [str , "InstrumentedExpression" ]
191
+ self , * expressions : Union [str , "InstrumentedExpression" ]
128
192
) -> "InstrumentedExpression" :
129
193
"""Add a condition to be met for the row to be included.
130
194
131
195
Use only in expressions given in the ``STATS`` command.
132
196
"""
133
- return InstrumentedExpression (f"{ self ._expr } WHERE { expr } " )
197
+ if len (expressions ) == 1 :
198
+ return InstrumentedExpression (f"{ self ._expr } WHERE { expressions [0 ]} " )
199
+ else :
200
+ return InstrumentedExpression (
201
+ f'{ self ._expr } WHERE { " AND " .join ([f"({ expr } )" for expr in expressions ])} ' )
202
+
203
+
204
+ E = InstrumentedExpression
134
205
135
206
136
207
class InstrumentedField (InstrumentedExpression ):
@@ -178,34 +249,6 @@ def __neg__(self) -> str: # type: ignore[override]
178
249
"""Return the field name representation for descending sort order"""
179
250
return f"-{ self ._expr } "
180
251
181
- def asc (self ) -> "InstrumentedField" :
182
- """Return the field name representation for ascending sort order.
183
-
184
- For use in ES|QL queries only.
185
- """
186
- return InstrumentedField (f"{ self ._expr } ASC" , None )
187
-
188
- def desc (self ) -> "InstrumentedField" :
189
- """Return the field name representation for descending sort order.
190
-
191
- For use in ES|QL queries only.
192
- """
193
- return InstrumentedField (f"{ self ._expr } DESC" , None )
194
-
195
- def nulls_first (self ) -> "InstrumentedField" :
196
- """Return the field name representation for nulls first sort order.
197
-
198
- For use in ES|QL queries only.
199
- """
200
- return InstrumentedField (f"{ self ._expr } NULLS FIRST" , None )
201
-
202
- def nulls_last (self ) -> "InstrumentedField" :
203
- """Return the field name representation for nulls last sort order.
204
-
205
- For use in ES|QL queries only.
206
- """
207
- return InstrumentedField (f"{ self ._expr } NULLS LAST" , None )
208
-
209
252
def __str__ (self ) -> str :
210
253
return self ._expr
211
254
0 commit comments