|
1 | | -from typing import List, Dict, Optional |
| 1 | +from typing import List, Dict, Optional, Union |
2 | 2 | from .tables import ITablesSnapshot |
3 | 3 | from .field_name import field_name, expression_name |
4 | 4 | from .ast import ( |
|
11 | 11 | From, |
12 | 12 | SelectField, |
13 | 13 | Where, |
| 14 | + Wildcard, |
14 | 15 | GroupBy, |
15 | 16 | FunctionCallExpression, |
16 | 17 | Command, |
|
22 | 23 | IsExpression, |
23 | 24 | FalseExpression, |
24 | 25 | TrueExpression, |
25 | | - Wildcard, |
26 | 26 | OrderBy, |
27 | 27 | MinusExpression, |
28 | 28 | MultiplyExpression, |
|
33 | 33 | GreaterThanOrEqualExpression, |
34 | 34 | LessThanExpression, |
35 | 35 | LessThanOrEqualExpression, |
36 | | - Wildcard, |
37 | 36 | Limit, |
38 | 37 | ) |
39 | 38 | from dataclasses import dataclass |
@@ -355,6 +354,10 @@ def apply_expression(expression: Expression, ctx: dict): |
355 | 354 | raise ValueError(f"Unknown function: {expression.name}") |
356 | 355 | elif isinstance(expression, NullExpression): |
357 | 356 | return None |
| 357 | + elif isinstance(expression, FalseExpression): |
| 358 | + return False |
| 359 | + elif isinstance(expression, TrueExpression): |
| 360 | + return True |
358 | 361 | elif isinstance(expression, IsExpression): |
359 | 362 | left_value = apply_expression(expression.left, ctx) |
360 | 363 | right_value = apply_expression(expression.right, ctx) |
@@ -503,15 +506,20 @@ def has_aggregation_fields(fields: List[SelectField]) -> bool: |
503 | 506 |
|
504 | 507 |
|
505 | 508 | def apply_select_fields(fields: List[SelectField], data: List[dict], ctx: dict): |
506 | | - return [ |
507 | | - { |
508 | | - field_name(field) or field.expression: apply_expression( |
509 | | - field.expression, {**ctx, **row} |
510 | | - ) |
511 | | - for field in fields |
512 | | - } |
513 | | - for row in data |
514 | | - ] |
| 509 | + result = [] |
| 510 | + for row in data: |
| 511 | + result_row = {} |
| 512 | + for field in fields: |
| 513 | + if isinstance(field.expression, Wildcard): |
| 514 | + result_row.update(row) |
| 515 | + elif isinstance(field.expression, Expression): |
| 516 | + result_row[field_name(field)] = apply_expression( |
| 517 | + field.expression, {**ctx, **row} |
| 518 | + ) |
| 519 | + else: |
| 520 | + raise ValueError(f"Unsupported field type: {type(field)}") |
| 521 | + result.append(result_row) |
| 522 | + return result |
515 | 523 |
|
516 | 524 |
|
517 | 525 | def apply_from( |
|
0 commit comments