hipster_sql_to_hbase 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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,118 @@
|
|
1
|
+
grammar SQLInsert
|
2
|
+
include SQLPrimitives
|
3
|
+
include SQLRowSupport
|
4
|
+
include SQLHelpers
|
5
|
+
|
6
|
+
rule insert
|
7
|
+
"INSERT" SPACE ((low_priority / delayed / high_priority) SPACE)? (ignore SPACE)?
|
8
|
+
("INTO" SPACE)? table_name SPACE? optional_list_of_columns
|
9
|
+
("VALUES" / "VALUE") SPACE* groups_of_values {
|
10
|
+
def query_type
|
11
|
+
:insert
|
12
|
+
end
|
13
|
+
def tree
|
14
|
+
cols = optional_list_of_columns.eval
|
15
|
+
cols = [cols] if !cols.is_a? Array
|
16
|
+
vals = groups_of_values.eval
|
17
|
+
vals = [vals] if !vals.is_a? Array
|
18
|
+
vals = [vals] if !vals[0].is_a? Array
|
19
|
+
if check_valid(cols,vals)
|
20
|
+
{
|
21
|
+
:into => table_name.eval,
|
22
|
+
:columns => cols,
|
23
|
+
:values => vals
|
24
|
+
}
|
25
|
+
else
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
def check_valid(cols,vals)
|
30
|
+
xpected_num = cols.length
|
31
|
+
result = true
|
32
|
+
vals.each do |val|
|
33
|
+
if (val.length != xpected_num)
|
34
|
+
result = false
|
35
|
+
break
|
36
|
+
end
|
37
|
+
end
|
38
|
+
result
|
39
|
+
end
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
rule optional_list_of_columns
|
44
|
+
list_of_columns SPACE {
|
45
|
+
def eval; list_of_columns.eval; end
|
46
|
+
}
|
47
|
+
/
|
48
|
+
'' {
|
49
|
+
def eval; nil; end
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
rule low_priority
|
54
|
+
"LOW_PRIORITY"
|
55
|
+
end
|
56
|
+
|
57
|
+
rule delayed
|
58
|
+
"DELAYED"
|
59
|
+
end
|
60
|
+
|
61
|
+
rule high_priority
|
62
|
+
"HIGH_PRIORITY"
|
63
|
+
end
|
64
|
+
|
65
|
+
rule ignore
|
66
|
+
"IGNORE"
|
67
|
+
end
|
68
|
+
|
69
|
+
rule list_of_columns
|
70
|
+
"(" SPACE? one_or_more_column_names SPACE? ")" {
|
71
|
+
def eval; one_or_more_column_names.eval; end
|
72
|
+
}
|
73
|
+
end
|
74
|
+
|
75
|
+
rule groups_of_values
|
76
|
+
OPEN_PARENS SPACE* list_of_values SPACE* CLOSE_PARENS SPACE* "," SPACE* groups_of_values {
|
77
|
+
def eval
|
78
|
+
[list_of_values.eval] + groups_of_values.eval
|
79
|
+
end
|
80
|
+
}
|
81
|
+
/
|
82
|
+
OPEN_PARENS SPACE* list_of_values SPACE* CLOSE_PARENS {
|
83
|
+
def eval
|
84
|
+
[list_of_values.eval]
|
85
|
+
end
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
rule list_of_values
|
90
|
+
one_or_more_values
|
91
|
+
/
|
92
|
+
'' { def eval; []; end }
|
93
|
+
end
|
94
|
+
|
95
|
+
rule one_or_more_values
|
96
|
+
insert_value SPACE? "," SPACE? one_or_more_values {
|
97
|
+
def eval
|
98
|
+
[insert_value.eval, one_or_more_values.eval].flatten
|
99
|
+
end
|
100
|
+
}
|
101
|
+
/
|
102
|
+
insert_value {
|
103
|
+
def eval
|
104
|
+
[super]
|
105
|
+
end
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
rule insert_value
|
110
|
+
default_value / primitive
|
111
|
+
end
|
112
|
+
|
113
|
+
rule default_value
|
114
|
+
"DEFAULT" SPACE* OPEN_PARENS SPACE* column_name SPACE* CLOSE_PARENS {
|
115
|
+
def eval; "DEFAULT"; end
|
116
|
+
}
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
grammar SQLKeyValuePair
|
2
|
+
include SQLPrimitives
|
3
|
+
include SQLRowSupport
|
4
|
+
|
5
|
+
rule key_value_pair
|
6
|
+
one_column_name optional_spaces joiner_or_null {
|
7
|
+
def eval
|
8
|
+
results = joiner_or_null.eval
|
9
|
+
klass = Expressions.find_class_for(results[:joiner])
|
10
|
+
if value = results[:value]
|
11
|
+
klass.new(one_column_name.eval.to_sym, results[:value])
|
12
|
+
else
|
13
|
+
klass.new(one_column_name.eval.to_sym)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
rule joiner_or_null
|
20
|
+
a_null / joiner_with_value
|
21
|
+
end
|
22
|
+
|
23
|
+
rule a_null
|
24
|
+
is_not_null / is_null
|
25
|
+
end
|
26
|
+
|
27
|
+
rule is_not_null
|
28
|
+
"IS" SPACE "NOT" SPACE "NULL" {
|
29
|
+
def eval
|
30
|
+
{ :joiner => :"IS NOT NULL" }
|
31
|
+
end
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
rule is_null
|
36
|
+
"IS" SPACE "NULL" {
|
37
|
+
def eval
|
38
|
+
{ :joiner => :"IS NULL" }
|
39
|
+
end
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
rule joiner_with_value
|
44
|
+
condition_joiner optional_spaces primitive {
|
45
|
+
def eval
|
46
|
+
{
|
47
|
+
:joiner => condition_joiner.eval,
|
48
|
+
:value => primitive.eval
|
49
|
+
}
|
50
|
+
end
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
rule condition_joiner
|
55
|
+
greater_than_or_equal /
|
56
|
+
less_than_or_equal /
|
57
|
+
equals /
|
58
|
+
not_equals /
|
59
|
+
less_than /
|
60
|
+
greater_than /
|
61
|
+
like
|
62
|
+
end
|
63
|
+
|
64
|
+
rule less_than_or_equal
|
65
|
+
"<=" { def eval; :<=; end }
|
66
|
+
end
|
67
|
+
|
68
|
+
rule greater_than_or_equal
|
69
|
+
">=" { def eval; :>= end }
|
70
|
+
end
|
71
|
+
|
72
|
+
rule less_than
|
73
|
+
"<" { def eval; :< end }
|
74
|
+
end
|
75
|
+
|
76
|
+
rule greater_than
|
77
|
+
">" { def eval; :> end }
|
78
|
+
end
|
79
|
+
|
80
|
+
rule not_equals
|
81
|
+
"!=" { def eval; :"!=" end }
|
82
|
+
end
|
83
|
+
|
84
|
+
rule equals
|
85
|
+
"=" { def eval; :"=" end }
|
86
|
+
end
|
87
|
+
|
88
|
+
rule like
|
89
|
+
"LIKE" { def eval; :"LIKE" end }
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
grammar SQLOrderByClause
|
2
|
+
include SQLPrimitives
|
3
|
+
include SQLRowSupport
|
4
|
+
include SQLHelpers
|
5
|
+
|
6
|
+
rule order_by
|
7
|
+
"ORDER" SPACE "BY" SPACE one_or_more_column_names_with_sort {
|
8
|
+
def eval
|
9
|
+
OrderBy.new(one_or_more_column_names_with_sort.eval)
|
10
|
+
end
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
rule one_or_more_column_names_with_sort
|
15
|
+
one_column_name_with_sort "," SPACE one_or_more_column_names_with_sort {
|
16
|
+
def eval
|
17
|
+
result1, result2 = one_column_name_with_sort.eval, one_or_more_column_names_with_sort.eval
|
18
|
+
[result1, result2].flatten
|
19
|
+
end
|
20
|
+
}
|
21
|
+
/
|
22
|
+
one_column_name_with_sort
|
23
|
+
end
|
24
|
+
|
25
|
+
rule one_column_name_with_sort
|
26
|
+
one_column_name optional_sort_condition {
|
27
|
+
def eval
|
28
|
+
column = one_column_name.eval
|
29
|
+
if value = optional_sort_condition.eval
|
30
|
+
OrderByPair.new(column, value)
|
31
|
+
else
|
32
|
+
OrderByPair.new(column)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
rule optional_sort_condition
|
39
|
+
SPACE sort_condition { def eval; sort_condition.eval; end } / EMPTY_STRING
|
40
|
+
end
|
41
|
+
|
42
|
+
rule sort_condition
|
43
|
+
ascending / descending
|
44
|
+
end
|
45
|
+
|
46
|
+
rule ascending
|
47
|
+
"ASC" { def eval; Guillotine::Expressions::OrderBy::ASC; end }
|
48
|
+
end
|
49
|
+
|
50
|
+
rule descending
|
51
|
+
"DESC" { def eval; Guillotine::Expressions::OrderBy::DESC; end }
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
grammar SQLPrimitives
|
2
|
+
include SQLTokens
|
3
|
+
|
4
|
+
rule primitive
|
5
|
+
OPEN_PARENS primitive CLOSE_PARENS {
|
6
|
+
def eval
|
7
|
+
simple_primitive.eval
|
8
|
+
end
|
9
|
+
}
|
10
|
+
/
|
11
|
+
simple_primitive
|
12
|
+
end
|
13
|
+
|
14
|
+
rule simple_primitive
|
15
|
+
datetime / date / boolean / quoted_string / backtick_string / number / string
|
16
|
+
end
|
17
|
+
|
18
|
+
rule optional_spaces
|
19
|
+
SPACE*
|
20
|
+
end
|
21
|
+
|
22
|
+
rule boolean
|
23
|
+
TRUE / FALSE
|
24
|
+
end
|
25
|
+
|
26
|
+
rule quoted_string
|
27
|
+
single_quoted_string / double_quoted_string
|
28
|
+
end
|
29
|
+
|
30
|
+
rule single_quoted_string
|
31
|
+
SINGLE_QUOTE (NON_QUOTE_CHARS / DOUBLE_QUOTE)* SINGLE_QUOTE {
|
32
|
+
def eval
|
33
|
+
text_value[1..text_value.length-2]
|
34
|
+
end
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
rule double_quoted_string
|
39
|
+
DOUBLE_QUOTE (NON_QUOTE_CHARS / SINGLE_QUOTE)* DOUBLE_QUOTE {
|
40
|
+
def eval
|
41
|
+
text_value[1..text_value.length-2]
|
42
|
+
end
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
rule backtick_string
|
47
|
+
BACKTICK string BACKTICK {
|
48
|
+
def eval
|
49
|
+
string.eval
|
50
|
+
end
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
rule string
|
55
|
+
STRING_CHARS+ {
|
56
|
+
def eval
|
57
|
+
text_value
|
58
|
+
end
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
rule number
|
63
|
+
float / integer
|
64
|
+
end
|
65
|
+
|
66
|
+
rule integer
|
67
|
+
MINUS_OR_DIGIT DIGIT* {
|
68
|
+
def eval
|
69
|
+
text_value.to_i
|
70
|
+
end
|
71
|
+
}
|
72
|
+
end
|
73
|
+
|
74
|
+
rule float
|
75
|
+
integer "." integer {
|
76
|
+
def eval
|
77
|
+
text_value.to_f
|
78
|
+
end
|
79
|
+
}
|
80
|
+
end
|
81
|
+
|
82
|
+
rule date
|
83
|
+
one:four_digits DASH two:two_digits DASH three:two_digits {
|
84
|
+
def eval
|
85
|
+
elements = [one.eval, two.eval, three.eval]
|
86
|
+
Date.new(*elements)
|
87
|
+
end
|
88
|
+
}
|
89
|
+
end
|
90
|
+
|
91
|
+
rule four_digits
|
92
|
+
two_digits two_digits {
|
93
|
+
def eval; text_value.to_i; end
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
rule two_digits
|
98
|
+
DIGIT DIGIT {
|
99
|
+
def eval; text_value.to_i; end
|
100
|
+
}
|
101
|
+
end
|
102
|
+
|
103
|
+
rule datetime
|
104
|
+
quote? date SPACE time quote? {
|
105
|
+
def eval
|
106
|
+
Time.parse(text_value)
|
107
|
+
end
|
108
|
+
}
|
109
|
+
end
|
110
|
+
|
111
|
+
rule time
|
112
|
+
two_digits ":" two_digits ":" two_digits
|
113
|
+
end
|
114
|
+
|
115
|
+
rule quote
|
116
|
+
SINGLE_QUOTE / DOUBLE_QUOTE
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
grammar SQLRowSupport
|
2
|
+
include SQLPrimitives
|
3
|
+
|
4
|
+
rule one_or_more_table_names
|
5
|
+
table_name "," SPACE one_or_more_table_names {
|
6
|
+
def eval
|
7
|
+
[table_name.eval, one_or_more_table_names.eval]
|
8
|
+
end
|
9
|
+
}
|
10
|
+
/
|
11
|
+
table_name
|
12
|
+
end
|
13
|
+
|
14
|
+
rule one_or_more_column_names_with_sort
|
15
|
+
one_column_name_with_sort "," SPACE one_or_more_column_names {
|
16
|
+
def eval
|
17
|
+
result1, result2 = one_column_name.eval, one_or_more_column_names.eval
|
18
|
+
[result1, result2].flatten
|
19
|
+
end
|
20
|
+
}
|
21
|
+
/
|
22
|
+
one_column_name_with_sort
|
23
|
+
end
|
24
|
+
|
25
|
+
rule one_or_more_column_names
|
26
|
+
one_column_name SPACE? "," SPACE? one_or_more_column_names {
|
27
|
+
def eval
|
28
|
+
result1, result2 = one_column_name.eval, one_or_more_column_names.eval
|
29
|
+
[result1, result2].flatten
|
30
|
+
end
|
31
|
+
}
|
32
|
+
/
|
33
|
+
one_column_name
|
34
|
+
end
|
35
|
+
|
36
|
+
rule one_column_name
|
37
|
+
table_name dot column_name {
|
38
|
+
def eval
|
39
|
+
column_name.eval
|
40
|
+
end
|
41
|
+
}
|
42
|
+
/
|
43
|
+
column_name
|
44
|
+
end
|
45
|
+
|
46
|
+
rule column_name
|
47
|
+
backtick_string / column_string / all_columns
|
48
|
+
end
|
49
|
+
|
50
|
+
# TODO: Clean this up
|
51
|
+
rule table_name
|
52
|
+
backtick_string
|
53
|
+
/
|
54
|
+
string
|
55
|
+
end
|
56
|
+
|
57
|
+
rule column_string
|
58
|
+
string {
|
59
|
+
def eval
|
60
|
+
text_value.downcase
|
61
|
+
end
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
rule dot
|
66
|
+
"." { def eval; "."; end }
|
67
|
+
end
|
68
|
+
|
69
|
+
rule all_columns
|
70
|
+
"*" { def eval; "*"; end }
|
71
|
+
end
|
72
|
+
end
|