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 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: