Skip to content

Commit 54654be

Browse files
authored
Fixing time series tests (#23)
* Delete Redis.Close() line and comment some functions with errors * Fix the Tests that didn't Pass * Update TS commands to the corrent version
1 parent 2149f4d commit 54654be

File tree

7 files changed

+426
-159
lines changed

7 files changed

+426
-159
lines changed

src/NRedisStack/TimeSeries/Extensions/AggregationExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ internal static class AggregationExtensions
1919
TsAggregation.StdS => "STD.S",
2020
TsAggregation.VarP => "VAR.P",
2121
TsAggregation.VarS => "VAR.S",
22+
TsAggregation.Twa => "TWA",
2223
_ => throw new ArgumentOutOfRangeException(nameof(aggregation), "Invalid aggregation type"),
2324
};
2425

@@ -36,6 +37,7 @@ internal static class AggregationExtensions
3637
"STD.S" => TsAggregation.StdS,
3738
"VAR.P" => TsAggregation.VarP,
3839
"VAR.S" => TsAggregation.VarS,
40+
"TWA" => TsAggregation.Twa,
3941
_ => throw new ArgumentOutOfRangeException(nameof(aggregation), $"Invalid aggregation type '{aggregation}'"),
4042
};
4143
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System;
2+
using NRedisStack.Literals.Enums;
3+
4+
namespace NRedisStack.Extensions
5+
{
6+
internal static class TsBucketTimestampsExtensions
7+
{
8+
public static string AsArg(this TsBucketTimestamps bt) => bt switch
9+
{
10+
TsBucketTimestamps.low => "low",
11+
TsBucketTimestamps.mid => "mid",
12+
TsBucketTimestamps.high => "high",
13+
_ => throw new ArgumentOutOfRangeException(nameof(bt), "Invalid TsBucketTimestamps type"),
14+
};
15+
16+
public static TsBucketTimestamps Asbt(string bt) => bt switch
17+
{
18+
"low" => TsBucketTimestamps.low,
19+
"mid" => TsBucketTimestamps.mid,
20+
"high" => TsBucketTimestamps.high,
21+
_ => throw new ArgumentOutOfRangeException(nameof(bt), $"Invalid TsBucketTimestamps type '{bt}'"),
22+
};
23+
}
24+
}

src/NRedisStack/TimeSeries/Literals/CommandArgs.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ internal class TimeSeriesArgs
1919
public static string REDUCE => "REDUCE";
2020
public static string FILTER_BY_TS => "FILTER_BY_TS";
2121
public static string FILTER_BY_VALUE => "FILTER_BY_VALUE";
22-
22+
public static string LATEST => "LATEST";
23+
public static string DEBUG => "DEBUG";
24+
public static string BUCKETTIMESTAMP => "BUCKETTIMESTAMP";
25+
public static string EMPTY => "EMPTY";
2326
}
2427
}

src/NRedisStack/TimeSeries/Literals/Enums/Aggregation.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,5 +69,10 @@ public enum TsAggregation
6969
/// The variance is the average of the squared differences from the mean
7070
/// </summary>
7171
VarS,
72+
73+
/// <summary>
74+
/// Time-weighted average of all values
75+
/// </summary>
76+
Twa,
7277
}
7378
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
namespace NRedisStack.Literals.Enums
2+
{
3+
/// <summary>
4+
/// TODO: Add description
5+
/// </summary>
6+
public enum TsBucketTimestamps
7+
{
8+
/// <summary>
9+
/// Timestamp is the start time (default)
10+
/// </summary>
11+
low,
12+
13+
/// <summary>
14+
/// Timestamp is the mid time (rounded down if not an integer)
15+
/// </summary>
16+
mid,
17+
18+
/// <summary>
19+
/// Timestamp is the end time
20+
/// </summary>
21+
high,
22+
}
23+
}

src/NRedisStack/TimeSeries/TimeSeriesAux.cs

