@@ -186,7 +186,7 @@ def test_w_scalar_subfield(self):
186186 def test_w_repeated_subfield (self ):
187187 subfield = _Field ('REPEATED' , 'color' , 'STRING' )
188188 field = _Field ('REQUIRED' , fields = [subfield ])
189- value = {'f' : [{'v' : [' red', ' yellow', ' blue' ]}]}
189+ value = {'f' : [{'v' : [{ 'v' : ' red'}, { 'v' : ' yellow'}, { 'v' : ' blue'} ]}]}
190190 coerced = self ._call_fut (value , field )
191191 self .assertEqual (coerced , {'color' : ['red' , 'yellow' , 'blue' ]})
192192
@@ -234,6 +234,97 @@ def test_w_string_value(self):
234234 self .assertEqual (coerced , 'Wonderful!' )
235235
236236
237+ class Test_row_from_json (unittest .TestCase ):
238+
239+ def _call_fut (self , row , schema ):
240+ from google .cloud .bigquery ._helpers import _row_from_json
241+ return _row_from_json (row , schema )
242+
243+ def test_w_single_scalar_column (self ):
244+ # SELECT 1 AS col
245+ col = _Field ('REQUIRED' , 'col' , 'INTEGER' )
246+ row = {u'f' : [{u'v' : u'1' }]}
247+ self .assertEqual (self ._call_fut (row , schema = [col ]), (1 ,))
248+
249+ def test_w_single_struct_column (self ):
250+ # SELECT (1, 2) AS col
251+ sub_1 = _Field ('REQUIRED' , 'sub_1' , 'INTEGER' )
252+ sub_2 = _Field ('REQUIRED' , 'sub_2' , 'INTEGER' )
253+ col = _Field ('REQUIRED' , 'col' , 'RECORD' , fields = [sub_1 , sub_2 ])
254+ row = {u'f' : [{u'v' : {u'f' : [{u'v' : u'1' }, {u'v' : u'2' }]}}]}
255+ self .assertEqual (self ._call_fut (row , schema = [col ]),
256+ ({'sub_1' : 1 , 'sub_2' : 2 },))
257+
258+ def test_w_single_array_column (self ):
259+ # SELECT [1, 2, 3] as col
260+ col = _Field ('REPEATED' , 'col' , 'INTEGER' )
261+ row = {u'f' : [{u'v' : [{u'v' : u'1' }, {u'v' : u'2' }, {u'v' : u'3' }]}]}
262+ self .assertEqual (self ._call_fut (row , schema = [col ]),
263+ ([1 , 2 , 3 ],))
264+
265+ def test_w_struct_w_nested_array_column (self ):
266+ # SELECT ([1, 2], 3, [4, 5]) as col
267+ first = _Field ('REPEATED' , 'first' , 'INTEGER' )
268+ second = _Field ('REQUIRED' , 'second' , 'INTEGER' )
269+ third = _Field ('REPEATED' , 'third' , 'INTEGER' )
270+ col = _Field ('REQUIRED' , 'col' , 'RECORD' ,
271+ fields = [first , second , third ])
272+ row = {
273+ u'f' : [
274+ {u'v' : {
275+ u'f' : [
276+ {u'v' : [{u'v' : u'1' }, {u'v' : u'2' }]},
277+ {u'v' : u'3' },
278+ {u'v' : [{u'v' : u'4' }, {u'v' : u'5' }]}
279+ ]
280+ }},
281+ ]
282+ }
283+ self .assertEqual (
284+ self ._call_fut (row , schema = [col ]),
285+ ({u'first' : [1 , 2 ], u'second' : 3 , u'third' : [4 , 5 ]},))
286+
287+ def test_w_array_of_struct (self ):
288+ # SELECT [(1, 2, 3), (4, 5, 6)] as col
289+ first = _Field ('REQUIRED' , 'first' , 'INTEGER' )
290+ second = _Field ('REQUIRED' , 'second' , 'INTEGER' )
291+ third = _Field ('REQUIRED' , 'third' , 'INTEGER' )
292+ col = _Field ('REPEATED' , 'col' , 'RECORD' ,
293+ fields = [first , second , third ])
294+ row = {u'f' : [{u'v' : [
295+ {u'v' : {u'f' : [{u'v' : u'1' }, {u'v' : u'2' }, {u'v' : u'3' }]}},
296+ {u'v' : {u'f' : [{u'v' : u'4' }, {u'v' : u'5' }, {u'v' : u'6' }]}},
297+ ]}]}
298+ self .assertEqual (
299+ self ._call_fut (row , schema = [col ]),
300+ ([
301+ {u'first' : 1 , u'second' : 2 , u'third' : 3 },
302+ {u'first' : 4 , u'second' : 5 , u'third' : 6 },
303+ ],))
304+
305+ def test_w_array_of_struct_w_array (self ):
306+ # SELECT [([1, 2, 3], 4), ([5, 6], 7)]
307+ first = _Field ('REPEATED' , 'first' , 'INTEGER' )
308+ second = _Field ('REQUIRED' , 'second' , 'INTEGER' )
309+ col = _Field ('REPEATED' , 'col' , 'RECORD' , fields = [first , second ])
310+ row = {u'f' : [{u'v' : [
311+ {u'v' : {u'f' : [
312+ {u'v' : [{u'v' : u'1' }, {u'v' : u'2' }, {u'v' : u'3' }]},
313+ {u'v' : u'4' }
314+ ]}},
315+ {u'v' : {u'f' : [
316+ {u'v' : [{u'v' : u'5' }, {u'v' : u'6' }]},
317+ {u'v' : u'7' }
318+ ]}}
319+ ]}]}
320+ self .assertEqual (
321+ self ._call_fut (row , schema = [col ]),
322+ ([
323+ {u'first' : [1 , 2 , 3 ], u'second' : 4 },
324+ {u'first' : [5 , 6 ], u'second' : 7 },
325+ ],))
326+
327+
237328class Test_rows_from_json (unittest .TestCase ):
238329
239330 def _call_fut (self , value , field ):
@@ -253,12 +344,12 @@ def test_w_record_subfield(self):
253344 {'f' : [
254345 {'v' : 'Phred Phlyntstone' },
255346 {'v' : {'f' : [{'v' : '800' }, {'v' : '555-1212' }, {'v' : 1 }]}},
256- {'v' : [' orange', ' black' ]},
347+ {'v' : [{ 'v' : ' orange'}, { 'v' : ' black'} ]},
257348 ]},
258349 {'f' : [
259350 {'v' : 'Bharney Rhubble' },
260351 {'v' : {'f' : [{'v' : '877' }, {'v' : '768-5309' }, {'v' : 2 }]}},
261- {'v' : [' brown' ]},
352+ {'v' : [{ 'v' : ' brown'} ]},
262353 ]},
263354 {'f' : [
264355 {'v' : 'Wylma Phlyntstone' },
0 commit comments