Skip to content

Commit

Permalink
Add Translation for MathF (#18842)
Browse files Browse the repository at this point in the history
Fixes #18842
  • Loading branch information
ntovas committed May 16, 2021
1 parent 67a5d16 commit e19152f
Show file tree
Hide file tree
Showing 6 changed files with 676 additions and 4 deletions.
26 changes: 23 additions & 3 deletions src/EFCore.SqlServer/Query/Internal/SqlServerMathTranslator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,21 +52,41 @@ public class SqlServerMathTranslator : IMethodCallTranslator
{ typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Sign), new[] { typeof(int) }), "SIGN" },
{ typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Sign), new[] { typeof(long) }), "SIGN" },
{ typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Sign), new[] { typeof(sbyte) }), "SIGN" },
{ typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Sign), new[] { typeof(short) }), "SIGN" }
{ typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Sign), new[] { typeof(short) }), "SIGN" },
{ typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Abs), new[] { typeof(float) }), "ABS" },
{ typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Ceiling), new[] { typeof(float) }), "CEILING" },
{ typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Floor), new[] { typeof(float) }), "FLOOR" },
{ typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Pow), new[] { typeof(float), typeof(float) }), "POWER" },
{ typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Exp), new[] { typeof(float) }), "EXP" },
{ typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Log10), new[] { typeof(float) }), "LOG10" },
{ typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Log), new[] { typeof(float) }), "LOG" },
{ typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Log), new[] { typeof(float), typeof(float) }), "LOG" },
{ typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Sqrt), new[] { typeof(float) }), "SQRT" },
{ typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Acos), new[] { typeof(float) }), "ACOS" },
{ typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Asin), new[] { typeof(float) }), "ASIN" },
{ typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Atan), new[] { typeof(float) }), "ATAN" },
{ typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Atan2), new[] { typeof(float), typeof(float) }), "ATN2" },
{ typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Cos), new[] { typeof(float) }), "COS" },
{ typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Sin), new[] { typeof(float) }), "SIN" },
{ typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Tan), new[] { typeof(float) }), "TAN" },
{ typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Sign), new[] { typeof(float) }), "SIGN" }
};

private static readonly IEnumerable<MethodInfo> _truncateMethodInfos = new[]
{
typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Truncate), new[] { typeof(decimal) }),
typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Truncate), new[] { typeof(double) })
typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Truncate), new[] { typeof(double) }),
typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Truncate), new[] { typeof(float) })
};

private static readonly IEnumerable<MethodInfo> _roundMethodInfos = new[]
{
typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Round), new[] { typeof(decimal) }),
typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Round), new[] { typeof(double) }),
typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Round), new[] { typeof(decimal), typeof(int) }),
typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Round), new[] { typeof(double), typeof(int) })
typeof(Math).GetRequiredRuntimeMethod(nameof(Math.Round), new[] { typeof(double), typeof(int) }),
typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Round), new[] { typeof(float) }),
typeof(MathF).GetRequiredRuntimeMethod(nameof(MathF.Round), new[] { typeof(float), typeof(int) })
};

private readonly ISqlExpressionFactory _sqlExpressionFactory;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,12 @@ public class SqliteMathTranslator : IMethodCallTranslator
{ typeof(Math).GetRequiredMethod(nameof(Math.Min), new[] { typeof(uint), typeof(uint) }), "min" },
{ typeof(Math).GetRequiredMethod(nameof(Math.Min), new[] { typeof(ushort), typeof(ushort) }), "min" },
{ typeof(Math).GetRequiredMethod(nameof(Math.Round), new[] { typeof(double) }), "round" },
{ typeof(Math).GetRequiredMethod(nameof(Math.Round), new[] { typeof(double), typeof(int) }), "round" }
{ typeof(Math).GetRequiredMethod(nameof(Math.Round), new[] { typeof(double), typeof(int) }), "round" },
{ typeof(MathF).GetRequiredMethod(nameof(MathF.Abs), new[] { typeof(float) }), "abs" },
{ typeof(MathF).GetRequiredMethod(nameof(MathF.Max), new[] { typeof(float), typeof(float) }), "max" },
{ typeof(MathF).GetRequiredMethod(nameof(MathF.Min), new[] { typeof(float), typeof(float) }), "min" },
{ typeof(MathF).GetRequiredMethod(nameof(MathF.Round), new[] { typeof(float) }), "round" },
{ typeof(MathF).GetRequiredMethod(nameof(MathF.Round), new[] { typeof(float), typeof(int) }), "round" }
};

