influxer 1.1.3 → 1.1.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 36dc815f87b5baba491093838e46cf60537af9eb
4
- data.tar.gz: 3149c0e7950e1986bfefeb78cec5bf8e3b334596
3
+ metadata.gz: 34d7516d9e613074dcc24cf1c401bf69af544fa8
4
+ data.tar.gz: ea286c505a09b55058dc00fa05bebd1786c2de20
5
5
  SHA512:
6
- metadata.gz: 9555072584dbcb205fafdf5f82615430d729a8e7b56962bda588c1b8319b3c5e2b6a07c238705bb1bec8737b39d85852e63d8dd3bdbd0a7483ba441bb512e806
7
- data.tar.gz: b2b26a45612366170dba61278e5fb3fbeb0ae56b802bf652b8db90fcf4b63372eb3a33386d791fb605c3668a27b3e399001a608df4a156e4755fb15dbfb36f96
6
+ metadata.gz: 96fbc0c09e0127c7be545ffab4e0108a9ea26c7d471678c74095d35ce55827103357ce584b371e86cdd82200ff0ea86a63fb1f4ff61890e6d841b59de1618d35
7
+ data.tar.gz: 5e580bcbfebb8ca2d731cd658e81d7cd418dc90a4e423aac8ea47d5cb06ccdd409b4e938d6752be4f9b5955bbcede839a004c3ee77dd7fd103c01471a51e1a22
data/Changelog.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 1.1.4
6
+
7
+ - [Fixes [#35](https://github.com/palkan/influxer/issues/35)] Support time duration suffix and handle `'s'` and `'ms'` precisions. ([@palkan][])
8
+
9
+ [PR](https://github.com/palkan/influxer/pull/36)
10
+
11
+ **BREAKING:** `Time`-like value are only typecasted for `time` key.
12
+
5
13
  ## 1.1.2
6
14
 
7
15
  - Support exclusive ranges as `where` arguments. ([@MPursche][])
@@ -30,7 +30,8 @@ module Influxer
30
30
  :async,
31
31
  database: 'db',
32
32
  time_precision: 'ns',
33
- cache: false
33
+ cache: false,
34
+ time_duration_suffix_enabled: false
34
35
 
35
36
  def load(*)
36
37
  super
@@ -2,24 +2,55 @@
2
2
 
3
3
  module Influxer
4
4
  module TimestampQuoting #:nodoc:
5
- TIME_FACTOR = 1_000_000_000
5
+ TIME_FACTORS = {
6
+ 'ns' => 1_000_000_000,
7
+ 'ms' => 1_000,
8
+ 's' => 1
9
+ }.freeze
6
10
 
7
- # Quote timestamp as ns
8
- # rubocop: disable Metrics/AbcSize, Metrics/MethodLength
11
+ DEFAULT_PRECISION = 'ns'
12
+
13
+ # Quote timestamp
14
+ # rubocop: disable Metrics/MethodLength, Metrics/AbcSize
9
15
  def quote_timestamp(val, client)
10
- return val unless client.time_precision == 'ns'
16
+ if Influxer.config.time_duration_suffix_enabled
17
+ precision = if TIME_FACTORS.keys.include?(client.time_precision)
18
+ client.time_precision
19
+ else
20
+ DEFAULT_PRECISION
21
+ end
22
+ return quote_timestamp_with_suffix(val, precision)
23
+ end
24
+
25
+ if !TIME_FACTORS.keys.include?(client.time_precision) &&
26
+ !val.is_a?(Numeric)
27
+ warn(
28
+ "Influxer doesn't automatically cast Time and String values " \
29
+ "to '#{client.time_precision}' precision. " \
30
+ "Please, convert to numeric value yourself"
31
+ )
32
+ return val
33
+ end
34
+
35
+ factorize_timestamp(val, TIME_FACTORS.fetch(client.time_precision))
36
+ end
37
+ # rubocop: enable Metrics/MethodLength, Metrics/AbcSize
38
+
39
+ def quote_timestamp_with_suffix(val, precision)
40
+ "#{factorize_timestamp(val, TIME_FACTORS.fetch(precision))}#{precision}"
41
+ end
11
42
 
43
+ def factorize_timestamp(val, factor)
12
44
  case val
13
45
  when Numeric
14
- val.to_i.to_s.ljust(19, '0').to_i
46
+ (val.to_f * factor).to_i
15
47
  when String
16
- (Time.parse(val).to_r * TIME_FACTOR).to_i
48
+ (Time.parse(val).to_r * factor).to_i
17
49
  when Date, DateTime
18
- (val.to_time.to_r * TIME_FACTOR).to_i
50
+ (val.to_time.to_r * factor).to_i
19
51
  when Time
20
- (val.to_r * TIME_FACTOR).to_i
52
+ (val.to_r * factor).to_i
21
53
  end
22
54
  end
23
- # rubocop: enable Metrics/AbcSize, Metrics/MethodLength
24
55
  end
25
56
  end
@@ -268,17 +268,15 @@ module Influxer
268
268
  self
269
269
  end
270
270
 
271
- # rubocop: disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
272
271
  def quoted(val, key = nil)
273
272
  if val.is_a?(String) || val.is_a?(Symbol) || @klass.tag?(key)
274
273
  "'#{val}'"
275
- elsif val.is_a?(Time) || val.is_a?(Date) || val.is_a?(DateTime)
274
+ elsif key.to_s == "time"
276
275
  quote_timestamp val, @instance.client
277
276
  else
278
277
  val.to_s
279
278
  end
280
279
  end
281
- # rubocop: enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
282
280
 
283
281
  def get_points(list)
284
282
  return list if normalized?
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Influxer # :nodoc:
4
- VERSION = "1.1.3"
4
+ VERSION = "1.1.4"
5
5
  end
@@ -69,7 +69,7 @@ describe Influxer::Relation, :query do
69
69
  describe "#where" do
70
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_r * 1_000_000_000).to_i})"
72
+ expect(rel.where(user_id: 1, dummy: 'q', time: Time.now).to_sql).to eq "select * from \"dummy\" where (user_id = 1) and (dummy = 'q') and (time = #{(Time.now.to_r * 1_000_000_000).to_i})"
73
73
  end
