influxdb-arel 0.0.1
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/.gitignore +22 -0
- data/.rspec +3 -0
- data/.travis.yml +8 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +350 -0
- data/Rakefile +6 -0
- data/influxdb-arel.gemspec +24 -0
- data/lib/influxdb-arel.rb +1 -0
- data/lib/influxdb.rb +4 -0
- data/lib/influxdb/arel.rb +38 -0
- data/lib/influxdb/arel/alias_predication.rb +9 -0
- data/lib/influxdb/arel/attributes.rb +1 -0
- data/lib/influxdb/arel/attributes/attribute.rb +74 -0
- data/lib/influxdb/arel/core_extensions.rb +49 -0
- data/lib/influxdb/arel/expressions.rb +73 -0
- data/lib/influxdb/arel/math.rb +21 -0
- data/lib/influxdb/arel/nodes.rb +27 -0
- data/lib/influxdb/arel/nodes/and.rb +32 -0
- data/lib/influxdb/arel/nodes/binary.rb +47 -0
- data/lib/influxdb/arel/nodes/duration.rb +30 -0
- data/lib/influxdb/arel/nodes/equality.rb +11 -0
- data/lib/influxdb/arel/nodes/function.rb +47 -0
- data/lib/influxdb/arel/nodes/grouping.rb +11 -0
- data/lib/influxdb/arel/nodes/in.rb +8 -0
- data/lib/influxdb/arel/nodes/infix_operation.rb +51 -0
- data/lib/influxdb/arel/nodes/node.rb +19 -0
- data/lib/influxdb/arel/nodes/now.rb +15 -0
- data/lib/influxdb/arel/nodes/select_statement.rb +59 -0
- data/lib/influxdb/arel/nodes/sql_literal.rb +23 -0
- data/lib/influxdb/arel/nodes/table_alias.rb +23 -0
- data/lib/influxdb/arel/nodes/time.rb +13 -0
- data/lib/influxdb/arel/nodes/unary.rb +35 -0
- data/lib/influxdb/arel/predications.rb +137 -0
- data/lib/influxdb/arel/select_manager.rb +129 -0
- data/lib/influxdb/arel/table.rb +219 -0
- data/lib/influxdb/arel/tree_manager.rb +30 -0
- data/lib/influxdb/arel/version.rb +5 -0
- data/lib/influxdb/arel/visitor.rb +287 -0
- data/spec/lib/influxdb/arel/core_extensions_spec.rb +49 -0
- data/spec/lib/influxdb/arel/nodes/and_spec.rb +17 -0
- data/spec/lib/influxdb/arel/nodes/binary_spec.rb +49 -0
- data/spec/lib/influxdb/arel/nodes/duration_spec.rb +72 -0
- data/spec/lib/influxdb/arel/nodes/equality_spec.rb +5 -0
- data/spec/lib/influxdb/arel/nodes/function_spec.rb +69 -0
- data/spec/lib/influxdb/arel/nodes/grouping_spec.rb +10 -0
- data/spec/lib/influxdb/arel/nodes/in_spec.rb +13 -0
- data/spec/lib/influxdb/arel/nodes/now_spec.rb +8 -0
- data/spec/lib/influxdb/arel/nodes/sql_literal_spec.rb +28 -0
- data/spec/lib/influxdb/arel/nodes/table_alias_spec.rb +36 -0
- data/spec/lib/influxdb/arel/nodes/time_spec.rb +5 -0
- data/spec/lib/influxdb/arel/nodes/unary_spec.rb +25 -0
- data/spec/lib/influxdb/arel/select_manager_spec.rb +459 -0
- data/spec/lib/influxdb/arel/table_spec.rb +193 -0
- data/spec/lib/influxdb/arel_spec.rb +11 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/support/examples/binary_node.rb +10 -0
- data/spec/support/examples/function_node.rb +14 -0
- data/spec/support/examples/node_as.rb +8 -0
- data/spec/support/examples/node_expressions.rb +145 -0
- data/spec/support/examples/node_math.rb +29 -0
- data/spec/support/examples/node_predications.rb +248 -0
- data/spec/support/examples/node_to_sql.rb +5 -0
- data/spec/support/examples/unary_node.rb +10 -0
- data/spec/support/fabrics.rb +21 -0
- metadata +177 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
module Nodes
|
4
|
+
class InfixOperation < Binary
|
5
|
+
include Expressions
|
6
|
+
include Predications
|
7
|
+
include AliasPredication
|
8
|
+
include Math
|
9
|
+
|
10
|
+
attr_reader :operator
|
11
|
+
|
12
|
+
def initialize(operator, left, right)
|
13
|
+
super(left, right)
|
14
|
+
@operator = operator
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Multiplication < InfixOperation
|
19
|
+
def initialize(left, right)
|
20
|
+
super(:*, left, right)
|
21
|
+
end
|
22
|
+
|
23
|
+
def as(name)
|
24
|
+
Grouping.new(self).as(name)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class Division < InfixOperation
|
29
|
+
def initialize(left, right)
|
30
|
+
super(:/, left, right)
|
31
|
+
end
|
32
|
+
|
33
|
+
def as(name)
|
34
|
+
Grouping.new(self).as(name)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class Addition < InfixOperation
|
39
|
+
def initialize(left, right)
|
40
|
+
super(:+, left, right)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class Subtraction < InfixOperation
|
45
|
+
def initialize(left, right)
|
46
|
+
super(:-, left, right)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
module Nodes
|
4
|
+
class Node
|
5
|
+
def or(right)
|
6
|
+
Nodes::Grouping.new(Nodes::Or.new(self, right))
|
7
|
+
end
|
8
|
+
|
9
|
+
def and(right)
|
10
|
+
Nodes::And.new([self, right])
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_sql
|
14
|
+
Visitor.new.accept(self)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
module Nodes
|
4
|
+
class SelectStatement < Node
|
5
|
+
attr_accessor :limit, :order, :wheres, :groups, :columns, :series, :join, :merge, :fill, :into
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
super
|
9
|
+
self.wheres = []
|
10
|
+
self.groups = []
|
11
|
+
self.columns = []
|
12
|
+
self.series = []
|
13
|
+
self.merge = nil
|
14
|
+
self.join = nil
|
15
|
+
self.order = nil
|
16
|
+
self.limit = nil
|
17
|
+
self.fill = nil
|
18
|
+
self.into = nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize_copy(other)
|
22
|
+
super
|
23
|
+
self.wheres = wheres.map{|where| where.clone }
|
24
|
+
self.groups = groups.map{|group| group.clone }
|
25
|
+
self.columns = columns.map{|column| column.clone }
|
26
|
+
self.series = series.map{|series| series.clone }
|
27
|
+
self.join = join.clone if join
|
28
|
+
self.merge = merge.clone if merge
|
29
|
+
self.order = order.clone if order
|
30
|
+
self.limit = limit.clone if limit
|
31
|
+
self.fill = fill.clone if fill
|
32
|
+
self.into = into.clone if into
|
33
|
+
end
|
34
|
+
|
35
|
+
def table
|
36
|
+
join || merge || series.map(&:unalias).uniq
|
37
|
+
end
|
38
|
+
|
39
|
+
def hash
|
40
|
+
[limit, order, wheres, groups, columns, table, fill, into].hash
|
41
|
+
end
|
42
|
+
|
43
|
+
def eql?(other)
|
44
|
+
self.class == other.class &&
|
45
|
+
columns == other.columns &&
|
46
|
+
wheres == other.wheres &&
|
47
|
+
groups == other.groups &&
|
48
|
+
table == other.table &&
|
49
|
+
order == other.order &&
|
50
|
+
limit == other.limit &&
|
51
|
+
fill == other.fill &&
|
52
|
+
into == other.into
|
53
|
+
end
|
54
|
+
|
55
|
+
alias :== :eql?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
module Nodes
|
4
|
+
class SqlLiteral < String
|
5
|
+
include Expressions
|
6
|
+
include Predications
|
7
|
+
include AliasPredication
|
8
|
+
|
9
|
+
def name
|
10
|
+
self
|
11
|
+
end
|
12
|
+
|
13
|
+
def unalias
|
14
|
+
self
|
15
|
+
end
|
16
|
+
|
17
|
+
def eql?(other)
|
18
|
+
Table.comparable_classes.include?(other.class) && name == other.name
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
module Nodes
|
4
|
+
class TableAlias < Binary
|
5
|
+
alias :name :right
|
6
|
+
alias :relation :left
|
7
|
+
alias :table_alias :name
|
8
|
+
|
9
|
+
def [](name)
|
10
|
+
Attribute.new(self, name)
|
11
|
+
end
|
12
|
+
|
13
|
+
def table_name
|
14
|
+
relation.respond_to?(:name) ? relation.name : name
|
15
|
+
end
|
16
|
+
|
17
|
+
def unalias
|
18
|
+
relation
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
module Nodes
|
4
|
+
class Unary < Node
|
5
|
+
attr_accessor :expr
|
6
|
+
alias :value :expr
|
7
|
+
|
8
|
+
def initialize(expr)
|
9
|
+
super()
|
10
|
+
self.expr = expr
|
11
|
+
end
|
12
|
+
|
13
|
+
def hash
|
14
|
+
self.expr.hash
|
15
|
+
end
|
16
|
+
|
17
|
+
def eql?(other)
|
18
|
+
self.class == other.class && expr == other.expr
|
19
|
+
end
|
20
|
+
|
21
|
+
alias :== :eql?
|
22
|
+
end
|
23
|
+
|
24
|
+
%w{
|
25
|
+
Group
|
26
|
+
Limit
|
27
|
+
Fill
|
28
|
+
Ordering
|
29
|
+
Into
|
30
|
+
}.each do |name|
|
31
|
+
const_set(name, Class.new(Unary))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
module Predications
|
4
|
+
def not_eq(other)
|
5
|
+
Nodes::NotEqual.new(self, other)
|
6
|
+
end
|
7
|
+
|
8
|
+
def not_eq_any(others)
|
9
|
+
grouping_any(:not_eq, others)
|
10
|
+
end
|
11
|
+
|
12
|
+
def not_eq_all(others)
|
13
|
+
grouping_all(:not_eq, others)
|
14
|
+
end
|
15
|
+
|
16
|
+
def eq(other)
|
17
|
+
Nodes::Equality.new(self, other)
|
18
|
+
end
|
19
|
+
|
20
|
+
def eq_any(others)
|
21
|
+
grouping_any(:eq, others)
|
22
|
+
end
|
23
|
+
|
24
|
+
def eq_all(others)
|
25
|
+
grouping_all(:eq, others)
|
26
|
+
end
|
27
|
+
|
28
|
+
def in(other)
|
29
|
+
case other
|
30
|
+
when Range
|
31
|
+
if other.begin == -Float::INFINITY && other.end == Float::INFINITY
|
32
|
+
Nodes::Equality.new(1, 1)
|
33
|
+
elsif other.end == Float::INFINITY
|
34
|
+
Nodes::GreaterThanOrEqual.new(self, other.begin)
|
35
|
+
elsif other.begin == -Float::INFINITY && other.exclude_end?
|
36
|
+
Nodes::LessThan.new(self, other.end)
|
37
|
+
elsif other.begin == -Float::INFINITY
|
38
|
+
Nodes::LessThanOrEqual.new(self, other.end)
|
39
|
+
elsif other.exclude_end?
|
40
|
+
left = Nodes::GreaterThanOrEqual.new(self, other.begin)
|
41
|
+
right = Nodes::LessThan.new(self, other.end)
|
42
|
+
Nodes::And.new([left, right])
|
43
|
+
else
|
44
|
+
left = Nodes::GreaterThanOrEqual.new(self, other.begin)
|
45
|
+
right = Nodes::LessThanOrEqual.new(self, other.end)
|
46
|
+
Nodes::And.new([left, right])
|
47
|
+
end
|
48
|
+
else
|
49
|
+
Nodes::In.new(self, other)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def matches(other)
|
54
|
+
Nodes::Matches.new(self, other)
|
55
|
+
end
|
56
|
+
|
57
|
+
def matches_any(others)
|
58
|
+
grouping_any(:matches, others)
|
59
|
+
end
|
60
|
+
|
61
|
+
def matches_all(others)
|
62
|
+
grouping_all(:matches, others)
|
63
|
+
end
|
64
|
+
|
65
|
+
def does_not_match(other)
|
66
|
+
Nodes::DoesNotMatch.new(self, other)
|
67
|
+
end
|
68
|
+
|
69
|
+
def does_not_match_any(others)
|
70
|
+
grouping_any(:does_not_match, others)
|
71
|
+
end
|
72
|
+
|
73
|
+
def does_not_match_all(others)
|
74
|
+
grouping_all(:does_not_match, others)
|
75
|
+
end
|
76
|
+
|
77
|
+
def gteq(right)
|
78
|
+
Nodes::GreaterThanOrEqual.new(self, right)
|
79
|
+
end
|
80
|
+
|
81
|
+
def gteq_any(others)
|
82
|
+
grouping_any(:gteq, others)
|
83
|
+
end
|
84
|
+
|
85
|
+
def gteq_all(others)
|
86
|
+
grouping_all(:gteq, others)
|
87
|
+
end
|
88
|
+
|
89
|
+
def gt(right)
|
90
|
+
Nodes::GreaterThan.new(self, right)
|
91
|
+
end
|
92
|
+
|
93
|
+
def gt_any(others)
|
94
|
+
grouping_any(:gt, others)
|
95
|
+
end
|
96
|
+
|
97
|
+
def gt_all(others)
|
98
|
+
grouping_all(:gt, others)
|
99
|
+
end
|
100
|
+
|
101
|
+
def lt(right)
|
102
|
+
Nodes::LessThan.new(self, right)
|
103
|
+
end
|
104
|
+
|
105
|
+
def lt_any(others)
|
106
|
+
grouping_any(:lt, others)
|
107
|
+
end
|
108
|
+
|
109
|
+
def lt_all(others)
|
110
|
+
grouping_all(:lt, others)
|
111
|
+
end
|
112
|
+
|
113
|
+
def lteq(right)
|
114
|
+
Nodes::LessThanOrEqual.new(self, right)
|
115
|
+
end
|
116
|
+
|
117
|
+
def lteq_any(others)
|
118
|
+
grouping_any(:lteq, others)
|
119
|
+
end
|
120
|
+
|
121
|
+
def lteq_all(others)
|
122
|
+
grouping_all(:lteq, others)
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
def grouping_any(method_id, others)
|
128
|
+
nodes = others.map{|expr| send(method_id, expr) }
|
129
|
+
Nodes::Grouping.new(nodes.inject{|result, node| Nodes::Or.new(result, node) })
|
130
|
+
end
|
131
|
+
|
132
|
+
def grouping_all(method_id, others)
|
133
|
+
Nodes::Grouping.new(Nodes::And.new(others.map{|expr| send(method_id, expr) }))
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
class SelectManager < Arel::TreeManager
|
4
|
+
def initialize(*tables)
|
5
|
+
super()
|
6
|
+
@ast = Nodes::SelectStatement.new
|
7
|
+
from(*tables)
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize_copy(other)
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
def limit
|
15
|
+
ast.limit
|
16
|
+
end
|
17
|
+
|
18
|
+
alias :taken :limit
|
19
|
+
|
20
|
+
def wheres
|
21
|
+
ast.wheres
|
22
|
+
end
|
23
|
+
|
24
|
+
def group(*columns)
|
25
|
+
columns.each do |column|
|
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
|
+
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def fill(value)
|
34
|
+
ast.fill = Nodes::Fill.new(value)
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
def from(*series)
|
39
|
+
series = series.map do |table|
|
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
|
52
|
+
end
|
53
|
+
|
54
|
+
def join(table = nil)
|
55
|
+
if table && !series.empty?
|
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
|
61
|
+
self
|
62
|
+
end
|
63
|
+
|
64
|
+
def merge(table = nil)
|
65
|
+
if table && !series.empty?
|
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
|
72
|
+
end
|
73
|
+
|
74
|
+
def column(*columns)
|
75
|
+
columns.each do |column|
|
76
|
+
column = STRING_OR_SYMBOL_CLASS.include?(column.class) ? Arel.sql(column.to_s) : column
|
77
|
+
ast.columns.push(column)
|
78
|
+
end
|
79
|
+
|
80
|
+
self
|
81
|
+
end
|
82
|
+
|
83
|
+
def columns
|
84
|
+
ast.columns
|
85
|
+
end
|
86
|
+
|
87
|
+
def columns=(columns)
|
88
|
+
self.column(*columns)
|
89
|
+
end
|
90
|
+
|
91
|
+
def order(expr)
|
92
|
+
expr = STRING_OR_SYMBOL_CLASS.include?(expr.class) ? Nodes::Ordering.new(expr.to_s) : expr
|
93
|
+
ast.order = expr
|
94
|
+
self
|
95
|
+
end
|
96
|
+
|
97
|
+
def desc
|
98
|
+
ast.order = Nodes::Ordering.new('desc')
|
99
|
+
self
|
100
|
+
end
|
101
|
+
|
102
|
+
def asc
|
103
|
+
ast.order = Nodes::Ordering.new('asc')
|
104
|
+
self
|
105
|
+
end
|
106
|
+
|
107
|
+
def ordering
|
108
|
+
ast.order
|
109
|
+
end
|
110
|
+
|
111
|
+
def take(limit)
|
112
|
+
ast.limit = limit ? Nodes::Limit.new(limit) : nil
|
113
|
+
self
|
114
|
+
end
|
115
|
+
|
116
|
+
alias :limit= :take
|
117
|
+
|
118
|
+
def into(table)
|
119
|
+
table = STRING_OR_SYMBOL_CLASS.include?(table.class) ? Arel.sql(table.to_s) : table
|
120
|
+
ast.into = Nodes::Into.new(table)
|
121
|
+
self
|
122
|
+
end
|
123
|
+
|
124
|
+
def series
|
125
|
+
ast.series
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|