Skip to content

Commit daf8ac9

Browse files
author
Enric Sala
committed
Move time manipulation methods to a utils class
1 parent 2b9ee8c commit daf8ac9

File tree

5 files changed

+115
-79
lines changed

5 files changed

+115
-79
lines changed

influxdb-client/InfluxDB.m

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@
6060
if nargin < 4 || isempty(epoch)
6161
epoch = 'ms';
6262
else
63-
assert(any(strcmp(epoch, {'ns', 'u', 'ms', 's', 'm', 'h'})), ...
64-
'epoch:unknown', '"%s" is not a valid epoch', epoch);
63+
TimeUtils.validateEpoch(epoch);
6564
end
6665
url = [obj.Url '/query'];
6766
opts = weboptions('Timeout', obj.ReadTimeout, ...
@@ -90,8 +89,7 @@
9089
params{end + 1} = ['db=' urlencode(obj.Database)];
9190
end
9291
if nargin > 3 && ~isempty(precision)
93-
assert(any(strcmp(precision, {'ns', 'u', 'ms', 's', 'm', 'h'})), ...
94-
'precision:unknown', '"%s" is not a valid precision', precision);
92+
TimeUtils.validatePrecision(precision);
9593
params{end + 1} = ['precision=' precision];
9694
end
9795
if nargin > 4 && ~isempty(retention)

influxdb-client/QueryBuilder.m

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,11 @@
113113
elseif ischar(before)
114114
obj.Before = ['time < ''' before ''''];
115115
elseif isdatetime(before)
116-
obj.Before = ['time < ' obj.formatDatetime(before) 'ms'];
116+
str = TimeUtils.formatDatetime(before, 'ms', true);
117+
obj.Before = ['time < ' str];
117118
elseif isfloat(before)
118-
obj.Before = ['time < ' obj.formatDatenum(before) 'ms'];
119+
str = TimeUtils.formatDatenum(before, 'ms', true);
120+
obj.Before = ['time < ' str];
119121
else
120122
error('unsupported before type');
121123
end
@@ -128,9 +130,11 @@
128130
elseif ischar(before)
129131
obj.Before = ['time <= ''' before ''''];
130132
elseif isdatetime(before)
131-
obj.Before = ['time <= ' obj.formatDatetime(before) 'ms'];
133+
str = TimeUtils.formatDatetime(before, 'ms', true);
134+
obj.Before = ['time <= ' str];
132135
elseif isfloat(before)
133-
obj.Before = ['time <= ' obj.formatDatenum(before) 'ms'];
136+
str = TimeUtils.formatDatenum(before, 'ms', true);
137+
obj.Before = ['time <= ' str];
134138
else
135139
error('unsupported before type');
136140
end
@@ -143,9 +147,11 @@
143147
elseif ischar(after)
144148
obj.After = ['time > ''' after ''''];
145149
elseif isdatetime(after)
146-
obj.After = ['time > ' obj.formatDatetime(after) 'ms'];
150+
str = TimeUtils.formatDatetime(after, 'ms', true);
151+
obj.After = ['time > ' str];
147152
elseif isfloat(after)
148-
obj.After = ['time > ' obj.formatDatenum(after) 'ms'];
153+
str = TimeUtils.formatDatenum(after, 'ms', true);
154+
obj.After = ['time > ' str];
149155
else
150156
error('unsupported before type');
151157
end
@@ -158,9 +164,11 @@
158164
elseif ischar(after)
159165
obj.After = ['time >= ''' after ''''];
160166
elseif isdatetime(after)
161-
obj.After = ['time >= ' obj.formatDatetime(after) 'ms'];
167+
str = TimeUtils.formatDatetime(after, 'ms', true);
168+
obj.After = ['time >= ' str];
162169
elseif isfloat(after)
163-
obj.After = ['time >= ' obj.formatDatenum(after) 'ms'];
170+
str = TimeUtils.formatDatenum(after, 'ms', true);
171+
obj.After = ['time >= ' str];
164172
else
165173
error('unsupported before type');
166174
end
@@ -263,18 +271,4 @@
263271
end
264272
end
265273

266-
methods(Static, Access = private)
267-
% Convert datetime to string
268-
function str = formatDatetime(dtime)
269-
str = num2str(int64(1000 * posixtime(dtime)));
270-
end
271-
272-
% Convert datenum to string
273-
function str = formatDatenum(dnum)
274-
warning('timezone not specified, assuming local');
275-
dtime = datetime(dnum, 'ConvertFrom', 'datenum', 'TimeZone', 'local');
276-
str = QueryBuilder.formatDatetime(dtime);
277-
end
278-
end
279-
280274
end

influxdb-client/Series.m

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@
9696
% Obtain the time precision scale
9797
if time_length > 0
9898
if nargin < 2, precision = 'ms'; end
99-
scale = obj.timeScale(precision);
99+
scale = TimeUtils.scaleOfPrecision(precision);
100100
timestamp = int64(scale * posixtime(obj.Time));
101101
end
102102

@@ -151,27 +151,6 @@
151151
error('unsupported value type');
152152
end
153153
end
154-
155-
% Otain the scale for a precision
156-
function scale = timeScale(precision)
157-
switch precision
158-
case 'ns'
159-
scale = 1000000000;
160-
case 'u'
161-
scale = 1000000;
162-
case 'ms'
163-
scale = 1000;
164-
case 's'
165-
scale = 1;
166-
case 'm'
167-
scale = 1 / 60;
168-
case 'h'
169-
scale = 1 / 3600;
170-
otherwise
171-
error('precision:unknown', ...
172-
'"%s" is not a valid precision', precision);
173-
end
174-
end
175154
end
176155

177156
end

influxdb-client/SeriesResult.m

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@
126126
% Check if the first field is the time
127127
if strcmp('time', fields{1})
128128
timestamps = cell2mat(celled(:, 1));
129-
time = SeriesResult.toDatetime(timestamps, epoch);
129+
time = TimeUtils.toDatetime(timestamps, epoch);
130130
fields = fields(2:end);
131131
celled = celled(:, 2:end);
132132
else
@@ -165,34 +165,4 @@
165165
end
166166
end
167167

168-
methods(Static, Access = private)
169-
% Convert a unix timestamp to a datetime
170-
function [time] = toDatetime(timestamp, epoch)
171-
scale = SeriesResult.timeScale(epoch);
172-
time = datetime(timestamp / scale, ...
173-
'ConvertFrom', 'posixtime', 'TimeZone', 'local');
174-
end
175-
176-
% Obtain the scale for an epoch
177-
function scale = timeScale(epoch)
178-
switch epoch
179-
case 'ns'
180-
scale = 1000000000;
181-
case 'u'
182-
scale = 1000000;
183-
case 'ms'
184-
scale = 1000;
185-
case 's'
186-
scale = 1;
187-
case 'm'
188-
scale = 1 / 60;
189-
case 'h'
190-
scale = 1 / 3600;
191-
otherwise
192-
error('epoch:unknown', ...
193-
'"%s" is not a valid epoch', epoch);
194-
end
195-
end
196-
end
197-
198168
end

influxdb-client/TimeUtils.m

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
classdef TimeUtils
2+
3+
properties(Constant, Access = private)
4+
DEFAULT_PRECISION = 'ms'
5+
DEFAULT_APPEND_PRECISION = false
6+
PRECISIONS = {'ns', 'u', 'ms', 's', 'm', 'h'}
7+
EPOCHS = {'ns', 'u', 'ms', 's', 'm', 'h'}
8+
end
9+
10+
methods(Static)
11+
% Format a datetime as a string
12+
function str = formatDatetime(dtime, precision, appendPrecision)
13+
if nargin < 2, precision = TimeUtils.DEFAULT_PRECISION; end
14+
if nargin < 3, appendPrecision = TimeUtils.DEFAULT_APPEND_PRECISION; end
15+
scale = TimeUtils.scaleOfPrecision(precision);
16+
value = int64(scale * posixtime(dtime));
17+
if appendPrecision
18+
str = [num2str(value), precision];
19+
else
20+
str = num2str(value);
21+
end
22+
end
23+
24+
% Format a datenum as a string
25+
function str = formatDatenum(dnum, precision, appendPrecision)
26+
if nargin < 2, precision = TimeUtils.DEFAULT_PRECISION; end
27+
if nargin < 3, appendPrecision = TimeUtils.DEFAULT_APPEND_PRECISION; end
28+
warning('datenums do not specify a timezone, assuming local');
29+
dtime = datetime(dnum, 'ConvertFrom', 'datenum', 'TimeZone', 'local');
30+
str = TimeUtils.formatDatetime(dtime, precision, appendPrecision);
31+
end
32+
33+
% Convert a timestamp to a datetime
34+
function dtime = toDatetime(timestamp, precision)
35+
scale = TimeUtils.scaleOfPrecision(precision);
36+
dtime = datetime(timestamp / scale, ...
37+
'ConvertFrom', 'posixtime', 'TimeZone', 'local');
38+
end
39+
40+
% Validate a precision
41+
function validatePrecision(precision)
42+
assert(any(strcmp(precision, TimeUtils.PRECISIONS)), ...
43+
'precision:unknown', '"%s" is not a valid precision', precision);
44+
end
45+
46+
% Obtain the scale for a precision
47+
function scale = scaleOfPrecision(precision)
48+
switch precision
49+
case 'ns'
50+
scale = 1000000000;
51+
case 'u'
52+
scale = 1000000;
53+
case 'ms'
54+
scale = 1000;
55+
case 's'
56+
scale = 1;
57+
case 'm'
58+
scale = 1 / 60;
59+
case 'h'
60+
scale = 1 / 3600;
61+
otherwise
62+
error('precision:unknown', ...
63+
'"%s" is not a valid precision', precision);
64+
end
65+
end
66+
67+
% Validate an epoch
68+
function validateEpoch(epoch)
69+
assert(any(strcmp(epoch, TimeUtils.EPOCHS)), ...
70+
'epoch:unknown', '"%s" is not a valid epoch', epoch);
71+
end
72+
73+
% Obtain the scale for an epoch
74+
function scale = scaleOfEpoch(epoch)
75+
switch epoch
76+
case 'ns'
77+
scale = 1000000000;
78+
case 'u'
79+
scale = 1000000;
80+
case 'ms'
81+
scale = 1000;
82+
case 's'
83+
scale = 1;
84+
case 'm'
85+
scale = 1 / 60;
86+
case 'h'
87+
scale = 1 / 3600;
88+
otherwise
89+
error('epoch:unknown', ...
90+
'"%s" is not a valid epoch', epoch);
91+
end
92+
end
93+
end
94+
95+
end

0 commit comments

Comments
 (0)