Lines changed: 89 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ namespace NRedisStack
99
{
1010
public static class TimeSeriesAux
1111
{
12+
public static void AddLatest(this IList<object> args, bool latest)
13+
{
14+
if (latest) args.Add(TimeSeriesArgs.LATEST);
15+
}
16+
1217
public static void AddRetentionTime(this IList<object> args, long? retentionTime)
1318
{
1419
if (retentionTime.HasValue)
@@ -76,18 +81,46 @@ public static void AddOnDuplicate(this IList<object> args, TsDuplicatePolicy? po
7681
}
7782
}
7883

79-
public static void AddAlign(this IList<object> args, TimeStamp align)
84+
public static void AddAlign(this IList<object> args, TimeStamp? align)
8085
{
81-
if(align != null)
86+
if (align != null)
8287
{
8388
args.Add(TimeSeriesArgs.ALIGN);
8489
args.Add(align.Value);
8590
}
8691
}
8792

93+
public static void AddBucketTimestamp(this IList<object> args, TsBucketTimestamps? bt)
94+
{
95+
if (bt != null)
96+
{
97+
args.Add(TimeSeriesArgs.BUCKETTIMESTAMP);
98+
args.Add(bt.Value.AsArg());
99+
}
100+
}
101+
102+
public static void AddAggregation(this IList<object> args, TimeStamp? align,
103+
TsAggregation? aggregation,
104+
long? timeBucket,
105+
TsBucketTimestamps? bt,
106+
bool empty)
107+
{
108+
if (aggregation == null && (align != null || timeBucket != null || bt != null || empty))
109+
{
110+
throw new ArgumentException("align, timeBucket, BucketTimestamps or empty cannot be defined without Aggregation");
111+
}
112+
else
113+
{
114+
args.AddAlign(align);
115+
args.AddAggregation(aggregation, timeBucket);
116+
args.AddBucketTimestamp(bt);
117+
if (empty) args.Add(TimeSeriesArgs.EMPTY);
118+
}
119+
}
120+
88121
public static void AddAggregation(this IList<object> args, TsAggregation? aggregation, long? timeBucket)
89122
{
90-
if(aggregation != null)
123+
if (aggregation != null)
91124
{
92125
args.Add(TimeSeriesArgs.AGGREGATION);
93126
args.Add(aggregation.Value.AsArg());
@@ -101,18 +134,18 @@ public static void AddAggregation(this IList<object> args, TsAggregation? aggreg
101134

102135
public static void AddFilters(this List<object> args, IReadOnlyCollection<string> filter)
103136
{
104-
if(filter == null || filter.Count == 0)
137+
if (filter == null || filter.Count == 0)
105138
{
106139
throw new ArgumentException("There should be at least one filter on MRANGE/MREVRANGE");
107140
}
108141
args.Add(TimeSeriesArgs.FILTER);
109-
foreach(string f in filter)
142+
foreach (string f in filter)
110143
{
111144
args.Add(f);
112145
}
113146
}
114147

115-
public static void AddFilterByTs(this List<object> args, IReadOnlyCollection<TimeStamp> filter)
148+
public static void AddFilterByTs(this List<object> args, IReadOnlyCollection<TimeStamp>? filter)
116149
{
117150
if (filter != null)
118151
{
@@ -134,20 +167,23 @@ public static void AddFilterByValue(this List<object> args, (long, long)? filter
134167
}
135168
}
136169

137-
public static void AddWithLabels(this IList<object> args, bool? withLabels, IReadOnlyCollection<string> selectLabels = null)
170+
public static void AddWithLabels(this IList<object> args, bool? withLabels, IReadOnlyCollection<string>? selectLabels = null)
138171
{
139-
if(withLabels.HasValue && selectLabels != null) {
172+
if (withLabels.HasValue && selectLabels != null)
173+
{
140174
throw new ArgumentException("withLabels and selectLabels cannot be specified together.");
141175
}
142176

143-
if(withLabels.HasValue && withLabels.Value)
177+
if (withLabels.HasValue && withLabels.Value)
144178
{
145179
args.Add(TimeSeriesArgs.WITHLABELS);
146180
}
147181

148-
if(selectLabels != null){
182+
if (selectLabels != null)
183+
{
149184
args.Add(TimeSeriesArgs.SELECTEDLABELS);
150-
foreach(string label in selectLabels){
185+
foreach (string label in selectLabels)
186+
{
151187
args.Add(label);
152188
}
153189
}
@@ -166,7 +202,7 @@ public static void AddGroupby(this IList<object> args, (string groupby, TsReduce
166202

167203
public static void AddTimeStamp(this IList<object> args, TimeStamp timeStamp)
168204
{
169-
if(timeStamp != null)
205+
if (timeStamp != null)
170206
{
171207
args.Add(TimeSeriesArgs.TIMESTAMP);
172208
args.Add(timeStamp.Value);
@@ -184,7 +220,7 @@ public static void AddRule(this IList<object> args, TimeSeriesRule rule)
184220
public static List<object> BuildTsCreateArgs(string key, long? retentionTime, IReadOnlyCollection<TimeSeriesLabel> labels, bool? uncompressed,
185221
long? chunkSizeBytes, TsDuplicatePolicy? policy)
186222
{
187-
var args = new List<object> {key};
223+
var args = new List<object> { key };
188224
args.AddRetentionTime(retentionTime);
189225
args.AddChunkSize(chunkSizeBytes);
190226
args.AddLabels(labels);
@@ -193,18 +229,21 @@ public static List<object> BuildTsCreateArgs(string key, long? retentionTime, IR
193229
return args;
194230
}
195231

196-
public static List<object> BuildTsAlterArgs(string key, long? retentionTime, IReadOnlyCollection<TimeSeriesLabel>? labels)
232+
public static List<object> BuildTsAlterArgs(string key, long? retentionTime, long? chunkSizeBytes,
233+
TsDuplicatePolicy? policy, IReadOnlyCollection<TimeSeriesLabel>? labels)
197234
{
198-
var args = new List<object> {key};
235+
var args = new List<object> { key };
199236
args.AddRetentionTime(retentionTime);
200-
if (labels != null) args.AddLabels(labels);
237+
args.AddChunkSize(chunkSizeBytes);
238+
args.AddDuplicatePolicy(policy);
239+
args.AddLabels(labels);
201240
return args;
202241
}
203242

204243
public static List<object> BuildTsAddArgs(string key, TimeStamp timestamp, double value, long? retentionTime,
205244
IReadOnlyCollection<TimeSeriesLabel> labels, bool? uncompressed, long? chunkSizeBytes, TsDuplicatePolicy? policy)
206245
{
207-
var args = new List<object> {key, timestamp.Value, value};
246+
var args = new List<object> { key, timestamp.Value, value };
208247
args.AddRetentionTime(retentionTime);
209248
args.AddChunkSize(chunkSizeBytes);
210249
args.AddLabels(labels);
@@ -216,7 +255,7 @@ public static List<object> BuildTsAddArgs(string key, TimeStamp timestamp, doubl
216255
public static List<object> BuildTsIncrDecrByArgs(string key, double value, TimeStamp? timestamp, long? retentionTime,
217256
IReadOnlyCollection<TimeSeriesLabel>? labels, bool? uncompressed, long? chunkSizeBytes)
218257
{
219-
var args = new List<object> {key, value};
258+
var args = new List<object> { key, value };
220259
if (timestamp != null) args.AddTimeStamp(timestamp);
221260
args.AddRetentionTime(retentionTime);
222261
args.AddChunkSize(chunkSizeBytes);
@@ -244,51 +283,65 @@ public static List<object> BuildTsMaddArgs(IReadOnlyCollection<(string key, Time
244283
return args;
245284
}
246285

247-
public static List<object> BuildTsMgetArgs(IReadOnlyCollection<string> filter, bool? withLabels)
286+
public static List<object> BuildTsMgetArgs(bool latest, IReadOnlyCollection<string> filter, bool? withLabels = null, IReadOnlyCollection<string>? selectedLabels = null)
248287
{
249288
var args = new List<object>();
250-
args.AddWithLabels(withLabels);
289+
args.AddLatest(latest);
290+
args.AddWithLabels(withLabels, selectedLabels);
251291
args.AddFilters(filter);
252292
return args;
253293
}
254294

295+
//TODO: add the new parameters to TS.RANGE
255296
public static List<object> BuildRangeArgs(string key,
256297
TimeStamp fromTimeStamp,
257298
TimeStamp toTimeStamp,
299+
bool latest,
300+
IReadOnlyCollection<TimeStamp>? filterByTs,
301+
(long, long)? filterByValue,
258302
long? count,
303+
TimeStamp? align,
259304
TsAggregation? aggregation,
260305
long? timeBucket,
261-
IReadOnlyCollection<TimeStamp>? filterByTs,
262-
(long, long)? filterByValue,
263-
TimeStamp? align)
306+
TsBucketTimestamps? bt,
307+
bool empty)
264308
{
265309
var args = new List<object>()
266310
{key, fromTimeStamp.Value, toTimeStamp.Value};
267-
311+
args.AddLatest(latest);
268312
if (filterByTs != null) args.AddFilterByTs(filterByTs);
269313
args.AddFilterByValue(filterByValue);
270314
args.AddCount(count);
271-
if (align != null) args.AddAlign(align);
272-
args.AddAggregation(aggregation, timeBucket);
315+
args.AddAggregation(align, aggregation, timeBucket, bt, empty);
273316
return args;
274317
}
275318

276319

277-
public static List<object> BuildMultiRangeArgs(TimeStamp fromTimeStamp, TimeStamp toTimeStamp,
278-
IReadOnlyCollection<string> filter, long? count, TsAggregation? aggregation, long? timeBucket,
279-
bool? withLabels, (string, TsReduce)? groupbyTuple, IReadOnlyCollection<TimeStamp>? filterByTs,
280-
(long, long)? filterByValue, IReadOnlyCollection<string>? selectLabels, TimeStamp? align)
320+
public static List<object> BuildMultiRangeArgs(TimeStamp fromTimeStamp,
321+
TimeStamp toTimeStamp,
322+
IReadOnlyCollection<string> filter,
323+
bool latest,
324+
IReadOnlyCollection<TimeStamp>? filterByTs,
325+
(long, long)? filterByValue,
326+
bool? withLabels,
327+
IReadOnlyCollection<string>? selectLabels,
328+
long? count,
329+
TimeStamp? align,
330+
TsAggregation? aggregation,
331+
long? timeBucket,
332+
TsBucketTimestamps? bt,
333+
bool empty,
334+
(string, TsReduce)? groupbyTuple)
281335
{
282-
var args = new List<object>() {fromTimeStamp.Value, toTimeStamp.Value};
283-
if (filterByTs != null) args.AddFilterByTs(filterByTs);
336+
var args = new List<object>() { fromTimeStamp.Value, toTimeStamp.Value };
337+
args.AddFilterByTs(filterByTs);
284338
args.AddFilterByValue(filterByValue);
285-
args.AddCount(count);
286-
if (align != null) args.AddAlign(align);
287-
args.AddAggregation(aggregation, timeBucket);
288339
args.AddWithLabels(withLabels, selectLabels);
340+
args.AddCount(count);
341+
args.AddAggregation(align, aggregation, timeBucket, bt, empty);
289342
args.AddFilters(filter);
290343
args.AddGroupby(groupbyTuple);
291344
return args;
292345
}
293346
}
294-
}
347+
}

0 commit comments

Comments
 (0)