hipster_sql_to_hbase 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.document +4 -0
  3. data/Gemfile +5 -0
  4. data/LICENSE +20 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.md +39 -0
  7. data/README.rdoc +19 -0
  8. data/Rakefile +31 -0
  9. data/VERSION +1 -0
  10. data/hipster_sql_to_hbase.gemspec +55 -0
  11. data/lib/adapter/Hbase.thrift +914 -0
  12. data/lib/adapter/hbase.rb +59 -0
  13. data/lib/adapter/hbase/hbase.rb +2966 -0
  14. data/lib/adapter/hbase/hbase_constants.rb +14 -0
  15. data/lib/adapter/hbase/hbase_types.rb +282 -0
  16. data/lib/datatype_extras.rb +18 -0
  17. data/lib/executor.rb +91 -0
  18. data/lib/hipster_sql_to_hbase.rb +167 -0
  19. data/lib/result_tree_to_hbase_converter.rb +119 -0
  20. data/lib/result_tree_to_json_converter.rb +40 -0
  21. data/lib/sql_parser/sql.treetop +21 -0
  22. data/lib/sql_parser/sql_chars.treetop +5 -0
  23. data/lib/sql_parser/sql_create_table.treetop +47 -0
  24. data/lib/sql_parser/sql_datatypes.treetop +71 -0
  25. data/lib/sql_parser/sql_delete.treetop +64 -0
  26. data/lib/sql_parser/sql_drop_table.treetop +26 -0
  27. data/lib/sql_parser/sql_from_clause.treetop +12 -0
  28. data/lib/sql_parser/sql_group_by_clause.treetop +15 -0
  29. data/lib/sql_parser/sql_helpers.treetop +19 -0
  30. data/lib/sql_parser/sql_insert.treetop +118 -0
  31. data/lib/sql_parser/sql_key_value_pair.treetop +91 -0
  32. data/lib/sql_parser/sql_limit.treetop +7 -0
  33. data/lib/sql_parser/sql_order_by_clause.treetop +53 -0
  34. data/lib/sql_parser/sql_primitives.treetop +118 -0
  35. data/lib/sql_parser/sql_row_support.treetop +72 -0
  36. data/lib/sql_parser/sql_select.treetop +82 -0
  37. data/lib/sql_parser/sql_select_clause.treetop +17 -0
  38. data/lib/sql_parser/sql_show_tables.treetop +26 -0
  39. data/lib/sql_parser/sql_tokens.treetop +125 -0
  40. data/lib/sql_parser/sql_transaction.treetop +43 -0
  41. data/lib/sql_parser/sql_truncate.treetop +11 -0
  42. data/lib/sql_parser/sql_update.treetop +82 -0
  43. data/lib/sql_parser/sql_where_condition.treetop +46 -0
  44. data/lib/sql_treetop_load.rb +23 -0
  45. data/spec/hipster_sql_to_hbase_spec.rb +171 -0
  46. data/spec/spec_helper.rb +3 -0
  47. 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,7 @@
1
+ grammar SQLLimit
2
+ include SQLPrimitives
3
+
4
+ rule limit
5
+ "LIMIT" SPACE number { def eval; Limit.new(number.eval); end }
6
+ end
7
+ 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