74
74
 
75
75
  it "generate valid conditions from strings" do
@@ -81,11 +81,11 @@ describe Influxer::Relation, :query do
81
81
  end
82
82
 
83
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})"
84
+ expect(rel.where(time: Date.new(2015)).to_sql).to eq "select * from \"dummy\" where (time = #{(Date.new(2015).to_time.to_r * 1_000_000_000).to_i})"
85
85
  end
86
86
 
87
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})"
88
+ expect(rel.where(time: DateTime.new(2015)).to_sql).to eq "select * from \"dummy\" where (time = #{(DateTime.new(2015).to_time.to_r * 1_000_000_000).to_i})"
89
89
  end
90
90
 
91
91
  it "handle inclusive ranges" do
@@ -105,6 +105,58 @@ describe Influxer::Relation, :query do
105
105
  expect(rel.to_a).to eq []
106
106
  end
107
107
 
108
+ context "with timestamp duration" do
109
+ around do |ex|
110
+ old_duration = Influxer.config.time_duration_suffix_enabled
111
+ Influxer.config.time_duration_suffix_enabled = true
112
+ ex.run
113
+ Influxer.config.time_duration_suffix_enabled = old_duration
114
+ end
115
+
116
+ it "adds ns suffix to times" do
117
+ expect(rel.where(time: DateTime.new(2015)).to_sql).to eq "select * from \"dummy\" where (time = #{(DateTime.new(2015).to_time.to_r * 1_000_000_000).to_i}ns)"
118
+ end
119
+
120
+ context "with different time_precision" do
121
+ around do |ex|
122
+ old_precision = Influxer.config.time_precision
123
+ Influxer.config.time_precision = 's'
124
+ ex.run
125
+ Influxer.config.time_precision = old_precision
126
+ end
127
+
128
+ it "adds s suffix to times" do
129
+ expect(rel.where(time: DateTime.new(2015)).to_sql).to eq "select * from \"dummy\" where (time = #{DateTime.new(2015).to_time.to_i}s)"
130
+ end
131
+ end
132
+
133
+ context "with unsupported time_precision" do
134
+ around do |ex|
135
+ old_precision = Influxer.config.time_precision
136
+ Influxer.config.time_precision = 'h'
137
+ ex.run
138
+ Influxer.config.time_precision = old_precision
139
+ end
140
+
141
+ it "casts to ns with suffix" do
142
+ expect(rel.where(time: DateTime.new(2015)).to_sql).to eq "select * from \"dummy\" where (time = #{(DateTime.new(2015).to_time.to_r * 1_000_000_000).to_i}ns)"
143
+ end
144
+ end
145
+ end
146
+
147
+ context "with different time_precision" do
148
+ around do |ex|
149
+ old_precision = Influxer.config.time_precision
150
+ Influxer.config.time_precision = 's'
151
+ ex.run
152
+ Influxer.config.time_precision = old_precision
153
+ end
154
+
155
+ it "casts to correct numeric representation" do
156
+ expect(rel.where(time: DateTime.new(2015)).to_sql).to eq "select * from \"dummy\" where (time = #{DateTime.new(2015).to_time.to_i})"
157
+ end
158
+ end
159
+
108
160
  context "with tags" do
109
161
  it "integer tag values" do
110
162
  expect(rel.where(dummy_id: 10).to_sql).to eq "select * from \"dummy\" where (dummy_id = '10')"
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.3
4
+ version: 1.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vlad Dem
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-11 00:00:00.000000000 Z
11
+ date: 2018-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel