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,82 @@
1
+ grammar SQLSelect
2
+ include SQLRowSupport
3
+
4
+ include SQLSelectClause
5
+ include SQLFromClause
6
+ include SQLWhereCondition
7
+ include SQLOrderByClause
8
+ include SQLLimit
9
+ include SQLHelpers
10
+
11
+ rule select_expression
12
+ select
13
+ from
14
+ where_condition_or_empty
15
+ limit_condition_or_empty
16
+ order_by_condition_or_empty
17
+ {
18
+ def eval
19
+ SelectExpression.new({
20
+ :string => self.text_value,
21
+
22
+ :select => select.eval,
23
+ :from => from.eval,
24
+ :where => where_condition_or_empty.eval,
25
+ :limit => limit_condition_or_empty.eval,
26
+ :order_by => order_by_condition_or_empty.eval
27
+ })
28
+ end
29
+ def query_type
30
+ :select
31
+ end
32
+ def build_tree(init_clause)
33
+ clauses = []
34
+ clause = init_clause
35
+ while clause
36
+ parens = clause.OPEN_PARENS rescue false
37
+ if parens
38
+ clauses << build_tree(clause.where_clause)
39
+ break
40
+ end
41
+
42
+ clause_obj = false
43
+ begin
44
+ clause_obj = clause.clause1
45
+ rescue
46
+ clause_obj = clause if clause.one_column_name rescue false
47
+ end
48
+ if clause_obj
49
+ clauses << {
50
+ :column => clause_obj.one_column_name.eval,
51
+ :condition => clause_obj.joiner_or_null.condition_joiner.eval,
52
+ :value => clause_obj.joiner_or_null.primitive.eval
53
+ }
54
+
55
+ dc_joiner = clause.disjunction_or_conjunction_joiner.text_value rescue dc_joiner = false
56
+ clauses << dc_joiner if dc_joiner
57
+
58
+ clause = clause.clause2 rescue false
59
+ if !clause
60
+ clause = clause.where_clause rescue false
61
+ end
62
+ else
63
+ clause = clause.where_clause rescue false
64
+ end
65
+ end
66
+ clauses
67
+ end
68
+ def tree
69
+ init_clause = self.where_condition_or_empty.where_condition.where_clause rescue false
70
+
71
+ where_result = (init_clause) ? build_tree(init_clause) : nil
72
+ {
73
+ :select => select.columns,
74
+ :from => from.tables,
75
+ :where => where_result,
76
+ :limit => limit_condition_or_empty.eval,
77
+ :order_by => order_by_condition_or_empty.eval
78
+ }
79
+ end
80
+ }
81
+ end
82
+ end
@@ -0,0 +1,17 @@
1
+ grammar SQLSelectClause
2
+ include SQLPrimitives
3
+ include SQLRowSupport
4
+
5
+ rule select
6
+ "SELECT" SPACE one_or_more_column_names optional_spaces {
7
+ def columns
8
+ result = one_or_more_column_names.eval
9
+ if result.kind_of?(Array)
10
+ result
11
+ else
12
+ [result]
13
+ end
14
+ end
15
+ }
16
+ end
17
+ end
@@ -0,0 +1,26 @@
1
+ grammar SQLShowTables
2
+ include SQLPrimitives
3
+ include SQLRowSupport
4
+ include SQLWhereCondition
5
+
6
+ rule show_tables
7
+ "SHOW" SPACE (full)? "TABLES" from_table?
8
+ (like_pattern / (SPACE where_condition))? {
9
+ def eval
10
+ Expressions::TableDisplayer.new(Guillotine::DataStore)
11
+ end
12
+ }
13
+ end
14
+
15
+ rule full
16
+ "FULL" SPACE
17
+ end
18
+
19
+ rule from_table
20
+ SPACE "FROM" SPACE table_name
21
+ end
22
+
23
+ rule like_pattern
24
+ SPACE "LIKE" SPACE single_quoted_string
25
+ end
26
+ end
@@ -0,0 +1,125 @@
1
+ grammar SQLTokens
2
+ rule SPACE
3
+ " "
4
+ end
5
+
6
+ rule OPEN_PARENS
7
+ '('
8
+ end
9
+
10
+ rule CLOSE_PARENS
11
+ ')'
12
+ end
13
+
14
+ rule EMPTY_STRING
15
+ '' { def eval; nil; end }
16
+ end
17
+
18
+ rule TRUE
19
+ "TRUE" {
20
+ def eval
21
+ true
22
+ end
23
+ }
24
+ end
25
+
26
+ rule FALSE
27
+ "FALSE" {
28
+ def eval
29
+ false
30
+ end
31
+ }
32
+ end
33
+
34
+ rule SINGLE_QUOTE
35
+ "'"
36
+ end
37
+
38
+ rule DOUBLE_QUOTE
39
+ "\""
40
+ end
41
+
42
+ rule BACKTICK
43
+ "`"
44
+ end
45
+
46
+ rule COMMA
47
+ ","
48
+ end
49
+
50
+ rule STRING_CHARS
51
+ [0-9a-zA-Z\$_]
52
+ end
53
+
54
+ rule ALPHA_CHARS
55
+ [a-zA-Z]
56
+ end
57
+
58
+ rule NON_QUOTE_CHARS
59
+ [^'"]
60
+ end
61
+
62
+ rule DIGIT
63
+ [0-9]
64
+ end
65
+
66
+ rule DASH
67
+ "-" { def eval; nil; end }
68
+ end
69
+
70
+ rule MINUS_OR_DIGIT
71
+ DASH / DIGIT
72
+ end
73
+
74
+ rule REAL_KEYWORD
75
+ "REAL"
76
+ end
77
+
78
+ rule DOUBLE_KEYWORD
79
+ "DOUBLE"
80
+ end
81
+
82
+ rule FLOAT_KEYWORD
83
+ "FLOAT"
84
+ end
85
+
86
+ rule DECIMAL_KEYWORD
87
+ "DECIMAL"
88
+ end
89
+
90
+ rule NUMERIC_KEYWORD
91
+ "NUMERIC"
92
+ end
93
+
94
+ rule SMALL_INT_KEYWORD
95
+ "SMALLINT"
96
+ end
97
+
98
+ rule TINY_INT_KEYWORD
99
+ "TINYINT"
100
+ end
101
+
102
+ rule INT_KEYWORD
103
+ "INT"
104
+ end
105
+
106
+ rule INTEGER_KEYWORD
107
+ "INTEGER"
108
+ end
109
+
110
+ rule ZEROFILL_KEYWORD
111
+ "ZEROFILL"
112
+ end
113
+
114
+ rule UNSIGNED_KEYWORD
115
+ "UNSIGNED"
116
+ end
117
+
118
+ rule BIG_INT_KEYWORD
119
+ "BIGINT"
120
+ end
121
+
122
+ rule VARCHAR_KEYWORD
123
+ "VARCHAR"
124
+ end
125
+ end
@@ -0,0 +1,43 @@
1
+ grammar SQLTransaction
2
+ include SQLPrimitives
3
+
4
+ rule transaction_statement
5
+ start_transaction / begin / commit / rollback
6
+ end
7
+
8
+ rule start_transaction
9
+ "START" SPACE "TRANSACTION" with_consistent_snapshot?
10
+ end
11
+
12
+ rule with_consistent_snapshot
13
+ SPACE "WITH" SPACE "CONSISTENT" SPACE "SNAPSHOT"
14
+ end
15
+
16
+ rule begin
17
+ "BEGIN" work?
18
+ end
19
+
20
+ rule work
21
+ SPACE "WORK"
22
+ end
23
+
24
+ rule commit
25
+ "COMMIT" optional_transactional_clauses
26
+ end
27
+
28
+ rule optional_transactional_clauses
29
+ work? chain? release?
30
+ end
31
+
32
+ rule chain
33
+ SPACE "AND" SPACE ("NO" SPACE)? "CHAIN"
34
+ end
35
+
36
+ rule release
37
+ SPACE ("NO" SPACE)? "RELEASE"
38
+ end
39
+
40
+ rule rollback
41
+ "ROLLBACK" optional_transactional_clauses
42
+ end
43
+ end
@@ -0,0 +1,11 @@
1
+ grammar SQLTruncate
2
+ include SQLRowSupport
3
+
4
+ rule truncate
5
+ "TRUNCATE" SPACE ("TABLE" SPACE)? table_name {
6
+ def eval
7
+ Truncate.new(table_name.eval)
8
+ end
9
+ }
10
+ end
11
+ end
@@ -0,0 +1,82 @@
1
+ grammar SQLUpdate
2
+
3
+ rule parts
4
+ update / simple_where_clause / assignment_list / assignment / quoted_string / text / identifier
5
+ end
6
+
7
+ rule update
8
+ "UPDATE" space identifier space "SET" space assignment_list space simple_where_clause {
9
+ def table_name
10
+ identifier.text_value
11
+ end
12
+ def id
13
+ simple_where_clause.id
14
+ end
15
+ def items
16
+ assignment_list.items
17
+ end
18
+ }
19
+ end
20
+
21
+ rule simple_where_clause
22
+ "WHERE" space identifier space "=" space quoted_string {
23
+ def id
24
+ quoted_string.text_value
25
+ end
26
+ }
27
+ end
28
+
29
+ rule assignment_list
30
+ a1:assignment space "," space a2:assignment_list {
31
+ def items
32
+ a1.items.merge(a2.items)
33
+ end
34
+ }
35
+ /
36
+ assignment
37
+ end
38
+
39
+ rule assignment
40
+ identifier space "=" space quoted_string {
41
+
42
+ def items
43
+ { key => value }
44
+ end
45
+
46
+ def key
47
+ identifier.text_value
48
+ end
49
+
50
+ def value
51
+ quoted_string.text_value
52
+ end
53
+ }
54
+ end
55
+
56
+ rule quoted_string
57
+ "'" text "'" {
58
+ def text_value
59
+ text.text_value
60
+ end
61
+ }
62
+ /
63
+ "''" {
64
+ def text_value
65
+ ""
66
+ end
67
+ }
68
+ end
69
+
70
+ rule text
71
+ ( "''" / !"'" . )+
72
+ end
73
+
74
+ rule identifier
75
+ (!("'" / "=" / " ") .)+
76
+ end
77
+
78
+ rule space
79
+ ' '*
80
+ end
81
+
82
+ end
@@ -0,0 +1,46 @@
1
+ grammar SQLWhereCondition
2
+ include SQLKeyValuePair
3
+
4
+ rule where_condition
5
+ "WHERE" SPACE where_clause {
6
+ def eval
7
+ where_clause.eval
8
+ end
9
+ }
10
+ end
11
+
12
+ rule where_clause
13
+ OPEN_PARENS optional_spaces where_clause optional_spaces CLOSE_PARENS {
14
+ def eval
15
+ where_clause.eval
16
+ end
17
+ }
18
+ /
19
+ clause1:single_expression_where_clause SPACE
20
+ disjunction_or_conjunction_joiner SPACE
21
+ clause2:where_clause {
22
+ def eval
23
+ klass = Expressions.find_class_for(disjunction_or_conjunction_joiner.eval)
24
+ klass.new(clause1.eval, clause2.eval)
25
+ end
26
+ }
27
+ /
28
+ single_expression_where_clause
29
+ end
30
+
31
+ rule disjunction_or_conjunction_joiner
32
+ and / or
33
+ end
34
+
35
+ rule and
36
+ "AND" { def eval; :AND; end }
37
+ end
38
+
39
+ rule or
40
+ "OR" { def eval; :OR; end }
41
+ end
42
+
43
+ rule single_expression_where_clause
44
+ key_value_pair
45
+ end
46
+ end
@@ -0,0 +1,23 @@
1
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_tokens.treetop"
2
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_primitives.treetop"
3
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_helpers.treetop"
4
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_chars.treetop"
5
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_row_support.treetop"
6
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_key_value_pair.treetop"
7
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_where_condition.treetop"
8
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_limit.treetop"
9
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_order_by_clause.treetop"
10
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_group_by_clause.treetop"
11
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_from_clause.treetop"
12
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_select_clause.treetop"
13
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_select.treetop"
14
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_truncate.treetop"
15
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_delete.treetop"
16
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_drop_table.treetop"
17
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_show_tables.treetop"
18
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_transaction.treetop"
19
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_insert.treetop"
20
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_update.treetop"
21
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_datatypes.treetop"
22
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql_create_table.treetop"
23
+ Treetop.load "#{File.dirname(__FILE__)}/sql_parser/sql.treetop"