influxdb-arel 0.0.1 → 0.1.0
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/.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
data/lib/influxdb/arel/nodes.rb
CHANGED
@@ -1,27 +1,20 @@
|
|
1
1
|
require 'influxdb/arel/nodes/node'
|
2
|
+
require 'influxdb/arel/nodes/unary'
|
3
|
+
require 'influxdb/arel/nodes/binary'
|
2
4
|
require 'influxdb/arel/nodes/now'
|
3
5
|
require 'influxdb/arel/nodes/select_statement'
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
require 'influxdb/arel/nodes/unary'
|
6
|
+
require 'influxdb/arel/nodes/delete_statement'
|
7
|
+
require 'influxdb/arel/nodes/attribute'
|
8
|
+
require 'influxdb/arel/nodes/table'
|
8
9
|
require 'influxdb/arel/nodes/grouping'
|
9
10
|
require 'influxdb/arel/nodes/time'
|
10
|
-
|
11
|
-
|
12
|
-
# binary
|
13
|
-
require 'influxdb/arel/nodes/binary'
|
14
11
|
require 'influxdb/arel/nodes/duration'
|
15
12
|
require 'influxdb/arel/nodes/equality'
|
16
13
|
require 'influxdb/arel/nodes/in'
|
17
|
-
# require 'influxdb/arel/nodes/delete_statement'
|
18
14
|
require 'influxdb/arel/nodes/table_alias'
|
19
15
|
require 'influxdb/arel/nodes/infix_operation'
|
20
|
-
|
21
|
-
# nary
|
22
16
|
require 'influxdb/arel/nodes/and'
|
23
|
-
|
24
|
-
|
25
17
|
require 'influxdb/arel/nodes/function'
|
26
|
-
# require 'influxdb/arel/nodes/named_function'
|
27
18
|
require 'influxdb/arel/nodes/sql_literal'
|
19
|
+
require 'influxdb/arel/nodes/ordering'
|
20
|
+
require 'influxdb/arel/nodes/merge'
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
module Nodes
|
4
|
+
class Attribute < Unary
|
5
|
+
include Extensions::Expressions
|
6
|
+
include Extensions::Predications
|
7
|
+
include Extensions::AliasPredication
|
8
|
+
include Extensions::Math
|
9
|
+
|
10
|
+
def time?
|
11
|
+
value.to_s == 'time'
|
12
|
+
end
|
13
|
+
|
14
|
+
def sequence_number?
|
15
|
+
value.to_s == 'sequence_number'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -6,14 +6,16 @@ module Influxdb
|
|
6
6
|
|
7
7
|
def initialize(left, right)
|
8
8
|
super()
|
9
|
+
left = left.to_s if Symbol === left
|
10
|
+
right = right.to_s if Symbol === right
|
9
11
|
self.left = left
|
10
12
|
self.right = right
|
11
13
|
end
|
12
14
|
|
13
15
|
def initialize_copy(other)
|
14
16
|
super
|
15
|
-
self.left = left.
|
16
|
-
self.right = right.
|
17
|
+
self.left = left.safe_clone if left
|
18
|
+
self.right = right.safe_clone if right
|
17
19
|
end
|
18
20
|
|
19
21
|
def hash
|
@@ -36,7 +38,6 @@ module Influxdb
|
|
36
38
|
LessThan
|
37
39
|
LessThanOrEqual
|
38
40
|
Matches
|
39
|
-
Merge
|
40
41
|
NotEqual
|
41
42
|
Or
|
42
43
|
}.each do |name|
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
module Nodes
|
4
|
+
class DeleteStatement < Node
|
5
|
+
attr_accessor :wheres, :tables, :regexp
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
super
|
9
|
+
self.wheres = []
|
10
|
+
self.tables = []
|
11
|
+
self.regexp = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize_copy(other)
|
15
|
+
super
|
16
|
+
self.wheres = wheres.map{|where| where.clone }
|
17
|
+
self.tables = tables.map{|table| table.clone }
|
18
|
+
self.regexp = regexp.clone
|
19
|
+
end
|
20
|
+
|
21
|
+
def table
|
22
|
+
regexp || tables
|
23
|
+
end
|
24
|
+
|
25
|
+
def hash
|
26
|
+
[wheres, tables].hash
|
27
|
+
end
|
28
|
+
|
29
|
+
def eql?(other)
|
30
|
+
self.class == other.class && wheres == other.wheres && table == other.table
|
31
|
+
end
|
32
|
+
|
33
|
+
alias :== :eql?
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -2,9 +2,9 @@ module Influxdb
|
|
2
2
|
module Arel
|
3
3
|
module Nodes
|
4
4
|
class Grouping < Unary
|
5
|
-
include Predications
|
6
|
-
include AliasPredication
|
7
|
-
include Expressions
|
5
|
+
include Extensions::Predications
|
6
|
+
include Extensions::AliasPredication
|
7
|
+
include Extensions::Expressions
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -2,10 +2,9 @@ module Influxdb
|
|
2
2
|
module Arel
|
3
3
|
module Nodes
|
4
4
|
class InfixOperation < Binary
|
5
|
-
include Expressions
|
6
|
-
include Predications
|
7
|
-
include
|
8
|
-
include Math
|
5
|
+
include Extensions::Expressions
|
6
|
+
include Extensions::Predications
|
7
|
+
include Extensions::Math
|
9
8
|
|
10
9
|
attr_reader :operator
|
11
10
|
|
@@ -39,12 +38,20 @@ module Influxdb
|
|
39
38
|
def initialize(left, right)
|
40
39
|
super(:+, left, right)
|
41
40
|
end
|
41
|
+
|
42
|
+
def as(name)
|
43
|
+
Grouping.new(self).as(name)
|
44
|
+
end
|
42
45
|
end
|
43
46
|
|
44
47
|
class Subtraction < InfixOperation
|
45
48
|
def initialize(left, right)
|
46
49
|
super(:-, left, right)
|
47
50
|
end
|
51
|
+
|
52
|
+
def as(name)
|
53
|
+
Grouping.new(self).as(name)
|
54
|
+
end
|
48
55
|
end
|
49
56
|
end
|
50
57
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
module Nodes
|
4
|
+
class Merge < Binary
|
5
|
+
def initialize(left, right)
|
6
|
+
left = left.unalias if left.respond_to?(:unalias)
|
7
|
+
right = right.unalias if right.respond_to?(:unalias)
|
8
|
+
super(left, right)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -2,17 +2,29 @@ module Influxdb
|
|
2
2
|
module Arel
|
3
3
|
module Nodes
|
4
4
|
class Node
|
5
|
-
|
6
|
-
Nodes::Grouping.new(Nodes::Or.new(self, right))
|
7
|
-
end
|
5
|
+
include Extensions::BooleanPredications
|
8
6
|
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
ENTENSIONS = {
|
8
|
+
alias: :AliasPrediction,
|
9
|
+
table_alias: :TableAliasPrediction,
|
10
|
+
math: :Math,
|
11
|
+
expressions: :Expressions,
|
12
|
+
predications: :Predications
|
13
|
+
}
|
12
14
|
|
13
15
|
def to_sql
|
14
16
|
Visitor.new.accept(self)
|
15
17
|
end
|
18
|
+
|
19
|
+
def extend(*extensions)
|
20
|
+
extensions.each do |extension|
|
21
|
+
if module_name = EXTENSIONS[extension]
|
22
|
+
singleton_class.send(:include, Influxdb::Arel::Extensions.const_get(module_name))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
self
|
27
|
+
end
|
16
28
|
end
|
17
29
|
end
|
18
30
|
end
|
@@ -2,14 +2,15 @@ module Influxdb
|
|
2
2
|
module Arel
|
3
3
|
module Nodes
|
4
4
|
class SelectStatement < Node
|
5
|
-
attr_accessor :limit, :order, :wheres, :groups, :
|
5
|
+
attr_accessor :limit, :order, :wheres, :groups, :attributes, :tables, :join, :merge, :regexp, :fill, :into
|
6
6
|
|
7
7
|
def initialize
|
8
8
|
super
|
9
9
|
self.wheres = []
|
10
10
|
self.groups = []
|
11
|
-
self.
|
12
|
-
self.
|
11
|
+
self.attributes = []
|
12
|
+
self.tables = []
|
13
|
+
self.regexp = nil
|
13
14
|
self.merge = nil
|
14
15
|
self.join = nil
|
15
16
|
self.order = nil
|
@@ -22,10 +23,11 @@ module Influxdb
|
|
22
23
|
super
|
23
24
|
self.wheres = wheres.map{|where| where.clone }
|
24
25
|
self.groups = groups.map{|group| group.clone }
|
25
|
-
self.
|
26
|
-
self.
|
26
|
+
self.attributes = attributes.map{|attribute| attribute.clone }
|
27
|
+
self.tables = tables.map{|table| table.clone }
|
27
28
|
self.join = join.clone if join
|
28
29
|
self.merge = merge.clone if merge
|
30
|
+
self.regexp = regexp.clone if regexp
|
29
31
|
self.order = order.clone if order
|
30
32
|
self.limit = limit.clone if limit
|
31
33
|
self.fill = fill.clone if fill
|
@@ -33,16 +35,16 @@ module Influxdb
|
|
33
35
|
end
|
34
36
|
|
35
37
|
def table
|
36
|
-
join || merge ||
|
38
|
+
join || merge || regexp || tables.map(&:unalias).uniq
|
37
39
|
end
|
38
40
|
|
39
41
|
def hash
|
40
|
-
[limit, order, wheres, groups,
|
42
|
+
[limit, order, wheres, groups, attributes, table, fill, into].hash
|
41
43
|
end
|
42
44
|
|
43
45
|
def eql?(other)
|
44
46
|
self.class == other.class &&
|
45
|
-
|
47
|
+
attributes == other.attributes &&
|
46
48
|
wheres == other.wheres &&
|
47
49
|
groups == other.groups &&
|
48
50
|
table == other.table &&
|
@@ -2,20 +2,17 @@ module Influxdb
|
|
2
2
|
module Arel
|
3
3
|
module Nodes
|
4
4
|
class SqlLiteral < String
|
5
|
-
include Expressions
|
6
|
-
include Predications
|
7
|
-
include AliasPredication
|
5
|
+
include Extensions::Expressions
|
6
|
+
include Extensions::Predications
|
7
|
+
include Extensions::AliasPredication
|
8
|
+
include Extensions::BooleanPredications
|
8
9
|
|
9
10
|
def name
|
10
11
|
self
|
11
12
|
end
|
12
13
|
|
13
|
-
def unalias
|
14
|
-
self
|
15
|
-
end
|
16
|
-
|
17
14
|
def eql?(other)
|
18
|
-
|
15
|
+
self.class == other.class && name == other.name
|
19
16
|
end
|
20
17
|
end
|
21
18
|
end
|
@@ -2,14 +2,12 @@ module Influxdb
|
|
2
2
|
module Arel
|
3
3
|
module Nodes
|
4
4
|
class TableAlias < Binary
|
5
|
+
include Extensions::JoiningMerging
|
6
|
+
|
5
7
|
alias :name :right
|
6
8
|
alias :relation :left
|
7
9
|
alias :table_alias :name
|
8
10
|
|
9
|
-
def [](name)
|
10
|
-
Attribute.new(self, name)
|
11
|
-
end
|
12
|
-
|
13
11
|
def table_name
|
14
12
|
relation.respond_to?(:name) ? relation.name : name
|
15
13
|
end
|
@@ -7,9 +7,15 @@ module Influxdb
|
|
7
7
|
|
8
8
|
def initialize(expr)
|
9
9
|
super()
|
10
|
+
expr = expr.to_s if Symbol === expr
|
10
11
|
self.expr = expr
|
11
12
|
end
|
12
13
|
|
14
|
+
def initialize_copy(other)
|
15
|
+
super
|
16
|
+
self.expr = expr.safe_clone if expr
|
17
|
+
end
|
18
|
+
|
13
19
|
def hash
|
14
20
|
self.expr.hash
|
15
21
|
end
|
@@ -25,7 +31,6 @@ module Influxdb
|
|
25
31
|
Group
|
26
32
|
Limit
|
27
33
|
Fill
|
28
|
-
Ordering
|
29
34
|
Into
|
30
35
|
}.each do |name|
|
31
36
|
const_set(name, Class.new(Unary))
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'bigdecimal'
|
2
|
+
|
3
|
+
module Influxdb
|
4
|
+
module Arel
|
5
|
+
module Quoter
|
6
|
+
extend self
|
7
|
+
|
8
|
+
class Repository
|
9
|
+
def initialize
|
10
|
+
@types = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def add(type, &block)
|
14
|
+
@types[type] = block
|
15
|
+
end
|
16
|
+
|
17
|
+
def quote(value)
|
18
|
+
block = @types[value.class]
|
19
|
+
block ? block.call(value) : value.inspect
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def repository
|
24
|
+
@repository ||= Repository.new
|
25
|
+
end
|
26
|
+
|
27
|
+
def repository=(value)
|
28
|
+
@repository = value
|
29
|
+
end
|
30
|
+
|
31
|
+
def quote(value)
|
32
|
+
repository.quote(value)
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_type(type, &block)
|
36
|
+
repository.add(type, &block)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
Quoter.add_type(String) do |value|
|
41
|
+
"'#{value}'"
|
42
|
+
end
|
43
|
+
|
44
|
+
Quoter.add_type(Time) do |value|
|
45
|
+
"'#{value.utc.strftime('%Y-%m-%d %H:%M:%S')}'"
|
46
|
+
end
|
47
|
+
|
48
|
+
Quoter.add_type(Date) do |value|
|
49
|
+
"'#{value.to_time.utc.strftime('%Y-%m-%d')}'"
|
50
|
+
end
|
51
|
+
|
52
|
+
Quoter.add_type(DateTime) do |value|
|
53
|
+
"'#{value.to_time.utc.strftime('%Y-%m-%d %H:%M:%S')}'"
|
54
|
+
end
|
55
|
+
|
56
|
+
Quoter.add_type(BigDecimal) do |value|
|
57
|
+
value.to_s('F')
|
58
|
+
end
|
59
|
+
|
60
|
+
Quoter.add_type(NilClass) do |value|
|
61
|
+
'null'
|
62
|
+
end
|
63
|
+
|
64
|
+
Quoter.add_type(Hash) do |value|
|
65
|
+
value = value.to_json if value.respond_to?(:to_json)
|
66
|
+
value.to_s
|
67
|
+
end
|
68
|
+
|
69
|
+
Quoter.add_type(Nodes::SqlLiteral) do |value|
|
70
|
+
value
|
71
|
+
end
|
72
|
+
|
73
|
+
if defined?(ActiveSupport::Multibyte::Chars)
|
74
|
+
Quoter.add_type(ActiveSupport::Multibyte::Chars) do |value|
|
75
|
+
"'#{value}'"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
if defined?(ActiveSupport::StringInquirer)
|
80
|
+
Quoter.add_type(ActiveSupport::StringInquirer) do |value|
|
81
|
+
"'#{value}'"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|