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