influxer 1.1.2 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a98e49b2f7085c5e01dcdfa21cc136a6f7907ee6
4
- data.tar.gz: 86846f099e3a62cb83804fc1ea362c185add8992
3
+ metadata.gz: 36dc815f87b5baba491093838e46cf60537af9eb
4
+ data.tar.gz: 3149c0e7950e1986bfefeb78cec5bf8e3b334596
5
5
  SHA512:
6
- metadata.gz: ce0f7ee3f32f256bc425cad1109333d27d52b7155e19f2dd8b92ba7cef8fb2496ad82ea292ac65cf9487402c7c580e4b734d151ca05f06e8c5cc4de9fa815f01
7
- data.tar.gz: cf48787c5ee242c0c35413e92bcad1f4b74a8f9f974b5041f54872db0d21cd56e7d0ef42cb6ab9964ca7fcaad4bf06f69f0d45af37e1a3877f9141bb049794de
6
+ metadata.gz: 9555072584dbcb205fafdf5f82615430d729a8e7b56962bda588c1b8319b3c5e2b6a07c238705bb1bec8737b39d85852e63d8dd3bdbd0a7483ba441bb512e806
7
+ data.tar.gz: b2b26a45612366170dba61278e5fb3fbeb0ae56b802bf652b8db90fcf4b63372eb3a33386d791fb605c3668a27b3e399001a608df4a156e4755fb15dbfb36f96
@@ -37,6 +37,10 @@ Style/Documentation:
37
37
  Style/StringLiterals:
38
38
  Enabled: false
39
39
 
40
+ Style/DateTime:
41
+ Exclude:
42
+ - 'spec/**/*.rb'
43
+
40
44
  Naming/SpaceInsideStringInterpolation:
41
45
  EnforcedStyle: no_space
42
46
 
@@ -1,5 +1,21 @@
1
1
  # Change log
2
2
 
3
+ ## master
4
+
5
+ ## 1.1.2
6
+
7
+ - Support exclusive ranges as `where` arguments. ([@MPursche][])
8
+
9
+ ```ruby
10
+ # range including the end
11
+ where(a: 1..4)
12
+ #=> ... WHERE a >= 1 AND a <= 4
13
+
14
+ #range excluding the end
15
+ where(a: 1...4)
16
+ #=> ... WHERE a >= 1 AND a < 4
17
+ ```
18
+
3
19
  ## 1.1.1
4
20
 
5
21
  - [Fixes [#31](https://github.com/palkan/influxer/issues/31)] Fix bug with empty arrays in `where` clause
@@ -81,4 +97,7 @@ end
81
97
  - Add `delete_all` support
82
98
  - Add cache support (using `Rails.cache`)
83
99
  - Scopes (default and named)
84
- - Support for fanout series
100
+ - Support for fanout series
101
+
102
+ [@palkan]: https://github.com/palkan
103
+ [@MPursche]: https://github.com/MPursche
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'influxer/metrics/relation'
4
4
  require 'influxer/metrics/scoping'
5
+ require 'influxer/metrics/quoting/timestamp'
5
6
  require 'influxer/metrics/active_model3/model'
6
7
 
7
8
  module Influxer
@@ -12,8 +13,6 @@ module Influxer
12
13
  # rubocop:disable Metrics/ClassLength
13
14
  class Metrics
14
15
  TIME_FACTOR = 1_000_000_000
15
-
16
- # rubocop:disable Style/MixinUsage
17
16
  if Influxer.active_model3?
18
17
  include Influxer::ActiveModel3::Model
19
18
  else
@@ -25,6 +24,7 @@ module Influxer
25
24
  extend ActiveModel::Callbacks
26
25
 
27
26
  include Influxer::Scoping
27
+ include Influxer::TimestampQuoting
28
28
 
29
29
  define_model_callbacks :write
30
30
 
@@ -224,21 +224,8 @@ module Influxer
224
224
  self.class.database)
225
225
  end
226
226
 
227
- # rubocop:disable Metrics/MethodLength
228
- # rubocop:disable Metrics/AbcSize
229
227
  def parsed_timestamp
230
- return @timestamp unless client.time_precision == 'ns'
231
-
232
- case @timestamp
233
- when Numeric
234
- @timestamp.to_i.to_s.ljust(19, '0').to_i
235
- when String
236
- (Time.parse(@timestamp).to_r * TIME_FACTOR).to_i
237
- when Date
238
- (@timestamp.to_time.to_r * TIME_FACTOR).to_i
239
- when Time
240
- (@timestamp.to_r * TIME_FACTOR).to_i
241
- end
228
+ quote_timestamp @timestamp, client
242
229
  end
243
230
  # rubocop:enable Metrics/MethodLength
244
231
  # rubocop:enable Metrics/AbcSize
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Influxer
4
+ module TimestampQuoting #:nodoc:
5
+ TIME_FACTOR = 1_000_000_000
6
+
7
+ # Quote timestamp as ns
8
+ # rubocop: disable Metrics/AbcSize, Metrics/MethodLength
9
+ def quote_timestamp(val, client)
10
+ return val unless client.time_precision == 'ns'
11
+
12
+ case val
13
+ when Numeric
14
+ val.to_i.to_s.ljust(19, '0').to_i
15
+ when String
16
+ (Time.parse(val).to_r * TIME_FACTOR).to_i
17
+ when Date, DateTime
18
+ (val.to_time.to_r * TIME_FACTOR).to_i
19
+ when Time
20
+ (val.to_r * TIME_FACTOR).to_i
21
+ end
22
+ end
23
+ # rubocop: enable Metrics/AbcSize, Metrics/MethodLength
24
+ end
25
+ end
@@ -4,6 +4,7 @@ require 'active_support/core_ext/module/delegation'
4
4
  require 'influxer/metrics/relation/time_query'
5
5
  require 'influxer/metrics/relation/calculations'
6
6
  require 'influxer/metrics/relation/where_clause'
7
+ require 'influxer/metrics/quoting/timestamp'
7
8
 
8
9
  module Influxer
9
10
  # Relation is used to build queries
@@ -11,6 +12,7 @@ module Influxer
11
12
  class Relation
12
13
  include Influxer::TimeQuery
13
14
  include Influxer::Calculations
15
+ include Influxer::TimestampQuoting
14
16
  prepend Influxer::WhereClause
15
17
 
16
18
  attr_reader :values
@@ -266,15 +268,17 @@ module Influxer
266
268
  self
267
269
  end
268
270
 
271
+ # rubocop: disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
269
272
  def quoted(val, key = nil)
270
273
  if val.is_a?(String) || val.is_a?(Symbol) || @klass.tag?(key)
271
274
  "'#{val}'"
272
- elsif val.is_a?(Time) || val.is_a?(DateTime)
273
- "#{val.to_i}s"
275
+ elsif val.is_a?(Time) || val.is_a?(Date) || val.is_a?(DateTime)
276
+ quote_timestamp val, @instance.client
274
277
  else
275
278
  val.to_s
276
279
  end
277
280
  end
281
+ # rubocop: enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
278
282
 
279
283
  def get_points(list)
280
284
  return list if normalized?
@@ -78,13 +78,25 @@ module Influxer
78
78
  buf.join(negate ? ' and ' : ' or ').to_s
79
79
  end
80
80
 
81
+ # rubocop: disable Metrics/AbcSize, Metrics/MethodLength, Style/IfInsideElse
81
82
  def build_range(key, val, negate)
82
- if negate
83
- "#{key} < #{quoted(val.begin)} or #{key} > #{quoted(val.end)}"
83
+ if val.exclude_end?
84
+ # begin...end range
85
+ if negate
86
+ "#{key} < #{quoted(val.begin)} or #{key} >= #{quoted(val.end)}"
87
+ else
88
+ "#{key} >= #{quoted(val.begin)} and #{key} < #{quoted(val.end)}"
89
+ end
84
90
  else
85
- "#{key} > #{quoted(val.begin)} and #{key} < #{quoted(val.end)}"
91
+ # begin..end range
92
+ if negate
93
+ "#{key} < #{quoted(val.begin)} or #{key} > #{quoted(val.end)}"
94
+ else
95
+ "#{key} >= #{quoted(val.begin)} and #{key} <= #{quoted(val.end)}"
96
+ end
86
97
  end
87
98
  end
99
+ # rubocop: enable Metrics/AbcSize, Metrics/MethodLength, Style/IfInsideElse
88
100
 
89
101
  def build_none
90
102
  @null_relation = true
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Influxer # :nodoc:
4
- VERSION = "1.1.2"
4
+ VERSION = "1.1.3"
5
5
  end
@@ -67,9 +67,9 @@ describe Influxer::Relation, :query do
67
67
  end
68
68
 
69
69
  describe "#where" do
70
- it "sgenerate valid conditions from hash" do
70
+ it "generate valid conditions from hash" do
71
71
  Timecop.freeze(Time.now)
72
- expect(rel.where(user_id: 1, dummy: 'q', timer: Time.now).to_sql).to eq "select * from \"dummy\" where (user_id = 1) and (dummy = 'q') and (timer = #{Time.now.to_i}s)"
72
+ expect(rel.where(user_id: 1, dummy: 'q', timer: Time.now).to_sql).to eq "select * from \"dummy\" where (user_id = 1) and (dummy = 'q') and (timer = #{(Time.now.to_r * 1_000_000_000).to_i})"
73
73
  end
74
74
 
75
75
  it "generate valid conditions from strings" do
@@ -80,8 +80,20 @@ describe Influxer::Relation, :query do
80
80
  expect(rel.where(user_id: 1, dummy: /^du.*/).to_sql).to eq "select * from \"dummy\" where (user_id = 1) and (dummy =~ /^du.*/)"
81
81
  end
82
82
 
83
- it "handle ranges" do
84
- expect(rel.where(user_id: 1..4).to_sql).to eq "select * from \"dummy\" where (user_id > 1 and user_id < 4)"
83
+ it "handle dates" do
84
+ expect(rel.where(timer: Date.new(2015)).to_sql).to eq "select * from \"dummy\" where (timer = #{(Date.new(2015).to_time.to_r * 1_000_000_000).to_i})"
85
+ end
86
+
87
+ it "handle date times" do
88
+ expect(rel.where(timer: DateTime.new(2015)).to_sql).to eq "select * from \"dummy\" where (timer = #{(DateTime.new(2015).to_time.to_r * 1_000_000_000).to_i})"
89
+ end
90
+
91
+ it "handle inclusive ranges" do
92
+ expect(rel.where(user_id: 1..4).to_sql).to eq "select * from \"dummy\" where (user_id >= 1 and user_id <= 4)"
93
+ end
94
+
95
+ it "handle exclusive range" do
96
+ expect(rel.where(user_id: 1...4).to_sql).to eq "select * from \"dummy\" where (user_id >= 1 and user_id < 4)"
85
97
  end
86
98
 
87
99
  it "handle arrays" do
@@ -117,10 +129,14 @@ describe Influxer::Relation, :query do
117
129
  expect(rel.where.not(user_id: 1, dummy: /^du.*/).to_sql).to eq "select * from \"dummy\" where (user_id <> 1) and (dummy !~ /^du.*/)"
118
130
  end
119
131
 
120
- it "handle ranges" do
132
+ it "handle inclusive ranges" do
121
133
  expect(rel.where.not(user_id: 1..4).to_sql).to eq "select * from \"dummy\" where (user_id < 1 or user_id > 4)"
122
134
  end
123
135
 
136
+ it "handle exclusive ranges" do
137
+ expect(rel.where.not(user_id: 1...4).to_sql).to eq "select * from \"dummy\" where (user_id < 1 or user_id >= 4)"
138
+ end
139
+
124
140
  it "handle arrays" do
125
141
  expect(rel.where.not(user_id: [1, 2, 3]).to_sql).to eq "select * from \"dummy\" where (user_id <> 1 and user_id <> 2 and user_id <> 3)"
126
142
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: influxer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vlad Dem
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-25 00:00:00.000000000 Z
11
+ date: 2018-01-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -204,6 +204,7 @@ files:
204
204
  - lib/influxer/engine.rb
205
205
  - lib/influxer/metrics/active_model3/model.rb
206
206
  - lib/influxer/metrics/metrics.rb
207
+ - lib/influxer/metrics/quoting/timestamp.rb
207
208
  - lib/influxer/metrics/relation.rb
208
209
  - lib/influxer/metrics/relation/calculations.rb
209
210
  - lib/influxer/metrics/relation/time_query.rb