Skip to content

Commit ce488b4

Browse files
authored
fix: unnecessary API call when writing collection of DataPoints (#113)
1 parent 9bca985 commit ce488b4

File tree

4 files changed

+100
-8
lines changed

4 files changed

+100
-8
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
### Features
44
1. [#97](https://github.com/influxdata/influxdb-client-csharp/pull/97): Improved WriteApi performance
55

6+
### Bug Fixes
7+
1. [#113](https://github.com/influxdata/influxdb-client-csharp/pull/113): Fixed unnecessary API call when writing collection of DataPoints
8+
69
## 1.10.0 [2020-07-17]
710

811
### Features

Client.Test/WriteApiAsyncTest.cs

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using System.Threading.Tasks;
4+
using InfluxDB.Client.Api.Domain;
5+
using InfluxDB.Client.Core.Test;
6+
using InfluxDB.Client.Writes;
7+
using NUnit.Framework;
8+
using WireMock.RequestBuilders;
9+
10+
namespace InfluxDB.Client.Test
11+
{
12+
[TestFixture]
13+
public class WriteApiAsyncTest : AbstractMockServerTest
14+
{
15+
private InfluxDBClient _influxDbClient;
16+
17+
[SetUp]
18+
public new void SetUp()
19+
{
20+
_influxDbClient = InfluxDBClientFactory.Create(MockServerUrl, "token".ToCharArray());
21+
}
22+
23+
[TearDown]
24+
public new void ResetServer()
25+
{
26+
_influxDbClient.Dispose();
27+
}
28+
29+
[Test]
30+
public async Task GroupPointsByPrecisionSame()
31+
{
32+
MockServer
33+
.Given(Request.Create().WithPath("/api/v2/write").UsingPost())
34+
.RespondWith(CreateResponse("{}"));
35+
36+
var writeApi = _influxDbClient.GetWriteApiAsync();
37+
await writeApi.WritePointsAsync("my-bucket", "my-org", new List<PointData>
38+
{
39+
PointData.Measurement("h2o").Tag("location", "coyote_creek").Field("water_level", 9.0D)
40+
.Timestamp(9L, WritePrecision.S),
41+
PointData.Measurement("h2o").Tag("location", "coyote_creek").Field("water_level", 10.0D)
42+
.Timestamp(10L, WritePrecision.S)
43+
});
44+
45+
Assert.AreEqual(1, MockServer.LogEntries.Count());
46+
47+
var request = MockServer.LogEntries.Last();
48+
Assert.AreEqual(MockServerUrl + "/api/v2/write?org=my-org&bucket=my-bucket&precision=s",
49+
request.RequestMessage.AbsoluteUrl);
50+
Assert.AreEqual("h2o,location=coyote_creek water_level=9 9\nh2o,location=coyote_creek water_level=10 10",
51+
request.RequestMessage.Body);
52+
}
53+
54+
[Test]
55+
public async Task GroupPointsByPrecisionDifferent()
56+
{
57+
MockServer
58+
.Given(Request.Create().WithPath("/api/v2/write").UsingPost())
59+
.RespondWith(CreateResponse("{}"));
60+
61+
var writeApi = _influxDbClient.GetWriteApiAsync();
62+
await writeApi.WritePointsAsync("my-bucket", "my-org", new List<PointData>
63+
{
64+
PointData.Measurement("h2o").Tag("location", "coyote_creek").Field("water_level", 9.0D)
65+
.Timestamp(9L, WritePrecision.S),
66+
PointData.Measurement("h2o").Tag("location", "coyote_creek").Field("water_level", 10.0D)
67+
.Timestamp(10L, WritePrecision.Ms)
68+
});
69+
70+
Assert.AreEqual(2, MockServer.LogEntries.Count());
71+
72+
var request = MockServer.LogEntries.ToList()[0];
73+
Assert.AreEqual(MockServerUrl + "/api/v2/write?org=my-org&bucket=my-bucket&precision=s",
74+
request.RequestMessage.AbsoluteUrl);
75+
Assert.AreEqual("h2o,location=coyote_creek water_level=9 9",
76+
request.RequestMessage.Body);
77+
78+
request = MockServer.LogEntries.ToList()[1];
79+
Assert.AreEqual(MockServerUrl + "/api/v2/write?org=my-org&bucket=my-bucket&precision=ms",
80+
request.RequestMessage.AbsoluteUrl);
81+
Assert.AreEqual("h2o,location=coyote_creek water_level=10 10",
82+
request.RequestMessage.Body);
83+
}
84+
}
85+
}

Client.Test/WriteApiTest.cs

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
using InfluxDB.Client.Core.Exceptions;
99
using InfluxDB.Client.Core.Test;
1010
using InfluxDB.Client.Writes;
11-
using Moq;
1211
using NUnit.Framework;
1312
using WireMock.RequestBuilders;
1413
using WireMock.ResponseBuilders;

Client/WriteApiAsync.cs

+12-7
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public async Task WriteRecordsAsync(string bucket, string org, WritePrecision pr
8888
Arguments.CheckNonEmptyString(org, nameof(org));
8989
Arguments.CheckNotNull(precision, nameof(precision));
9090

91-
List<BatchWriteData> list = new List<BatchWriteData>();
91+
var list = new List<BatchWriteData>();
9292

9393
foreach (var record in records)
9494
{
@@ -150,10 +150,7 @@ public async Task WritePointAsync(string bucket, string org, PointData point)
150150

151151
if (point == null) return;
152152

153-
BatchWriteData data = new BatchWritePoint(new BatchWriteOptions(bucket, org,
154-
point.Precision), _options, point);
155-
156-
await WriteData(org, bucket, point.Precision, new List<BatchWriteData>{data});
153+
await WritePointsAsync(bucket, org, new List<PointData> {point});
157154
}
158155

159156
/// <summary>
@@ -175,8 +172,16 @@ public async Task WritePointsAsync(string bucket, string org, List<PointData> po
175172
{
176173
Arguments.CheckNonEmptyString(bucket, nameof(bucket));
177174
Arguments.CheckNonEmptyString(org, nameof(org));
175+
176+
foreach (var grouped in points.GroupBy(it => it.Precision))
177+
{
178+
var options = new BatchWriteOptions(bucket, org, grouped.Key);
179+
var groupedPoints = grouped
180+
.Select(it => new BatchWritePoint(options, _options, it))
181+
.ToList();
178182

179-
foreach (var point in points) await WritePointAsync(bucket, org, point);
183+
await WriteData(org, bucket, grouped.Key, groupedPoints);
184+
}
180185
}
181186

182187
/// <summary>
@@ -262,7 +267,7 @@ public async Task WriteMeasurementsAsync<TM>(string bucket, string org, WritePre
262267
Arguments.CheckNonEmptyString(org, nameof(org));
263268
Arguments.CheckNotNull(precision, nameof(precision));
264269

265-
List<BatchWriteData> list = new List<BatchWriteData>();
270+
var list = new List<BatchWriteData>();
266271

267272
foreach (var measurement in measurements)
268273
{

0 commit comments

Comments
 (0)