|
7 | 7 | import codecs |
8 | 8 | import csv |
9 | 9 | from datetime import datetime, timedelta |
10 | | -from typing import List, Generator, Any |
| 10 | +from typing import List, Generator, Any, Union, Iterable |
11 | 11 |
|
12 | 12 | from influxdb_client import Dialect, IntegerLiteral, BooleanLiteral, FloatLiteral, DateTimeLiteral, StringLiteral, \ |
13 | | - VariableAssignment, Identifier, OptionStatement, File, DurationLiteral, Duration, UnaryExpression, \ |
| 13 | + VariableAssignment, Identifier, OptionStatement, File, DurationLiteral, Duration, UnaryExpression, Expression, \ |
14 | 14 | ImportDeclaration, MemberAssignment, MemberExpression, ArrayExpression |
15 | 15 | from influxdb_client import Query, QueryService |
16 | 16 | from influxdb_client.client.flux_csv_parser import FluxCsvParser, FluxSerializationMode |
@@ -203,35 +203,43 @@ def _params_to_extern_ast(params: dict) -> List['OptionStatement']: |
203 | 203 |
|
204 | 204 | statements = [] |
205 | 205 | for key, value in params.items(): |
206 | | - if value is None: |
| 206 | + expression = QueryApi._parm_to_extern_ast(value) |
| 207 | + if expression is None: |
207 | 208 | continue |
208 | 209 |
|
209 | | - if isinstance(value, bool): |
210 | | - literal = BooleanLiteral("BooleanLiteral", value) |
211 | | - elif isinstance(value, int): |
212 | | - literal = IntegerLiteral("IntegerLiteral", str(value)) |
213 | | - elif isinstance(value, float): |
214 | | - literal = FloatLiteral("FloatLiteral", value) |
215 | | - elif isinstance(value, datetime): |
216 | | - value = get_date_helper().to_utc(value) |
217 | | - literal = DateTimeLiteral("DateTimeLiteral", value.strftime('%Y-%m-%dT%H:%M:%S.%fZ')) |
218 | | - elif isinstance(value, timedelta): |
219 | | - _micro_delta = int(value / timedelta(microseconds=1)) |
220 | | - if _micro_delta < 0: |
221 | | - literal = UnaryExpression("UnaryExpression", argument=DurationLiteral("DurationLiteral", [ |
222 | | - Duration(magnitude=-_micro_delta, unit="us")]), operator="-") |
223 | | - else: |
224 | | - literal = DurationLiteral("DurationLiteral", [Duration(magnitude=_micro_delta, unit="us")]) |
225 | | - elif isinstance(value, str): |
226 | | - literal = StringLiteral("StringLiteral", str(value)) |
227 | | - else: |
228 | | - literal = value |
229 | | - |
230 | 210 | statements.append(OptionStatement("OptionStatement", |
231 | 211 | VariableAssignment("VariableAssignment", Identifier("Identifier", key), |
232 | | - literal))) |
| 212 | + expression))) |
233 | 213 | return statements |
234 | 214 |
|
| 215 | + @staticmethod |
| 216 | + def _parm_to_extern_ast(value) -> Union[Expression, None]: |
| 217 | + if value is None: |
| 218 | + return None |
| 219 | + if isinstance(value, bool): |
| 220 | + return BooleanLiteral("BooleanLiteral", value) |
| 221 | + elif isinstance(value, int): |
| 222 | + return IntegerLiteral("IntegerLiteral", str(value)) |
| 223 | + elif isinstance(value, float): |
| 224 | + return FloatLiteral("FloatLiteral", value) |
| 225 | + elif isinstance(value, datetime): |
| 226 | + value = get_date_helper().to_utc(value) |
| 227 | + return DateTimeLiteral("DateTimeLiteral", value.strftime('%Y-%m-%dT%H:%M:%S.%fZ')) |
| 228 | + elif isinstance(value, timedelta): |
| 229 | + _micro_delta = int(value / timedelta(microseconds=1)) |
| 230 | + if _micro_delta < 0: |
| 231 | + return UnaryExpression("UnaryExpression", argument=DurationLiteral("DurationLiteral", [ |
| 232 | + Duration(magnitude=-_micro_delta, unit="us")]), operator="-") |
| 233 | + else: |
| 234 | + return DurationLiteral("DurationLiteral", [Duration(magnitude=_micro_delta, unit="us")]) |
| 235 | + elif isinstance(value, str): |
| 236 | + return StringLiteral("StringLiteral", str(value)) |
| 237 | + elif isinstance(value, Iterable): |
| 238 | + return ArrayExpression("ArrayExpression", |
| 239 | + elements=list(map(lambda it: QueryApi._parm_to_extern_ast(it), value))) |
| 240 | + else: |
| 241 | + return value |
| 242 | + |
235 | 243 | @staticmethod |
236 | 244 | def _build_flux_ast(params: dict = None, profilers: List[str] = None): |
237 | 245 |
|
|
0 commit comments