impala 0.1.3 → 0.1.4
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/impala.gemspec +3 -1
- data/lib/impala.rb +2 -1
- data/lib/impala/cursor.rb +10 -5
- data/lib/impala/version.rb +1 -1
- data/test/test_impala_connected.rb +26 -2
- metadata +38 -6
data/impala.gemspec
CHANGED
@@ -13,12 +13,14 @@ Gem::Specification.new do |gem|
|
|
13
13
|
gem.homepage = "https://github.com/colinmarc/impala-ruby"
|
14
14
|
|
15
15
|
gem.add_dependency('thrift', '~> 0.9')
|
16
|
+
gem.add_dependency('ripl', '~> 0.7')
|
17
|
+
gem.add_dependency('hirb', '~> 0.7')
|
16
18
|
|
17
19
|
gem.add_development_dependency('rake')
|
18
20
|
gem.add_development_dependency('eden')
|
19
21
|
gem.add_development_dependency('pry')
|
20
22
|
|
21
|
-
gem.add_development_dependency('minitest'
|
23
|
+
gem.add_development_dependency('minitest')
|
22
24
|
gem.add_development_dependency('mocha')
|
23
25
|
|
24
26
|
gem.add_development_dependency('yard')
|
data/lib/impala.rb
CHANGED
@@ -8,6 +8,7 @@ $LOAD_PATH.push(gen_dir) unless $LOAD_PATH.include?(gen_dir)
|
|
8
8
|
require 'impala/version'
|
9
9
|
|
10
10
|
require 'thrift'
|
11
|
+
require 'time'
|
11
12
|
require 'impala/protocol'
|
12
13
|
require 'impala/cursor'
|
13
14
|
require 'impala/connection'
|
@@ -22,7 +23,7 @@ module Impala
|
|
22
23
|
class ParsingError < StandardError; end
|
23
24
|
|
24
25
|
# Connect to an Impala server. If a block is given, it will close the
|
25
|
-
# connection after
|
26
|
+
# connection after yielding the connection to the block.
|
26
27
|
# @param [String] host the hostname or IP address of the Impala server
|
27
28
|
# @param [int] port the port that the Impala server is listening on
|
28
29
|
# @yieldparam [Connection] conn the open connection. Will be closed once the block
|
data/lib/impala/cursor.rb
CHANGED
@@ -8,7 +8,6 @@ module Impala
|
|
8
8
|
def initialize(handle, service, buffer_length=1024)
|
9
9
|
@handle = handle
|
10
10
|
@service = service
|
11
|
-
@metadata = @service.get_results_metadata(@handle)
|
12
11
|
|
13
12
|
@buffer_length = buffer_length
|
14
13
|
@row_buffer = []
|
@@ -71,6 +70,10 @@ module Impala
|
|
71
70
|
|
72
71
|
private
|
73
72
|
|
73
|
+
def metadata
|
74
|
+
@metadata ||= @service.get_results_metadata(@handle)
|
75
|
+
end
|
76
|
+
|
74
77
|
def fetch_more
|
75
78
|
return if @done
|
76
79
|
|
@@ -88,9 +91,9 @@ module Impala
|
|
88
91
|
|
89
92
|
def parse_row(raw)
|
90
93
|
row = {}
|
91
|
-
fields = raw.split(
|
94
|
+
fields = raw.split(metadata.delim)
|
92
95
|
|
93
|
-
fields.zip(
|
96
|
+
fields.zip(metadata.schema.fieldSchemas).each do |raw_value, schema|
|
94
97
|
value = convert_raw_value(raw_value, schema)
|
95
98
|
row[schema.name.to_sym] = value
|
96
99
|
end
|
@@ -114,11 +117,13 @@ module Impala
|
|
114
117
|
end
|
115
118
|
when 'tinyint', 'int', 'bigint'
|
116
119
|
value.to_i
|
117
|
-
when 'double'
|
120
|
+
when 'double', 'float'
|
118
121
|
value.to_f
|
122
|
+
when "timestamp"
|
123
|
+
Time.parse(value)
|
119
124
|
else
|
120
125
|
raise ParsingError.new("Unknown type: #{schema.type}")
|
121
126
|
end
|
122
127
|
end
|
123
128
|
end
|
124
|
-
end
|
129
|
+
end
|
data/lib/impala/version.rb
CHANGED
@@ -28,8 +28,28 @@ describe 'connected tests' do
|
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'can run a basic query' do
|
31
|
-
ret = @connection.query('SELECT
|
32
|
-
assert_equal([{:
|
31
|
+
ret = @connection.query('SELECT "foo" AS foo')
|
32
|
+
assert_equal([{:foo=>'foo'}], ret, "the result should be a list of hashes")
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'can handle boolean values' do
|
36
|
+
ret = @connection.query('SELECT TRUE AS foo')
|
37
|
+
assert_equal([{:foo=>true}], ret, "the result should be a bool")
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'can handle double values' do
|
41
|
+
ret = @connection.query("SELECT 1.23 AS foo")
|
42
|
+
assert_equal([{:foo=>1.23}], ret, "the result should be a float")
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'can handle float values' do
|
46
|
+
ret = @connection.query("SELECT CAST(1.23 AS float) as foo")
|
47
|
+
assert_instance_of(Float, ret.first[:foo], "the result should be a float")
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'can handle timestamp values' do
|
51
|
+
ret = @connection.query("SELECT NOW() AS foo")
|
52
|
+
assert_instance_of(Time, ret.first[:foo])
|
33
53
|
end
|
34
54
|
|
35
55
|
# TODO: this test sucks because there's no way to get multiple records
|
@@ -44,4 +64,8 @@ describe 'connected tests' do
|
|
44
64
|
assert_equal(false, cursor.has_more?, "has_more? should be false")
|
45
65
|
assert_nil(cursor.fetch_row, "subsequent calls to fetch_row should be nil")
|
46
66
|
end
|
67
|
+
|
68
|
+
it 'can successfully run a "use" query' do
|
69
|
+
@connection.query('USE foo')
|
70
|
+
end
|
47
71
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: impala
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-03-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thrift
|
@@ -27,6 +27,38 @@ dependencies:
|
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0.9'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: ripl
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0.7'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0.7'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: hirb
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0.7'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.7'
|
30
62
|
- !ruby/object:Gem::Dependency
|
31
63
|
name: rake
|
32
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,17 +112,17 @@ dependencies:
|
|
80
112
|
requirement: !ruby/object:Gem::Requirement
|
81
113
|
none: false
|
82
114
|
requirements:
|
83
|
-
- -
|
115
|
+
- - ! '>='
|
84
116
|
- !ruby/object:Gem::Version
|
85
|
-
version: '
|
117
|
+
version: '0'
|
86
118
|
type: :development
|
87
119
|
prerelease: false
|
88
120
|
version_requirements: !ruby/object:Gem::Requirement
|
89
121
|
none: false
|
90
122
|
requirements:
|
91
|
-
- -
|
123
|
+
- - ! '>='
|
92
124
|
- !ruby/object:Gem::Version
|
93
|
-
version: '
|
125
|
+
version: '0'
|
94
126
|
- !ruby/object:Gem::Dependency
|
95
127
|
name: mocha
|
96
128
|
requirement: !ruby/object:Gem::Requirement
|