Skip to content

Commit a39de83

Browse files
committed
Field name
1 parent 36e3fdc commit a39de83

3 files changed

Lines changed: 60 additions & 6 deletions

File tree

json_sql/apply.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from typing import List, Dict, Optional
22
from .tables import ITablesSnapshot
3+
from .field_name import field_name
34
from .ast import (
45
Expression,
56
StringExpression,
@@ -195,7 +196,9 @@ def apply_limit(limit: Limit, data: List[dict], ctx: dict):
195196
def apply_select_fields(fields: List[SelectField], data: List[dict], ctx: dict):
196197
return [
197198
{
198-
field.alias: apply_expression(field.expression, {**ctx, **row})
199+
field_name(field) or field.expression: apply_expression(
200+
field.expression, {**ctx, **row}
201+
)
199202
for field in fields
200203
}
201204
for row in data

json_sql/cli.py

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
from typing import List
21
from pathlib import Path
3-
from json_sql.tables import FileSystemTables, Table
4-
from json import loads
5-
from eval import eval_sql
2+
from .tables import FileSystemTables
3+
from .eval import eval_sql
4+
from argparse import ArgumentParser
5+
from csv import DictWriter
6+
from sys import stdout
7+
from json import dumps
68

79

810
def query(code: str, workdir: Path, ctx: dict):
@@ -11,4 +13,40 @@ def query(code: str, workdir: Path, ctx: dict):
1113
return result
1214

1315

14-
def help(): ...
16+
if __name__ == "__main__":
17+
parser = ArgumentParser(description="Run SQL queries on JSON files.")
18+
parser.add_argument("code", type=str, help="SQL query to execute")
19+
parser.add_argument(
20+
"--workdir",
21+
type=Path,
22+
default=Path.cwd(),
23+
help="Directory containing JSON files",
24+
)
25+
parser.add_argument(
26+
"--ctx",
27+
type=str,
28+
default="{}",
29+
help="Context for the query (default: empty dictionary)",
30+
)
31+
parser.add_argument(
32+
"--format",
33+
type=str,
34+
default="json",
35+
choices=["json", "csv"],
36+
help="Output format (default: json)",
37+
)
38+
args = parser.parse_args()
39+
40+
result = query(code=args.code, workdir=args.workdir, ctx={})
41+
42+
if args.format == "json":
43+
print(dumps(result, indent=2))
44+
elif args.format == "csv":
45+
if len(result) == 0:
46+
print("No results to write to CSV.")
47+
else:
48+
keys = result[0].keys()
49+
writer = DictWriter(stdout, fieldnames=keys)
50+
writer.writeheader()
51+
for row in result:
52+
writer.writerow(row)

json_sql/field_name.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from .ast import SelectField, NameExpression
2+
3+
4+
def field_name(field: SelectField) -> str:
5+
"""
6+
Get the field name from a SelectField object.
7+
"""
8+
if field.alias:
9+
return field.alias
10+
elif isinstance(field.expression, NameExpression):
11+
return field.expression.name
12+
else:
13+
return "?column?"

0 commit comments

Comments
 (0)