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