hipster_sql_to_hbase 0.2.0 → 0.2.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 +4 -4
- data/VERSION +1 -1
- data/hipster_sql_to_hbase.gemspec +1 -1
- data/lib/hipster_sql_to_hbase.rb +7 -1
- data/lib/sql_parser/sql_create_table.treetop +7 -0
- data/lib/sql_parser/sql_from_clause.treetop +6 -1
- data/lib/sql_parser/sql_primitives.treetop +29 -5
- data/lib/sql_parser/sql_row_support.treetop +112 -27
- data/lib/sql_parser/sql_select.treetop +15 -21
- data/lib/sql_parser/sql_select_clause.treetop +105 -10
- data/lib/sql_parser/sql_tokens.treetop +13 -5
- data/spec/hipster_sql_to_hbase_spec.rb +19 -16
- data/spec/spec_helper.rb +0 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8f7de19de530e43d65fbb34022c20b589158c99
|
4
|
+
data.tar.gz: 2f618ebe82db8ccc67f78a35448c981a50f1b97b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af120d262c539e082624bf1af5addbdbc8e29dbfd01162530585ba30ffc88ee54e2b1d643d17b2c907b6e932ade7587e4b539adaf73e5c9cb29a4db09eec8acc
|
7
|
+
data.tar.gz: 41223aa5cd25db917af38b0cc4766a4716a6026a21f44e9449ec1b959820fddc1243ec395992fd69bc9646047bb4c37c1439e3846c9254bad6addbbda2b7103d
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.2
|
data/lib/hipster_sql_to_hbase.rb
CHANGED
@@ -143,7 +143,13 @@ module HipsterSqlToHbase
|
|
143
143
|
#
|
144
144
|
# === Note: the main difference between **parse_tree** and **parse_hash** is that a **ResultTree** can be further converted to Thrift calls while a **Hash** cannot.
|
145
145
|
def parse_tree(string)
|
146
|
-
|
146
|
+
parsed_hash = parse_hash(string)
|
147
|
+
|
148
|
+
if parsed_hash.nil?
|
149
|
+
nil
|
150
|
+
else
|
151
|
+
HipsterSqlToHbase::ResultTree.new(parsed_hash)
|
152
|
+
end
|
147
153
|
end
|
148
154
|
|
149
155
|
# Generate a <b>HipsterSqlToHbase</b>::<b>ThriftCallGroup</b> from a valid, SQL string.
|
@@ -56,6 +56,7 @@ grammar SQLCreateTable
|
|
56
56
|
rule optional_column_feature
|
57
57
|
optional_primary_key /
|
58
58
|
optional_auto_increment /
|
59
|
+
optional_default /
|
59
60
|
optional_not_null
|
60
61
|
end
|
61
62
|
|
@@ -65,6 +66,12 @@ grammar SQLCreateTable
|
|
65
66
|
SPACES "primary" SPACES "key"
|
66
67
|
end
|
67
68
|
|
69
|
+
rule optional_default
|
70
|
+
SPACES "DEFAULT" SPACES (quoted_string / NULL_KEYWORD / MINUS_OR_DIGIT+)
|
71
|
+
/
|
72
|
+
SPACES "default" SPACES (quoted_string / NULL_KEYWORD / MINUS_OR_DIGIT+)
|
73
|
+
end
|
74
|
+
|
68
75
|
rule optional_auto_increment
|
69
76
|
SPACES "AUTO_INCREMENT"
|
70
77
|
/
|
@@ -43,6 +43,22 @@ grammar SQLPrimitives
|
|
43
43
|
}
|
44
44
|
end
|
45
45
|
|
46
|
+
rule string
|
47
|
+
STRING_CHARS+ {
|
48
|
+
def eval
|
49
|
+
text_value
|
50
|
+
end
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
rule column_string
|
55
|
+
STRING_CHARS_W_NON_XCLUSIVE_NUMS+ {
|
56
|
+
def eval
|
57
|
+
text_value.downcase
|
58
|
+
end
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
46
62
|
rule backtick_string
|
47
63
|
BACKTICK string BACKTICK {
|
48
64
|
def eval
|
@@ -51,10 +67,10 @@ grammar SQLPrimitives
|
|
51
67
|
}
|
52
68
|
end
|
53
69
|
|
54
|
-
rule
|
55
|
-
|
70
|
+
rule backtick_column_string
|
71
|
+
BACKTICK column_string BACKTICK {
|
56
72
|
def eval
|
57
|
-
|
73
|
+
column_string.eval
|
58
74
|
end
|
59
75
|
}
|
60
76
|
end
|
@@ -64,7 +80,15 @@ grammar SQLPrimitives
|
|
64
80
|
end
|
65
81
|
|
66
82
|
rule integer
|
67
|
-
|
83
|
+
DASH? DIGIT* {
|
84
|
+
def eval
|
85
|
+
text_value.to_i
|
86
|
+
end
|
87
|
+
}
|
88
|
+
end
|
89
|
+
|
90
|
+
rule positive_integer
|
91
|
+
DIGIT* {
|
68
92
|
def eval
|
69
93
|
text_value.to_i
|
70
94
|
end
|
@@ -72,7 +96,7 @@ grammar SQLPrimitives
|
|
72
96
|
end
|
73
97
|
|
74
98
|
rule float
|
75
|
-
integer "."
|
99
|
+
integer "." positive_integer {
|
76
100
|
def eval
|
77
101
|
text_value.to_f
|
78
102
|
end
|
@@ -2,39 +2,76 @@ grammar SQLRowSupport
|
|
2
2
|
include SQLPrimitives
|
3
3
|
|
4
4
|
rule one_or_more_table_names
|
5
|
-
table_name
|
5
|
+
table_name COMMA SPACES one_or_more_table_names {
|
6
6
|
def eval
|
7
7
|
[table_name.eval, one_or_more_table_names.eval]
|
8
8
|
end
|
9
9
|
}
|
10
10
|
/
|
11
|
-
table_name
|
11
|
+
EMPTY_STRING table_name {
|
12
|
+
def eval
|
13
|
+
[table_name.eval]
|
14
|
+
end
|
15
|
+
}
|
12
16
|
end
|
13
|
-
|
14
|
-
rule
|
15
|
-
|
17
|
+
|
18
|
+
rule one_or_more_numbers
|
19
|
+
number optional_spaces COMMA optional_spaces one_or_more_numbers {
|
16
20
|
def eval
|
17
|
-
result1, result2 =
|
21
|
+
result1, result2 = number.eval, one_or_more_numbers.eval
|
18
22
|
[result1, result2].flatten
|
19
23
|
end
|
20
24
|
}
|
21
|
-
/
|
22
|
-
|
25
|
+
/
|
26
|
+
EMPTY_STRING number {
|
27
|
+
def eval
|
28
|
+
[number.eval]
|
29
|
+
end
|
30
|
+
}
|
23
31
|
end
|
24
|
-
|
25
|
-
rule
|
26
|
-
|
32
|
+
|
33
|
+
rule one_number_with_alias
|
34
|
+
number SPACES "AS" SPACES alias_column_name {
|
27
35
|
def eval
|
28
|
-
|
36
|
+
{
|
37
|
+
:number => number.eval,
|
38
|
+
:alias_hash => {
|
39
|
+
:number => number.eval,
|
40
|
+
:alias => alias_column_name.eval
|
41
|
+
}
|
42
|
+
}
|
43
|
+
end
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
rule one_or_more_number_with_alias
|
48
|
+
one_number_with_alias optional_spaces COMMA optional_spaces one_or_more_number_with_alias {
|
49
|
+
def eval
|
50
|
+
result1, result2 = one_number_with_alias.eval, one_or_more_number_with_alias.eval
|
29
51
|
[result1, result2].flatten
|
30
52
|
end
|
31
53
|
}
|
32
54
|
/
|
33
|
-
|
55
|
+
EMPTY_STRING one_number_with_alias {
|
56
|
+
def eval
|
57
|
+
[one_number_with_alias.eval]
|
58
|
+
end
|
59
|
+
}
|
34
60
|
end
|
35
61
|
|
62
|
+
#rule one_or_more_column_names_with_sort
|
63
|
+
# one_column_name_with_sort COMMA SPACES one_or_more_column_names {
|
64
|
+
# def eval
|
65
|
+
# result1, result2 = one_column_name.eval, one_or_more_column_names.eval
|
66
|
+
# [result1, result2].flatten
|
67
|
+
# end
|
68
|
+
# }
|
69
|
+
# /
|
70
|
+
# one_column_name_with_sort
|
71
|
+
#end
|
72
|
+
|
36
73
|
rule one_column_name
|
37
|
-
table_name
|
74
|
+
table_name DOT column_name {
|
38
75
|
def eval
|
39
76
|
column_name.eval
|
40
77
|
end
|
@@ -43,8 +80,68 @@ grammar SQLRowSupport
|
|
43
80
|
column_name
|
44
81
|
end
|
45
82
|
|
83
|
+
rule one_or_more_column_names
|
84
|
+
one_column_name optional_spaces COMMA optional_spaces one_or_more_column_names {
|
85
|
+
def eval
|
86
|
+
result1, result2 = one_column_name.eval, one_or_more_column_names.eval
|
87
|
+
[result1, result2].flatten
|
88
|
+
end
|
89
|
+
}
|
90
|
+
/
|
91
|
+
EMPTY_STRING one_column_name {
|
92
|
+
def eval
|
93
|
+
[one_column_name.eval]
|
94
|
+
end
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
rule one_column_name_with_alias
|
99
|
+
table_name DOT column_name SPACES "AS" SPACES alias_column_name {
|
100
|
+
def eval
|
101
|
+
{
|
102
|
+
:column => column_name.eval,
|
103
|
+
:alias_hash => {
|
104
|
+
:column => column_name.eval,
|
105
|
+
:alias => alias_column_name.eval
|
106
|
+
}
|
107
|
+
}
|
108
|
+
end
|
109
|
+
}
|
110
|
+
/
|
111
|
+
column_name SPACES "AS" SPACES alias_column_name {
|
112
|
+
def eval
|
113
|
+
{
|
114
|
+
:column => column_name.eval,
|
115
|
+
:alias_hash => {
|
116
|
+
:column => column_name.eval,
|
117
|
+
:alias => alias_column_name.eval
|
118
|
+
}
|
119
|
+
}
|
120
|
+
end
|
121
|
+
}
|
122
|
+
end
|
123
|
+
|
124
|
+
rule one_or_more_column_name_with_alias
|
125
|
+
one_column_name_with_alias optional_spaces COMMA optional_spaces one_or_more_column_name_with_alias {
|
126
|
+
def eval
|
127
|
+
result1, result2 = one_column_name_with_alias.eval, one_or_more_column_name_with_alias.eval
|
128
|
+
[result1, result2].flatten
|
129
|
+
end
|
130
|
+
}
|
131
|
+
/
|
132
|
+
EMPTY_STRING one_column_name_with_alias {
|
133
|
+
def eval
|
134
|
+
[one_column_name_with_alias.eval]
|
135
|
+
end
|
136
|
+
}
|
137
|
+
end
|
138
|
+
|
46
139
|
rule column_name
|
47
|
-
|
140
|
+
backtick_column_string / column_string / all_columns
|
141
|
+
end
|
142
|
+
|
143
|
+
rule alias_column_name
|
144
|
+
column_name
|
48
145
|
end
|
49
146
|
|
50
147
|
rule index_name
|
@@ -58,18 +155,6 @@ grammar SQLRowSupport
|
|
58
155
|
string
|
59
156
|
end
|
60
157
|
|
61
|
-
rule column_string
|
62
|
-
string {
|
63
|
-
def eval
|
64
|
-
text_value.downcase
|
65
|
-
end
|
66
|
-
}
|
67
|
-
end
|
68
|
-
|
69
|
-
rule dot
|
70
|
-
"." { def eval; "."; end }
|
71
|
-
end
|
72
|
-
|
73
158
|
rule all_columns
|
74
159
|
"*" { def eval; "*"; end }
|
75
160
|
end
|
@@ -10,35 +10,29 @@ grammar SQLSelect
|
|
10
10
|
|
11
11
|
rule select_expression
|
12
12
|
select
|
13
|
-
|
13
|
+
from_or_empty
|
14
14
|
where_tree
|
15
15
|
limit_condition_or_empty
|
16
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_tree.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
|
-
|
17
|
+
{
|
30
18
|
def query_type
|
31
19
|
:select
|
32
20
|
end
|
33
21
|
|
34
22
|
def tree
|
35
|
-
{
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
23
|
+
result = {}
|
24
|
+
|
25
|
+
selectables = select.eval
|
26
|
+
|
27
|
+
result[:limit] = limit_condition_or_empty.eval unless limit_condition_or_empty.eval.nil?
|
28
|
+
result[:order_by] = order_by_condition_or_empty.eval unless order_by_condition_or_empty.eval.nil?
|
29
|
+
result[:from] = from_or_empty.tables if defined? from_or_empty.tables
|
30
|
+
result[:where] = where_tree.eval unless where_tree.eval.nil?
|
31
|
+
result[:columns] = selectables[:columns] unless selectables[:columns].nil?
|
32
|
+
result[:numbers] = selectables[:numbers] unless selectables[:numbers].nil?
|
33
|
+
result[:aliases] = selectables[:aliases] unless selectables[:aliases].nil?
|
34
|
+
|
35
|
+
result
|
42
36
|
end
|
43
37
|
}
|
44
38
|
end
|
@@ -1,17 +1,112 @@
|
|
1
1
|
grammar SQLSelectClause
|
2
|
-
include SQLPrimitives
|
3
2
|
include SQLRowSupport
|
4
3
|
|
5
4
|
rule select
|
6
|
-
"SELECT" SPACES
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
5
|
+
"SELECT" SPACES selectable_list optional_spaces {
|
6
|
+
def eval
|
7
|
+
result = selectable_list.eval
|
8
|
+
result
|
9
|
+
end
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
rule selectable_list
|
14
|
+
selectables optional_spaces COMMA selectable_list {
|
15
|
+
def eval
|
16
|
+
result = {}
|
17
|
+
one_result = selectables.eval
|
18
|
+
list_result = selectable_list.eval
|
19
|
+
|
20
|
+
result[:columns] = []
|
21
|
+
result[:columns] += one_result[:columns] unless one_result[:columns].nil?
|
22
|
+
result[:columns] += list_result[:columns] unless list_result[:columns].nil?
|
23
|
+
result.delete(:columns) if result[:columns].empty?
|
24
|
+
|
25
|
+
result[:numbers] = []
|
26
|
+
result[:numbers] += one_result[:numbers] unless one_result[:numbers].nil?
|
27
|
+
result[:numbers] += list_result[:numbers] unless list_result[:numbers].nil?
|
28
|
+
result.delete(:numbers) if result[:numbers].empty?
|
29
|
+
|
30
|
+
result[:aliases] = []
|
31
|
+
result[:aliases] += one_result[:aliases] unless one_result[:aliases].nil?
|
32
|
+
result[:aliases] += list_result[:aliases] unless list_result[:aliases].nil?
|
33
|
+
result.delete(:aliases) if result[:aliases].empty?
|
34
|
+
|
35
|
+
result
|
36
|
+
end
|
37
|
+
}
|
38
|
+
/
|
39
|
+
selectables
|
40
|
+
end
|
41
|
+
|
42
|
+
rule selectables
|
43
|
+
selectable_columns_with_alias
|
44
|
+
/
|
45
|
+
selectable_columns
|
46
|
+
/
|
47
|
+
selectable_numbers_with_alias
|
48
|
+
/
|
49
|
+
selectable_numbers
|
50
|
+
end
|
51
|
+
|
52
|
+
rule selectable_columns_with_alias
|
53
|
+
optional_spaces one_or_more_column_name_with_alias {
|
54
|
+
def eval
|
55
|
+
result = {
|
56
|
+
:columns => [],
|
57
|
+
:aliases => []
|
58
|
+
}
|
59
|
+
num_alias_pairs = one_or_more_column_name_with_alias.eval
|
60
|
+
|
61
|
+
num_alias_pairs.each do |num_alias_pair|
|
62
|
+
result[:columns] << num_alias_pair[:column]
|
63
|
+
result[:aliases] << num_alias_pair[:alias_hash]
|
64
|
+
end
|
65
|
+
|
66
|
+
result
|
67
|
+
end
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
rule selectable_columns
|
72
|
+
optional_spaces one_or_more_column_names {
|
73
|
+
def eval
|
74
|
+
{
|
75
|
+
:columns => one_or_more_column_names.eval
|
76
|
+
}
|
77
|
+
end
|
78
|
+
}
|
79
|
+
end
|
80
|
+
|
81
|
+
rule selectable_numbers_with_alias
|
82
|
+
optional_spaces one_or_more_number_with_alias {
|
83
|
+
def eval
|
84
|
+
result = {
|
85
|
+
:numbers => [],
|
86
|
+
:aliases => []
|
87
|
+
}
|
88
|
+
num_alias_pairs = one_or_more_number_with_alias.eval
|
89
|
+
|
90
|
+
num_alias_pairs.each do |num_alias_pair|
|
91
|
+
result[:numbers] << num_alias_pair[:number]
|
92
|
+
result[:aliases] << num_alias_pair[:alias_hash]
|
93
|
+
end
|
94
|
+
|
95
|
+
result
|
96
|
+
end
|
97
|
+
}
|
98
|
+
end
|
99
|
+
|
100
|
+
rule selectable_numbers
|
101
|
+
optional_spaces one_or_more_numbers {
|
102
|
+
def eval
|
103
|
+
result_nums = one_or_more_numbers.eval
|
104
|
+
result_nums = [result_nums] unless result_nums.is_a? Array
|
105
|
+
|
106
|
+
{
|
107
|
+
:numbers => result_nums
|
108
|
+
}
|
109
|
+
end
|
15
110
|
}
|
16
111
|
end
|
17
112
|
end
|
@@ -44,17 +44,25 @@ grammar SQLTokens
|
|
44
44
|
end
|
45
45
|
|
46
46
|
rule BACKTICK
|
47
|
-
"`"
|
47
|
+
"`" { def eval; nil; end }
|
48
48
|
end
|
49
49
|
|
50
50
|
rule COMMA
|
51
51
|
","
|
52
52
|
end
|
53
53
|
|
54
|
+
rule DOT
|
55
|
+
"." { def eval; "."; end }
|
56
|
+
end
|
57
|
+
|
54
58
|
rule STRING_CHARS
|
55
59
|
[0-9a-zA-Z\$_:]
|
56
60
|
end
|
57
61
|
|
62
|
+
rule VALID_NON_NUM_CHARS
|
63
|
+
[a-zA-Z\$_:]
|
64
|
+
end
|
65
|
+
|
58
66
|
rule ALPHA_CHARS
|
59
67
|
[a-zA-Z]
|
60
68
|
end
|
@@ -63,12 +71,12 @@ grammar SQLTokens
|
|
63
71
|
[0-9]
|
64
72
|
end
|
65
73
|
|
66
|
-
rule
|
67
|
-
|
74
|
+
rule STRING_CHARS_W_NON_XCLUSIVE_NUMS
|
75
|
+
DIGIT* VALID_NON_NUM_CHARS+ DIGIT*
|
68
76
|
end
|
69
77
|
|
70
|
-
rule
|
71
|
-
|
78
|
+
rule DASH
|
79
|
+
"-" { def eval; nil; end }
|
72
80
|
end
|
73
81
|
|
74
82
|
rule REAL_KEYWORD
|
@@ -1,4 +1,7 @@
|
|
1
|
-
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'sql_sentence_types'))
|
3
|
+
|
4
|
+
require 'spec_helper'
|
2
5
|
|
3
6
|
|
4
7
|
|
@@ -63,11 +66,11 @@ describe "HipsterSqlToHbase.parse_tree method" do
|
|
63
66
|
expect(response.class).to eq(HipsterSqlToHbase::ResultTree)
|
64
67
|
expect(response[:query_type]).to eq(:select)
|
65
68
|
expect(response[:query_hash].class).to eq(Hash)
|
66
|
-
expect(response[:query_hash][:
|
67
|
-
expect(response[:query_hash][:
|
68
|
-
expect(response[:query_hash][:
|
69
|
-
expect(response[:query_hash][:from].class).to eq(
|
70
|
-
expect(response[:query_hash][:from]).to eq('users')
|
69
|
+
expect(response[:query_hash][:columns].class).to eq(Array)
|
70
|
+
expect(response[:query_hash][:columns].length).to eq(1)
|
71
|
+
expect(response[:query_hash][:columns][0]).to eq('user')
|
72
|
+
expect(response[:query_hash][:from].class).to eq(Array)
|
73
|
+
expect(response[:query_hash][:from][0]).to eq('users')
|
71
74
|
response[:query_hash][:where].should be_nil
|
72
75
|
response[:query_hash][:limit].should be_nil
|
73
76
|
response[:query_hash][:order].should be_nil
|
@@ -80,11 +83,11 @@ describe "HipsterSqlToHbase.parse_tree method" do
|
|
80
83
|
expect(response.class).to eq(HipsterSqlToHbase::ResultTree)
|
81
84
|
expect(response[:query_type]).to eq(:select)
|
82
85
|
expect(response[:query_hash].class).to eq(Hash)
|
83
|
-
expect(response[:query_hash][:
|
84
|
-
expect(response[:query_hash][:
|
85
|
-
expect(response[:query_hash][:
|
86
|
-
expect(response[:query_hash][:from].class).to eq(
|
87
|
-
expect(response[:query_hash][:from]).to eq('users')
|
86
|
+
expect(response[:query_hash][:columns].class).to eq(Array)
|
87
|
+
expect(response[:query_hash][:columns].length).to eq(1)
|
88
|
+
expect(response[:query_hash][:columns][0]).to eq('user')
|
89
|
+
expect(response[:query_hash][:from].class).to eq(Array)
|
90
|
+
expect(response[:query_hash][:from][0]).to eq('users')
|
88
91
|
response[:query_hash][:where].should be_nil
|
89
92
|
response[:query_hash][:limit].should be_nil
|
90
93
|
response[:query_hash][:order].should be_nil
|
@@ -97,11 +100,11 @@ describe "HipsterSqlToHbase.parse_tree method" do
|
|
97
100
|
expect(response.class).to eq(HipsterSqlToHbase::ResultTree)
|
98
101
|
expect(response[:query_type]).to eq(:select)
|
99
102
|
expect(response[:query_hash].class).to eq(Hash)
|
100
|
-
expect(response[:query_hash][:
|
101
|
-
expect(response[:query_hash][:
|
102
|
-
expect(response[:query_hash][:
|
103
|
-
expect(response[:query_hash][:from].class).to eq(
|
104
|
-
expect(response[:query_hash][:from]).to eq('users')
|
103
|
+
expect(response[:query_hash][:columns].class).to eq(Array)
|
104
|
+
expect(response[:query_hash][:columns].length).to eq(1)
|
105
|
+
expect(response[:query_hash][:columns][0]).to eq('user')
|
106
|
+
expect(response[:query_hash][:from].class).to eq(Array)
|
107
|
+
expect(response[:query_hash][:from][0]).to eq('users')
|
105
108
|
response[:query_hash][:where].should be_nil
|
106
109
|
response[:query_hash][:limit].should be_nil
|
107
110
|
response[:query_hash][:order].should be_nil
|
data/spec/spec_helper.rb
CHANGED