impala 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -3,6 +3,7 @@
3
3
  .bundle
4
4
  .config
5
5
  .yardoc
6
+ .yardopts
6
7
  Gemfile.lock
7
8
  InstalledFiles
8
9
  _yardoc
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='localhost', port=21000)
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
- ret = yield connection
26
- connection.close
28
+ begin
29
+ ret = yield connection
30
+ ensure
31
+ connection.close
32
+ end
27
33
  else
28
34
  ret = connection
29
35
  end
@@ -2,7 +2,7 @@ module Impala
2
2
  class Connection
3
3
  SLEEP_INTERVAL = 0.1
4
4
 
5
- def initialize(host='localhost', port=21000)
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(raw)
58
- #TODO?
59
- raw.downcase
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
- begin
71
- #TODO select here, or something
72
- while true
73
- state = @service.get_state(handle)
74
- if state == Protocol::Beeswax::QueryState::FINISHED
75
- break
76
- elsif state == Protocol::Beeswax::QueryState::EXCEPTION
77
- close_handle(handle)
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
- rescue Interrupt
84
- close_handle(handle)
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}" #TODO
94
+ raise ParsingError.new("Unknown type: #{schema.type}")
95
95
  end
96
96
  end
97
97
  end
@@ -1,3 +1,3 @@
1
1
  module Impala
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -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
- hash: 25
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
- date: 2013-01-24 00:00:00 Z
19
- dependencies:
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
- prerelease: false
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
- hash: 25
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
- requirement: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 3
44
- segments:
45
- - 0
46
- version: "0"
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
- requirement: &id003 !ruby/object:Gem::Requirement
53
- none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- hash: 3
58
- segments:
59
- - 0
60
- version: "0"
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
- version_requirements: *id003
63
- - !ruby/object:Gem::Dependency
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
- requirement: &id004 !ruby/object:Gem::Requirement
67
- none: false
68
- requirements:
69
- - - ">="
70
- - !ruby/object:Gem::Version
71
- hash: 3
72
- segments:
73
- - 0
74
- version: "0"
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
- version_requirements: *id004
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
- hash: 3
186
- segments:
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
- hash: 3
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.24
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: