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 @@
|
|
1
|
+
require 'influxdb'
|
data/lib/influxdb.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require "influxdb/arel/version"
|
2
|
+
|
3
|
+
require 'influxdb/arel/expressions'
|
4
|
+
require 'influxdb/arel/predications'
|
5
|
+
require 'influxdb/arel/math'
|
6
|
+
require 'influxdb/arel/alias_predication'
|
7
|
+
require 'influxdb/arel/table'
|
8
|
+
require 'influxdb/arel/attributes'
|
9
|
+
|
10
|
+
require 'influxdb/arel/visitor'
|
11
|
+
|
12
|
+
require 'influxdb/arel/tree_manager'
|
13
|
+
require 'influxdb/arel/select_manager'
|
14
|
+
# require 'influxdb/arel/delete_manager'
|
15
|
+
require 'influxdb/arel/nodes'
|
16
|
+
|
17
|
+
module Influxdb
|
18
|
+
module Arel
|
19
|
+
extend self
|
20
|
+
|
21
|
+
def sql(raw_sql)
|
22
|
+
Nodes::SqlLiteral.new(raw_sql)
|
23
|
+
end
|
24
|
+
|
25
|
+
def star
|
26
|
+
sql('*')
|
27
|
+
end
|
28
|
+
|
29
|
+
def now
|
30
|
+
Influxdb::Arel::Nodes::Now.new
|
31
|
+
end
|
32
|
+
|
33
|
+
def time(duration)
|
34
|
+
duration = sql(duration) if String === duration
|
35
|
+
Influxdb::Arel::Nodes::Time.new(duration)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'influxdb/arel/attributes/attribute'
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
module Attributes
|
4
|
+
class Attribute < Struct.new(:relation, :name)
|
5
|
+
include Expressions
|
6
|
+
include Predications
|
7
|
+
include AliasPredication
|
8
|
+
include Math
|
9
|
+
|
10
|
+
def self.encode(value)
|
11
|
+
"'#{value.to_s}'"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class Time < Attribute
|
16
|
+
def self.encode(value)
|
17
|
+
value.to_i * 1_000_000
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Date < Time; end
|
22
|
+
class DateTime < Time; end
|
23
|
+
|
24
|
+
class BigDecimal < Attribute
|
25
|
+
def self.encode(value)
|
26
|
+
value.to_s('F')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class Boolean < Attribute
|
31
|
+
def self.encode(value)
|
32
|
+
value.inspect
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class FalseClass < Boolean; end
|
37
|
+
class TrueClass < Boolean; end
|
38
|
+
|
39
|
+
class Float < Attribute
|
40
|
+
def self.encode(value)
|
41
|
+
value
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class Integer < Attribute
|
46
|
+
def self.encode(value)
|
47
|
+
value
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class Regexp < Attribute
|
52
|
+
def self.encode(value)
|
53
|
+
value.inspect
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class Hash < Attribute
|
58
|
+
def self.encode(value)
|
59
|
+
value = value.to_json if value.respond_to?(:to_json)
|
60
|
+
super(value)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class NilClass < Attribute
|
65
|
+
def self.encode(value)
|
66
|
+
'null'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
Attribute = Attributes::Attribute
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
class Integer
|
2
|
+
def u
|
3
|
+
Influxdb::Arel::Nodes::Duration.new(self, 'u')
|
4
|
+
end
|
5
|
+
|
6
|
+
def s
|
7
|
+
Influxdb::Arel::Nodes::Duration.new(self, 's')
|
8
|
+
end
|
9
|
+
|
10
|
+
def m
|
11
|
+
Influxdb::Arel::Nodes::Duration.new(self, 'm')
|
12
|
+
end
|
13
|
+
|
14
|
+
def h
|
15
|
+
Influxdb::Arel::Nodes::Duration.new(self, 'h')
|
16
|
+
end
|
17
|
+
|
18
|
+
def d
|
19
|
+
Influxdb::Arel::Nodes::Duration.new(self, 'd')
|
20
|
+
end
|
21
|
+
|
22
|
+
def w
|
23
|
+
Influxdb::Arel::Nodes::Duration.new(self, 'w')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class String
|
28
|
+
def to_influxdb_arel
|
29
|
+
Influxdb::Arel::Nodes::SqlLiteral.new(self)
|
30
|
+
end
|
31
|
+
|
32
|
+
alias :to_arel :to_influxdb_arel unless method_defined?(:to_arel)
|
33
|
+
|
34
|
+
def as(other)
|
35
|
+
Influxdb::Arel::Nodes::As.new(to_influxdb_arel, other.to_influxdb_arel)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class Symbol
|
40
|
+
def to_influxdb_arel
|
41
|
+
Influxdb::Arel::Table.new(self.to_s)
|
42
|
+
end
|
43
|
+
|
44
|
+
alias :to_arel :to_influxdb_arel unless method_defined?(:to_arel)
|
45
|
+
|
46
|
+
def as(other)
|
47
|
+
to_influxdb_arel.as(other)
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
module Expressions
|
4
|
+
def count
|
5
|
+
Nodes::Count.new([self])
|
6
|
+
end
|
7
|
+
|
8
|
+
def sum
|
9
|
+
Nodes::Sum.new([self])
|
10
|
+
end
|
11
|
+
|
12
|
+
def max
|
13
|
+
Nodes::Max.new([self])
|
14
|
+
end
|
15
|
+
|
16
|
+
def min
|
17
|
+
Nodes::Min.new([self])
|
18
|
+
end
|
19
|
+
|
20
|
+
def mean
|
21
|
+
Nodes::Mean.new([self])
|
22
|
+
end
|
23
|
+
|
24
|
+
def mode
|
25
|
+
Nodes::Mode.new([self])
|
26
|
+
end
|
27
|
+
|
28
|
+
def median
|
29
|
+
Nodes::Median.new([self])
|
30
|
+
end
|
31
|
+
|
32
|
+
def distinct
|
33
|
+
Nodes::Distinct.new([self])
|
34
|
+
end
|
35
|
+
|
36
|
+
def percentile(nth)
|
37
|
+
Nodes::Percentile.new([self, nth])
|
38
|
+
end
|
39
|
+
|
40
|
+
def histogram(bucket_size = nil)
|
41
|
+
Nodes::Histogram.new([self, bucket_size || 1.0])
|
42
|
+
end
|
43
|
+
|
44
|
+
def derivative
|
45
|
+
Nodes::Derivative.new([self])
|
46
|
+
end
|
47
|
+
|
48
|
+
def stddev
|
49
|
+
Nodes::Stddev.new([self])
|
50
|
+
end
|
51
|
+
|
52
|
+
def first
|
53
|
+
Nodes::First.new([self])
|
54
|
+
end
|
55
|
+
|
56
|
+
def last
|
57
|
+
Nodes::Last.new([self])
|
58
|
+
end
|
59
|
+
|
60
|
+
def difference
|
61
|
+
Nodes::Difference.new([self])
|
62
|
+
end
|
63
|
+
|
64
|
+
def top(size)
|
65
|
+
Nodes::Top.new([self, size])
|
66
|
+
end
|
67
|
+
|
68
|
+
def bottom(size)
|
69
|
+
Nodes::Bottom.new([self, size])
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
module Math
|
4
|
+
def *(other)
|
5
|
+
Nodes::Multiplication.new(self, other)
|
6
|
+
end
|
7
|
+
|
8
|
+
def +(other)
|
9
|
+
Nodes::Grouping.new(Nodes::Addition.new(self, other))
|
10
|
+
end
|
11
|
+
|
12
|
+
def -(other)
|
13
|
+
Nodes::Grouping.new(Nodes::Subtraction.new(self, other))
|
14
|
+
end
|
15
|
+
|
16
|
+
def /(other)
|
17
|
+
Nodes::Division.new(self, other)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'influxdb/arel/nodes/node'
|
2
|
+
require 'influxdb/arel/nodes/now'
|
3
|
+
require 'influxdb/arel/nodes/select_statement'
|
4
|
+
# require 'influxdb/arel/nodes/update_statement'
|
5
|
+
|
6
|
+
# unary
|
7
|
+
require 'influxdb/arel/nodes/unary'
|
8
|
+
require 'influxdb/arel/nodes/grouping'
|
9
|
+
require 'influxdb/arel/nodes/time'
|
10
|
+
|
11
|
+
|
12
|
+
# binary
|
13
|
+
require 'influxdb/arel/nodes/binary'
|
14
|
+
require 'influxdb/arel/nodes/duration'
|
15
|
+
require 'influxdb/arel/nodes/equality'
|
16
|
+
require 'influxdb/arel/nodes/in'
|
17
|
+
# require 'influxdb/arel/nodes/delete_statement'
|
18
|
+
require 'influxdb/arel/nodes/table_alias'
|
19
|
+
require 'influxdb/arel/nodes/infix_operation'
|
20
|
+
|
21
|
+
# nary
|
22
|
+
require 'influxdb/arel/nodes/and'
|
23
|
+
|
24
|
+
|
25
|
+
require 'influxdb/arel/nodes/function'
|
26
|
+
# require 'influxdb/arel/nodes/named_function'
|
27
|
+
require 'influxdb/arel/nodes/sql_literal'
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
module Nodes
|
4
|
+
class And < Node
|
5
|
+
attr_reader :children
|
6
|
+
|
7
|
+
def initialize(children)
|
8
|
+
super()
|
9
|
+
@children = children
|
10
|
+
end
|
11
|
+
|
12
|
+
def left
|
13
|
+
children.first
|
14
|
+
end
|
15
|
+
|
16
|
+
def right
|
17
|
+
children[1]
|
18
|
+
end
|
19
|
+
|
20
|
+
def hash
|
21
|
+
children.hash
|
22
|
+
end
|
23
|
+
|
24
|
+
def eql?(other)
|
25
|
+
self.class == other.class && children == other.children
|
26
|
+
end
|
27
|
+
|
28
|
+
alias :== :eql?
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
module Nodes
|
4
|
+
class Binary < Node
|
5
|
+
attr_accessor :left, :right
|
6
|
+
|
7
|
+
def initialize(left, right)
|
8
|
+
super()
|
9
|
+
self.left = left
|
10
|
+
self.right = right
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize_copy(other)
|
14
|
+
super
|
15
|
+
self.left = left.clone if left
|
16
|
+
self.right = right.clone if right
|
17
|
+
end
|
18
|
+
|
19
|
+
def hash
|
20
|
+
[left, right].hash
|
21
|
+
end
|
22
|
+
|
23
|
+
def eql?(other)
|
24
|
+
self.class == other.class && left == other.left && right == other.right
|
25
|
+
end
|
26
|
+
|
27
|
+
alias :== :eql?
|
28
|
+
end
|
29
|
+
|
30
|
+
%w{
|
31
|
+
As
|
32
|
+
DoesNotMatch
|
33
|
+
GreaterThan
|
34
|
+
GreaterThanOrEqual
|
35
|
+
Join
|
36
|
+
LessThan
|
37
|
+
LessThanOrEqual
|
38
|
+
Matches
|
39
|
+
Merge
|
40
|
+
NotEqual
|
41
|
+
Or
|
42
|
+
}.each do |name|
|
43
|
+
const_set(name, Class.new(Binary))
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
module Nodes
|
4
|
+
class Duration < Binary
|
5
|
+
POSSIBLE_SUFFIXES = %w{u s m h d w}.freeze
|
6
|
+
|
7
|
+
alias :value :left
|
8
|
+
alias :suffix :right
|
9
|
+
|
10
|
+
def initialize(value, suffix)
|
11
|
+
suffix = suffix.to_s
|
12
|
+
suffix = 'u' unless POSSIBLE_SUFFIXES.include?(suffix)
|
13
|
+
super(value.to_i, suffix)
|
14
|
+
end
|
15
|
+
|
16
|
+
def time
|
17
|
+
Arel.time(self)
|
18
|
+
end
|
19
|
+
|
20
|
+
def ago
|
21
|
+
Arel.now - self
|
22
|
+
end
|
23
|
+
|
24
|
+
def since
|
25
|
+
Arel.now + self
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Influxdb
|
2
|
+
module Arel
|
3
|
+
module Nodes
|
4
|
+
class Function < Node
|
5
|
+
include AliasPredication
|
6
|
+
include Math
|
7
|
+
|
8
|
+
attr_accessor :expressions
|
9
|
+
|
10
|
+
def initialize(expr)
|
11
|
+
super()
|
12
|
+
self.expressions = expr
|
13
|
+
end
|
14
|
+
|
15
|
+
def hash
|
16
|
+
expressions.hash
|
17
|
+
end
|
18
|
+
|
19
|
+
def eql?(other)
|
20
|
+
self.class == other.class && expressions == other.expressions
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
%w{
|
25
|
+
Count
|
26
|
+
Sum
|
27
|
+
Max
|
28
|
+
Min
|
29
|
+
Mean
|
30
|
+
Mode
|
31
|
+
Median
|
32
|
+
Distinct
|
33
|
+
Percentile
|
34
|
+
Histogram
|
35
|
+
Derivative
|
36
|
+
Stddev
|
37
|
+
First
|
38
|
+
Last
|
39
|
+
Difference
|
40
|
+
Top
|
41
|
+
Bottom
|
42
|
+
}.each do |name|
|
43
|
+
const_set(name, Class.new(Function))
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|