impala 0.1.1 → 0.1.2
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.
- data/.gitignore +1 -0
- data/Rakefile +10 -0
- data/impala.gemspec +8 -0
- data/lib/impala.rb +9 -3
- data/lib/impala/connection.rb +24 -26
- data/lib/impala/cursor.rb +2 -2
- data/lib/impala/version.rb +1 -1
- data/test/test_impala.rb +34 -0
- metadata +173 -86
data/.gitignore
CHANGED
data/Rakefile
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
|
3
|
+
task :default => [:test]
|
4
|
+
|
5
|
+
task :test do
|
6
|
+
ret = true
|
7
|
+
Dir["test/**/*.rb"].each do |f|
|
8
|
+
ret = ret && ruby(f, '')
|
9
|
+
end
|
10
|
+
exit(ret)
|
11
|
+
end
|
12
|
+
|
3
13
|
THRIFT_FILES = FileList['./thrift/*.thrift']
|
4
14
|
GENNED_FILES = FileList['./lib/impala/protocol/*']
|
5
15
|
|
data/impala.gemspec
CHANGED
@@ -18,6 +18,14 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.add_development_dependency('eden')
|
19
19
|
gem.add_development_dependency('pry')
|
20
20
|
|
21
|
+
gem.add_development_dependency('test-unit')
|
22
|
+
gem.add_development_dependency('shoulda')
|
23
|
+
gem.add_development_dependency('mocha')
|
24
|
+
|
25
|
+
gem.add_development_dependency('yard')
|
26
|
+
gem.add_development_dependency('redcarpet')
|
27
|
+
gem.add_development_dependency('github-markup')
|
28
|
+
|
21
29
|
gem.files = `git ls-files`.split($/)
|
22
30
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
23
31
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
data/lib/impala.rb
CHANGED
@@ -14,16 +14,22 @@ require 'impala/connection'
|
|
14
14
|
|
15
15
|
module Impala
|
16
16
|
KNOWN_COMMANDS = ['select', 'show', 'describe', 'use']
|
17
|
+
DEFAULT_HOST = 'localhost'
|
18
|
+
DEFAULT_PORT = 21000
|
17
19
|
class InvalidQueryError < StandardError; end
|
18
20
|
class ConnectionError < StandardError; end
|
19
21
|
class CursorError < StandardError; end
|
22
|
+
class ParsingError < StandardError; end
|
20
23
|
|
21
|
-
def self.connect(host=
|
24
|
+
def self.connect(host=DEFAULT_HOST, port=DEFAULT_PORT)
|
22
25
|
connection = Connection.new(host, port)
|
23
26
|
|
24
27
|
if block_given?
|
25
|
-
|
26
|
-
|
28
|
+
begin
|
29
|
+
ret = yield connection
|
30
|
+
ensure
|
31
|
+
connection.close
|
32
|
+
end
|
27
33
|
else
|
28
34
|
ret = connection
|
29
35
|
end
|
data/lib/impala/connection.rb
CHANGED
@@ -2,7 +2,7 @@ module Impala
|
|
2
2
|
class Connection
|
3
3
|
SLEEP_INTERVAL = 0.1
|
4
4
|
|
5
|
-
def initialize(host
|
5
|
+
def initialize(host, port)
|
6
6
|
@host = host
|
7
7
|
@port = port
|
8
8
|
@connected = false
|
@@ -38,13 +38,6 @@ module Impala
|
|
38
38
|
def execute(raw_query)
|
39
39
|
raise ConnectionError.new("Connection closed") unless open?
|
40
40
|
|
41
|
-
words = raw_query.split
|
42
|
-
if words.empty?
|
43
|
-
raise InvalidQueryError.new("Empty query")
|
44
|
-
elsif !KNOWN_COMMANDS.include?(words.first.downcase)
|
45
|
-
raise InvalidQueryError.new("Unrecognized command: '#{words.first}'")
|
46
|
-
end
|
47
|
-
|
48
41
|
query = sanitize_query(raw_query)
|
49
42
|
handle = send_query(query)
|
50
43
|
|
@@ -54,9 +47,16 @@ module Impala
|
|
54
47
|
|
55
48
|
private
|
56
49
|
|
57
|
-
def sanitize_query(
|
58
|
-
|
59
|
-
|
50
|
+
def sanitize_query(raw_query)
|
51
|
+
words = raw_query.split
|
52
|
+
raise InvalidQueryError.new("Empty query") if words.empty?
|
53
|
+
|
54
|
+
command = words.first.downcase
|
55
|
+
if !KNOWN_COMMANDS.include?(command)
|
56
|
+
raise InvalidQueryError.new("Unrecognized command: '#{words.first}'")
|
57
|
+
end
|
58
|
+
|
59
|
+
([command] + words[1..-1]).join(' ')
|
60
60
|
end
|
61
61
|
|
62
62
|
def send_query(sanitized_query)
|
@@ -67,23 +67,21 @@ module Impala
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def wait_for_result(handle)
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
raise ConnectionError.new("The query was aborted")
|
79
|
-
end
|
80
|
-
|
81
|
-
sleep(SLEEP_INTERVAL)
|
70
|
+
#TODO select here, or something
|
71
|
+
while true
|
72
|
+
state = @service.get_state(handle)
|
73
|
+
if state == Protocol::Beeswax::QueryState::FINISHED
|
74
|
+
break
|
75
|
+
elsif state == Protocol::Beeswax::QueryState::EXCEPTION
|
76
|
+
close_handle(handle)
|
77
|
+
raise ConnectionError.new("The query was aborted")
|
82
78
|
end
|
83
|
-
|
84
|
-
|
85
|
-
raise
|
79
|
+
|
80
|
+
sleep(SLEEP_INTERVAL)
|
86
81
|
end
|
82
|
+
rescue
|
83
|
+
close_handle(handle)
|
84
|
+
raise
|
87
85
|
end
|
88
86
|
|
89
87
|
def close_handle(handle)
|
data/lib/impala/cursor.rb
CHANGED
@@ -84,14 +84,14 @@ module Impala
|
|
84
84
|
elsif value == 'false'
|
85
85
|
false
|
86
86
|
else
|
87
|
-
raise "Invalid value for boolean: #{value}"
|
87
|
+
raise ParsingError.new("Invalid value for boolean: #{value}")
|
88
88
|
end
|
89
89
|
when 'tinyint', 'int', 'bigint'
|
90
90
|
value.to_i
|
91
91
|
when 'double'
|
92
92
|
value.to_f
|
93
93
|
else
|
94
|
-
raise "Unknown type: #{schema.type}"
|
94
|
+
raise ParsingError.new("Unknown type: #{schema.type}")
|
95
95
|
end
|
96
96
|
end
|
97
97
|
end
|
data/lib/impala/version.rb
CHANGED
data/test/test_impala.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'impala'
|
2
|
+
require 'test-unit'
|
3
|
+
require 'shoulda'
|
4
|
+
require 'mocha'
|
5
|
+
|
6
|
+
class TestImpala < Test::Unit::TestCase
|
7
|
+
include Mocha
|
8
|
+
|
9
|
+
context 'Impala.connect' do
|
10
|
+
setup do
|
11
|
+
Thrift::Socket.expects(:new).with('host', 12345)
|
12
|
+
Thrift::BufferedTransport.expects(:new).once.returns(stub(:open => nil))
|
13
|
+
Thrift::BinaryProtocol.expects(:new).once
|
14
|
+
Impala::Protocol::ImpalaService::Client.expects(:new).once
|
15
|
+
end
|
16
|
+
|
17
|
+
should 'return an open connection when passed a block' do
|
18
|
+
connection = Impala.connect('host', 12345)
|
19
|
+
assert_equal(Impala::Connection, connection.class)
|
20
|
+
assert_equal(true, connection.open?)
|
21
|
+
end
|
22
|
+
|
23
|
+
should 'return the results of the query when given a block with a query, and then close tho connection' do
|
24
|
+
Impala::Connection.any_instance.stubs(:query => 'result')
|
25
|
+
Impala::Connection.any_instance.expects(:close).once
|
26
|
+
|
27
|
+
ret = Impala.connect('host', 12345) do |conn|
|
28
|
+
conn.query('query')
|
29
|
+
end
|
30
|
+
|
31
|
+
assert_equal('result', ret)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
metadata
CHANGED
@@ -1,89 +1,183 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: impala
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 1
|
10
|
-
version: 0.1.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Colin Marc
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2013-01-25 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: thrift
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
18
|
+
requirements:
|
26
19
|
- - ~>
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
- 9
|
32
|
-
version: "0.9"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0.9'
|
33
22
|
type: :runtime
|
34
|
-
version_requirements: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: rake
|
37
23
|
prerelease: false
|
38
|
-
|
39
|
-
none: false
|
40
|
-
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.9'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
47
38
|
type: :development
|
48
|
-
version_requirements: *id002
|
49
|
-
- !ruby/object:Gem::Dependency
|
50
|
-
name: eden
|
51
39
|
prerelease: false
|
52
|
-
|
53
|
-
none: false
|
54
|
-
requirements:
|
55
|
-
- -
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: eden
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
61
54
|
type: :development
|
62
|
-
|
63
|
-
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
64
63
|
name: pry
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: test-unit
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: shoulda
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: mocha
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
65
119
|
prerelease: false
|
66
|
-
|
67
|
-
none: false
|
68
|
-
requirements:
|
69
|
-
- -
|
70
|
-
- !ruby/object:Gem::Version
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: yard
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
75
134
|
type: :development
|
76
|
-
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: redcarpet
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
type: :development
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: github-markup
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ! '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ! '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
77
174
|
description: A ruby client for Cloudera's Impala
|
78
|
-
email:
|
175
|
+
email:
|
79
176
|
- colinmarc@gmail.com
|
80
177
|
executables: []
|
81
|
-
|
82
178
|
extensions: []
|
83
|
-
|
84
179
|
extra_rdoc_files: []
|
85
|
-
|
86
|
-
files:
|
180
|
+
files:
|
87
181
|
- .gitignore
|
88
182
|
- Gemfile
|
89
183
|
- LICENSE.txt
|
@@ -147,6 +241,7 @@ files:
|
|
147
241
|
- lib/impala/protocol/types_constants.rb
|
148
242
|
- lib/impala/protocol/types_types.rb
|
149
243
|
- lib/impala/version.rb
|
244
|
+
- test/test_impala.rb
|
150
245
|
- thrift/Data.thrift
|
151
246
|
- thrift/DataSinks.thrift
|
152
247
|
- thrift/Descriptors.thrift
|
@@ -171,36 +266,28 @@ files:
|
|
171
266
|
- thrift/hive_metastore.thrift
|
172
267
|
homepage: https://github.com/colinmarc/impala-ruby
|
173
268
|
licenses: []
|
174
|
-
|
175
269
|
post_install_message:
|
176
270
|
rdoc_options: []
|
177
|
-
|
178
|
-
require_paths:
|
271
|
+
require_paths:
|
179
272
|
- lib
|
180
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
273
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
181
274
|
none: false
|
182
|
-
requirements:
|
183
|
-
- -
|
184
|
-
- !ruby/object:Gem::Version
|
185
|
-
|
186
|
-
|
187
|
-
- 0
|
188
|
-
version: "0"
|
189
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
275
|
+
requirements:
|
276
|
+
- - ! '>='
|
277
|
+
- !ruby/object:Gem::Version
|
278
|
+
version: '0'
|
279
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
190
280
|
none: false
|
191
|
-
requirements:
|
192
|
-
- -
|
193
|
-
- !ruby/object:Gem::Version
|
194
|
-
|
195
|
-
segments:
|
196
|
-
- 0
|
197
|
-
version: "0"
|
281
|
+
requirements:
|
282
|
+
- - ! '>='
|
283
|
+
- !ruby/object:Gem::Version
|
284
|
+
version: '0'
|
198
285
|
requirements: []
|
199
|
-
|
200
286
|
rubyforge_project:
|
201
|
-
rubygems_version: 1.8.
|
287
|
+
rubygems_version: 1.8.23
|
202
288
|
signing_key:
|
203
289
|
specification_version: 3
|
204
290
|
summary: A ruby client for Cloudera's Impala
|
205
|
-
test_files:
|
206
|
-
|
291
|
+
test_files:
|
292
|
+
- test/test_impala.rb
|
293
|
+
has_rdoc:
|