Skip to content

Commit 2604f8a

Browse files
committed
use reflection pattern to recognize methods in translators
1 parent cafdd06 commit 2604f8a

File tree

5 files changed

+350
-70
lines changed

5 files changed

+350
-70
lines changed

src/MongoDB.Driver/Linq/Linq3Implementation/Reflection/EnumerableMethod.cs

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,26 @@ internal static class EnumerableMethod
112112
private static readonly MethodInfo __maxSingle;
113113
private static readonly MethodInfo __maxSingleWithSelector;
114114
private static readonly MethodInfo __maxWithSelector;
115+
private static readonly MethodInfo __medianDecimal;
116+
private static readonly MethodInfo __medianDecimalWithSelector;
117+
private static readonly MethodInfo __medianDouble;
118+
private static readonly MethodInfo __medianDoubleWithSelector;
119+
private static readonly MethodInfo __medianInt32;
120+
private static readonly MethodInfo __medianInt32WithSelector;
121+
private static readonly MethodInfo __medianInt64;
122+
private static readonly MethodInfo __medianInt64WithSelector;
123+
private static readonly MethodInfo __medianNullableDecimal;
124+
private static readonly MethodInfo __medianNullableDecimalWithSelector;
125+
private static readonly MethodInfo __medianNullableDouble;
126+
private static readonly MethodInfo __medianNullableDoubleWithSelector;
127+
private static readonly MethodInfo __medianNullableInt32;
128+
private static readonly MethodInfo __medianNullableInt32WithSelector;
129+
private static readonly MethodInfo __medianNullableInt64;
130+
private static readonly MethodInfo __medianNullableInt64WithSelector;
131+
private static readonly MethodInfo __medianNullableSingle;
132+
private static readonly MethodInfo __medianNullableSingleWithSelector;
133+
private static readonly MethodInfo __medianSingle;
134+
private static readonly MethodInfo __medianSingleWithSelector;
115135
private static readonly MethodInfo __min;
116136
private static readonly MethodInfo __minDecimal;
117137
private static readonly MethodInfo __minDecimalWithSelector;
@@ -139,6 +159,26 @@ internal static class EnumerableMethod
139159
private static readonly MethodInfo __ofType;
140160
private static readonly MethodInfo __orderBy;
141161
private static readonly MethodInfo __orderByDescending;
162+
private static readonly MethodInfo __percentileDecimal;
163+
private static readonly MethodInfo __percentileDecimalWithSelector;
164+
private static readonly MethodInfo __percentileDouble;
165+
private static readonly MethodInfo __percentileDoubleWithSelector;
166+
private static readonly MethodInfo __percentileInt32;
167+
private static readonly MethodInfo __percentileInt32WithSelector;
168+
private static readonly MethodInfo __percentileInt64;
169+
private static readonly MethodInfo __percentileInt64WithSelector;
170+
private static readonly MethodInfo __percentileNullableDecimal;
171+
private static readonly MethodInfo __percentileNullableDecimalWithSelector;
172+
private static readonly MethodInfo __percentileNullableDouble;
173+
private static readonly MethodInfo __percentileNullableDoubleWithSelector;
174+
private static readonly MethodInfo __percentileNullableInt32;
175+
private static readonly MethodInfo __percentileNullableInt32WithSelector;
176+
private static readonly MethodInfo __percentileNullableInt64;
177+
private static readonly MethodInfo __percentileNullableInt64WithSelector;
178+
private static readonly MethodInfo __percentileNullableSingle;
179+
private static readonly MethodInfo __percentileNullableSingleWithSelector;
180+
private static readonly MethodInfo __percentileSingle;
181+
private static readonly MethodInfo __percentileSingleWithSelector;
142182
private static readonly MethodInfo __prepend;
143183
private static readonly MethodInfo __range;
144184
private static readonly MethodInfo __repeat;
@@ -279,6 +319,26 @@ static EnumerableMethod()
279319
__maxSingle = ReflectionInfo.Method((IEnumerable<float> source) => source.Max());
280320
__maxSingleWithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, float> selector) => source.Max(selector));
281321
__maxWithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, object> selector) => source.Max(selector));
322+
__medianDecimal = ReflectionInfo.Method((IEnumerable<decimal> source) => source.Median());
323+
__medianDecimalWithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, decimal> selector) => source.Median(selector));
324+
__medianDouble = ReflectionInfo.Method((IEnumerable<double> source) => source.Median());
325+
__medianDoubleWithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, double> selector) => source.Median(selector));
326+
__medianInt32 = ReflectionInfo.Method((IEnumerable<int> source) => source.Median());
327+
__medianInt32WithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, int> selector) => source.Median(selector));
328+
__medianInt64 = ReflectionInfo.Method((IEnumerable<long> source) => source.Median());
329+
__medianInt64WithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, long> selector) => source.Median(selector));
330+
__medianNullableDecimal = ReflectionInfo.Method((IEnumerable<decimal?> source) => source.Median());
331+
__medianNullableDecimalWithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, decimal?> selector) => source.Median(selector));
332+
__medianNullableDouble = ReflectionInfo.Method((IEnumerable<double?> source) => source.Median());
333+
__medianNullableDoubleWithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, double?> selector) => source.Median(selector));
334+
__medianNullableInt32 = ReflectionInfo.Method((IEnumerable<int?> source) => source.Median());
335+
__medianNullableInt32WithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, int?> selector) => source.Median(selector));
336+
__medianNullableInt64 = ReflectionInfo.Method((IEnumerable<long?> source) => source.Median());
337+
__medianNullableInt64WithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, long?> selector) => source.Median(selector));
338+
__medianNullableSingle = ReflectionInfo.Method((IEnumerable<float?> source) => source.Median());
339+
__medianNullableSingleWithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, float?> selector) => source.Median(selector));
340+
__medianSingle = ReflectionInfo.Method((IEnumerable<float> source) => source.Median());
341+
__medianSingleWithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, float> selector) => source.Median(selector));
282342
__min = ReflectionInfo.Method((IEnumerable<object> source) => source.Min());
283343
__minDecimal = ReflectionInfo.Method((IEnumerable<decimal> source) => source.Min());
284344
__minDecimalWithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, decimal> selector) => source.Min(selector));
@@ -306,6 +366,26 @@ static EnumerableMethod()
306366
__ofType = ReflectionInfo.Method((IEnumerable source) => source.OfType<object>());
307367
__orderBy = ReflectionInfo.Method((IEnumerable<object> source, Func<object, object> keySelector) => source.OrderBy(keySelector));
308368
__orderByDescending = ReflectionInfo.Method((IEnumerable<object> source, Func<object, object> keySelector) => source.OrderByDescending(keySelector));
369+
__percentileDecimal = ReflectionInfo.Method((IEnumerable<decimal> source, IEnumerable<double> percentiles) => source.Percentile(percentiles));
370+
__percentileDecimalWithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, decimal> selector, IEnumerable<double> percentiles) => source.Percentile(selector, percentiles));
371+
__percentileDouble = ReflectionInfo.Method((IEnumerable<double> source, IEnumerable<double> percentiles) => source.Percentile(percentiles));
372+
__percentileDoubleWithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, double> selector, IEnumerable<double> percentiles) => source.Percentile(selector, percentiles));
373+
__percentileInt32 = ReflectionInfo.Method((IEnumerable<int> source, IEnumerable<double> percentiles) => source.Percentile(percentiles));
374+
__percentileInt32WithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, int> selector, IEnumerable<double> percentiles) => source.Percentile(selector, percentiles));
375+
__percentileInt64 = ReflectionInfo.Method((IEnumerable<long> source, IEnumerable<double> percentiles) => source.Percentile(percentiles));
376+
__percentileInt64WithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, long> selector, IEnumerable<double> percentiles) => source.Percentile(selector, percentiles));
377+
__percentileNullableDecimal = ReflectionInfo.Method((IEnumerable<decimal?> source, IEnumerable<double> percentiles) => source.Percentile(percentiles));
378+
__percentileNullableDecimalWithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, decimal?> selector, IEnumerable<double> percentiles) => source.Percentile(selector, percentiles));
379+
__percentileNullableDouble = ReflectionInfo.Method((IEnumerable<double?> source, IEnumerable<double> percentiles) => source.Percentile(percentiles));
380+
__percentileNullableDoubleWithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, double?> selector, IEnumerable<double> percentiles) => source.Percentile(selector, percentiles));
381+
__percentileNullableInt32 = ReflectionInfo.Method((IEnumerable<int?> source, IEnumerable<double> percentiles) => source.Percentile(percentiles));
382+
__percentileNullableInt32WithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, int?> selector, IEnumerable<double> percentiles) => source.Percentile(selector, percentiles));
383+
__percentileNullableInt64 = ReflectionInfo.Method((IEnumerable<long?> source, IEnumerable<double> percentiles) => source.Percentile(percentiles));
384+
__percentileNullableInt64WithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, long?> selector, IEnumerable<double> percentiles) => source.Percentile(selector, percentiles));
385+
__percentileNullableSingle = ReflectionInfo.Method((IEnumerable<float?> source, IEnumerable<double> percentiles) => source.Percentile(percentiles));
386+
__percentileNullableSingleWithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, float?> selector, IEnumerable<double> percentiles) => source.Percentile(selector, percentiles));
387+
__percentileSingle = ReflectionInfo.Method((IEnumerable<float> source, IEnumerable<double> percentiles) => source.Percentile(percentiles));
388+
__percentileSingleWithSelector = ReflectionInfo.Method((IEnumerable<object> source, Func<object, float> selector, IEnumerable<double> percentiles) => source.Percentile(selector, percentiles));
309389
__prepend = ReflectionInfo.Method((IEnumerable<object> source, object element) => source.Prepend(element));
310390
__range = ReflectionInfo.Method((int start, int count) => Enumerable.Range(start, count));
311391
__repeat = ReflectionInfo.Method((object element, int count) => Enumerable.Repeat(element, count));
@@ -445,6 +525,26 @@ static EnumerableMethod()
445525
public static MethodInfo MaxSingle => __maxSingle;
446526
public static MethodInfo MaxSingleWithSelector => __maxSingleWithSelector;
447527
public static MethodInfo MaxWithSelector => __maxWithSelector;
528+
public static MethodInfo MedianDecimal => __medianDecimal;
529+
public static MethodInfo MedianDecimalWithSelector => __medianDecimalWithSelector;
530+
public static MethodInfo MedianDouble => __medianDouble;
531+
public static MethodInfo MedianDoubleWithSelector => __medianDoubleWithSelector;
532+
public static MethodInfo MedianInt32 => __medianInt32;
533+
public static MethodInfo MedianInt32WithSelector => __medianInt32WithSelector;
534+
public static MethodInfo MedianInt64 => __medianInt64;
535+
public static MethodInfo MedianInt64WithSelector => __medianInt64WithSelector;
536+
public static MethodInfo MedianNullableDecimal => __medianNullableDecimal;
537+
public static MethodInfo MedianNullableDecimalWithSelector => __medianNullableDecimalWithSelector;
538+
public static MethodInfo MedianNullableDouble => __medianNullableDouble;
539+
public static MethodInfo MedianNullableDoubleWithSelector => __medianNullableDoubleWithSelector;
540+
public static MethodInfo MedianNullableInt32 => __medianNullableInt32;
541+
public static MethodInfo MedianNullableInt32WithSelector => __medianNullableInt32WithSelector;
542+
public static MethodInfo MedianNullableInt64 => __medianNullableInt64;
543+
public static MethodInfo MedianNullableInt64WithSelector => __medianNullableInt64WithSelector;
544+
public static MethodInfo MedianNullableSingle => __medianNullableSingle;
545+
public static MethodInfo MedianNullableSingleWithSelector => __medianNullableSingleWithSelector;
546+
public static MethodInfo MedianSingle => __medianSingle;
547+
public static MethodInfo MedianSingleWithSelector => __medianSingleWithSelector;
448548
public static MethodInfo Min => __min;
449549
public static MethodInfo MinDecimal => __minDecimal;
450550
public static MethodInfo MinDecimalWithSelector => __minDecimalWithSelector;
@@ -472,6 +572,26 @@ static EnumerableMethod()
472572
public static MethodInfo OfType => __ofType;
473573
public static MethodInfo OrderBy => __orderBy;
474574
public static MethodInfo OrderByDescending => __orderByDescending;
575+
public static MethodInfo PercentileDecimal => __percentileDecimal;
576+
public static MethodInfo PercentileDecimalWithSelector => __percentileDecimalWithSelector;
577+
public static MethodInfo PercentileDouble => __percentileDouble;
578+
public static MethodInfo PercentileDoubleWithSelector => __percentileDoubleWithSelector;
579+
public static MethodInfo PercentileInt32 => __percentileInt32;
580+
public static MethodInfo PercentileInt32WithSelector => __percentileInt32WithSelector;
581+
public static MethodInfo PercentileInt64 => __percentileInt64;
582+
public static MethodInfo PercentileInt64WithSelector => __percentileInt64WithSelector;
583+
public static MethodInfo PercentileNullableDecimal => __percentileNullableDecimal;
584+
public static MethodInfo PercentileNullableDecimalWithSelector => __percentileNullableDecimalWithSelector;
585+
public static MethodInfo PercentileNullableDouble => __percentileNullableDouble;
586+
public static MethodInfo PercentileNullableDoubleWithSelector => __percentileNullableDoubleWithSelector;
587+
public static MethodInfo PercentileNullableInt32 => __percentileNullableInt32;
588+
public static MethodInfo PercentileNullableInt32WithSelector => __percentileNullableInt32WithSelector;
589+
public static MethodInfo PercentileNullableInt64 => __percentileNullableInt64;
590+
public static MethodInfo PercentileNullableInt64WithSelector => __percentileNullableInt64WithSelector;
591+
public static MethodInfo PercentileNullableSingle => __percentileNullableSingle;
592+
public static MethodInfo PercentileNullableSingleWithSelector => __percentileNullableSingleWithSelector;
593+
public static MethodInfo PercentileSingle => __percentileSingle;
594+
public static MethodInfo PercentileSingleWithSelector => __percentileSingleWithSelector;
475595
public static MethodInfo Prepend => __prepend;
476596
public static MethodInfo Range => __range;
477597
public static MethodInfo Repeat => __repeat;

0 commit comments

Comments
 (0)