Skip to content

Commit df662ff

Browse files
committed
Support query result traverse pages
1 parent 2eb9367 commit df662ff

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

lib/bigquery-client/jobs.rb

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,19 @@
33
module BigQuery
44
module Jobs
55
def sql(query, options = {})
6-
result = jobs_query(query, options)
7-
names = result['schema']['fields'].map {|field| field['name'] }
8-
types = result['schema']['fields'].map {|field| field['type'] }
9-
records = (result['rows'] || []).map {|row| row['f'].map {|record| record['v'] } }
6+
jobs_query_response = jobs_query(query, options)
7+
names = jobs_query_response['schema']['fields'].map {|field| field['name'] }
8+
types = jobs_query_response['schema']['fields'].map {|field| field['type'] }
9+
records = extract_records(jobs_query_response)
10+
11+
page_token = jobs_query_response['pageToken']
12+
job_id = jobs_query_response['jobReference']['jobId']
13+
while page_token
14+
query_results_response = query_results(job_id, pageToken: page_token)
15+
records += extract_records(query_results_response)
16+
page_token = query_results_response['pageToken']
17+
end
18+
1019
convert(records, types).map { |values| [names, values].transpose.to_h }
1120
end
1221

@@ -52,6 +61,10 @@ def query_results(id, options = {})
5261

5362
private
5463

64+
def extract_records(response)
65+
(response['rows'] || []).map {|row| row['f'].map {|record| record['v'] } }
66+
end
67+
5568
def convert(records, types)
5669
records.map do |values|
5770
values.map.with_index do |value, index|

test/test_jobs.rb

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
require 'helper'
22

33
class JobsTest < Test::Unit::TestCase
4-
@@query = <<-"EOS"
4+
@@normal_query = <<-"EOS"
55
SELECT
66
born_alive_alive, mother_residence_state, is_male
77
FROM
@@ -23,8 +23,17 @@ class JobsTest < Test::Unit::TestCase
2323
0
2424
EOS
2525

26+
@@huge_result_query = <<-"EOS"
27+
SELECT
28+
title
29+
FROM
30+
publicdata:samples.wikipedia
31+
LIMIT
32+
1234567
33+
EOS
34+
2635
def test_sql
27-
result = $client.sql(@@query)
36+
result = $client.sql(@@normal_query)
2837
assert { result.size == 100 }
2938
assert { result.sample["born_alive_alive"].is_a? Fixnum }
3039
assert { result.sample["mother_residence_state"].is_a? String }
@@ -35,4 +44,9 @@ def test_sql_when_no_rows
3544
result = $client.sql(@@no_rows_query)
3645
assert { result == [] }
3746
end
47+
48+
def test_sql_pagination
49+
record_size = $client.sql(@@huge_result_query).size
50+
assert { record_size == 1234567 }
51+
end
3852
end

0 commit comments

Comments
 (0)