Skip to content

Commit 1e70b2f

Browse files
Use ValueTasks instead of Tasks (#81)
* Use ValueTask to go Faster. * More ValueTasks, more Fast. * Fix build. * Revert "Auxiliary commit to revert individual files from c9f13c9" This reverts commit 784c94d4c41e44a50b43c466758eedf2106aba80.
1 parent 1b87fab commit 1e70b2f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+296
-318
lines changed

Core.Arango.Tests/LinqTest_BasicOperations.cs

+9-16
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Diagnostics.CodeAnalysis;
4-
using System.Globalization;
53
using System.Linq;
64
using System.Threading.Tasks;
75
using Core.Arango.Protocol;
@@ -46,14 +44,9 @@ class InnerChain
4644
public string F { get; set; }
4745
}
4846

49-
public class LinqTest_BasicOperations : TestBase
47+
public class LinqTest_BasicOperations(ITestOutputHelper output) : TestBase
5048
{
5149
private const string D = "test";
52-
private readonly ITestOutputHelper _output;
53-
public LinqTest_BasicOperations(ITestOutputHelper output)
54-
{
55-
_output = output;
56-
}
5750

5851
[Fact]
5952
public void Any()
@@ -81,7 +74,7 @@ public async Task GroupBy()
8174

8275
var result = await q.ToListAsync();
8376

84-
_output.WriteLine(q.ToAql().aql);
77+
output.WriteLine(q.ToAql().aql);
8578
}
8679

