Skip to content

Commit e9bff48

Browse files
author
Andrew Ochsner
committed
Fixes #1300
1 parent 3b0361f commit e9bff48

File tree

2 files changed

+105
-33
lines changed

2 files changed

+105
-33
lines changed

src/Elasticsearch.Net/Extensions/StringExtensions.cs

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Specialized;
1+
using System;
2+
using System.Collections.Specialized;
23

34
namespace Elasticsearch.Net
45
{
@@ -25,6 +26,36 @@ internal static NameValueCollection ToNameValueCollection(this string queryStrin
2526

2627
return queryParameters;
2728
}
28-
29+
internal static TimeSpan? ToTimeSpan(this string s)
30+
{
31+
if (s.IsNullOrEmpty())
32+
return null;
33+
long wholeNumber;
34+
if (long.TryParse(s, out wholeNumber))
35+
{
36+
return TimeSpan.FromMilliseconds(wholeNumber);
37+
}
38+
double decimalNumber;
39+
var unit = s.Substring(s.Length - 1);
40+
if (s.Length <= 1 || !double.TryParse(s.Substring(0, s.Length - 1), out decimalNumber))
41+
{
42+
return null;
43+
}
44+
switch (unit)
45+
{
46+
case "s":
47+
return TimeSpan.FromSeconds(decimalNumber);
48+
case "m":
49+
return TimeSpan.FromMinutes(decimalNumber);
50+
case "h":
51+
return TimeSpan.FromHours(decimalNumber);
52+
case "d":
53+
return TimeSpan.FromDays(decimalNumber);
54+
case "w":
55+
return TimeSpan.FromDays(decimalNumber * 7);
56+
default:
57+
return null;
58+
}
59+
}
2960
}
3061
}

src/Tests/Nest.Tests.Unit/Extensions/StringExtensionsTests.cs

Lines changed: 72 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,76 @@
33

44
namespace Nest.Tests.Unit.Extensions
55
{
6-
[TestFixture]
7-
public class StringExtensionsTests
8-
{
9-
[Test]
10-
public void CanConvertQueryStringToNameValueCollectionWithQuestionMark()
11-
{
12-
// Arrange
13-
var queryString = "?test1=one&test2=two";
14-
15-
// Act
16-
var queryCollection = queryString.ToNameValueCollection();
17-
18-
// Assert
19-
Assert.IsTrue(queryCollection["test1"] == "one");
20-
Assert.IsTrue(queryCollection["test2"] == "two");
21-
}
22-
23-
[Test]
24-
public void CanConvertQueryStringToNameValueCollectionWithoutQuestionMark()
25-
{
26-
// Arrange
27-
var queryString = "test1=testone&test2=testtwo";
28-
29-
// Act
30-
var queryCollection = queryString.ToNameValueCollection();
31-
32-
// Assert
33-
Assert.IsTrue(queryCollection["test1"] == "testone");
34-
Assert.IsTrue(queryCollection["test2"] == "testtwo");
35-
}
36-
}
6+
[TestFixture]
7+
public class StringExtensionsTests
8+
{
9+
[Test]
10+
public void CanConvertQueryStringToNameValueCollectionWithQuestionMark()
11+
{
12+
// Arrange
13+
var queryString = "?test1=one&test2=two";
14+
15+
// Act
16+
var queryCollection = queryString.ToNameValueCollection();
17+
18+
// Assert
19+
Assert.IsTrue(queryCollection["test1"] == "one");
20+
Assert.IsTrue(queryCollection["test2"] == "two");
21+
}
22+
23+
[Test]
24+
public void CanConvertQueryStringToNameValueCollectionWithoutQuestionMark()
25+
{
26+
// Arrange
27+
var queryString = "test1=testone&test2=testtwo";
28+
29+
// Act
30+
var queryCollection = queryString.ToNameValueCollection();
31+
32+
// Assert
33+
Assert.IsTrue(queryCollection["test1"] == "testone");
34+
Assert.IsTrue(queryCollection["test2"] == "testtwo");
35+
}
36+
37+
private const int s = 1000;
38+
private const int m = 60 * s;
39+
private const int h = 60 * m;
40+
private const int d = 24 * h;
41+
private const int w = 7 * d;
42+
43+
/// <summary />
44+
[TestCase("0s", 0)]
45+
[TestCase("1s", 1 * s)]
46+
[TestCase("-1s", -1 * s)]
47+
[TestCase("1.5s", 1.5 * s)]
48+
[TestCase("90s", 90 * s)]
49+
[TestCase("1m", 1 * m)]
50+
[TestCase("1h", 1 * h)]
51+
[TestCase("1d", 1 * d)]
52+
[TestCase("1w", 1 * w)]
53+
[TestCase("0", 0)]
54+
[TestCase("1", 1)]
55+
public void ParseElasticSearchTimeUnit_Success(string value, double timeInMillis)
56+
{
57+
// act
58+
Assert.That(value.ToTimeSpan().Value.TotalMilliseconds, Is.EqualTo(timeInMillis));
59+
}
60+
61+
[TestCase(null)]
62+
[TestCase("")]
63+
[TestCase(" ")]
64+
[TestCase("1.5")]
65+
[TestCase("2s2")]
66+
[TestCase("2ss")]
67+
[TestCase("4m2s")]
68+
[TestCase("2M")]
69+
[TestCase("2y")]
70+
[TestCase("s")]
71+
public void ParseElasticSearchTimeUnit_Fail_ReturnsNull(string value)
72+
{
73+
// act
74+
Assert.That(value.ToTimeSpan(), Is.Null);
75+
}
76+
77+
}
3778
}

0 commit comments

Comments
 (0)