Skip to content

Commit

Permalink
v8.3.0
Browse files Browse the repository at this point in the history
  • Loading branch information
Samuel Abraham committed Apr 17, 2024
1 parent dd1873f commit 82f04ee
Show file tree
Hide file tree
Showing 60 changed files with 3,347 additions and 759 deletions.
9 changes: 6 additions & 3 deletions src/TypeCache.GraphQL/Resolvers/BatchLoaderFieldResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,13 +62,16 @@ public BatchLoaderFieldResolver(MethodInfo methodInfo, Func<PARENT, MATCH> getPa

private Task<IEnumerable<CHILD>> LoadData(IResolveFieldContext context, IEnumerable<MATCH> keys)
{
var arguments = context.GetArguments<PARENT, MATCH>(this._MethodInfo, keys);
var arguments = context.GetArguments<PARENT, MATCH>(this._MethodInfo, keys).ToArray();
object? result;
if (!this._MethodInfo.IsStatic)
{
var controller = context.RequestServices!.GetRequiredService(this._MethodInfo.DeclaringType!);
arguments = [controller, ..arguments];
result = this._MethodInfo.InvokeFunc(controller, arguments);
}
var result = this._MethodInfo.InvokeMethod(arguments.ToArray());
else
result = this._MethodInfo.InvokeStaticFunc(arguments);

return result switch
{
ValueTask<IEnumerable<CHILD>> valueTask => valueTask.AsTask(),
Expand Down
3 changes: 1 addition & 2 deletions src/TypeCache.GraphQL/Resolvers/ItemLoaderFieldResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,7 @@ public ItemLoaderFieldResolver(MethodInfo methodInfo)
private Task<T> LoadData(IResolveFieldContext context)
{
var methodInfo = (MethodInfo)this._MethodHandle.ToMethodBase();
var arguments = context.GetArguments(methodInfo).ToArray();
var result = methodInfo.InvokeMethod(arguments);
var result = methodInfo.InvokeStaticFunc(context.GetArguments(methodInfo).ToArray());
return result switch
{
ValueTask<T> valueTask => valueTask.AsTask(),
Expand Down
6 changes: 4 additions & 2 deletions src/TypeCache.GraphQL/Resolvers/MethodFieldResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@ public sealed class MethodFieldResolver(MethodInfo methodInfo) : FieldResolver
context.RequestServices.AssertNotNull();

var arguments = context.GetArguments(methodInfo).ToArray();
object? result;
if (!methodInfo.IsStatic)
{
var controller = context.RequestServices.GetRequiredService(methodInfo.DeclaringType!);
arguments = [controller, ..arguments];
result = methodInfo.InvokeFunc(controller, arguments);
}
else
result = methodInfo.InvokeStaticFunc(arguments);

var result = methodInfo.InvokeMethod(arguments);
return result switch
{
ValueTask<object?> valueTask => await valueTask,
Expand Down
11 changes: 7 additions & 4 deletions src/TypeCache.GraphQL/Resolvers/MethodSourceStreamResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,15 @@ public MethodSourceStreamResolver(MethodInfo methodInfo)
{
context.RequestServices.AssertNotNull();

var controller = !this._MethodInfo.IsStatic ? context.RequestServices.GetRequiredService(this._MethodInfo.DeclaringType!) : null;
var arguments = context.GetArguments(this._MethodInfo).ToArray();
object? result;
if (!this._MethodInfo.IsStatic)
arguments = [controller, .. arguments];

var result = this._MethodInfo.InvokeMethod(arguments);
{
var controller = context.RequestServices.GetRequiredService(this._MethodInfo.DeclaringType!);
result = this._MethodInfo.InvokeFunc(controller, arguments);
}
else
result = this._MethodInfo.InvokeStaticFunc(arguments);

return result switch
{
Expand Down
2 changes: 1 addition & 1 deletion src/TypeCache.GraphQL/Resolvers/PropertyFieldResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public sealed class PropertyFieldResolver<T>(PropertyInfo propertyInfo) : FieldR
_ => context.Source
};

var value = propertyInfo.GetPropertyValue(source!);
var value = propertyInfo.GetValueEx(source!);
if (value is null)
return value ?? context.GetArgument<object>("null");

Expand Down
4 changes: 2 additions & 2 deletions src/TypeCache.GraphQL/TypeCache.GraphQL.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
<Nullable>enable</Nullable>
<RootNamespace>TypeCache.GraphQL</RootNamespace>
<PackageId>TypeCache.GraphQL</PackageId>
<Version>8.2.1</Version>
<Authors>Samuel Abraham &lt;sam987883@gmail.com&gt;</Authors>
<Version>8.3.0</Version>
<Authors>Samuel Abraham &lt;sam987883@gmail.com&gt;</Authors>
<Company>Samuel Abraham &lt;sam987883@gmail.com&gt;</Company>
<Title>TypeCache GraphQL</Title>
<Description>An easier way to add endpoints to GraphQL:
Expand Down
4 changes: 2 additions & 2 deletions src/TypeCache.GraphQL/Types/GraphQLEnumType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public override bool CanParseValue(object? value)
=> value switch
{
null => true,
T token => Enum<T>.IsValid(token),
T token => Enum<T>.IsDefined(token),
string text => Enum.TryParse<T>(text, true, out _),
_ when value.GetType() == typeof(T).GetEnumUnderlyingType() => true,
_ => false
Expand All @@ -57,7 +57,7 @@ _ when value.GetType() == typeof(T).GetEnumUnderlyingType() => true,
=> value switch
{
null => null,
T token when Enum<T>.IsValid(token) => token,
T token when Enum<T>.IsDefined(token) => token,
T token => null,
string text => Enum.Parse<T>(text, true),
_ => Enum.ToObject(typeof(T), value)
Expand Down
2 changes: 1 addition & 1 deletion src/TypeCache/Collections/CustomEquatable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public override int GetHashCode()
if (fieldInfos.Length == 0)
return base.GetHashCode();

var values = fieldInfos.Select(fieldInfo => fieldInfo.GetFieldValue(this)).ToArray();
var values = fieldInfos.Select(fieldInfo => fieldInfo.GetValueEx(this)).ToArray();
var hashCode = new HashCode();
values.ForEach(hashCode.Add);
return hashCode.ToHashCode();
Expand Down
4 changes: 2 additions & 2 deletions src/TypeCache/Converters/FieldJsonConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public sealed class FieldJsonConverter<T> : JsonConverter<T?>
{
var fieldInfo = typeof(T).GetPublicFields().FirstOrDefault(_ => _.Name().EqualsIgnoreCase(name));
if (fieldInfo is not null && !fieldInfo.IsInitOnly)
fieldInfo.SetFieldValue(output!, reader.TokenType switch
fieldInfo.SetValueEx(output!, reader.TokenType switch
{
JsonTokenType.StartObject or JsonTokenType.StartArray => JsonSerializer.Deserialize(ref reader, fieldInfo.FieldType, options),
_ => reader.GetValue()
Expand All @@ -43,7 +43,7 @@ public override void Write(Utf8JsonWriter writer, T? input, JsonSerializerOption
foreach (var field in typeof(T).GetPublicFields())
{
writer.WritePropertyName(field!.Name());
var value = field.GetFieldValue(input);
var value = field.GetValueEx(input);
writer.WriteValue(value, options);
}
writer.WriteEndObject();
Expand Down
2 changes: 1 addition & 1 deletion src/TypeCache/Converters/PropertyJsonConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public override void Write(Utf8JsonWriter writer, T? input, JsonSerializerOption
foreach (var property in typeof(T).GetPublicProperties())
{
writer.WritePropertyName(property.Name());
var value = property.GetPropertyValue(input);
var value = property.GetValueEx(input);
writer.WriteValue(value, options);
}
writer.WriteEndObject();
Expand Down
28 changes: 0 additions & 28 deletions src/TypeCache/Converters/ValueJsonConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,32 +15,4 @@ public sealed class ValueJsonConverter : JsonConverter<object?>
[MethodImpl(AggressiveInlining), DebuggerHidden]
public override void Write(Utf8JsonWriter writer, object? value, JsonSerializerOptions options)
=> JsonSerializer.Serialize(writer, value, options);

private static IDictionary<string, object> GetObject(ref Utf8JsonReader reader, JsonSerializerOptions options)
{
var dictionary = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
while (reader.Read() && reader.TokenType == JsonTokenType.PropertyName)
{
var name = reader.GetString();
if (reader.Read())
{
var value = JsonSerializer.Deserialize<object>(ref reader, options);
dictionary.Add(name!, value!);
}
}

return dictionary;
}

private static object[] GetArray(ref Utf8JsonReader reader, JsonSerializerOptions options)
{
var list = new List<object>();
while (reader.Read() && reader.TokenType != JsonTokenType.EndArray)
{
var value = JsonSerializer.Deserialize<object>(ref reader, options);
list.Add(value!);
}

return list.ToArray();
}
}
4 changes: 2 additions & 2 deletions src/TypeCache/Data/Extensions/DbDataReaderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public static async Task ReadModelsAsync<T>(this DbDataReader @this, IList<T> ro
{
var model = (T)typeof(T).Create()!;
@this.GetValues(values);
properties.ForEach((property, columnIndex) => property.SetPropertyValue(model, values[columnIndex]));
properties.ForEach((property, columnIndex) => property.SetValueEx(model, values[columnIndex]));
rows.Add((T)model);
}
}
Expand All @@ -53,7 +53,7 @@ public static async Task ReadModelsAsync(this DbDataReader @this, Type modelType
{
var model = modelType.Create()!;
@this.GetValues(values);
properties.ForEach((property, columnIndex) => property.SetPropertyValue(model, values[columnIndex]));
properties.ForEach((property, columnIndex) => property.SetValueEx(model, values[columnIndex]));
rows.Add(model);
}
}
Expand Down
10 changes: 7 additions & 3 deletions src/TypeCache/Data/Extensions/StringBuilderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,14 @@ public static StringBuilder AppendStatementEndSQL(this StringBuilder @this)
return @this.Append(';').AppendLine();
}

public static StringBuilder AppendValuesSQL<T>(this StringBuilder @this, T[] input, StringValues columns)
{
public static StringBuilder AppendValuesSQL<T>(this StringBuilder @this, T[] input, string[] columns)
{
var propertyInfos = typeof(T).GetProperties(Instance | Public);
var propertyMap = propertyInfos
.Where(_ => columns.ContainsIgnoreCase(_.Name))
.ToDictionary(_ => _.Name, _ => _.GetValueFunc(), StringComparer.OrdinalIgnoreCase);
var values = input.Select(row => Invariant($"({columns.Select<string, string>(column =>
(typeof(T).GetProperties(Instance | Public).Where(_ => _.Name().EqualsIgnoreCase(column)).First()?.GetPropertyValue(row!)).ToSQL()).ToCSV()})")).ToArray();
propertyMap[column].Invoke(row!, null).ToSQL()).ToCSV()})")).ToArray();
@this.Append("VALUES ");
values.ForEach(row => @this.Append(row), () => @this.AppendLine().Append("\t, "));
return @this.AppendLine();
Expand Down
7 changes: 7 additions & 0 deletions src/TypeCache/Extensions/ArrayExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@ public static class ArrayExtensions
public static void Clear<T>(this T[] @this, int start = 0, int length = 0)
=> Array.Clear(@this, start, length is 0 ? @this.Length : length);

/// <remarks>
/// <c>=&gt; @<paramref name="this"/>.Contains(<paramref name="value"/>, <see cref="StringComparer.OrdinalIgnoreCase"/>);</c>
/// </remarks>
[MethodImpl(AggressiveInlining), DebuggerHidden]
public static bool ContainsIgnoreCase(this string[] @this, string value)
=> @this.Contains(value, StringComparer.OrdinalIgnoreCase);

/// <exception cref="ArgumentNullException"/>
/// <exception cref="ArgumentException"/>
public static T[] Copy<T>(this T[] @this)
Expand Down
15 changes: 15 additions & 0 deletions src/TypeCache/Extensions/CharExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,26 @@
// Copyright (c) 2021 Samuel Abraham

using System.Globalization;
using System.Numerics;

namespace TypeCache.Extensions;

public static class CharExtensions
{
/// <remarks>
/// <c>=&gt; @<paramref name="this"/> &gt;= <paramref name="minimum"/> &amp;&amp; @<paramref name="this"/> &lt;= <paramref name="maximum"/>;</c>
/// </remarks>
[MethodImpl(AggressiveInlining), DebuggerHidden]
public static bool Between(this char @this, char minimum, char maximum)
=> @this >= minimum && @this <= maximum;

/// <remarks>
/// <c>=&gt; @<paramref name="this"/> &gt; <paramref name="minimum"/> &amp;&amp; @<paramref name="this"/> &lt; <paramref name="maximum"/>;</c>
/// </remarks>
[MethodImpl(AggressiveInlining), DebuggerHidden]
public static bool InBetween(this char @this, char minimum, char maximum)
=> @this > minimum && @this < maximum;

/// <inheritdoc cref="char.GetUnicodeCategory(char)"/>
/// <remarks>
/// <c>=&gt; <see cref="char"/>.GetUnicodeCategory(@<paramref name="this"/>);</c>
Expand Down
28 changes: 0 additions & 28 deletions src/TypeCache/Extensions/ComparableExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,6 @@ namespace TypeCache.Extensions;

public static class ComparableExtensions
{
/// <summary>
/// <c>=&gt; @<paramref name="this"/>.GreaterThanOrEqualTo(<paramref name="value1"/>) &amp;&amp; @<paramref name="this"/>.LessThanOrEqualTo(<paramref name="value2"/>);</c>
/// </summary>
[MethodImpl(AggressiveInlining), DebuggerHidden]
public static bool Between(this IComparable @this, object value1, object value2)
=> @this.GreaterThanOrEqualTo(value1) && @this.LessThanOrEqualTo(value2);

/// <summary>
/// <c>=&gt; @<paramref name="this"/>.GreaterThanOrEqualTo(<paramref name="value1"/>) &amp;&amp; @<paramref name="this"/>.LessThanOrEqualTo(<paramref name="value2"/>);</c>
/// </summary>
[MethodImpl(AggressiveInlining), DebuggerHidden]
public static bool Between<T>(this IComparable<T> @this, T value1, T value2)
=> @this.GreaterThanOrEqualTo(value1) && @this.LessThanOrEqualTo(value2);

/// <summary>
/// <c>=&gt; @<paramref name="this"/>.CompareTo(<paramref name="value"/>) == 0;</c>
/// </summary>
Expand Down Expand Up @@ -60,20 +46,6 @@ public static bool GreaterThanOrEqualTo(this IComparable @this, object value)
public static bool GreaterThanOrEqualTo<T>(this IComparable<T> @this, T value)
=> @this.CompareTo(value) >= 0;

/// <summary>
/// <c>=&gt; @<paramref name="this"/>.GreaterThan(<paramref name="value1"/>) &amp;&amp; @<paramref name="this"/>.LessThan(<paramref name="value2"/>)</c>
/// </summary>
[MethodImpl(AggressiveInlining), DebuggerHidden]
public static bool InBetween(this IComparable @this, object value1, object value2)
=> @this.GreaterThan(value1) && @this.LessThan(value2);

/// <summary>
/// <c>=&gt; @<paramref name="this"/>.GreaterThan(<paramref name="value1"/>) &amp;&amp; @<paramref name="this"/>.LessThan(<paramref name="value2"/>)</c>
/// </summary>
[MethodImpl(AggressiveInlining), DebuggerHidden]
public static bool InBetween<T>(this IComparable<T> @this, T value1, T value2)
=> @this.GreaterThan(value1) && @this.LessThan(value2);

/// <summary>
/// <c>=&gt; @<paramref name="this"/>.CompareTo(<paramref name="value"/>) &lt; 0;</c>
/// </summary>
Expand Down
6 changes: 4 additions & 2 deletions src/TypeCache/Extensions/CsvExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,17 +63,19 @@ public static string[] ToCSV<T>(this IEnumerable<T> @this)
var propertyInfos = typeof(T).GetPublicProperties().Where(propertyInfo => propertyInfo.CanRead).ToArray();
if (propertyInfos.Length > 0)
{
var funcs = propertyInfos.Select(_ => _.GetValueFunc()).ToArray();
var headerRow = string.Join(',', propertyInfos.Select(propertyInfo => propertyInfo.Name.EscapeCSV()));
var dataRows = @this.Select(row => string.Join(',', propertyInfos.Select(propertyInfo => propertyInfo.GetPropertyValue(row).EscapeCSV())));
var dataRows = @this.Select(row => string.Join(',', funcs.Select(_ => _.Invoke(row, null).EscapeCSV())));

return [headerRow, ..dataRows];
}

var fieldInfos = typeof(T).GetPublicFields();
if (fieldInfos.Length > 0)
{
var funcs = fieldInfos.Select(_ => _.GetValueFunc()).ToArray();
var headerRow = string.Join(',', fieldInfos.Select(fieldInfo => fieldInfo.Name.EscapeCSV()));
var dataRows = @this.Select(row => string.Join(',', fieldInfos.Select(fieldInfo => fieldInfo.GetFieldValue(row).EscapeCSV())));
var dataRows = @this.Select(row => string.Join(',', funcs.Select(_ => _.Invoke(row).EscapeCSV())));

return [headerRow, .. dataRows];
}
Expand Down
Loading

0 comments on commit 82f04ee

Please sign in to comment.