presto-client 0.4.12 → 0.4.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ChangeLog +5 -1
- data/README.md +11 -0
- data/lib/presto/client/client.rb +14 -1
- data/lib/presto/client/query.rb +2 -1
- data/lib/presto/client/statement_client.rb +30 -22
- data/lib/presto/client/version.rb +1 -1
- data/spec/client_spec.rb +75 -0
- data/spec/statement_client_spec.rb +7 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0bee1b8fb22804f12e8a2fe9ee8f9fca6262cf4f
|
4
|
+
data.tar.gz: 2bd49e06c846141c5d909c507716970454565270
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0128a6bdf303a34f156916fb460c4e133277d41de5ff9b839fb19c969e569e71bdef2174a40be8e5bb5b43868ab41d192afb7a9320dbb750ca83990929fd734d
|
7
|
+
data.tar.gz: 30486a370eb854050e71dd0cdec598e17fe0aa3bec43feb6f1b20f7292c8b8d8362e29ce35d06a5757726d547c3f507af2751726092fbbf8580325d17cc66823
|
data/ChangeLog
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
2016-08-02 version 0.4.13:
|
2
|
+
|
3
|
+
* Added support for :http_proxy option to use a HTTP proxy server
|
4
|
+
* Added support for hashed Client response using `run_with_names` (thanks to MoovWeb for allowing me to contribute)
|
5
|
+
* Upgraded Presto model version to 0.134
|
1
6
|
|
2
7
|
2015-04-01 version 0.4.5:
|
3
8
|
|
@@ -62,4 +67,3 @@ since Presto 0.78
|
|
62
67
|
2014-01-07 version 0.1.0:
|
63
68
|
|
64
69
|
* First release
|
65
|
-
|
data/README.md
CHANGED
@@ -21,6 +21,7 @@ client = Presto::Client.new(
|
|
21
21
|
time_zone: "US/Pacific", # optional
|
22
22
|
language: "English", # optional
|
23
23
|
properties: {"hello" => "world", "mycatalog.hello" => "world"}, # optional
|
24
|
+
http_proxy: "proxy.example.com:8080", # optional
|
24
25
|
http_debug: true,
|
25
26
|
)
|
26
27
|
|
@@ -30,6 +31,15 @@ rows.each {|row|
|
|
30
31
|
p row
|
31
32
|
}
|
32
33
|
|
34
|
+
# run a query and get results as a hash:
|
35
|
+
results = client.run_with_names("select alpha, 1 AS beta from tablename")
|
36
|
+
results.each {|row|
|
37
|
+
p row['alpha'] # access by name
|
38
|
+
p row['beta']
|
39
|
+
p row.values[0] # access by index
|
40
|
+
p row.values[1]
|
41
|
+
}
|
42
|
+
|
33
43
|
# another way to run a query and fetch results streamingly:
|
34
44
|
# start running a query on presto
|
35
45
|
client.query("select * from sys.node") do |q|
|
@@ -54,6 +64,7 @@ end
|
|
54
64
|
* **user** sets user name to connect to a Presto.
|
55
65
|
* **time_zone** sets time zone of the query. Time zone affects some functions such as `format_datetime`.
|
56
66
|
* **language** sets language of the query. Language affects some functions such as `format_datetime`.
|
67
|
+
* **http_proxy** sets host:port of a HTTP proxy server.
|
57
68
|
* **http_debug** enables debug message to STDOUT for each HTTP requests
|
58
69
|
* **http_open_timeout** sets timeout in seconds to open new HTTP connection
|
59
70
|
* **http_timeout** sets timeout in seconds to read data from a server
|
data/lib/presto/client/client.rb
CHANGED
@@ -48,10 +48,23 @@ module Presto::Client
|
|
48
48
|
q.close
|
49
49
|
end
|
50
50
|
end
|
51
|
+
|
52
|
+
# Accepts the raw response from the Presto Client and returns an
|
53
|
+
# array of hashes where you can access the data in each row using the
|
54
|
+
# output name specified in the query with AS:
|
55
|
+
# SELECT expression AS output_name
|
56
|
+
def run_with_names(query)
|
57
|
+
columns, rows = run(query)
|
58
|
+
|
59
|
+
column_names = columns.map(&:name)
|
60
|
+
|
61
|
+
rows.map do |row|
|
62
|
+
Hash[column_names.zip(row)]
|
63
|
+
end
|
64
|
+
end
|
51
65
|
end
|
52
66
|
|
53
67
|
def self.new(*args)
|
54
68
|
Client.new(*args)
|
55
69
|
end
|
56
|
-
|
57
70
|
end
|
data/lib/presto/client/query.rb
CHANGED
@@ -27,7 +27,8 @@ module Presto::Client
|
|
27
27
|
raise ArgumentError, ":server option is required"
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
proxy = options[:http_proxy] || options[:proxy] # :proxy is obsoleted
|
31
|
+
faraday = Faraday.new(url: "http://#{server}", proxy: "#{proxy}") do |faraday|
|
31
32
|
#faraday.request :url_encoded
|
32
33
|
faraday.response :logger if options[:http_debug]
|
33
34
|
faraday.adapter Faraday.default_adapter
|
@@ -47,9 +47,39 @@ module Presto::Client
|
|
47
47
|
@query = query
|
48
48
|
@closed = false
|
49
49
|
@exception = nil
|
50
|
+
|
51
|
+
@faraday.headers.merge!(optional_headers)
|
50
52
|
post_query_request!
|
51
53
|
end
|
52
54
|
|
55
|
+
def optional_headers
|
56
|
+
headers = {}
|
57
|
+
if v = @options[:user]
|
58
|
+
headers[PrestoHeaders::PRESTO_USER] = v
|
59
|
+
end
|
60
|
+
if v = @options[:source]
|
61
|
+
headers[PrestoHeaders::PRESTO_SOURCE] = v
|
62
|
+
end
|
63
|
+
if v = @options[:catalog]
|
64
|
+
headers[PrestoHeaders::PRESTO_CATALOG] = v
|
65
|
+
end
|
66
|
+
if v = @options[:schema]
|
67
|
+
headers[PrestoHeaders::PRESTO_SCHEMA] = v
|
68
|
+
end
|
69
|
+
if v = @options[:time_zone]
|
70
|
+
headers[PrestoHeaders::PRESTO_TIME_ZONE] = v
|
71
|
+
end
|
72
|
+
if v = @options[:language]
|
73
|
+
headers[PrestoHeaders::PRESTO_LANGUAGE] = v
|
74
|
+
end
|
75
|
+
if v = @options[:properties]
|
76
|
+
headers[PrestoHeaders::PRESTO_SESSION] = encode_properties(v)
|
77
|
+
end
|
78
|
+
headers
|
79
|
+
end
|
80
|
+
|
81
|
+
private :optional_headers
|
82
|
+
|
53
83
|
def init_request(req)
|
54
84
|
req.options.timeout = @options[:http_timeout] || 300
|
55
85
|
req.options.open_timeout = @options[:http_open_timeout] || 60
|
@@ -61,28 +91,6 @@ module Presto::Client
|
|
61
91
|
response = @faraday.post do |req|
|
62
92
|
req.url "/v1/statement"
|
63
93
|
|
64
|
-
if v = @options[:user]
|
65
|
-
req.headers[PrestoHeaders::PRESTO_USER] = v
|
66
|
-
end
|
67
|
-
if v = @options[:source]
|
68
|
-
req.headers[PrestoHeaders::PRESTO_SOURCE] = v
|
69
|
-
end
|
70
|
-
if v = @options[:catalog]
|
71
|
-
req.headers[PrestoHeaders::PRESTO_CATALOG] = v
|
72
|
-
end
|
73
|
-
if v = @options[:schema]
|
74
|
-
req.headers[PrestoHeaders::PRESTO_SCHEMA] = v
|
75
|
-
end
|
76
|
-
if v = @options[:time_zone]
|
77
|
-
req.headers[PrestoHeaders::PRESTO_TIME_ZONE] = v
|
78
|
-
end
|
79
|
-
if v = @options[:language]
|
80
|
-
req.headers[PrestoHeaders::PRESTO_LANGUAGE] = v
|
81
|
-
end
|
82
|
-
if v = @options[:properties]
|
83
|
-
req.headers[PrestoHeaders::PRESTO_SESSION] = encode_properties(v)
|
84
|
-
end
|
85
|
-
|
86
94
|
req.body = @query
|
87
95
|
init_request(req)
|
88
96
|
end
|
data/spec/client_spec.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Presto::Client::Client do
|
4
|
+
let(:client) { Presto::Client.new({}) }
|
5
|
+
|
6
|
+
describe 'rehashes' do
|
7
|
+
let(:columns) do
|
8
|
+
[
|
9
|
+
Models::Column.new(name: 'animal', type: 'string'),
|
10
|
+
Models::Column.new(name: 'score', type: 'integer'),
|
11
|
+
Models::Column.new(name: 'name', type: 'string')
|
12
|
+
]
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'multiple rows' do
|
16
|
+
rows = [
|
17
|
+
['dog', 1, 'Lassie'],
|
18
|
+
['horse', 5, 'Mr. Ed'],
|
19
|
+
['t-rex', 37, 'Doug']
|
20
|
+
]
|
21
|
+
client.stub(:run).and_return([columns, rows])
|
22
|
+
|
23
|
+
rehashed = client.run_with_names('fake query')
|
24
|
+
|
25
|
+
rehashed.length.should == 3
|
26
|
+
|
27
|
+
rehashed[0]['animal'].should == 'dog'
|
28
|
+
rehashed[0]['score'].should == 1
|
29
|
+
rehashed[0]['name'].should == 'Lassie'
|
30
|
+
|
31
|
+
rehashed[0].values[0].should == 'dog'
|
32
|
+
rehashed[0].values[1].should == 1
|
33
|
+
rehashed[0].values[2].should == 'Lassie'
|
34
|
+
|
35
|
+
rehashed[1]['animal'].should == 'horse'
|
36
|
+
rehashed[1]['score'].should == 5
|
37
|
+
rehashed[1]['name'].should == 'Mr. Ed'
|
38
|
+
|
39
|
+
rehashed[1].values[0].should == 'horse'
|
40
|
+
rehashed[1].values[1].should == 5
|
41
|
+
rehashed[1].values[2].should == 'Mr. Ed'
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'empty results' do
|
45
|
+
rows = []
|
46
|
+
client.stub(:run).and_return([columns, rows])
|
47
|
+
|
48
|
+
rehashed = client.run_with_names('fake query')
|
49
|
+
|
50
|
+
rehashed.length.should == 0
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'handles too few result columns' do
|
54
|
+
rows = [['wrong', 'count']]
|
55
|
+
client.stub(:run).and_return([columns, rows])
|
56
|
+
|
57
|
+
client.run_with_names('fake query').should == [{
|
58
|
+
"animal" => "wrong",
|
59
|
+
"score" => "count",
|
60
|
+
"name" => nil,
|
61
|
+
}]
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'handles too many result columns' do
|
65
|
+
rows = [['wrong', 'count', 'too', 'much', 'columns']]
|
66
|
+
client.stub(:run).and_return([columns, rows])
|
67
|
+
|
68
|
+
client.run_with_names('fake query').should == [{
|
69
|
+
"animal" => "wrong",
|
70
|
+
"score" => "count",
|
71
|
+
"name" => 'too',
|
72
|
+
}]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -67,6 +67,12 @@ describe Presto::Client::StatementClient do
|
|
67
67
|
stub_request(:get, "localhost/v1/next_uri").
|
68
68
|
with(headers: {
|
69
69
|
"User-Agent" => "presto-ruby/#{VERSION}",
|
70
|
+
"X-Presto-Catalog" => options[:catalog],
|
71
|
+
"X-Presto-Schema" => options[:schema],
|
72
|
+
"X-Presto-User" => options[:user],
|
73
|
+
"X-Presto-Language" => options[:language],
|
74
|
+
"X-Presto-Time-Zone" => options[:time_zone],
|
75
|
+
"X-Presto-Session" => options[:properties].map {|k,v| "#{k}=#{v}"}.join("\r\nX-Presto-Session: ")
|
70
76
|
}).to_return(body: lambda{|req|if retry_p; response_json.to_json; else; retry_p=true; raise Timeout::Error.new("execution expired"); end })
|
71
77
|
|
72
78
|
faraday = Faraday.new(url: "http://localhost")
|
@@ -75,5 +81,6 @@ describe Presto::Client::StatementClient do
|
|
75
81
|
sc.advance.should be_true
|
76
82
|
retry_p.should be_true
|
77
83
|
end
|
84
|
+
|
78
85
|
end
|
79
86
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: presto-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sadayuki Furuhashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -125,6 +125,7 @@ files:
|
|
125
125
|
- modelgen/models.rb
|
126
126
|
- modelgen/presto_models.rb
|
127
127
|
- presto-client.gemspec
|
128
|
+
- spec/client_spec.rb
|
128
129
|
- spec/spec_helper.rb
|
129
130
|
- spec/statement_client_spec.rb
|
130
131
|
homepage: https://github.com/treasure-data/presto-client-ruby
|
@@ -147,10 +148,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
147
148
|
version: '0'
|
148
149
|
requirements: []
|
149
150
|
rubyforge_project:
|
150
|
-
rubygems_version: 2.
|
151
|
+
rubygems_version: 2.5.1
|
151
152
|
signing_key:
|
152
153
|
specification_version: 4
|
153
154
|
summary: Presto client library
|
154
155
|
test_files:
|
156
|
+
- spec/client_spec.rb
|
155
157
|
- spec/spec_helper.rb
|
156
158
|
- spec/statement_client_spec.rb
|