private readonly ISqlExpressionFactory _sqlExpressionFactory;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -595,6 +595,215 @@ FROM root c
WHERE ((c[""Discriminator""] = ""OrderDetail"") AND (c[""OrderID""] = 11077))");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_abs1(bool async)
{
await base.Where_mathf_abs1(async);

AssertSql(
@"SELECT [p].[ProductID], [p].[Discontinued], [p].[ProductName], [p].[SupplierID], [p].[UnitPrice], [p].[UnitsInStock]
FROM [Products] AS [p]
WHERE ABS(CAST([p].[ProductID] AS real)) > CAST(10 AS real)");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_ceiling1(bool async)
{
await base.Where_mathf_ceiling1(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE ([o].[UnitPrice] < 7.0) AND (CEILING([o].[Discount]) > CAST(0 AS real))");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_floor(bool async)
{
await base.Where_mathf_floor(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE ([o].[Quantity] < CAST(5 AS smallint)) AND (FLOOR(CAST([o].[UnitPrice] AS real)) > CAST(10 AS real))");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_power(bool async)
{
await base.Where_mathf_power(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE POWER([o].[Discount], CAST(2 AS real)) > CAST(0.05 AS real)");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_round2(bool async)
{
await base.Where_mathf_round2(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE ROUND(CAST([o].[UnitPrice] AS real), 2) > CAST(100 AS real)");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_truncate(bool async)
{
await base.Where_mathf_truncate(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE ([o].[Quantity] < CAST(5 AS smallint)) AND (ROUND(CAST([o].[UnitPrice] AS real), 0, 1) > CAST(10 AS real))");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_exp(bool async)
{
await base.Where_mathf_exp(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE ([o].[OrderID] = 11077) AND (EXP([o].[Discount]) > CAST(1 AS real))");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_log10(bool async)
{
await base.Where_mathf_log10(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE (([o].[OrderID] = 11077) AND ([o].[Discount] > CAST(0 AS real))) AND (LOG10([o].[Discount]) < CAST(0 AS real))");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_log(bool async)
{
await base.Where_mathf_log(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE (([o].[OrderID] = 11077) AND ([o].[Discount] > CAST(0 AS real))) AND (LOG([o].[Discount]) < CAST(0 AS real))");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_log_new_base(bool async)
{
await base.Where_mathf_log_new_base(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE (([o].[OrderID] = 11077) AND ([o].[Discount] > CAST(0 AS real))) AND (LOG([o].[Discount], CAST(7 AS real)) < CAST(0 AS real))");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_sqrt(bool async)
{
await base.Where_mathf_sqrt(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE ([o].[OrderID] = 11077) AND (SQRT([o].[Discount]) > CAST(0 AS real))");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_acos(bool async)
{
await base.Where_mathf_acos(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE ([o].[OrderID] = 11077) AND (ACOS([o].[Discount]) > CAST(1 AS real))");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_asin(bool async)
{
await base.Where_mathf_asin(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE ([o].[OrderID] = 11077) AND (ASIN([o].[Discount]) > CAST(0 AS real))");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_atan(bool async)
{
await base.Where_mathf_atan(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE ([o].[OrderID] = 11077) AND (ATAN([o].[Discount]) > CAST(0 AS real))");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_atan2(bool async)
{
await base.Where_mathf_atan2(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE ([o].[OrderID] = 11077) AND (ATN2([o].[Discount], CAST(1 AS real)) > CAST(0 AS real))");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_cos(bool async)
{
await base.Where_mathf_cos(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE ([o].[OrderID] = 11077) AND (COS([o].[Discount]) > CAST(0 AS real))");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_sin(bool async)
{
await base.Where_mathf_sin(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE ([o].[OrderID] = 11077) AND (SIN([o].[Discount]) > CAST(0 AS real))");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_tan(bool async)
{
await base.Where_mathf_tan(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE ([o].[OrderID] = 11077) AND (TAN([o].[Discount]) > CAST(0 AS real))");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_mathf_sign(bool async)
{
await base.Where_mathf_sign(async);

AssertSql(
@"SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice]
FROM [Order Details] AS [o]
WHERE ([o].[OrderID] = 11077) AND (SIGN([o].[Discount]) > 0)");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Where_guid_newguid(bool async)
{
Expand Down
Loading

0 comments on commit e19152f

Please sign in to comment.