3939
4040from __future__ import annotations
4141
42- from typing import Any , Dict , Iterable , List , Optional , Sequence , Union
42+ from typing import Any , Dict , Iterable , List , Optional , Union
4343
44- from .filters import FilterExpression , _format_value
44+ from . import filters
4545
4646__all__ = ["QueryBuilder" ]
4747
@@ -75,7 +75,7 @@ def __init__(self, table: str) -> None:
7575 raise ValueError ("table name is required" )
7676 self .table = table
7777 self ._select : List [str ] = []
78- self ._filter_parts : List [Union [str , FilterExpression ]] = []
78+ self ._filter_parts : List [Union [str , filters . FilterExpression ]] = []
7979 self ._orderby : List [str ] = []
8080 self ._expand : List [str ] = []
8181 self ._top : Optional [int ] = None
@@ -109,7 +109,7 @@ def filter_eq(self, column: str, value: Any) -> QueryBuilder:
109109 :param value: Value to compare against.
110110 :return: Self for method chaining.
111111 """
112- self ._filter_parts .append (f" { column . lower () } eq { _format_value ( value )} " )
112+ self ._filter_parts .append (filters . eq ( column , value ))
113113 return self
114114
115115 def filter_ne (self , column : str , value : Any ) -> QueryBuilder :
@@ -119,7 +119,7 @@ def filter_ne(self, column: str, value: Any) -> QueryBuilder:
119119 :param value: Value to compare against.
120120 :return: Self for method chaining.
121121 """
122- self ._filter_parts .append (f" { column . lower () } ne { _format_value ( value )} " )
122+ self ._filter_parts .append (filters . ne ( column , value ))
123123 return self
124124
125125 def filter_gt (self , column : str , value : Any ) -> QueryBuilder :
@@ -129,7 +129,7 @@ def filter_gt(self, column: str, value: Any) -> QueryBuilder:
129129 :param value: Value to compare against.
130130 :return: Self for method chaining.
131131 """
132- self ._filter_parts .append (f" { column . lower () } gt { _format_value ( value )} " )
132+ self ._filter_parts .append (filters . gt ( column , value ))
133133 return self
134134
135135 def filter_ge (self , column : str , value : Any ) -> QueryBuilder :
@@ -139,7 +139,7 @@ def filter_ge(self, column: str, value: Any) -> QueryBuilder:
139139 :param value: Value to compare against.
140140 :return: Self for method chaining.
141141 """
142- self ._filter_parts .append (f" { column . lower () } ge { _format_value ( value )} " )
142+ self ._filter_parts .append (filters . ge ( column , value ))
143143 return self
144144
145145 def filter_lt (self , column : str , value : Any ) -> QueryBuilder :
@@ -149,7 +149,7 @@ def filter_lt(self, column: str, value: Any) -> QueryBuilder:
149149 :param value: Value to compare against.
150150 :return: Self for method chaining.
151151 """
152- self ._filter_parts .append (f" { column . lower () } lt { _format_value ( value )} " )
152+ self ._filter_parts .append (filters . lt ( column , value ))
153153 return self
154154
155155 def filter_le (self , column : str , value : Any ) -> QueryBuilder :
@@ -159,7 +159,7 @@ def filter_le(self, column: str, value: Any) -> QueryBuilder:
159159 :param value: Value to compare against.
160160 :return: Self for method chaining.
161161 """
162- self ._filter_parts .append (f" { column . lower () } le { _format_value ( value )} " )
162+ self ._filter_parts .append (filters . le ( column , value ))
163163 return self
164164
165165 # --------------------------------------------------------- filter: string functions
@@ -171,7 +171,7 @@ def filter_contains(self, column: str, value: str) -> QueryBuilder:
171171 :param value: Substring to search for.
172172 :return: Self for method chaining.
173173 """
174- self ._filter_parts .append (f" contains({ column . lower () } , { _format_value ( value )} )" )
174+ self ._filter_parts .append (filters . contains (column , value ))
175175 return self
176176
177177 def filter_startswith (self , column : str , value : str ) -> QueryBuilder :
@@ -181,7 +181,7 @@ def filter_startswith(self, column: str, value: str) -> QueryBuilder:
181181 :param value: Prefix to match.
182182 :return: Self for method chaining.
183183 """
184- self ._filter_parts .append (f" startswith({ column . lower () } , { _format_value ( value )} )" )
184+ self ._filter_parts .append (filters . startswith (column , value ))
185185 return self
186186
187187 def filter_endswith (self , column : str , value : str ) -> QueryBuilder :
@@ -191,7 +191,7 @@ def filter_endswith(self, column: str, value: str) -> QueryBuilder:
191191 :param value: Suffix to match.
192192 :return: Self for method chaining.
193193 """
194- self ._filter_parts .append (f" endswith({ column . lower () } , { _format_value ( value )} )" )
194+ self ._filter_parts .append (filters . endswith (column , value ))
195195 return self
196196
197197 # --------------------------------------------------------- filter: null checks
@@ -202,7 +202,7 @@ def filter_null(self, column: str) -> QueryBuilder:
202202 :param column: Column name (will be lowercased).
203203 :return: Self for method chaining.
204204 """
205- self ._filter_parts .append (f" { column . lower () } eq null" )
205+ self ._filter_parts .append (filters . is_null ( column ) )
206206 return self
207207
208208 def filter_not_null (self , column : str ) -> QueryBuilder :
@@ -211,30 +211,11 @@ def filter_not_null(self, column: str) -> QueryBuilder:
211211 :param column: Column name (will be lowercased).
212212 :return: Self for method chaining.
213213 """
214- self ._filter_parts .append (f" { column . lower () } ne null" )
214+ self ._filter_parts .append (filters . is_not_null ( column ) )
215215 return self
216216
217217 # --------------------------------------------------------- filter: special
218218
219- def filter_in (self , column : str , values : Sequence [Any ]) -> QueryBuilder :
220- """Add an ``in`` filter: ``column in (val1, val2, ...)``.
221-
222- :param column: Column name (will be lowercased).
223- :param values: Non-empty list of values for the ``in`` clause.
224- :return: Self for method chaining.
225- :raises ValueError: If ``values`` is empty.
226-
227- Example::
228-
229- query = QueryBuilder("account").filter_in("statecode", [0, 1, 2])
230- # Produces: statecode in (0, 1, 2)
231- """
232- if not values :
233- raise ValueError ("filter_in requires at least one value" )
234- formatted = ", " .join (_format_value (v ) for v in values )
235- self ._filter_parts .append (f"{ column .lower ()} in ({ formatted } )" )
236- return self
237-
238219 def filter_between (self , column : str , low : Any , high : Any ) -> QueryBuilder :
239220 """Add a between filter: ``(column ge low and column le high)``.
240221
@@ -248,8 +229,7 @@ def filter_between(self, column: str, low: Any, high: Any) -> QueryBuilder:
248229 query = QueryBuilder("account").filter_between("revenue", 100000, 500000)
249230 # Produces: (revenue ge 100000 and revenue le 500000)
250231 """
251- col = column .lower ()
252- self ._filter_parts .append (f"({ col } ge { _format_value (low )} and { col } le { _format_value (high )} )" )
232+ self ._filter_parts .append (filters .between (column , low , high ))
253233 return self
254234
255235 def filter_raw (self , filter_string : str ) -> QueryBuilder :
@@ -267,12 +247,12 @@ def filter_raw(self, filter_string: str) -> QueryBuilder:
267247 "(statecode eq 0 or statecode eq 1)"
268248 )
269249 """
270- self ._filter_parts .append (filter_string )
250+ self ._filter_parts .append (filters . raw ( filter_string ) )
271251 return self
272252
273253 # ------------------------------------------------------ filter: expression tree
274254
275- def where (self , expression : FilterExpression ) -> QueryBuilder :
255+ def where (self , expression : filters . FilterExpression ) -> QueryBuilder :
276256 """Add a composable filter expression.
277257
278258 Accepts a :class:`~PowerPlatform.Dataverse.models.filters.FilterExpression`
@@ -295,7 +275,7 @@ def where(self, expression: FilterExpression) -> QueryBuilder:
295275 .where((eq("statecode", 0) | eq("statecode", 1))
296276 & gt("revenue", 100000)))
297277 """
298- if not isinstance (expression , FilterExpression ):
278+ if not isinstance (expression , filters . FilterExpression ):
299279 raise TypeError (f"where() requires a FilterExpression, got { type (expression ).__name__ } " )
300280 self ._filter_parts .append (expression )
301281 return self
@@ -376,7 +356,7 @@ def build(self) -> dict:
376356 if self ._filter_parts :
377357 parts : List [str ] = []
378358 for part in self ._filter_parts :
379- if isinstance (part , FilterExpression ):
359+ if isinstance (part , filters . FilterExpression ):
380360 parts .append (part .to_odata ())
381361 else :
382362 parts .append (part )
0 commit comments