Skip to content

Commit 5d922e9

Browse files
authored
Add Tests for [BUCKETTIMESTAMP bt] [EMPTY] features (#26)
* Add Tests for [BUCKETTIMESTAMP bt] [EMPTY] features * Fix UpperCase problem in AggregationExtensions
1 parent 98c207f commit 5d922e9

File tree

5 files changed

+205
-20
lines changed

5 files changed

+205
-20
lines changed

src/NRedisStack/TimeSeries/Extensions/AggregationExtensions.cs

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,37 @@ internal static class AggregationExtensions
77
{
88
public static string AsArg(this TsAggregation aggregation) => aggregation switch
99
{
10-
TsAggregation.Avg => "AVG",
11-
TsAggregation.Sum => "SUM",
12-
TsAggregation.Min => "MIN",
13-
TsAggregation.Max => "MAX",
14-
TsAggregation.Range => "RANGE",
15-
TsAggregation.Count => "COUNT",
16-
TsAggregation.First => "FIRST",
17-
TsAggregation.Last => "LAST",
18-
TsAggregation.StdP => "STD.P",
19-
TsAggregation.StdS => "STD.S",
20-
TsAggregation.VarP => "VAR.P",
21-
TsAggregation.VarS => "VAR.S",
22-
TsAggregation.Twa => "TWA",
10+
TsAggregation.Avg => "avg",
11+
TsAggregation.Sum => "sum",
12+
TsAggregation.Min => "min",
13+
TsAggregation.Max => "max",
14+
TsAggregation.Range => "range",
15+
TsAggregation.Count => "count",
16+
TsAggregation.First => "first",
17+
TsAggregation.Last => "last",
18+
TsAggregation.StdP => "std.p",
19+
TsAggregation.StdS => "std.s",
20+
TsAggregation.VarP => "var.p",
21+
TsAggregation.VarS => "var.s",
22+
TsAggregation.Twa => "twa",
2323
_ => throw new ArgumentOutOfRangeException(nameof(aggregation), "Invalid aggregation type"),
2424
};
2525

2626
public static TsAggregation AsAggregation(string aggregation) => aggregation switch
2727
{
28+
"avg" => TsAggregation.Avg,
29+
"sum" => TsAggregation.Sum,
30+
"min" => TsAggregation.Min,
31+
"max" => TsAggregation.Max,
32+
"range" => TsAggregation.Range,
33+
"count" => TsAggregation.Count,
34+
"first" => TsAggregation.First,
35+
"last" => TsAggregation.Last,
36+
"std.p" => TsAggregation.StdP,
37+
"std.s" => TsAggregation.StdS,
38+
"var.p" => TsAggregation.VarP,
39+
"var.s" => TsAggregation.VarS,
40+
"twa" => TsAggregation.Twa,
2841
"AVG" => TsAggregation.Avg,
2942
"SUM" => TsAggregation.Sum,
3043
"MIN" => TsAggregation.Min,

src/NRedisStack/TimeSeries/Extensions/BucketTimestampsExtensions.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@ internal static class TsBucketTimestampsExtensions
77
{
88
public static string AsArg(this TsBucketTimestamps bt) => bt switch
99
{
10-
TsBucketTimestamps.low => "low",
11-
TsBucketTimestamps.mid => "mid",
12-
TsBucketTimestamps.high => "high",
10+
TsBucketTimestamps.low => "-",
11+
TsBucketTimestamps.mid => "~",
12+
TsBucketTimestamps.high => "+",
1313
_ => throw new ArgumentOutOfRangeException(nameof(bt), "Invalid TsBucketTimestamps type"),
1414
};
1515

1616
public static TsBucketTimestamps Asbt(string bt) => bt switch
1717
{
18-
"low" => TsBucketTimestamps.low,
19-
"mid" => TsBucketTimestamps.mid,
20-
"high" => TsBucketTimestamps.high,
18+
"-" => TsBucketTimestamps.low,
19+
"~" => TsBucketTimestamps.mid,
20+
"+" => TsBucketTimestamps.high,
2121
_ => throw new ArgumentOutOfRangeException(nameof(bt), $"Invalid TsBucketTimestamps type '{bt}'"),
2222
};
2323
}

tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRange.cs

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,5 +176,91 @@ public void TestAlignTimestamp()
176176
Assert.Equal(2, db.TS().Range("ts2", "-", "+", aggregation: TsAggregation.Count, timeBucket: 10).Count);
177177
Assert.Equal(1, db.TS().Range("ts3", "-", "+", aggregation: TsAggregation.Count, timeBucket: 10).Count);
178178
}
179+
180+
[Fact]
181+
public void TestBucketTimestamp()
182+
{
183+
IDatabase db = redisFixture.Redis.GetDatabase();
184+
db.Execute("FLUSHALL");
185+
186+
db.TS().Create("t1");
187+
188+
db.TS().Add("t1",15,1);
189+
db.TS().Add("t1",17,4);
190+
db.TS().Add("t1",51,3);
191+
db.TS().Add("t1",73,5);
192+
db.TS().Add("t1",75,3);
193+
194+
var range = db.TS().Range("t1", 0, 100,
195+
align: 0,
196+
aggregation: TsAggregation.Max,
197+
timeBucket: 10);
198+
199+
var expected = new List<TimeSeriesTuple>();
200+
expected.Add(new TimeSeriesTuple(10, 4.0));
201+
expected.Add(new TimeSeriesTuple(50, 3.0));
202+
expected.Add(new TimeSeriesTuple(70, 5.0));
203+
Assert.Equal(range, expected);
204+
205+
range = db.TS().Range("t1", 0, 100,
206+
align: 0,
207+
aggregation: TsAggregation.Max,
208+
timeBucket: 10,
209+
bt: TsBucketTimestamps.high);
210+
211+
expected.Clear();
212+
expected.Add(new TimeSeriesTuple(20, 4.0));
213+
expected.Add(new TimeSeriesTuple(60, 3.0));
214+
expected.Add(new TimeSeriesTuple(80, 5.0));
215+
Assert.Equal(range, expected);
216+
}
217+
218+
[Fact]
219+
public void TestEmpty()
220+
{
221+
IDatabase db = redisFixture.Redis.GetDatabase();
222+
db.Execute("FLUSHALL");
223+
224+
db.TS().Create("t1");
225+
226+
db.TS().Add("t1",15,1);
227+
db.TS().Add("t1",17,4);
228+
db.TS().Add("t1",51,3);
229+
db.TS().Add("t1",73,5);
230+
db.TS().Add("t1",75,3);
231+
232+
var range = db.TS().Range("t1", 0, 100,
233+
align: 0,
234+
aggregation: TsAggregation.Max,
235+
timeBucket: 10);
236+
237+
var expected = new List<TimeSeriesTuple>();
238+
expected.Add(new TimeSeriesTuple(10, 4.0));
239+
expected.Add(new TimeSeriesTuple(50, 3.0));
240+
expected.Add(new TimeSeriesTuple(70, 5.0));
241+
Assert.Equal(range, expected);
242+
243+
range = db.TS().Range("t1", 0, 100,
244+
align: 0,
245+
aggregation: TsAggregation.Max,
246+
timeBucket: 10,
247+
empty: true);
248+
249+
expected.Clear();
250+
251+
expected.Add(new TimeSeriesTuple(10, 4.0));
252+
expected.Add(new TimeSeriesTuple(20, double.NaN));
253+
expected.Add(new TimeSeriesTuple(30, double.NaN));
254+
expected.Add(new TimeSeriesTuple(40, double.NaN));
255+
expected.Add(new TimeSeriesTuple(50, 3.0));
256+
expected.Add(new TimeSeriesTuple(60, double.NaN));
257+
expected.Add(new TimeSeriesTuple(70, 5.0));
258+
259+
for (int i = 0 ; i < range.Count() ; i++)
260+
{
261+
Assert.Equal(range[i].Time.Value, expected[i].Time.Value);
262+
Assert.Equal(range[i].Val, expected[i].Val);
263+
}
264+
}
179265
}
180266
}

tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRangeAsync.cs

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,5 +176,91 @@ public async Task TestAlignTimestampAsync()
176176
Assert.Equal(2, (await db.TS().RangeAsync("ts2", "-", "+", aggregation: TsAggregation.Count, timeBucket: 10)).Count);
177177
Assert.Equal(1, (await db.TS().RangeAsync("ts3", "-", "+", aggregation: TsAggregation.Count, timeBucket: 10)).Count);
178178
}
179+
180+
[Fact]
181+
public async Task TestBucketTimestampAsync()
182+
{
183+
IDatabase db = redisFixture.Redis.GetDatabase();
184+
db.Execute("FLUSHALL");
185+
186+
db.TS().Create("t1");
187+
188+
db.TS().Add("t1",15,1);
189+
db.TS().Add("t1",17,4);
190+
db.TS().Add("t1",51,3);
191+
db.TS().Add("t1",73,5);
192+
db.TS().Add("t1",75,3);
193+
194+
var range = await db.TS().RangeAsync("t1", 0, 100,
195+
align: 0,
196+
aggregation: TsAggregation.Max,
197+
timeBucket: 10);
198+
199+
var expected = new List<TimeSeriesTuple>();
200+
expected.Add(new TimeSeriesTuple(10, 4.0));
201+
expected.Add(new TimeSeriesTuple(50, 3.0));
202+
expected.Add(new TimeSeriesTuple(70, 5.0));
203+
Assert.Equal(range, expected);
204+
205+
range = await db.TS().RangeAsync("t1", 0, 100,
206+
align: 0,
207+
aggregation: TsAggregation.Max,
208+
timeBucket: 10,
209+
bt: TsBucketTimestamps.high);
210+
211+
expected.Clear();
212+
expected.Add(new TimeSeriesTuple(20, 4.0));
213+
expected.Add(new TimeSeriesTuple(60, 3.0));
214+
expected.Add(new TimeSeriesTuple(80, 5.0));
215+
Assert.Equal(range, expected);
216+
}
217+
218+
[Fact]
219+
public async Task TestEmptyAsync()
220+
{
221+
IDatabase db = redisFixture.Redis.GetDatabase();
222+
db.Execute("FLUSHALL");
223+
224+
db.TS().Create("t1");
225+
226+
db.TS().Add("t1",15,1);
227+
db.TS().Add("t1",17,4);
228+
db.TS().Add("t1",51,3);
229+
db.TS().Add("t1",73,5);
230+
db.TS().Add("t1",75,3);
231+
232+
var range = await db.TS().RangeAsync("t1", 0, 100,
233+
align: 0,
234+
aggregation: TsAggregation.Max,
235+
timeBucket: 10);
236+
237+
var expected = new List<TimeSeriesTuple>();
238+
expected.Add(new TimeSeriesTuple(10, 4.0));
239+
expected.Add(new TimeSeriesTuple(50, 3.0));
240+
expected.Add(new TimeSeriesTuple(70, 5.0));
241+
Assert.Equal(range, expected);
242+
243+
range = await db.TS().RangeAsync("t1", 0, 100,
244+
align: 0,
245+
aggregation: TsAggregation.Max,
246+
timeBucket: 10,
247+
empty: true);
248+
249+
expected.Clear();
250+
251+
expected.Add(new TimeSeriesTuple(10, 4.0));
252+
expected.Add(new TimeSeriesTuple(20, double.NaN));
253+
expected.Add(new TimeSeriesTuple(30, double.NaN));
254+
expected.Add(new TimeSeriesTuple(40, double.NaN));
255+
expected.Add(new TimeSeriesTuple(50, 3.0));
256+
expected.Add(new TimeSeriesTuple(60, double.NaN));
257+
expected.Add(new TimeSeriesTuple(70, 5.0));
258+
259+
for (int i = 0 ; i < range.Count() ; i++)
260+
{
261+
Assert.Equal(range[i].Time.Value, expected[i].Time.Value);
262+
Assert.Equal(range[i].Val, expected[i].Val);
263+
}
264+
}
179265
}
180266
}

tests/NRedisStack.Tests/TimeSeries/TestDataTypes/TestTimeSeriesRule.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public void TestRuleHashCode()
5555
public void TestRuleToString()
5656
{
5757
TimeSeriesRule rule = new TimeSeriesRule("key", 50, TsAggregation.Avg);
58-
Assert.Equal("DestinationKey: key, TimeBucket: 50, Aggregation: AVG", (string)rule);
58+
Assert.Equal("DestinationKey: key, TimeBucket: 50, Aggregation: avg", (string)rule);
5959
}
6060
}
6161
}

0 commit comments

Comments
 (0)