8780
/*[Fact]
@@ -192,7 +185,7 @@ public async Task Count_In_Filter()
192185
var q = Arango.Query<Activity>("test")
193186
.Where(x => x.Notes.Count() == 3);
194187

195-
_output.WriteLine(q.ToAql().aql);
188+
output.WriteLine(q.ToAql().aql);
196189

197190
var activities = await q.ToListAsync();
198191

@@ -205,7 +198,7 @@ public async Task Count_In_Select()
205198
var q = Arango.Query<Activity>("test")
206199
.Select(x => x.Notes.Count());
207200

208-
_output.WriteLine(q.ToAql().aql);
201+
output.WriteLine(q.ToAql().aql);
209202

210203
var activitiesNotesCount = await q.ToListAsync();
211204

@@ -227,7 +220,7 @@ public async Task Contains()
227220
{
228221
var p = await Arango.Query<Activity>("test").FirstOrDefaultAsync();
229222

230-
_output.WriteLine(JsonConvert.SerializeObject(p));
223+
output.WriteLine(JsonConvert.SerializeObject(p));
231224

232225
var boolean = Arango.Query<Activity>("test").Contains(p); // This should work: does `p` not get serialized the same way is it gets de-serialized? This operations should be inverse of each other.
233226

@@ -283,7 +276,7 @@ public async Task Except_Compare_Keys()
283276
.Select(x => x.Key)
284277
.Except(list);
285278

286-
PrintQuery(q, _output);
279+
PrintQuery(q, output);
287280

288281
var p = await q.ToListAsync();
289282

@@ -298,7 +291,7 @@ public async Task Combine_Skip_Take()
298291
.Take(1)
299292
.Select(x => x.Key);
300293

301-
PrintQuery(q, _output);
294+
PrintQuery(q, output);
302295

303296
var p = await q.ToListAsync();
304297

@@ -357,8 +350,8 @@ public async Task Union()
357350

358351
var aql = q.ToAql();
359352

360-
_output.WriteLine(aql.aql);
361-
_output.WriteLine(JsonConvert.SerializeObject(aql.bindVars));
353+
output.WriteLine(aql.aql);
354+
output.WriteLine(JsonConvert.SerializeObject(aql.bindVars));
362355

363356
var p = await q.ToListAsync();
364357

Core.Arango.Tests/LinqTest_String.cs

+5-13
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,18 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Diagnostics.CodeAnalysis;
4-
using System.Globalization;
53
using System.Linq;
64
using System.Threading.Tasks;
75
using Core.Arango.Protocol;
86
using Core.Arango.Linq;
97
using Core.Arango.Tests.Core;
10-
using Newtonsoft.Json;
118
using Xunit;
129
using Xunit.Abstractions;
1310

1411
namespace Core.Arango.Tests
1512
{
16-
public class LinqTest_String : TestBase
13+
public class LinqTest_String(ITestOutputHelper output) : TestBase
1714
{
1815
private const string D = "test";
19-
private readonly ITestOutputHelper _output;
20-
public LinqTest_String(ITestOutputHelper output)
21-
{
22-
_output = output;
23-
}
2416

2517
[Fact]
2618
public async Task StringConcat()
@@ -201,8 +193,8 @@ public async Task StringSubstring()
201193
Assert.Equal("Project A", p1.Name);
202194
Assert.Equal("Project A", p2.Name);
203195

204-
_output.WriteLine(q1.ToAql().aql);
205-
_output.WriteLine(q2.ToAql().aql);
196+
output.WriteLine(q1.ToAql().aql);
197+
output.WriteLine(q2.ToAql().aql);
206198
}
207199

208200
[Fact]
@@ -212,7 +204,7 @@ public async Task StringToLower()
212204
var p = await q.FirstOrDefaultAsync();
213205

214206
Assert.Equal("Project A", p.Name);
215-
_output.WriteLine(q.ToAql().aql);
207+
output.WriteLine(q.ToAql().aql);
216208
}
217209

218210
[Fact]
@@ -222,7 +214,7 @@ public async Task StringToUpper()
222214
var p = await q.FirstOrDefaultAsync();
223215

224216
Assert.Equal("Project A", p.Name);
225-
_output.WriteLine(q.ToAql().aql);
217+
output.WriteLine(q.ToAql().aql);
226218
}
227219

228220
public override async Task InitializeAsync()

Core.Arango.Tests/QueryStatisticTest.cs

+2-9
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,8 @@
99

1010
namespace Core.Arango.Tests
1111
{
12-
public class QueryStatisticTest : TestBase
12+
public class QueryStatisticTest(ITestOutputHelper output) : TestBase
1313
{
14-
private readonly ITestOutputHelper _output;
15-
16-
public QueryStatisticTest(ITestOutputHelper output)
17-
{
18-
_output = output;
19-
}
20-
2114
public override async Task InitializeAsync()
2215
{
2316
Arango =
@@ -31,7 +24,7 @@ public override async Task InitializeAsync()
3124
foreach (var p in bindVars.OrderByDescending(x => x.Key.Length))
3225
boundQuery = boundQuery.Replace("@" + p.Key, JsonConvert.SerializeObject(p.Value));
3326

34-
_output.WriteLine(
27+
output.WriteLine(
3528
$"{boundQuery}\n{JsonConvert.SerializeObject(stats, Formatting.Indented)}");
3629
}
3730
});

Core.Arango.Tests/TransactionTest.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public async Task StreamTransactionQuery(string serializer)
110110
Assert.Equal(3, (await Arango.Query.FindAsync<Entity>("test", "test", $"true")).Count);
111111

112112
var exception =
113-
await Assert.ThrowsAsync<ArangoException>(() => Arango.Query.FindAsync<Entity>(t2, "test", $"true"));
113+
await Assert.ThrowsAsync<ArangoException>(() => Arango.Query.FindAsync<Entity>(t2, "test", $"true").AsTask());
114114

115115
Assert.NotNull(exception.ErrorNumber);
116116
Assert.NotNull(exception.Code);

Core.Arango/ArangoContext.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public ArangoContext(string cs, IArangoConfiguration settings = null)
110110
public IArangoPregelModule Pregel { get; }
111111

112112
/// <inheritdoc />
113-
public async Task<ArangoVersion> GetVersionAsync(CancellationToken cancellationToken = default)
113+
public async ValueTask<ArangoVersion> GetVersionAsync(CancellationToken cancellationToken = default)
114114
{
115115
var res = await Configuration.Transport.SendAsync<ArangoVersion>(HttpMethod.Get,
116116
"/_db/_system/_api/version",
@@ -123,7 +123,7 @@ public async Task<ArangoVersion> GetVersionAsync(CancellationToken cancellationT
123123
}
124124

125125
/// <inheritdoc />
126-
public async Task<IReadOnlyCollection<string>> GetEndpointsAsync(CancellationToken cancellationToken = default)
126+
public async ValueTask<IReadOnlyCollection<string>> GetEndpointsAsync(CancellationToken cancellationToken = default)
127127
{
128128
var res = await Configuration.Transport.SendAsync<EndpointResponse>(HttpMethod.Get,
129129
"/_api/cluster/endpoints", cancellationToken: cancellationToken);

Core.Arango/IArangoContext.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,11 @@ public interface IArangoContext
9090
/// <summary>
9191
/// Get Arango server version and license
9292
/// </summary>
93-
Task<ArangoVersion> GetVersionAsync(CancellationToken cancellationToken = default);
93+
ValueTask<ArangoVersion> GetVersionAsync(CancellationToken cancellationToken = default);
9494

9595
/// <summary>
9696
/// Get Arango cluster endpoints
9797
/// </summary>
98-
Task<IReadOnlyCollection<string>> GetEndpointsAsync(CancellationToken cancellationToken = default);
98+
ValueTask<IReadOnlyCollection<string>> GetEndpointsAsync(CancellationToken cancellationToken = default);
9999
}
100100
}

Core.Arango/Linq/ArangoQueryExtensions.cs

+11-11
Original file line numberDiff line numberDiff line change
@@ -51,29 +51,29 @@ public static (string aql, IDictionary<string, object> bindVars) ToAql<T>(this I
5151
return (data.Query.Trim(), data.BindVars);
5252
}
5353

54-
public static Task<TSource> FirstAsync<TSource>(this IQueryable<TSource> source, CancellationToken cancellationToken = default)
54+
public static ValueTask<TSource> FirstAsync<TSource>(this IQueryable<TSource> source, CancellationToken cancellationToken = default)
5555
{
5656
return FirstOrDefaultAsync(source, false, null, cancellationToken);
5757
}
5858

59-
public static Task<TSource> FirstAsync<TSource>(this IQueryable<TSource> source,
59+
public static ValueTask<TSource> FirstAsync<TSource>(this IQueryable<TSource> source,
6060
Expression<Func<TSource, bool>> predicate, CancellationToken cancellationToken = default)
6161
{
6262
return FirstOrDefaultAsync(source, false, predicate, cancellationToken);
6363
}
6464

65-
public static Task<TSource> FirstOrDefaultAsync<TSource>(this IQueryable<TSource> source, CancellationToken cancellationToken = default)
65+
public static ValueTask<TSource> FirstOrDefaultAsync<TSource>(this IQueryable<TSource> source, CancellationToken cancellationToken = default)
6666
{
6767
return FirstOrDefaultAsync(source, true, null, cancellationToken);
6868
}
6969

70-
public static Task<TSource> FirstOrDefaultAsync<TSource>(this IQueryable<TSource> source,
70+
public static ValueTask<TSource> FirstOrDefaultAsync<TSource>(this IQueryable<TSource> source,
7171
Expression<Func<TSource, bool>> predicate, CancellationToken cancellationToken = default)
7272
{
7373
return FirstOrDefaultAsync(source, true, predicate, cancellationToken);
7474
}
7575

76-
private static Task<T> FirstOrDefaultAsync<T>(this IQueryable<T> source, bool returnDefaultWhenEmpty,
76+
private static ValueTask<T> FirstOrDefaultAsync<T>(this IQueryable<T> source, bool returnDefaultWhenEmpty,
7777
Expression<Func<T, bool>> predicate, CancellationToken cancellationToken = default)
7878
{
7979
if (predicate != null)
@@ -85,29 +85,29 @@ private static Task<T> FirstOrDefaultAsync<T>(this IQueryable<T> source, bool re
8585
: source.AsArangoQueryable().FirstAsync(cancellationToken);
8686
}
8787

88-
public static Task<TSource> SingleAsync<TSource>(this IQueryable<TSource> source, CancellationToken cancellationToken = default)
88+
public static ValueTask<TSource> SingleAsync<TSource>(this IQueryable<TSource> source, CancellationToken cancellationToken = default)
8989
{
9090
return SingleOrDefaultAsync(source, false, null, cancellationToken);
9191
}
9292

93-
public static Task<TSource> SingleAsync<TSource>(this IQueryable<TSource> source,
93+
public static ValueTask<TSource> SingleAsync<TSource>(this IQueryable<TSource> source,
9494
Expression<Func<TSource, bool>> predicate, CancellationToken cancellationToken = default)
9595
{
9696
return SingleOrDefaultAsync(source, false, predicate, cancellationToken);
9797
}
9898

99-
public static Task<TSource> SingleOrDefaultAsync<TSource>(this IQueryable<TSource> source, CancellationToken cancellationToken = default)
99+
public static ValueTask<TSource> SingleOrDefaultAsync<TSource>(this IQueryable<TSource> source, CancellationToken cancellationToken = default)
100100
{
101101
return SingleOrDefaultAsync(source, true, null, cancellationToken);
102102
}
103103

104-
public static Task<TSource> SingleOrDefaultAsync<TSource>(this IQueryable<TSource> source,
104+
public static ValueTask<TSource> SingleOrDefaultAsync<TSource>(this IQueryable<TSource> source,
105105
Expression<Func<TSource, bool>> predicate, CancellationToken cancellationToken = default)
106106
{
107107
return SingleOrDefaultAsync(source, true, predicate, cancellationToken);
108108
}
109109

110-
private static Task<T> SingleOrDefaultAsync<T>(this IQueryable<T> source, bool returnDefaultWhenEmpty,
110+
private static ValueTask<T> SingleOrDefaultAsync<T>(this IQueryable<T> source, bool returnDefaultWhenEmpty,
111111
Expression<Func<T, bool>> predicate, CancellationToken cancellationToken = default)
112112
{
113113
if (predicate != null)
@@ -119,7 +119,7 @@ private static Task<T> SingleOrDefaultAsync<T>(this IQueryable<T> source, bool r
119119
: source.AsArangoQueryable().SingleAsync(cancellationToken);
120120
}
121121

122-
public static Task<List<T>> ToListAsync<T>(this IQueryable<T> source, CancellationToken cancellationToken = default)
122+
public static ValueTask<List<T>> ToListAsync<T>(this IQueryable<T> source, CancellationToken cancellationToken = default)
123123
{
124124
return source.AsArangoQueryable().ToListAsync(cancellationToken);
125125
}

Core.Arango/Linq/Interface/IArangoLinq.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ internal interface IArangoLinq
1111
public string ResolvePropertyName(Type t, string s);
1212
public string ResolveCollectionName(Type t);
1313
public IAsyncEnumerable<T> StreamAsync<T>(string query, IDictionary<string, object> bindVars, CancellationToken cancellationToken = default);
14-
public Task<ArangoList<T>> ExecuteAsync<T>(string query, IDictionary<string, object> bindVars, CancellationToken cancellationToken = default);
14+
public ValueTask<ArangoList<T>> ExecuteAsync<T>(string query, IDictionary<string, object> bindVars, CancellationToken cancellationToken = default);
1515
}
1616
}

Core.Arango/Linq/Internal/ArangoLinq.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public IAsyncEnumerable<T> StreamAsync<T>(string query, IDictionary<string, obje
3434
return _context.Query.ExecuteStreamAsync<T>(_handle, query, bindVars, cancellationToken: cancellationToken);
3535
}
3636

37-
public async Task<ArangoList<T>> ExecuteAsync<T>(string query, IDictionary<string, object> bindVars, CancellationToken cancellationToken = default)
37+
public async ValueTask<ArangoList<T>> ExecuteAsync<T>(string query, IDictionary<string, object> bindVars, CancellationToken cancellationToken = default)
3838
{
3939
return await _context.Query.ExecuteAsync<T>(_handle, query, bindVars, cancellationToken: cancellationToken).ConfigureAwait(false);
4040
}

Core.Arango/Linq/Query/ArangoQueryable.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -29,34 +29,34 @@ public ArangoQueryable(IQueryProvider provider, Expression expression, IArangoLi
2929
this.db = db;
3030
}
3131

32-
public async Task<List<T>> ToListAsync(CancellationToken cancellationToken = default)
32+
public async ValueTask<List<T>> ToListAsync(CancellationToken cancellationToken = default)
3333
{
3434
var data = GetQueryData();
3535
return await db.ExecuteAsync<T>(data.Query, data.BindVars, cancellationToken).ConfigureAwait(false);
3636
}
3737

38-
public async Task<T> SingleOrDefaultAsync(CancellationToken cancellationToken = default)
38+
public async ValueTask<T> SingleOrDefaultAsync(CancellationToken cancellationToken = default)
3939
{
4040
var data = GetQueryData();
4141
var list = await db.ExecuteAsync<T>(data.Query, data.BindVars, cancellationToken).ConfigureAwait(false);
4242
return list.SingleOrDefault();
4343
}
4444

45-
public async Task<T> SingleAsync(CancellationToken cancellationToken = default)
45+
public async ValueTask<T> SingleAsync(CancellationToken cancellationToken = default)
4646
{
4747
var data = GetQueryData();
4848
var list = await db.ExecuteAsync<T>(data.Query, data.BindVars, cancellationToken).ConfigureAwait(false);
4949
return list.Single();
5050
}
5151

52-
public async Task<T> FirstOrDefaultAsync(CancellationToken cancellationToken = default)
52+
public async ValueTask<T> FirstOrDefaultAsync(CancellationToken cancellationToken = default)
5353
{
5454
var data = GetQueryData();
5555
var list = await db.ExecuteAsync<T>(data.Query, data.BindVars, cancellationToken).ConfigureAwait(false);
5656
return list.FirstOrDefault();
5757
}
5858

59-
public async Task<T> FirstAsync(CancellationToken cancellationToken = default)
59+
public async ValueTask<T> FirstAsync(CancellationToken cancellationToken = default)
6060
{
6161
var data = GetQueryData();
6262
var list = await db.ExecuteAsync<T>(data.Query, data.BindVars, cancellationToken).ConfigureAwait(false);

Core.Arango/Modules/IArangoAnalyzerModule.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public interface IArangoAnalyzerModule
1313
/// <summary>
1414
/// creates a new Analyzer based on the provided definition
1515
/// </summary>
16-
Task CreateAsync(ArangoHandle database, ArangoAnalyzer analyzer, CancellationToken cancellationToken = default);
16+
ValueTask CreateAsync(ArangoHandle database, ArangoAnalyzer analyzer, CancellationToken cancellationToken = default);
1717

1818
/// <summary>
1919
/// removes an Analyzer configuration
@@ -22,19 +22,19 @@ public interface IArangoAnalyzerModule
2222
/// <param name="analyzer">The name of the Analyzer to remove.</param>
2323
/// <param name="force">The Analyzer configuration should be removed even if it is in-use. The default value is false.</param>
2424
/// <param name="cancellationToken"></param>
25-
Task DeleteAsync(ArangoHandle database, string analyzer, bool force = false,
25+
ValueTask DeleteAsync(ArangoHandle database, string analyzer, bool force = false,
2626
CancellationToken cancellationToken = default);
2727

2828
/// <summary>
2929
/// returns a listing of available Analyzer definitions
3030
/// </summary>
31-
Task<IReadOnlyCollection<ArangoAnalyzer>> ListAsync(ArangoHandle database,
31+
ValueTask<IReadOnlyCollection<ArangoAnalyzer>> ListAsync(ArangoHandle database,
3232
CancellationToken cancellationToken = default);
3333

3434
/// <summary>
3535
/// returns an Analyzer definition
3636
/// </summary>
37-
Task<ArangoAnalyzer> GetDefinitionAsync(ArangoHandle database, string analyzer,
37+
ValueTask<ArangoAnalyzer> GetDefinitionAsync(ArangoHandle database, string analyzer,
3838
CancellationToken cancellationToken = default);
3939
}
4040
}

0 commit comments

Comments
 (0)