Skip to content

Commit da245fa

Browse files
authored
feat(bigquery): RANGE support when reading Arrow format (#9795)
1 parent 62d6ecf commit da245fa

File tree

3 files changed

+74
-62
lines changed

3 files changed

+74
-62
lines changed

bigquery/arrow.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,21 @@ func convertArrowValue(col arrow.Array, i int, ft arrow.DataType, fs *FieldSchem
272272
arr := col.(*array.Struct)
273273
nestedValues := []Value{}
274274
fields := ft.(*arrow.StructType).Fields()
275+
if fs.Type == RangeFieldType {
276+
rangeFieldSchema := &FieldSchema{
277+
Type: fs.RangeElementType.Type,
278+
}
279+
start, err := convertArrowValue(arr.Field(0), i, fields[0].Type, rangeFieldSchema)
280+
if err != nil {
281+
return nil, err
282+
}
283+
end, err := convertArrowValue(arr.Field(1), i, fields[1].Type, rangeFieldSchema)
284+
if err != nil {
285+
return nil, err
286+
}
287+
rangeValue := &RangeValue{Start: start, End: end}
288+
return Value(rangeValue), nil
289+
}
275290
for fIndex, f := range fields {
276291
v, err := convertArrowValue(arr.Field(fIndex), i, f.Type, fs.Schema[fIndex])
277292
if err != nil {

bigquery/integration_test.go

Lines changed: 42 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2154,7 +2154,7 @@ var (
21542154
queryParameterTestCases = []queryParameterTestCase{}
21552155
)
21562156

2157-
func initQueryParameterTestCases(includeRangeCases bool) {
2157+
func initQueryParameterTestCases() {
21582158
d := civil.Date{Year: 2016, Month: 3, Day: 20}
21592159
tm := civil.Time{Hour: 15, Minute: 04, Second: 05, Nanosecond: 3008}
21602160
rtm := tm
@@ -2276,6 +2276,46 @@ func initQueryParameterTestCases(includeRangeCases bool) {
22762276
[]Value{"{\"alpha\":\"beta\"}"},
22772277
"{\"alpha\":\"beta\"}",
22782278
},
2279+
{
2280+
"RangeUnboundedStart",
2281+
"SELECT @val",
2282+
[]QueryParameter{
2283+
{
2284+
Name: "val",
2285+
Value: &QueryParameterValue{
2286+
Type: StandardSQLDataType{
2287+
TypeKind: "RANGE",
2288+
RangeElementType: &StandardSQLDataType{
2289+
TypeKind: "TIMESTAMP",
2290+
},
2291+
},
2292+
Value: rangeTimestamp1,
2293+
},
2294+
},
2295+
},
2296+
[]Value{rangeTimestamp1},
2297+
rangeTimestamp1,
2298+
},
2299+
{
2300+
"RangeUnboundedEnd",
2301+
"SELECT @val",
2302+
[]QueryParameter{
2303+
{
2304+
Name: "val",
2305+
Value: &QueryParameterValue{
2306+
Type: StandardSQLDataType{
2307+
TypeKind: "RANGE",
2308+
RangeElementType: &StandardSQLDataType{
2309+
TypeKind: "TIMESTAMP",
2310+
},
2311+
},
2312+
Value: rangeTimestamp2,
2313+
},
2314+
},
2315+
},
2316+
[]Value{rangeTimestamp2},
2317+
rangeTimestamp2,
2318+
},
22792319
{
22802320
"NestedStructParam",
22812321
"SELECT @val",
@@ -2448,51 +2488,6 @@ func initQueryParameterTestCases(includeRangeCases bool) {
24482488
},
24492489
},
24502490
}
2451-
2452-
if includeRangeCases {
2453-
queryParameterTestCases = append(queryParameterTestCases, []queryParameterTestCase{
2454-
{
2455-
"RangeUnboundedEnd",
2456-
"SELECT @val",
2457-
[]QueryParameter{
2458-
{
2459-
Name: "val",
2460-
Value: &QueryParameterValue{
2461-
Type: StandardSQLDataType{
2462-
TypeKind: "RANGE",
2463-
RangeElementType: &StandardSQLDataType{
2464-
TypeKind: "TIMESTAMP",
2465-
},
2466-
},
2467-
Value: rangeTimestamp1,
2468-
},
2469-
},
2470-
},
2471-
[]Value{rangeTimestamp1},
2472-
rangeTimestamp1,
2473-
},
2474-
{
2475-
"RangeUnboundedStart",
2476-
"SELECT @val",
2477-
[]QueryParameter{
2478-
{
2479-
Name: "val",
2480-
Value: &QueryParameterValue{
2481-
Type: StandardSQLDataType{
2482-
TypeKind: "RANGE",
2483-
RangeElementType: &StandardSQLDataType{
2484-
TypeKind: "TIMESTAMP",
2485-
},
2486-
},
2487-
Value: rangeTimestamp2,
2488-
},
2489-
},
2490-
},
2491-
[]Value{rangeTimestamp2},
2492-
rangeTimestamp2,
2493-
},
2494-
}...)
2495-
}
24962491
}
24972492

24982493
func TestIntegration_QueryParameters(t *testing.T) {
@@ -2501,7 +2496,7 @@ func TestIntegration_QueryParameters(t *testing.T) {
25012496
}
25022497
ctx := context.Background()
25032498

2504-
initQueryParameterTestCases(true)
2499+
initQueryParameterTestCases()
25052500

25062501
for _, tc := range queryParameterTestCases {
25072502
t.Run(tc.name, func(t *testing.T) {

bigquery/storage_integration_test.go

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,23 +37,25 @@ func TestIntegration_StorageReadBasicTypes(t *testing.T) {
3737
}
3838
ctx := context.Background()
3939

40-
initQueryParameterTestCases(false)
40+
initQueryParameterTestCases()
4141

4242
for _, c := range queryParameterTestCases {
43-
q := storageOptimizedClient.Query(c.query)
44-
q.Parameters = c.parameters
45-
q.forceStorageAPI = true
46-
it, err := q.Read(ctx)
47-
if err != nil {
48-
t.Fatal(err)
49-
}
50-
err = checkIteratorRead(it, c.wantRow)
51-
if err != nil {
52-
t.Fatalf("%s: error on query `%s`[%v]: %v", it.SourceJob().ID(), c.query, c.parameters, err)
53-
}
54-
if !it.IsAccelerated() {
55-
t.Fatalf("%s: expected storage api to be used", it.SourceJob().ID())
56-
}
43+
t.Run(c.name, func(t *testing.T) {
44+
q := storageOptimizedClient.Query(c.query)
45+
q.Parameters = c.parameters
46+
q.forceStorageAPI = true
47+
it, err := q.Read(ctx)
48+
if err != nil {
49+
t.Fatal(err)
50+
}
51+
err = checkIteratorRead(it, c.wantRow)
52+
if err != nil {
53+
t.Fatalf("%s: error on query `%s`[%v]: %v", it.SourceJob().ID(), c.query, c.parameters, err)
54+
}
55+
if !it.IsAccelerated() {
56+
t.Fatalf("%s: expected storage api to be used", it.SourceJob().ID())
57+
}
58+
})
5759
}
5860
}
5961

0 commit comments

Comments
 (0)