From 510034ce3b8d42cbcbf0002080b97b4dff5e236e Mon Sep 17 00:00:00 2001 From: "REDMOND\\adityasa" Date: Sat, 27 Jan 2024 15:10:26 -0800 Subject: [PATCH] Addressed a couple of TODOs. --- .../src/Linq/ExpressionToSQL.cs | 4 +-- ...nctionBaselineTests.TestFirstOrDefault.xml | 36 +++++++++++++++---- .../Linq/LinqScalarFunctionBaselineTests.cs | 27 +++++++++++--- 3 files changed, 53 insertions(+), 14 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs b/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs index 6327071be5..ca8e660c13 100644 --- a/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs +++ b/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs @@ -1271,7 +1271,6 @@ private static Collection VisitMethodCall(MethodCallExpression inputExpression, { if (inputExpression.Arguments.Count == 1) { - // ISSUE-TODO-adityasa-2024/1/26 - Disallow other overloads of FirstOrDefault. SqlNumberLiteral sqlNumberLiteral; bool success = TryGetSqlNumberLiteral(1, out sqlNumberLiteral); Debug.Assert(success, "ExpressionToSQL Assert!", "SqlNumberLiteral Construction must succeed!"); @@ -1281,8 +1280,7 @@ private static Collection VisitMethodCall(MethodCallExpression inputExpression, } else { - // ISSUE-TODO-adityasa-2024/1/26 - Improve error message. - throw new DocumentQueryException(string.Format(CultureInfo.CurrentCulture, ClientResources.MethodNotSupported, inputExpression.Method.Name)); + throw new DocumentQueryException(string.Format(CultureInfo.CurrentCulture, ClientResources.InvalidArgumentsCount, inputExpression.Method.Name, 0, inputExpression.Arguments.Count - 1)); } break; diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqScalarFunctionBaselineTests.TestFirstOrDefault.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqScalarFunctionBaselineTests.TestFirstOrDefault.xml index 3bd5afcc33..6643954202 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqScalarFunctionBaselineTests.TestFirstOrDefault.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqScalarFunctionBaselineTests.TestFirstOrDefault.xml @@ -127,12 +127,23 @@ WHERE (root["Flag"] AND (NOT root["Flag"]))]]> - + - + + + + + + + + + + + + @@ -143,24 +154,35 @@ WHERE (root["Flag"] AND (NOT root["Flag"]))]]> - + - + True, new Data())]]> - + + + + + + + + True, value(Microsoft.Azure.Cosmos.Services.Management.Tests.LinqProviderTests.LinqScalarFunctionBaselineTests).GetDefaultData())]]> + + + + - Min 1]]> + data.Multiples.FirstOrDefault()).Min(), Object)]]> @@ -171,7 +193,7 @@ WHERE (root["Flag"] AND (NOT root["Flag"]))]]> - Min 2]]> + new List`1() {Void Add(Int32)(1), Void Add(Int32)(2), Void Add(Int32)(3)}.FirstOrDefault()).Min(), Object)]]> diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Linq/LinqScalarFunctionBaselineTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Linq/LinqScalarFunctionBaselineTests.cs index ab03d4a4c1..18bd95f37c 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Linq/LinqScalarFunctionBaselineTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Linq/LinqScalarFunctionBaselineTests.cs @@ -126,13 +126,21 @@ public void TestFirstOrDefault() ///////////////// // ISSUE-TODO-adityasa-2024/1/26 - Support FirstOrDefault overloads. + // Please note, this requires potential support for user code invocation in context of rest of the client code (except maybe some simple cases). + // We do not currently do this for any other scenarios. // Unsupported inputs.Add(new LinqScalarFunctionInput( - "FirstOrDefault with explicit default", + "FirstOrDefault with explicit (inline) default", b => getQuery(b) .FirstOrDefault(new Data()))); + // Unsupported + inputs.Add(new LinqScalarFunctionInput( + "FirstOrDefault with explicit default from function invocation", + b => getQuery(b) + .FirstOrDefault(this.GetDefaultData()))); + // Unsupported inputs.Add(new LinqScalarFunctionInput( "FirstOrDefault with predicate", @@ -141,20 +149,26 @@ public void TestFirstOrDefault() // Unsupported inputs.Add(new LinqScalarFunctionInput( - "FirstOrDefault with explicit default and predicate", + "FirstOrDefault with explicit (inline) default and predicate", b => getQuery(b) .FirstOrDefault(_ => true, new Data()))); // Unsupported inputs.Add(new LinqScalarFunctionInput( - "Select (FirstOrDefault) -> Min 1", + "FirstOrDefault with explicit default from function invocation and predicate", + b => getQuery(b) + .FirstOrDefault(_ => true, this.GetDefaultData()))); + + // Unsupported + inputs.Add(new LinqScalarFunctionInput( + "Nested FirstOrDefault 1", b => getQuery(b) .Select(data => data.Multiples.FirstOrDefault()) .Min())); // Unsupported inputs.Add(new LinqScalarFunctionInput( - "Select (FirstOrDefault) -> Min 2", + "Nested FirstOrDefault 2", b => getQuery(b) .Select(data => new List { 1, 2, 3 }.FirstOrDefault()) .Min())); @@ -178,6 +192,11 @@ public void TestFirstOrDefault() this.ExecuteTestSuite(inputs); } + private Data GetDefaultData() + { + return new Data(); + } + public override LinqScalarFunctionOutput ExecuteTest(LinqScalarFunctionInput input) { lastExecutedScalarQuery = null;