Skip to content

Commit fd32096

Browse files
committed
Fixed STJ issue with KeyedBucket serialization
1 parent 1c1cdc3 commit fd32096

File tree

5 files changed

+74
-35
lines changed

5 files changed

+74
-35
lines changed

src/Foundatio.Repositories/Extensions/FindResultsExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ public static string GetAsyncQueryId(this IHaveData results)
1010
}
1111

1212
/// <summary>
13-
/// Whether or not the query completed successfully or was interupted (will also be true while the query is still running)
13+
/// Whether the query completed successfully or was interrupted (will also be true while the query is still running)
1414
/// </summary>
1515
public static bool IsAsyncQueryPartial(this IHaveData results)
1616
{
1717
return results.Data.GetBoolean(AsyncQueryDataKeys.IsPartial, false);
1818
}
1919

2020
/// <summary>
21-
/// Whether or not the query is still running
21+
/// Whether the query is still running
2222
/// </summary>
2323
public static bool IsAsyncQueryRunning(this IHaveData results)
2424
{

src/Foundatio.Repositories/Models/Aggregations/DateHistogramBucket.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ namespace Foundatio.Repositories.Models;
77
[DebuggerDisplay("Date: {Date}: Ticks: {Key}")]
88
public class DateHistogramBucket : KeyedBucket<double>
99
{
10-
public DateHistogramBucket() { }
10+
public DateHistogramBucket()
11+
{
12+
}
1113

1214
[System.Text.Json.Serialization.JsonConstructor]
1315
public DateHistogramBucket(DateTime date, IReadOnlyDictionary<string, IAggregate> aggregations) : base(aggregations)

src/Foundatio.Repositories/Models/Aggregations/KeyedBucket.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using System.Diagnostics;
34
using Foundatio.Repositories.Utility;
45

@@ -7,12 +8,16 @@ namespace Foundatio.Repositories.Models;
78
[DebuggerDisplay("KeyAsString: {KeyAsString} Key: {Key} Total: {Total}")]
89
public class KeyedBucket<T> : BucketBase
910
{
10-
public KeyedBucket() { }
11+
public KeyedBucket()
12+
{
13+
}
1114

1215
[System.Text.Json.Serialization.JsonConstructor]
13-
public KeyedBucket(IReadOnlyDictionary<string, IAggregate> aggregations) : base(aggregations) { }
16+
public KeyedBucket(IReadOnlyDictionary<string, IAggregate> aggregations) : base(aggregations)
17+
{
18+
}
1419

15-
[System.Text.Json.Serialization.JsonConverter(typeof(ObjectToInferredTypesSystemTextJsonConverter))]
20+
[System.Text.Json.Serialization.JsonConverter(typeof(ObjectToInferredTypesConverter))]
1621
public T Key { get; set; }
1722
public string KeyAsString { get; set; }
1823
public long? Total { get; set; }
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using System;
2+
using System.Text.Json;
3+
using System.Text.Json.Serialization;
4+
5+
namespace Foundatio.Repositories.Utility;
6+
7+
public class ObjectToInferredTypesConverter : JsonConverterFactory
8+
{
9+
public override bool CanConvert(Type typeToConvert) => true;
10+
11+
public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
12+
{
13+
var converterType = typeof(ObjectToInferredTypesConverterInner<>).MakeGenericType(typeToConvert);
14+
return (JsonConverter)Activator.CreateInstance(converterType);
15+
}
16+
17+
private class ObjectToInferredTypesConverterInner<T> : JsonConverter<T>
18+
{
19+
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
20+
{
21+
object result = reader.TokenType switch
22+
{
23+
JsonTokenType.Number when reader.TryGetInt64(out long l) => l,
24+
JsonTokenType.Number => reader.GetDouble(),
25+
JsonTokenType.String when reader.TryGetDateTime(out DateTime datetime) => datetime,
26+
JsonTokenType.String => reader.GetString()!,
27+
JsonTokenType.True => true,
28+
JsonTokenType.False => false,
29+
JsonTokenType.Null => null!,
30+
_ => JsonDocument.ParseValue(ref reader).RootElement.Clone()
31+
};
32+
33+
if (result == null)
34+
return default!;
35+
36+
if (result is T typedResult)
37+
return typedResult;
38+
39+
try
40+
{
41+
// Special case for JsonElement
42+
if (result is JsonElement element)
43+
{
44+
return JsonSerializer.Deserialize<T>(element.GetRawText(), options)!;
45+
}
46+
47+
return (T)Convert.ChangeType(result, typeof(T));
48+
}
49+
catch (Exception ex)
50+
{
51+
throw new JsonException($"Cannot convert {result} to type {typeof(T)}: {ex.Message}", ex);
52+
}
53+
}
54+
55+
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
56+
{
57+
JsonSerializer.Serialize(writer, value, typeof(T), options);
58+
}
59+
}
60+
}

src/Foundatio.Repositories/Utility/ObjectToInferredTypesSystemTextJsonConverter.cs

Lines changed: 0 additions & 28 deletions
This file was deleted.

0 commit comments

Comments
 (0)