|
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