influxdb-arel 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/Gemfile +1 -0
- data/README.md +218 -124
- data/lib/influxdb/arel.rb +25 -16
- data/lib/influxdb/arel/builder.rb +209 -0
- data/lib/influxdb/arel/clauses.rb +6 -0
- data/lib/influxdb/arel/clauses/base.rb +34 -0
- data/lib/influxdb/arel/clauses/expressions.rb +75 -0
- data/lib/influxdb/arel/clauses/from_clause.rb +45 -0
- data/lib/influxdb/arel/clauses/group_clause.rb +34 -0
- data/lib/influxdb/arel/clauses/select_clause.rb +37 -0
- data/lib/influxdb/arel/clauses/where_clause.rb +102 -0
- data/lib/influxdb/arel/core_extensions.rb +5 -21
- data/lib/influxdb/arel/delete_manager.rb +50 -0
- data/lib/influxdb/arel/extensions.rb +6 -0
- data/lib/influxdb/arel/extensions/alias_predication.rb +11 -0
- data/lib/influxdb/arel/extensions/boolean_predications.rb +15 -0
- data/lib/influxdb/arel/extensions/expressions.rb +75 -0
- data/lib/influxdb/arel/extensions/joining_merging.rb +21 -0
- data/lib/influxdb/arel/extensions/math.rb +23 -0
- data/lib/influxdb/arel/extensions/predications.rb +144 -0
- data/lib/influxdb/arel/nodes.rb +7 -14
- data/lib/influxdb/arel/nodes/attribute.rb +20 -0
- data/lib/influxdb/arel/nodes/binary.rb +4 -3
- data/lib/influxdb/arel/nodes/delete_statement.rb +37 -0
- data/lib/influxdb/arel/nodes/duration.rb +3 -3
- data/lib/influxdb/arel/nodes/function.rb +2 -2
- data/lib/influxdb/arel/nodes/grouping.rb +3 -3
- data/lib/influxdb/arel/nodes/infix_operation.rb +11 -4
- data/lib/influxdb/arel/nodes/merge.rb +13 -0
- data/lib/influxdb/arel/nodes/node.rb +18 -6
- data/lib/influxdb/arel/nodes/now.rb +1 -1
- data/lib/influxdb/arel/nodes/ordering.rb +15 -0
- data/lib/influxdb/arel/nodes/select_statement.rb +10 -8
- data/lib/influxdb/arel/nodes/sql_literal.rb +5 -8
- data/lib/influxdb/arel/nodes/table.rb +19 -0
- data/lib/influxdb/arel/nodes/table_alias.rb +2 -4
- data/lib/influxdb/arel/nodes/unary.rb +6 -1
- data/lib/influxdb/arel/quoter.rb +85 -0
- data/lib/influxdb/arel/select_manager.rb +111 -64
- data/lib/influxdb/arel/tree_manager.rb +15 -5
- data/lib/influxdb/arel/version.rb +1 -1
- data/lib/influxdb/arel/visitor.rb +96 -126
- data/lib/influxdb/arel/visitor/delete_statement.rb +32 -0
- data/lib/influxdb/arel/visitor/select_statement.rb +59 -0
- data/lib/influxdb/arel/visitor/where_statement.rb +14 -0
- data/spec/lib/influxdb/arel/builder_spec.rb +173 -0
- data/spec/lib/influxdb/arel/core_extensions_spec.rb +0 -21
- data/spec/lib/influxdb/arel/nodes/and_spec.rb +6 -9
- data/spec/lib/influxdb/arel/nodes/attribute_spec.rb +21 -0
- data/spec/lib/influxdb/arel/nodes/binary_spec.rb +0 -4
- data/spec/lib/influxdb/arel/nodes/duration_spec.rb +1 -0
- data/spec/lib/influxdb/arel/nodes/in_spec.rb +1 -0
- data/spec/lib/influxdb/arel/nodes/infix_operation_spec.rb +17 -0
- data/spec/lib/influxdb/arel/nodes/merge_spec.rb +25 -0
- data/spec/lib/influxdb/arel/nodes/now_spec.rb +1 -0
- data/spec/lib/influxdb/arel/nodes/ordering_spec.rb +19 -0
- data/spec/lib/influxdb/arel/nodes/sql_literal_spec.rb +1 -5
- data/spec/lib/influxdb/arel/nodes/table_alias_spec.rb +3 -10
- data/spec/lib/influxdb/arel/nodes/table_spec.rb +8 -0
- data/spec/lib/influxdb/arel/nodes/unary_spec.rb +0 -4
- data/spec/lib/influxdb/arel/quoter/repository_spec.rb +10 -0
- data/spec/lib/influxdb/arel/quoter_spec.rb +33 -0
- data/spec/lib/influxdb/arel/select_manager_spec.rb +356 -156
- data/spec/lib/influxdb/arel_spec.rb +22 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/support/examples/binary_node.rb +1 -0
- data/spec/support/examples/function_node.rb +1 -0
- data/spec/support/examples/infix_operation_node.rb +15 -0
- data/spec/support/examples/node_boolean_predications.rb +21 -0
- data/spec/support/examples/node_joining_merging.rb +53 -0
- data/spec/support/examples/unary_node.rb +1 -0
- data/spec/support/fabrics.rb +3 -3
- metadata +49 -11
- data/lib/influxdb/arel/alias_predication.rb +0 -9
- data/lib/influxdb/arel/attributes.rb +0 -1
- data/lib/influxdb/arel/attributes/attribute.rb +0 -74
- data/lib/influxdb/arel/expressions.rb +0 -73
- data/lib/influxdb/arel/math.rb +0 -21
- data/lib/influxdb/arel/predications.rb +0 -137
- data/lib/influxdb/arel/table.rb +0 -219
- data/spec/lib/influxdb/arel/table_spec.rb +0 -193
@@ -1,96 +1,98 @@
|
|
1
1
|
module Influxdb
|
2
2
|
module Arel
|
3
3
|
class SelectManager < Arel::TreeManager
|
4
|
-
|
4
|
+
DIRECTIONS = [:asc, :desc].freeze
|
5
|
+
|
6
|
+
def initialize(*tables, &block)
|
5
7
|
super()
|
6
8
|
@ast = Nodes::SelectStatement.new
|
7
|
-
from(*tables)
|
9
|
+
from(*tables, &block)
|
8
10
|
end
|
9
11
|
|
10
|
-
def
|
11
|
-
|
12
|
+
def group(*attributes, &block)
|
13
|
+
ast.groups |= Clauses::GroupClause.new(*attributes, &block).to_arel
|
14
|
+
self
|
12
15
|
end
|
13
16
|
|
14
|
-
def
|
15
|
-
ast.
|
17
|
+
def group!(*attributes, &block)
|
18
|
+
ast.groups = process_value_with_bang(Clauses::GroupClause, attributes, &block)
|
19
|
+
self
|
16
20
|
end
|
17
21
|
|
18
|
-
|
19
|
-
|
20
|
-
def wheres
|
21
|
-
ast.wheres
|
22
|
+
def group_values
|
23
|
+
ast.groups
|
22
24
|
end
|
23
25
|
|
24
|
-
def
|
25
|
-
|
26
|
-
column = STRING_OR_SYMBOL_CLASS.include?(column.class) ? Arel.sql(column.to_s) : column
|
27
|
-
ast.groups.push(Nodes::Group.new(column))
|
28
|
-
end
|
29
|
-
|
26
|
+
def select(*attributes, &block)
|
27
|
+
ast.attributes |= Clauses::SelectClause.new(*attributes, &block).to_arel
|
30
28
|
self
|
31
29
|
end
|
32
30
|
|
33
|
-
def
|
34
|
-
ast.
|
31
|
+
def select!(*attributes, &block)
|
32
|
+
ast.attributes = process_value_with_bang(Clauses::SelectClause, attributes, &block)
|
35
33
|
self
|
36
34
|
end
|
37
35
|
|
38
|
-
def
|
39
|
-
|
40
|
-
case table
|
41
|
-
when String, Symbol
|
42
|
-
Arel.sql(table.to_s)
|
43
|
-
when Regexp
|
44
|
-
Arel.sql(table.inspect)
|
45
|
-
else
|
46
|
-
table
|
47
|
-
end
|
48
|
-
end.compact
|
49
|
-
|
50
|
-
ast.series = series unless series.empty?
|
51
|
-
self
|
36
|
+
def select_values
|
37
|
+
ast.attributes
|
52
38
|
end
|
53
39
|
|
54
|
-
def
|
55
|
-
|
56
|
-
table = STRING_OR_SYMBOL_CLASS.include?(table.class) ? Arel.sql(table.to_s) : table
|
57
|
-
ast.join = Nodes::Join.new(series[0], table)
|
58
|
-
elsif series.size > 1
|
59
|
-
ast.join = Nodes::Join.new(series[0], series[1])
|
60
|
-
end
|
40
|
+
def fill(value)
|
41
|
+
ast.fill = Nodes::Fill.new(value)
|
61
42
|
self
|
62
43
|
end
|
63
44
|
|
64
|
-
def
|
65
|
-
|
66
|
-
table = STRING_OR_SYMBOL_CLASS.include?(table.class) ? Arel.sql(table.to_s) : table
|
67
|
-
ast.merge = Nodes::Merge.new(series[0].unalias, table.unalias)
|
68
|
-
elsif series.size > 1
|
69
|
-
ast.merge = Nodes::Merge.new(series[0].unalias, series[1].unalias)
|
70
|
-
end
|
71
|
-
self
|
45
|
+
def fill_value
|
46
|
+
ast.fill
|
72
47
|
end
|
73
48
|
|
74
|
-
def
|
75
|
-
|
76
|
-
|
77
|
-
|
49
|
+
def from(*new_tables, &block)
|
50
|
+
new_tables = new_tables.compact
|
51
|
+
return self if new_tables.empty? && !block_given?
|
52
|
+
|
53
|
+
expr = Clauses::FromClause.new(*new_tables, &block).to_arel
|
54
|
+
|
55
|
+
case expr
|
56
|
+
when Array
|
57
|
+
regexps, merges, joins, others = separate_tables(expr.to_a)
|
58
|
+
ast.regexp = Nodes::Table.new(regexps.first) if regexps
|
59
|
+
ast.join = joins.first if joins
|
60
|
+
ast.merge = merges.first if merges
|
61
|
+
ast.tables = others if others
|
62
|
+
when Nodes::Join
|
63
|
+
ast.join = expr
|
64
|
+
when Nodes::Merge
|
65
|
+
ast.merge = expr
|
66
|
+
when Regexp
|
67
|
+
ast.regexp = expr
|
68
|
+
else
|
69
|
+
ast.tables = Array(expr)
|
78
70
|
end
|
79
71
|
|
80
72
|
self
|
81
73
|
end
|
82
74
|
|
83
|
-
def
|
84
|
-
ast.
|
75
|
+
def tables
|
76
|
+
[ast.regexp] || ast.tables
|
85
77
|
end
|
86
78
|
|
87
|
-
def
|
88
|
-
|
79
|
+
def join(*joining_tables)
|
80
|
+
ast.join = process_value_for_tables_union(Nodes::Join, joining_tables, :joining)
|
81
|
+
self
|
82
|
+
end
|
83
|
+
|
84
|
+
def merge(*merging_tables)
|
85
|
+
ast.merge = process_value_for_tables_union(Nodes::Merge, merging_tables, :merging)
|
86
|
+
self
|
89
87
|
end
|
90
88
|
|
91
89
|
def order(expr)
|
92
|
-
|
93
|
-
|
90
|
+
case
|
91
|
+
when Nodes::Ordering === expr
|
92
|
+
ast.order = expr
|
93
|
+
when DIRECTIONS.include?(expr.to_sym)
|
94
|
+
send(expr)
|
95
|
+
end
|
94
96
|
self
|
95
97
|
end
|
96
98
|
|
@@ -104,25 +106,70 @@ module Influxdb
|
|
104
106
|
self
|
105
107
|
end
|
106
108
|
|
107
|
-
def
|
109
|
+
def invert_order
|
110
|
+
ast.order = (ast.order && ast.order.invert) || Nodes::Ordering.new('asc')
|
111
|
+
self
|
112
|
+
end
|
113
|
+
|
114
|
+
def order_value
|
108
115
|
ast.order
|
109
116
|
end
|
110
117
|
|
111
|
-
def
|
118
|
+
def limit(limit)
|
112
119
|
ast.limit = limit ? Nodes::Limit.new(limit) : nil
|
113
120
|
self
|
114
121
|
end
|
115
122
|
|
116
|
-
|
123
|
+
def limit_value
|
124
|
+
ast.limit
|
125
|
+
end
|
117
126
|
|
118
127
|
def into(table)
|
119
|
-
|
120
|
-
ast.into = Nodes::Into.new(table)
|
128
|
+
ast.into = Nodes::Into.new(Arel.arelize(table))
|
121
129
|
self
|
122
130
|
end
|
123
131
|
|
124
|
-
def
|
125
|
-
ast.
|
132
|
+
def into_value
|
133
|
+
ast.into
|
134
|
+
end
|
135
|
+
|
136
|
+
def delete
|
137
|
+
raise 'IllegalSQLConstruct: Ambiguous deletion operation' if ast.tables.size != 1
|
138
|
+
DeleteManager.new.tap do |manager|
|
139
|
+
manager.tables = ast.tables
|
140
|
+
manager.regexp = ast.regexp
|
141
|
+
manager.where_values = where_values
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
private
|
146
|
+
|
147
|
+
def process_value_with_bang(klass, attributes, &block)
|
148
|
+
return nil if attributes.empty? && !block_given?
|
149
|
+
klass.new(*attributes, &block).to_arel
|
150
|
+
end
|
151
|
+
|
152
|
+
def process_value_for_tables_union(klass, tables, type)
|
153
|
+
_tables = (ast.tables + tables).compact
|
154
|
+
raise "IllegalSQLConstruct: Ambiguous #{type} clause" if _tables.size != 2
|
155
|
+
_tables = Arel.arelize(_tables){|expr| Nodes::Table.new(expr) }
|
156
|
+
klass.new(*_tables)
|
157
|
+
end
|
158
|
+
|
159
|
+
def separate_tables(expr)
|
160
|
+
grouped_tables = expr.group_by do |value|
|
161
|
+
case value
|
162
|
+
when Nodes::Join
|
163
|
+
:joins
|
164
|
+
when Nodes::Merge
|
165
|
+
:merges
|
166
|
+
when Regexp
|
167
|
+
:regexp
|
168
|
+
else
|
169
|
+
:others
|
170
|
+
end
|
171
|
+
end
|
172
|
+
grouped_tables.values_at(:regexp, :merges, :joins, :others)
|
126
173
|
end
|
127
174
|
end
|
128
175
|
end
|
@@ -15,16 +15,26 @@ module Influxdb
|
|
15
15
|
|
16
16
|
def initialize_copy(other)
|
17
17
|
super
|
18
|
-
@ast =
|
18
|
+
@ast = ast.clone
|
19
19
|
end
|
20
20
|
|
21
|
-
def where(expr)
|
22
|
-
|
23
|
-
|
21
|
+
def where(expr = nil, &block)
|
22
|
+
ast.wheres << Clauses::WhereClause.new(expr, &block).to_arel
|
23
|
+
self
|
24
|
+
end
|
24
25
|
|
25
|
-
|
26
|
+
def where!(expr = nil, &block)
|
27
|
+
ast.wheres = [Clauses::WhereClause.new(expr, &block).to_arel].compact
|
26
28
|
self
|
27
29
|
end
|
30
|
+
|
31
|
+
def where_values
|
32
|
+
ast.wheres
|
33
|
+
end
|
34
|
+
|
35
|
+
def where_values=(value)
|
36
|
+
ast.wheres = value
|
37
|
+
end
|
28
38
|
end
|
29
39
|
end
|
30
40
|
end
|
@@ -18,90 +18,60 @@ module Influxdb
|
|
18
18
|
method_hash[node_class] = "visit_#{(node_class.name || '').gsub('::', '_')}"
|
19
19
|
end
|
20
20
|
|
21
|
-
def visit(object
|
22
|
-
send
|
21
|
+
def visit(object)
|
22
|
+
send(DISPATCH[object.class], object)
|
23
23
|
rescue NoMethodError => e
|
24
24
|
raise e if respond_to?(DISPATCH[object.class], true)
|
25
|
-
|
26
|
-
superklass = object.class.ancestors.find{|klass|
|
27
|
-
respond_to?(DISPATCH[klass], true)
|
28
|
-
}
|
29
|
-
raise(TypeError, "Cannot visit #{object.class}") unless superklass
|
30
|
-
|
31
|
-
DISPATCH[object.class] = DISPATCH[superklass]
|
25
|
+
DISPATCH[object.class] = DISPATCH[find_visitable_superclass(object)]
|
32
26
|
retry
|
33
27
|
end
|
34
28
|
|
35
|
-
def visit_Influxdb_Arel_Nodes_SelectStatement(object
|
36
|
-
|
37
|
-
|
38
|
-
unless object.columns.empty?
|
39
|
-
result << SPACE
|
40
|
-
result << object.columns.map{|column| visit(column, attribute) }.join(COMMA)
|
41
|
-
else
|
42
|
-
result << SPACE
|
43
|
-
result << Arel.star
|
44
|
-
end
|
45
|
-
|
46
|
-
result << " FROM #{visit(object.table, attribute)}"
|
47
|
-
|
48
|
-
unless object.wheres.empty?
|
49
|
-
result << WHERE
|
50
|
-
result << object.wheres.map{|where| visit(where, attribute) }.join(AND)
|
51
|
-
end
|
52
|
-
|
53
|
-
unless object.groups.empty?
|
54
|
-
result << GROUP_BY
|
55
|
-
result << object.groups.map{|group| visit(group, attribute) }.join(COMMA)
|
56
|
-
result << " #{visit(object.fill, attribute)}" if object.fill
|
57
|
-
end
|
58
|
-
|
59
|
-
result << " #{visit(object.order, attribute)}" if object.order
|
60
|
-
result << " #{visit(object.limit, attribute)}" if object.limit
|
61
|
-
result << " #{visit(object.into, attribute)}" if object.into
|
29
|
+
def visit_Influxdb_Arel_Nodes_SelectStatement(object)
|
30
|
+
SelectStatement.new(self).visit(object)
|
31
|
+
end
|
62
32
|
|
63
|
-
|
64
|
-
|
33
|
+
def visit_Influxdb_Arel_Nodes_DeleteStatement(object)
|
34
|
+
DeleteStatement.new(self).visit(object)
|
65
35
|
end
|
66
36
|
|
67
|
-
def
|
37
|
+
def visit_Influxdb_Arel_Nodes_Table(object)
|
68
38
|
quote_table_name(object.name)
|
69
39
|
end
|
70
40
|
|
71
|
-
def visit_Influxdb_Arel_Nodes_Join(object
|
72
|
-
|
41
|
+
def visit_Influxdb_Arel_Nodes_Join(object)
|
42
|
+
visit_predication(object, 'INNER JOIN')
|
73
43
|
end
|
74
44
|
|
75
|
-
def visit_Influxdb_Arel_Nodes_Merge(object
|
76
|
-
|
45
|
+
def visit_Influxdb_Arel_Nodes_Merge(object)
|
46
|
+
visit_predication(object, 'MERGE')
|
77
47
|
end
|
78
48
|
|
79
|
-
def visit_Influxdb_Arel_Nodes_Limit(object
|
80
|
-
"LIMIT #{visit(object.expr
|
49
|
+
def visit_Influxdb_Arel_Nodes_Limit(object)
|
50
|
+
"LIMIT #{visit(object.expr)}"
|
81
51
|
end
|
82
52
|
|
83
|
-
def visit_Influxdb_Arel_Nodes_Ordering(object
|
53
|
+
def visit_Influxdb_Arel_Nodes_Ordering(object)
|
84
54
|
"ORDER #{object.value.upcase}"
|
85
55
|
end
|
86
56
|
|
87
|
-
def visit_Influxdb_Arel_Nodes_Into(object
|
88
|
-
"INTO #{visit(object.expr
|
57
|
+
def visit_Influxdb_Arel_Nodes_Into(object)
|
58
|
+
"INTO #{visit(object.expr)}"
|
89
59
|
end
|
90
60
|
|
91
|
-
def visit_Influxdb_Arel_Nodes_Grouping(object
|
92
|
-
"(#{visit(object.expr
|
61
|
+
def visit_Influxdb_Arel_Nodes_Grouping(object)
|
62
|
+
"(#{visit(object.expr)})"
|
93
63
|
end
|
94
64
|
|
95
|
-
def visit_Influxdb_Arel_Nodes_Group(object
|
96
|
-
visit(object.expr
|
65
|
+
def visit_Influxdb_Arel_Nodes_Group(object)
|
66
|
+
visit(object.expr)
|
97
67
|
end
|
98
68
|
|
99
|
-
def visit_Influxdb_Arel_Nodes_TableAlias(object
|
100
|
-
"#{visit(object.relation
|
69
|
+
def visit_Influxdb_Arel_Nodes_TableAlias(object)
|
70
|
+
"#{visit(object.relation)} AS #{quote_table_name(object.name)}"
|
101
71
|
end
|
102
72
|
|
103
|
-
def function(object
|
104
|
-
expressions = object.expressions.map{|exp| visit(exp
|
73
|
+
def function(object)
|
74
|
+
expressions = object.expressions.map{|exp| visit(exp) }.join(COMMA)
|
105
75
|
function_clause = object.class.name.split('::').last.upcase
|
106
76
|
"#{function_clause}(#{expressions})"
|
107
77
|
end
|
@@ -124,104 +94,99 @@ module Influxdb
|
|
124
94
|
alias :visit_Influxdb_Arel_Nodes_Top :function
|
125
95
|
alias :visit_Influxdb_Arel_Nodes_Bottom :function
|
126
96
|
|
127
|
-
def visit_Influxdb_Arel_Nodes_Fill(object
|
128
|
-
"fill(#{visit(object.expr
|
97
|
+
def visit_Influxdb_Arel_Nodes_Fill(object)
|
98
|
+
"fill(#{visit(object.expr)})"
|
129
99
|
end
|
130
100
|
|
131
|
-
def visit_Influxdb_Arel_Nodes_Time(object
|
132
|
-
"time(#{visit(object.expr
|
101
|
+
def visit_Influxdb_Arel_Nodes_Time(object)
|
102
|
+
"time(#{visit(object.expr)})"
|
133
103
|
end
|
134
104
|
|
135
|
-
def visit_Influxdb_Arel_Nodes_Duration(object
|
105
|
+
def visit_Influxdb_Arel_Nodes_Duration(object)
|
136
106
|
"#{object.value}#{object.suffix}"
|
137
107
|
end
|
138
108
|
|
139
|
-
def visit_Influxdb_Arel_Nodes_Now(object
|
109
|
+
def visit_Influxdb_Arel_Nodes_Now(object)
|
140
110
|
"now()"
|
141
111
|
end
|
142
112
|
|
143
|
-
def visit_Influxdb_Arel_Nodes_In(object
|
113
|
+
def visit_Influxdb_Arel_Nodes_In(object)
|
144
114
|
if Array === object.right && object.right.empty?
|
145
115
|
'1 = 0'
|
146
116
|
else
|
147
|
-
|
148
|
-
"#{visit(object.left, attribute)} IN (#{visit(object.right, attribute)})"
|
117
|
+
"#{visit(object.left)} IN (#{visit(object.right)})"
|
149
118
|
end
|
150
119
|
end
|
151
120
|
|
152
|
-
def visit_Influxdb_Arel_Nodes_GreaterThanOrEqual(object
|
153
|
-
|
154
|
-
|
121
|
+
def visit_Influxdb_Arel_Nodes_GreaterThanOrEqual(object)
|
122
|
+
if object.left.is_a?(Nodes::Attribute) && object.left.time?
|
123
|
+
right = object.right - 1
|
124
|
+
operator = '>'
|
125
|
+
else
|
126
|
+
right = object.right
|
127
|
+
operator = '>='
|
128
|
+
end
|
129
|
+
visit_predication(object, operator, right)
|
155
130
|
end
|
156
131
|
|
157
|
-
def visit_Influxdb_Arel_Nodes_GreaterThan(object
|
158
|
-
|
159
|
-
"#{visit(object.left, attribute)} > #{visit(object.right, attribute)}"
|
132
|
+
def visit_Influxdb_Arel_Nodes_GreaterThan(object)
|
133
|
+
visit_predication(object, '>')
|
160
134
|
end
|
161
135
|
|
162
|
-
def visit_Influxdb_Arel_Nodes_LessThanOrEqual(object
|
163
|
-
|
164
|
-
|
136
|
+
def visit_Influxdb_Arel_Nodes_LessThanOrEqual(object)
|
137
|
+
if object.left.is_a?(Nodes::Attribute) && object.left.time?
|
138
|
+
right = object.right + 1
|
139
|
+
operator = '<'
|
140
|
+
else
|
141
|
+
right = object.right
|
142
|
+
operator = '<='
|
143
|
+
end
|
144
|
+
visit_predication(object, operator, right)
|
165
145
|
end
|
166
146
|
|
167
|
-
def visit_Influxdb_Arel_Nodes_LessThan(object
|
168
|
-
|
169
|
-
"#{visit(object.left, attribute)} < #{visit(object.right, attribute)}"
|
147
|
+
def visit_Influxdb_Arel_Nodes_LessThan(object)
|
148
|
+
visit_predication(object, '<')
|
170
149
|
end
|
171
150
|
|
172
|
-
def visit_Influxdb_Arel_Nodes_NotEqual(object
|
173
|
-
|
174
|
-
attribute = object.left if Attributes::Attribute === object.left
|
175
|
-
|
176
|
-
if right.nil?
|
177
|
-
"#{visit(object.left, attribute)} <> null"
|
178
|
-
else
|
179
|
-
"#{visit(object.left, attribute)} <> #{visit(right, attribute)}"
|
180
|
-
end
|
151
|
+
def visit_Influxdb_Arel_Nodes_NotEqual(object)
|
152
|
+
visit_predication(object, '<>')
|
181
153
|
end
|
182
154
|
|
183
|
-
def visit_Influxdb_Arel_Nodes_Equality(object
|
184
|
-
|
185
|
-
attribute = object.left if Attributes::Attribute === object.left
|
186
|
-
|
187
|
-
if right.nil?
|
188
|
-
"#{visit(object.left, attribute)} = null"
|
189
|
-
else
|
190
|
-
"#{visit(object.left, attribute)} = #{visit(right, attribute)}"
|
191
|
-
end
|
155
|
+
def visit_Influxdb_Arel_Nodes_Equality(object)
|
156
|
+
visit_predication(object, '=')
|
192
157
|
end
|
193
158
|
|
194
|
-
def visit_Influxdb_Arel_Nodes_Matches(object
|
195
|
-
|
196
|
-
"#{visit object.left, attribute} =~ #{visit object.right, attribute}"
|
159
|
+
def visit_Influxdb_Arel_Nodes_Matches(object)
|
160
|
+
visit_predication(object, '=~')
|
197
161
|
end
|
198
162
|
|
199
|
-
def visit_Influxdb_Arel_Nodes_DoesNotMatch(object
|
200
|
-
|
201
|
-
"#{visit(object.left, attribute)} !~ #{visit(object.right, attribute)}"
|
163
|
+
def visit_Influxdb_Arel_Nodes_DoesNotMatch(object)
|
164
|
+
visit_predication(object, '!~')
|
202
165
|
end
|
203
166
|
|
204
|
-
def visit_Influxdb_Arel_Nodes_And(object
|
205
|
-
object.children.map{|node| visit(node
|
167
|
+
def visit_Influxdb_Arel_Nodes_And(object)
|
168
|
+
object.children.map{|node| visit(node) }.join(AND)
|
206
169
|
end
|
207
170
|
|
208
|
-
def visit_Influxdb_Arel_Nodes_Or(object
|
209
|
-
[visit(object.left
|
171
|
+
def visit_Influxdb_Arel_Nodes_Or(object)
|
172
|
+
[visit(object.left), visit(object.right)].join(OR)
|
210
173
|
end
|
211
174
|
|
212
|
-
def visit_Influxdb_Arel_Nodes_As(object
|
213
|
-
|
175
|
+
def visit_Influxdb_Arel_Nodes_As(object)
|
176
|
+
visit_predication(object, 'AS')
|
214
177
|
end
|
215
178
|
|
216
|
-
def
|
217
|
-
if object.relation.table_alias
|
218
|
-
|
219
|
-
else
|
220
|
-
|
221
|
-
end
|
179
|
+
def visit_Influxdb_Arel_Nodes_Attribute(object)
|
180
|
+
# if object.relation.table_alias
|
181
|
+
# "#{quote_table_name(object.relation.table_alias)}.#{quote_column_name(object.name)}"
|
182
|
+
# else
|
183
|
+
# quote_column_name(object.name)
|
184
|
+
# end
|
185
|
+
|
186
|
+
quote_column_name(object.value)
|
222
187
|
end
|
223
188
|
|
224
|
-
def literal(object
|
189
|
+
def literal(object)
|
225
190
|
object
|
226
191
|
end
|
227
192
|
|
@@ -229,7 +194,7 @@ module Influxdb
|
|
229
194
|
alias :visit_Bignum :literal
|
230
195
|
alias :visit_Fixnum :literal
|
231
196
|
|
232
|
-
def quoted(object
|
197
|
+
def quoted(object)
|
233
198
|
quote(object)
|
234
199
|
end
|
235
200
|
|
@@ -249,8 +214,8 @@ module Influxdb
|
|
249
214
|
alias :visit_TrueClass :quoted
|
250
215
|
alias :visit_Regexp :quoted
|
251
216
|
|
252
|
-
def visit_Influxdb_Arel_Nodes_InfixOperation(object
|
253
|
-
|
217
|
+
def visit_Influxdb_Arel_Nodes_InfixOperation(object)
|
218
|
+
visit_predication(object, object.operator)
|
254
219
|
end
|
255
220
|
|
256
221
|
alias :visit_Influxdb_Arel_Nodes_Addition :visit_Influxdb_Arel_Nodes_InfixOperation
|
@@ -258,17 +223,20 @@ module Influxdb
|
|
258
223
|
alias :visit_Influxdb_Arel_Nodes_Multiplication :visit_Influxdb_Arel_Nodes_InfixOperation
|
259
224
|
alias :visit_Influxdb_Arel_Nodes_Division :visit_Influxdb_Arel_Nodes_InfixOperation
|
260
225
|
|
261
|
-
def visit_Array(object
|
262
|
-
object.map{|node| visit(node
|
226
|
+
def visit_Array(object)
|
227
|
+
object.map{|node| visit(node) }.join(COMMA)
|
228
|
+
end
|
229
|
+
|
230
|
+
def visit_predication(object, expression, right = nil)
|
231
|
+
"#{visit(object.left)} #{expression} #{visit(right || object.right)}"
|
263
232
|
end
|
264
233
|
|
265
234
|
def quote(value)
|
266
|
-
|
267
|
-
attribute_for(value).encode(value)
|
235
|
+
Quoter.quote(value)
|
268
236
|
end
|
269
237
|
|
270
238
|
def quote_table_name(name)
|
271
|
-
return name if
|
239
|
+
return name if Nodes::SqlLiteral === name
|
272
240
|
return name.inspect if Regexp === name
|
273
241
|
/(?!\.)[\W\s]+/.match(name.to_s) ? "\"#{name}\"" : name
|
274
242
|
end
|
@@ -277,10 +245,12 @@ module Influxdb
|
|
277
245
|
name
|
278
246
|
end
|
279
247
|
|
280
|
-
def
|
281
|
-
|
282
|
-
|
283
|
-
|
248
|
+
def find_visitable_superclass(object)
|
249
|
+
object.class.ancestors.find{|klass|
|
250
|
+
respond_to?(DISPATCH[klass], true)
|
251
|
+
}.tap do |superklass|
|
252
|
+
raise(TypeError, "Cannot visit #{object.class}") unless superklass
|
253
|
+
end
|
284
254
|
end
|
285
255
|
end
|
286
256
|
end
|