hipster_sql_to_hbase 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.
- checksums.yaml +7 -0
- data/.document +4 -0
- data/Gemfile +5 -0
- data/LICENSE +20 -0
- data/LICENSE.txt +20 -0
- data/README.md +39 -0
- data/README.rdoc +19 -0
- data/Rakefile +31 -0
- data/VERSION +1 -0
- data/hipster_sql_to_hbase.gemspec +55 -0
- data/lib/adapter/Hbase.thrift +914 -0
- data/lib/adapter/hbase.rb +59 -0
- data/lib/adapter/hbase/hbase.rb +2966 -0
- data/lib/adapter/hbase/hbase_constants.rb +14 -0
- data/lib/adapter/hbase/hbase_types.rb +282 -0
- data/lib/datatype_extras.rb +18 -0
- data/lib/executor.rb +91 -0
- data/lib/hipster_sql_to_hbase.rb +167 -0
- data/lib/result_tree_to_hbase_converter.rb +119 -0
- data/lib/result_tree_to_json_converter.rb +40 -0
- data/lib/sql_parser/sql.treetop +21 -0
- data/lib/sql_parser/sql_chars.treetop +5 -0
- data/lib/sql_parser/sql_create_table.treetop +47 -0
- data/lib/sql_parser/sql_datatypes.treetop +71 -0
- data/lib/sql_parser/sql_delete.treetop +64 -0
- data/lib/sql_parser/sql_drop_table.treetop +26 -0
- data/lib/sql_parser/sql_from_clause.treetop +12 -0
- data/lib/sql_parser/sql_group_by_clause.treetop +15 -0
- data/lib/sql_parser/sql_helpers.treetop +19 -0
- data/lib/sql_parser/sql_insert.treetop +118 -0
- data/lib/sql_parser/sql_key_value_pair.treetop +91 -0
- data/lib/sql_parser/sql_limit.treetop +7 -0
- data/lib/sql_parser/sql_order_by_clause.treetop +53 -0
- data/lib/sql_parser/sql_primitives.treetop +118 -0
- data/lib/sql_parser/sql_row_support.treetop +72 -0
- data/lib/sql_parser/sql_select.treetop +82 -0
- data/lib/sql_parser/sql_select_clause.treetop +17 -0
- data/lib/sql_parser/sql_show_tables.treetop +26 -0
- data/lib/sql_parser/sql_tokens.treetop +125 -0
- data/lib/sql_parser/sql_transaction.treetop +43 -0
- data/lib/sql_parser/sql_truncate.treetop +11 -0
- data/lib/sql_parser/sql_update.treetop +82 -0
- data/lib/sql_parser/sql_where_condition.treetop +46 -0
- data/lib/sql_treetop_load.rb +23 -0
- data/spec/hipster_sql_to_hbase_spec.rb +171 -0
- data/spec/spec_helper.rb +3 -0
- metadata +192 -0
@@ -0,0 +1,171 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
describe "HipsterSqlToHbase.parse_syntax method" do
|
6
|
+
|
7
|
+
context "when parse_syntax is run against SELECT FROM query without table hierarchy or backticks" do
|
8
|
+
let(:response) { HipsterSqlToHbase.parse_syntax("SELECT user FROM users") }
|
9
|
+
it "succeeds" do
|
10
|
+
expect(response.class).to eq(Treetop::Runtime::SyntaxNode)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context "when parse_syntax is run against SELECT FROM query with backticks but no table hierarchy" do
|
15
|
+
let(:response) { HipsterSqlToHbase.parse_syntax("SELECT `user` FROM `users`") }
|
16
|
+
it "succeeds" do
|
17
|
+
expect(response.class).to eq(Treetop::Runtime::SyntaxNode)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "when parse_syntax is run against SELECT FROM query with backticks and table hierarchy" do
|
22
|
+
let(:response) { HipsterSqlToHbase.parse_syntax("SELECT `users`.`user` FROM `users`") }
|
23
|
+
it "succeeds" do
|
24
|
+
expect(response.class).to eq(Treetop::Runtime::SyntaxNode)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "when parse_syntax is run against INSERT INTO query without backticks" do
|
29
|
+
let(:response) { HipsterSqlToHbase.parse_syntax("INSERT INTO utests (val, num) VALUES ('test', 1)") }
|
30
|
+
it "succeeds" do
|
31
|
+
expect(response.class).to eq(Treetop::Runtime::SyntaxNode)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "when parse_syntax is run against INSERT INTO query with backticks" do
|
36
|
+
let(:response) { HipsterSqlToHbase.parse_syntax("INSERT INTO `utests` (`val`, `num`) VALUES ('test', 1)") }
|
37
|
+
it "succeeds" do
|
38
|
+
expect(response.class).to eq(Treetop::Runtime::SyntaxNode)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "when parse_syntax is run against CREATE TABLE query without backticks" do
|
43
|
+
let(:response) { HipsterSqlToHbase.parse_syntax("CREATE TABLE users (user VARCHAR(10), pass VARCHAR(5))") }
|
44
|
+
it "succeeds" do
|
45
|
+
expect(response.class).to eq(Treetop::Runtime::SyntaxNode)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "when parse_syntax is run against CREATE TABLE query with backticks" do
|
50
|
+
let(:response) { HipsterSqlToHbase.parse_syntax("CREATE TABLE `users` (`user` VARCHAR(10), `pass` VARCHAR(5))") }
|
51
|
+
it "succeeds" do
|
52
|
+
expect(response.class).to eq(Treetop::Runtime::SyntaxNode)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "HipsterSqlToHbase.parse_tree method" do
|
59
|
+
|
60
|
+
context "when parse_tree is run against SELECT FROM query without table hierarchy or backticks" do
|
61
|
+
let(:response) { HipsterSqlToHbase.parse_tree("SELECT user FROM users") }
|
62
|
+
it "returns a valid ResultTree" do
|
63
|
+
expect(response.class).to eq(HipsterSqlToHbase::ResultTree)
|
64
|
+
expect(response[:query_type]).to eq(:select)
|
65
|
+
expect(response[:query_hash].class).to eq(Hash)
|
66
|
+
expect(response[:query_hash][:select].class).to eq(Array)
|
67
|
+
expect(response[:query_hash][:select].length).to eq(1)
|
68
|
+
expect(response[:query_hash][:select][0]).to eq('user')
|
69
|
+
expect(response[:query_hash][:from].class).to eq(String)
|
70
|
+
expect(response[:query_hash][:from]).to eq('users')
|
71
|
+
response[:query_hash][:where].should be_nil
|
72
|
+
response[:query_hash][:limit].should be_nil
|
73
|
+
response[:query_hash][:order].should be_nil
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "when parse_tree is run against SELECT FROM query with backticks but no table hierarchy" do
|
78
|
+
let(:response) { HipsterSqlToHbase.parse_tree("SELECT `user` FROM `users`") }
|
79
|
+
it "succeeds" do
|
80
|
+
expect(response.class).to eq(HipsterSqlToHbase::ResultTree)
|
81
|
+
expect(response[:query_type]).to eq(:select)
|
82
|
+
expect(response[:query_hash].class).to eq(Hash)
|
83
|
+
expect(response[:query_hash][:select].class).to eq(Array)
|
84
|
+
expect(response[:query_hash][:select].length).to eq(1)
|
85
|
+
expect(response[:query_hash][:select][0]).to eq('user')
|
86
|
+
expect(response[:query_hash][:from].class).to eq(String)
|
87
|
+
expect(response[:query_hash][:from]).to eq('users')
|
88
|
+
response[:query_hash][:where].should be_nil
|
89
|
+
response[:query_hash][:limit].should be_nil
|
90
|
+
response[:query_hash][:order].should be_nil
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context "when parse_tree is run against SELECT FROM query with backticks and table hierarchy" do
|
95
|
+
let(:response) { HipsterSqlToHbase.parse_tree("SELECT `users`.`user` FROM `users`") }
|
96
|
+
it "returns a HipsterSqlToHbase ResultTree" do
|
97
|
+
expect(response.class).to eq(HipsterSqlToHbase::ResultTree)
|
98
|
+
expect(response[:query_type]).to eq(:select)
|
99
|
+
expect(response[:query_hash].class).to eq(Hash)
|
100
|
+
expect(response[:query_hash][:select].class).to eq(Array)
|
101
|
+
expect(response[:query_hash][:select].length).to eq(1)
|
102
|
+
expect(response[:query_hash][:select][0]).to eq('user')
|
103
|
+
expect(response[:query_hash][:from].class).to eq(String)
|
104
|
+
expect(response[:query_hash][:from]).to eq('users')
|
105
|
+
response[:query_hash][:where].should be_nil
|
106
|
+
response[:query_hash][:limit].should be_nil
|
107
|
+
response[:query_hash][:order].should be_nil
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "when parse_tree is run against INSERT INTO query without backticks" do
|
112
|
+
let(:response) { HipsterSqlToHbase.parse_tree("INSERT INTO users (val, num) VALUES ('test', 1)") }
|
113
|
+
it "returns a HipsterSqlToHbase ResultTree" do
|
114
|
+
expect(response.class).to eq(HipsterSqlToHbase::ResultTree)
|
115
|
+
expect(response[:query_type]).to eq(:insert)
|
116
|
+
expect(response[:query_hash].class).to eq(Hash)
|
117
|
+
expect(response[:query_hash][:into].class).to eq(String)
|
118
|
+
expect(response[:query_hash][:into]).to eq('users')
|
119
|
+
expect(response[:query_hash][:columns].class).to eq(Array)
|
120
|
+
expect(response[:query_hash][:columns].length).to eq(2)
|
121
|
+
expect(response[:query_hash][:columns][0]).to eq('val')
|
122
|
+
expect(response[:query_hash][:columns][1]).to eq('num')
|
123
|
+
expect(response[:query_hash][:values].class).to eq(Array)
|
124
|
+
expect(response[:query_hash][:values].length).to eq(1)
|
125
|
+
expect(response[:query_hash][:values][0].class).to eq(Array)
|
126
|
+
expect(response[:query_hash][:values][0].length).to eq(2)
|
127
|
+
expect(response[:query_hash][:values][0][0]).to eq('test')
|
128
|
+
expect(response[:query_hash][:values][0][1]).to eq(1)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context "when parse_tree is run against INSERT INTO query with backticks" do
|
133
|
+
let(:response) { HipsterSqlToHbase.parse_tree("INSERT INTO `users` (`val`, `num`) VALUES ('test', 1)") }
|
134
|
+
it "returns a HipsterSqlToHbase ResultTree" do
|
135
|
+
expect(response.class).to eq(HipsterSqlToHbase::ResultTree)
|
136
|
+
expect(response[:query_type]).to eq(:insert)
|
137
|
+
expect(response[:query_hash].class).to eq(Hash)
|
138
|
+
expect(response[:query_hash][:into].class).to eq(String)
|
139
|
+
expect(response[:query_hash][:into]).to eq('users')
|
140
|
+
expect(response[:query_hash][:columns].class).to eq(Array)
|
141
|
+
expect(response[:query_hash][:columns].length).to eq(2)
|
142
|
+
expect(response[:query_hash][:columns][0]).to eq('val')
|
143
|
+
expect(response[:query_hash][:columns][1]).to eq('num')
|
144
|
+
expect(response[:query_hash][:values].class).to eq(Array)
|
145
|
+
expect(response[:query_hash][:values].length).to eq(1)
|
146
|
+
expect(response[:query_hash][:values][0].class).to eq(Array)
|
147
|
+
expect(response[:query_hash][:values][0].length).to eq(2)
|
148
|
+
expect(response[:query_hash][:values][0][0]).to eq('test')
|
149
|
+
expect(response[:query_hash][:values][0][1]).to eq(1)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
context "when query is only a lower-case 'select'" do
|
154
|
+
let(:response) { HipsterSqlToHbase.parse_tree("select") }
|
155
|
+
it "does not succeed" do
|
156
|
+
response.should be_nil
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
161
|
+
|
162
|
+
describe "HipsterSqlToHbase.parse method" do
|
163
|
+
|
164
|
+
context "when query is only a lower-case 'select'" do
|
165
|
+
let(:response) { HipsterSqlToHbase.parse("select") }
|
166
|
+
it "does not succeed" do
|
167
|
+
response.should be_nil
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hipster_sql_to_hbase
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jean Lescure
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-02-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: treetop
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: jml_thrift
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: json
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rdoc
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 4.0.0
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 4.0.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: jfish
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.1.1
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.1.1
|
111
|
+
description: SQL to HBase parser using Treetop (output based on Thrift). Doing all
|
112
|
+
this before it was cool.
|
113
|
+
email: jeanmlescure@gmail.com
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files:
|
117
|
+
- LICENSE
|
118
|
+
- LICENSE.txt
|
119
|
+
- README.md
|
120
|
+
- README.rdoc
|
121
|
+
files:
|
122
|
+
- lib/adapter/hbase/hbase.rb
|
123
|
+
- lib/adapter/hbase/hbase_constants.rb
|
124
|
+
- lib/adapter/hbase/hbase_types.rb
|
125
|
+
- lib/adapter/hbase.rb
|
126
|
+
- lib/adapter/Hbase.thrift
|
127
|
+
- lib/datatype_extras.rb
|
128
|
+
- lib/executor.rb
|
129
|
+
- lib/hipster_sql_to_hbase.rb
|
130
|
+
- lib/result_tree_to_hbase_converter.rb
|
131
|
+
- lib/result_tree_to_json_converter.rb
|
132
|
+
- lib/sql_parser/sql.treetop
|
133
|
+
- lib/sql_parser/sql_chars.treetop
|
134
|
+
- lib/sql_parser/sql_create_table.treetop
|
135
|
+
- lib/sql_parser/sql_datatypes.treetop
|
136
|
+
- lib/sql_parser/sql_delete.treetop
|
137
|
+
- lib/sql_parser/sql_drop_table.treetop
|
138
|
+
- lib/sql_parser/sql_from_clause.treetop
|
139
|
+
- lib/sql_parser/sql_group_by_clause.treetop
|
140
|
+
- lib/sql_parser/sql_helpers.treetop
|
141
|
+
- lib/sql_parser/sql_insert.treetop
|
142
|
+
- lib/sql_parser/sql_key_value_pair.treetop
|
143
|
+
- lib/sql_parser/sql_limit.treetop
|
144
|
+
- lib/sql_parser/sql_order_by_clause.treetop
|
145
|
+
- lib/sql_parser/sql_primitives.treetop
|
146
|
+
- lib/sql_parser/sql_row_support.treetop
|
147
|
+
- lib/sql_parser/sql_select.treetop
|
148
|
+
- lib/sql_parser/sql_select_clause.treetop
|
149
|
+
- lib/sql_parser/sql_show_tables.treetop
|
150
|
+
- lib/sql_parser/sql_tokens.treetop
|
151
|
+
- lib/sql_parser/sql_transaction.treetop
|
152
|
+
- lib/sql_parser/sql_truncate.treetop
|
153
|
+
- lib/sql_parser/sql_update.treetop
|
154
|
+
- lib/sql_parser/sql_where_condition.treetop
|
155
|
+
- lib/sql_treetop_load.rb
|
156
|
+
- spec/hipster_sql_to_hbase_spec.rb
|
157
|
+
- spec/spec_helper.rb
|
158
|
+
- .document
|
159
|
+
- Gemfile
|
160
|
+
- LICENSE
|
161
|
+
- LICENSE.txt
|
162
|
+
- README.md
|
163
|
+
- README.rdoc
|
164
|
+
- Rakefile
|
165
|
+
- VERSION
|
166
|
+
- hipster_sql_to_hbase.gemspec
|
167
|
+
homepage: http://github.com/jeanlescure/hipster_sql_to_hbase
|
168
|
+
licenses:
|
169
|
+
- MIT
|
170
|
+
metadata: {}
|
171
|
+
post_install_message:
|
172
|
+
rdoc_options: []
|
173
|
+
require_paths:
|
174
|
+
- lib
|
175
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
176
|
+
requirements:
|
177
|
+
- - '>='
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: '0'
|
180
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
181
|
+
requirements:
|
182
|
+
- - '>='
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
version: '0'
|
185
|
+
requirements: []
|
186
|
+
rubyforge_project:
|
187
|
+
rubygems_version: 2.0.14
|
188
|
+
signing_key:
|
189
|
+
specification_version: 4
|
190
|
+
summary: SQL to HBase parser using Treetop (output based on Thrift).
|
191
|
+
test_files: []
|
192
|
+
has_rdoc:
|