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