trino-client 1.0.2 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ChangeLog.md +43 -0
- data/README.md +1 -1
- data/SECURITY.md +7 -0
- data/lib/trino/client/faraday_client.rb +12 -4
- data/lib/trino/client/query.rb +5 -3
- data/lib/trino/client/statement_client.rb +4 -2
- data/lib/trino/client/version.rb +1 -1
- data/lib/trino/client.rb +2 -4
- data/lib/trino-client.rb +1 -1
- data/trino-client.gemspec +16 -14
- metadata +76 -59
- data/.github/CODEOWNERS +0 -1
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -18
- data/.github/workflows/ruby.yml +0 -30
- data/.gitignore +0 -4
- data/Gemfile +0 -6
- data/Rakefile +0 -45
- data/modelgen/model_versions.rb +0 -280
- data/modelgen/modelgen.rb +0 -119
- data/modelgen/models.rb +0 -31
- data/modelgen/trino_models.rb +0 -270
- data/publish.rb +0 -14
- data/release.rb +0 -56
- data/spec/basic_query_spec.rb +0 -82
- data/spec/client_spec.rb +0 -75
- data/spec/gzip_spec.rb +0 -40
- data/spec/model_spec.rb +0 -35
- data/spec/spec_helper.rb +0 -42
- data/spec/statement_client_spec.rb +0 -637
- data/spec/tpch/q01.sql +0 -21
- data/spec/tpch/q02.sql +0 -43
- data/spec/tpch_query_spec.rb +0 -41
- data/trino-client-ruby/lib/trino-client-ruby.rb +0 -1
- data/trino-client-ruby/trino-client-ruby.gemspec +0 -20
data/publish.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
require File.expand_path 'lib/trino/client/version', File.dirname(__FILE__)
|
3
|
-
|
4
|
-
def run(cmd)
|
5
|
-
puts cmd
|
6
|
-
system cmd
|
7
|
-
end
|
8
|
-
|
9
|
-
run("gem build trino-client.gemspec")
|
10
|
-
run("gem push trino-client-#{Trino::Client::VERSION}.gem")
|
11
|
-
|
12
|
-
run("gem build trino-client-ruby/trino-client-ruby.gemspec")
|
13
|
-
run("gem push trino-client-ruby/trino-client-ruby-#{Trino::Client::VERSION}.gem")
|
14
|
-
|
data/release.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'fileutils'
|
4
|
-
|
5
|
-
PREFIX = 'https://github.com/treasure-data/trino-client-ruby'
|
6
|
-
RELEASE_NOTES_FILE = "ChangeLog.md"
|
7
|
-
|
8
|
-
last_tag = `git describe --tags --abbrev=0`.chomp
|
9
|
-
last_version = last_tag.sub("v", "")
|
10
|
-
puts "last version: #{last_version}"
|
11
|
-
|
12
|
-
print "next version? "
|
13
|
-
next_version = STDIN.gets.chomp
|
14
|
-
|
15
|
-
abort("Can't use empty version string") if next_version.empty?
|
16
|
-
|
17
|
-
logs = `git log #{last_tag}..HEAD --pretty=format:'%h %s'`
|
18
|
-
# Add links to GitHub issues
|
19
|
-
logs = logs.gsub(/\#([0-9]+)/, "[#\\1](#{PREFIX}/issues/\\1)")
|
20
|
-
|
21
|
-
new_release_notes = []
|
22
|
-
new_release_notes <<= "\#\# #{next_version}\n"
|
23
|
-
new_release_notes <<= logs.split(/\n/)
|
24
|
-
.reject{|line| line.include?("#{last_version} release notes")}
|
25
|
-
.map{|x|
|
26
|
-
rev = x[0..6]
|
27
|
-
"- #{x[8..-1]} [[#{rev}](#{PREFIX}/commit/#{rev})]\n"
|
28
|
-
}
|
29
|
-
|
30
|
-
release_notes = []
|
31
|
-
notes = File.readlines(RELEASE_NOTES_FILE)
|
32
|
-
|
33
|
-
release_notes <<= notes[0..1]
|
34
|
-
release_notes <<= new_release_notes
|
35
|
-
release_notes <<= "\n"
|
36
|
-
release_notes <<= notes[2..-1]
|
37
|
-
|
38
|
-
TMP_RELEASE_NOTES_FILE = "#{RELEASE_NOTES_FILE}.tmp"
|
39
|
-
File.delete(TMP_RELEASE_NOTES_FILE) if File.exists?(TMP_RELEASE_NOTES_FILE)
|
40
|
-
File.write("#{TMP_RELEASE_NOTES_FILE}", release_notes.join)
|
41
|
-
system("cat #{TMP_RELEASE_NOTES_FILE} | vim - -c ':f #{TMP_RELEASE_NOTES_FILE}' -c ':9'")
|
42
|
-
|
43
|
-
abort("The release note file is not saved. Aborted") unless File.exists?(TMP_RELEASE_NOTES_FILE)
|
44
|
-
|
45
|
-
def run(cmd)
|
46
|
-
puts cmd
|
47
|
-
system cmd
|
48
|
-
end
|
49
|
-
|
50
|
-
FileUtils.cp(TMP_RELEASE_NOTES_FILE, RELEASE_NOTES_FILE)
|
51
|
-
File.delete(TMP_RELEASE_NOTES_FILE)
|
52
|
-
|
53
|
-
# run "git commit #{RELEASE_NOTES_FILE} -m \"Add #{next_version} release notes\""
|
54
|
-
# run "git tag v#{next_version}"
|
55
|
-
# run "git push"
|
56
|
-
# run "git push --tags"
|
data/spec/basic_query_spec.rb
DELETED
@@ -1,82 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Trino::Client::Client do
|
4
|
-
before(:all) do
|
5
|
-
WebMock.disable!
|
6
|
-
@cluster = TinyPresto::Cluster.new()
|
7
|
-
@container = @cluster.run
|
8
|
-
@client = Trino::Client.new(server: 'localhost:8080', catalog: 'memory', user: 'test-user', schema: 'default')
|
9
|
-
loop do
|
10
|
-
begin
|
11
|
-
@client.run('show schemas')
|
12
|
-
break
|
13
|
-
rescue StandardError => exception
|
14
|
-
puts "Waiting for cluster ready... #{exception}"
|
15
|
-
sleep(3)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
puts 'Cluster is ready'
|
19
|
-
end
|
20
|
-
|
21
|
-
after(:all) do
|
22
|
-
@cluster.stop
|
23
|
-
WebMock.enable!
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'show schemas' do
|
27
|
-
columns, rows = run_with_retry(@client, 'show schemas')
|
28
|
-
expect(columns.length).to be(1)
|
29
|
-
expect(rows.length).to be(2)
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'ctas' do
|
33
|
-
expected = [[1, 'a'], [2, 'b']]
|
34
|
-
run_with_retry(@client, "create table ctas1 as select * from (values (1, 'a'), (2, 'b')) t(c1, c2)")
|
35
|
-
columns, rows = run_with_retry(@client, 'select * from ctas1')
|
36
|
-
expect(columns.map(&:name)).to match_array(%w[c1 c2])
|
37
|
-
expect(rows).to eq(expected)
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'next_uri' do
|
41
|
-
@client.query('show schemas') do |q|
|
42
|
-
expect(q.next_uri).to start_with('http://localhost:8080/v1/statement/')
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'advance' do
|
47
|
-
@client.query('show schemas') do |q|
|
48
|
-
expect(q.advance).to be(true)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
it 'current query result' do
|
53
|
-
@client.query('show schemas') do |q|
|
54
|
-
expect(q.current_results.info_uri).to start_with('http://localhost:8080/ui/query.html')
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'statement stats' do
|
59
|
-
@client.query('show schemas') do |q|
|
60
|
-
stats = q.current_results.stats
|
61
|
-
# Immediate subsequent request should get queued result
|
62
|
-
expect(stats.queued).to be(true)
|
63
|
-
expect(stats.scheduled).to be(false)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
it 'partial cancel' do
|
68
|
-
@client.query('show schemas') do |q|
|
69
|
-
q.cancel
|
70
|
-
expect { q.query_info }.to raise_error(Trino::Client::TrinoHttpError, /Error 410 Gone/)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'row chunk' do
|
75
|
-
expected_schemas = %w[default information_schema]
|
76
|
-
@client.query('show schemas') do |q|
|
77
|
-
q.each_row do |r|
|
78
|
-
expect(expected_schemas).to include(r[0])
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
data/spec/client_spec.rb
DELETED
@@ -1,75 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Trino::Client::Client do
|
4
|
-
let(:client) { Trino::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
|
data/spec/gzip_spec.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Trino::Client::Client do
|
4
|
-
before(:all) do
|
5
|
-
@spec_path = File.dirname(__FILE__)
|
6
|
-
WebMock.disable!
|
7
|
-
@cluster = TinyPresto::Cluster.new()
|
8
|
-
@container = @cluster.run
|
9
|
-
@client = Trino::Client.new(server: 'localhost:8080', catalog: 'tpch', user: 'test-user', schema: 'tiny', gzip: true, http_debug: true)
|
10
|
-
loop do
|
11
|
-
begin
|
12
|
-
# Make sure to all workers are available.
|
13
|
-
@client.run('show schemas')
|
14
|
-
break
|
15
|
-
rescue StandardError => exception
|
16
|
-
puts "Waiting for cluster ready... #{exception}"
|
17
|
-
sleep(3)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
puts 'Cluster is ready'
|
21
|
-
end
|
22
|
-
|
23
|
-
after(:all) do
|
24
|
-
@cluster.stop
|
25
|
-
WebMock.enable!
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'tpch q01 with gzip option' do
|
29
|
-
$stdout = StringIO.new
|
30
|
-
begin
|
31
|
-
q = File.read("#{@spec_path}/tpch/q01.sql")
|
32
|
-
columns, rows = run_with_retry(@client, q)
|
33
|
-
expect(columns.length).to be(10)
|
34
|
-
expect(rows.length).to be(4)
|
35
|
-
expect($stdout.string).to include ('content-encoding: "gzip"')
|
36
|
-
ensure
|
37
|
-
$stdout = STDOUT
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
data/spec/model_spec.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Trino::Client::Models do
|
4
|
-
describe 'rehash of BlockedReason' do
|
5
|
-
h = {
|
6
|
-
"operatorId" => 0,
|
7
|
-
"planNodeId" => "47",
|
8
|
-
"operatorType" => "ScanFilterAndProjectOperator",
|
9
|
-
"addInputCalls" => 0,
|
10
|
-
"addInputWall" => "0.00ns",
|
11
|
-
"addInputCpu" => "0.00ns",
|
12
|
-
"addInputUser" => "0.00ns",
|
13
|
-
"inputDataSize" => "9.46MB",
|
14
|
-
"inputPositions" => 440674,
|
15
|
-
"getOutputCalls" => 734,
|
16
|
-
"getOutputWall" => "7.29s",
|
17
|
-
"getOutputCpu" => "0.00ns",
|
18
|
-
"getOutputUser" => "0.00ns",
|
19
|
-
"outputDataSize" => "36.99MB",
|
20
|
-
"outputPositions" => 440674,
|
21
|
-
"blockedWall" => "0.00ns",
|
22
|
-
"finishCalls" => 0,
|
23
|
-
"finishWall" => "0.00ns",
|
24
|
-
"finishCpu" => "0.00ns",
|
25
|
-
"finishUser" => "0.00ns",
|
26
|
-
"memoryReservation" => "0B",
|
27
|
-
"systemMemoryReservation" => "0b",
|
28
|
-
"blockedReason" => "WAITING_FOR_MEMORY",
|
29
|
-
"info" => {"k" => "v"}
|
30
|
-
}
|
31
|
-
|
32
|
-
stats = Models::OperatorStats.decode(h)
|
33
|
-
stats.blocked_reason.should == :waiting_for_memory
|
34
|
-
end
|
35
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'bundler'
|
2
|
-
|
3
|
-
begin
|
4
|
-
Bundler.setup(:default, :test)
|
5
|
-
rescue Bundler::BundlerError => e
|
6
|
-
$stderr.puts e.message
|
7
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
-
exit e.status_code
|
9
|
-
end
|
10
|
-
|
11
|
-
require 'simplecov'
|
12
|
-
SimpleCov.start
|
13
|
-
|
14
|
-
require 'json'
|
15
|
-
require 'webmock/rspec'
|
16
|
-
|
17
|
-
require 'trino-client'
|
18
|
-
include Trino::Client
|
19
|
-
|
20
|
-
require 'tiny-presto'
|
21
|
-
|
22
|
-
MAX_RETRY_COUNT = 5
|
23
|
-
RETRYABLE_ERRORS = [
|
24
|
-
/No nodes available to run query/
|
25
|
-
]
|
26
|
-
|
27
|
-
def run_with_retry(client, sql)
|
28
|
-
i = 0
|
29
|
-
while i < MAX_RETRY_COUNT
|
30
|
-
begin
|
31
|
-
columns, rows = @client.run(sql)
|
32
|
-
return columns, rows
|
33
|
-
rescue Trino::Client::TrinoQueryError => e
|
34
|
-
if RETRYABLE_ERRORS.any? { |error| e.message =~ error }
|
35
|
-
sleep(i)
|
36
|
-
i += 1
|
37
|
-
next
|
38
|
-
end
|
39
|
-
raise "Fail to run query: #{e}"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|