@@ -46,29 +46,29 @@ def test_insert_json(faux_conn, metadata, json_table, json_data):
46
46
47
47
48
48
@pytest .mark .parametrize (
49
- "path,sql, literal_sql" ,
49
+ "path,literal_sql" ,
50
50
(
51
51
(
52
52
["name" ],
53
- "JSON_QUERY(`json_table`.`cart`, %(cart_1:STRING)s)" ,
54
53
"JSON_QUERY(`json_table`.`cart`, '$.\" name\" ')" ,
55
54
),
56
55
(
57
56
["items" , 0 ],
58
- "JSON_QUERY(`json_table`.`cart`, %(cart_1:STRING)s)" ,
59
57
"JSON_QUERY(`json_table`.`cart`, '$.\" items\" [0]')" ,
60
58
),
61
59
(
62
60
["items" , 0 , "price" ],
63
- "JSON_QUERY(`json_table`.`cart`, %(cart_1:STRING)s)" ,
64
61
'JSON_QUERY(`json_table`.`cart`, \' $."items"[0]."price"\' )' ,
65
62
),
66
63
),
67
64
)
68
- def test_json_query (faux_conn , json_column , path , sql , literal_sql ):
65
+ def test_json_query (faux_conn , json_column , path , literal_sql ):
69
66
expr = sqlalchemy .select (json_column [path ])
70
67
71
- expected_sql = f"SELECT { sql } AS `anon_1` \n FROM `json_table`"
68
+ expected_sql = (
69
+ "SELECT JSON_QUERY(`json_table`.`cart`, %(cart_1:STRING)s) AS `anon_1` \n "
70
+ "FROM `json_table`"
71
+ )
72
72
expected_literal_sql = f"SELECT { literal_sql } AS `anon_1` \n FROM `json_table`"
73
73
74
74
actual_sql = expr .compile (faux_conn ).string
@@ -85,8 +85,16 @@ def test_json_value(faux_conn, json_column, json_data):
85
85
sqlalchemy .func .JSON_VALUE (json_column [["name" ]]) == "Alice"
86
86
)
87
87
88
- expected_sql = "SELECT JSON_QUERY(`json_table`.`cart`, %(cart_1:STRING)s) AS `first_item` \n FROM `json_table` \n WHERE JSON_VALUE(JSON_QUERY(`json_table`.`cart`, %(cart_2:STRING)s)) = %(JSON_VALUE_1:STRING)s"
89
- expected_literal_sql = "SELECT JSON_QUERY(`json_table`.`cart`, '$.\" items\" [0]') AS `first_item` \n FROM `json_table` \n WHERE JSON_VALUE(JSON_QUERY(`json_table`.`cart`, '$.\" name\" ')) = 'Alice'"
88
+ expected_sql = (
89
+ "SELECT JSON_QUERY(`json_table`.`cart`, %(cart_1:STRING)s) AS `first_item` \n "
90
+ "FROM `json_table` \n "
91
+ "WHERE JSON_VALUE(JSON_QUERY(`json_table`.`cart`, %(cart_2:STRING)s)) = %(JSON_VALUE_1:STRING)s"
92
+ )
93
+ expected_literal_sql = (
94
+ "SELECT JSON_QUERY(`json_table`.`cart`, '$.\" items\" [0]') AS `first_item` \n "
95
+ "FROM `json_table` \n "
96
+ "WHERE JSON_VALUE(JSON_QUERY(`json_table`.`cart`, '$.\" name\" ')) = 'Alice'"
97
+ )
90
98
91
99
actual_sql = expr .compile (faux_conn ).string
92
100
actual_literal_sql = expr .compile (
@@ -118,12 +126,10 @@ def test_json_literal(faux_conn):
118
126
assert expected_literal_sql == actual_literal_sql
119
127
120
128
121
- @pytest .mark .parametrize ("lax" , (False , True ))
122
- def test_json_casts (faux_conn , json_column , json_data , lax ):
129
+ @pytest .mark .parametrize ("lax,prefix " , (( False , "" ), ( True , "LAX_" ) ))
130
+ def test_json_casts (faux_conn , json_column , json_data , lax , prefix ):
123
131
from sqlalchemy_bigquery import JSON
124
132
125
- prefix = "LAX_" if lax else "" # FIXME: Manually parameterize
126
-
127
133
expr = sqlalchemy .select (1 ).where (
128
134
json_column [["name" ]].as_string (lax = lax ) == "Alice"
129
135
)
@@ -157,13 +163,23 @@ def test_json_casts(faux_conn, json_column, json_data, lax):
157
163
)
158
164
159
165
160
- def test_json_path_mode (faux_conn , json_column ):
166
+ @pytest .mark .parametrize (
167
+ "mode,prefix" , ((None , "" ), ("LAX" , "lax " ), ("LAX_RECURSIVE" , "lax recursive " ))
168
+ )
169
+ def test_json_path_mode (faux_conn , json_column , mode , prefix ):
161
170
from sqlalchemy_bigquery import JSON
162
171
163
- expr = sqlalchemy .select (json_column [[JSON .JSONPathMode .LAX , "items" , "price" ]])
172
+ if mode == "LAX" :
173
+ path = [JSON .JSONPathMode .LAX , "items" , "price" ]
174
+ elif mode == "LAX_RECURSIVE" :
175
+ path = [JSON .JSONPathMode .LAX_RECURSIVE , "items" , "price" ]
176
+ else :
177
+ path = ["items" , "price" ]
178
+
179
+ expr = sqlalchemy .select (json_column [path ])
164
180
165
181
expected_literal_sql = (
166
- 'SELECT JSON_QUERY(`json_table`.`cart`, \' lax $."items"."price"\' ) AS `anon_1` \n '
182
+ f 'SELECT JSON_QUERY(`json_table`.`cart`, \' { prefix } $."items"."price"\' ) AS `anon_1` \n '
167
183
"FROM `json_table`"
168
184
)
169
185
actual_literal_sql = expr .compile (
0 commit comments