@@ -63,6 +63,11 @@ class InstrumentedExpression:
6363 def __init__ (self , expr : str ):
6464 self ._expr = expr
6565
66+ def _render_value (self , value : Any ):
67+ if isinstance (value , InstrumentedExpression ):
68+ return str (value )
69+ return json .dumps (value )
70+
6671 def __str__ (self ) -> str :
6772 return self ._expr
6873
@@ -76,61 +81,127 @@ def __neg__(self) -> "InstrumentedExpression":
7681 return InstrumentedExpression (f"-({ self ._expr } )" )
7782
7883 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 )} " )
8085
8186 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 )} " )
8388
8489 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 )} " )
8691
8792 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 )} " )
8994
9095 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 )} " )
9297
9398 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 )} " )
95100
96101 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 )} " )
98103
99104 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 } " )
101106
102107 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 )} " )
104109
105110 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 } " )
107112
108113 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 )} " )
110115
111116 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 } " )
113118
114119 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 )} " )
116121
117122 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 } " )
119124
120125 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 )} " )
122127
123128 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" )
125189
126190 def where (
127- self , expr : Union [str , "InstrumentedExpression" ]
191+ self , * expressions : Union [str , "InstrumentedExpression" ]
128192 ) -> "InstrumentedExpression" :
129193 """Add a condition to be met for the row to be included.
130194
131195 Use only in expressions given in the ``STATS`` command.
132196 """
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
134205
135206
136207class InstrumentedField (InstrumentedExpression ):
@@ -178,34 +249,6 @@ def __neg__(self) -> str: # type: ignore[override]
178249 """Return the field name representation for descending sort order"""
179250 return f"-{ self ._expr } "
180251
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-
209252 def __str__ (self ) -> str :
210253 return self ._expr
211254
0 commit comments