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