From e360dca61863c01515761e9c25161386ace5c059 Mon Sep 17 00:00:00 2001 From: Minh Le Date: Tue, 16 Aug 2022 11:49:58 -0700 Subject: [PATCH 01/12] Add custom serializer to SqlObjectCreate argument to use when serialize objects. --- .../src/Linq/ExpressionToSQL.cs | 6 ++-- .../src/Linq/GeometrySqlExpressionFactory.cs | 2 +- .../src/Linq/SqlExpressionManipulation.cs | 1 + .../src/Query/Core/Parser/CstToAstVisitor.cs | 2 +- .../Serializer/CosmosLinqSerializerOptions.cs | 13 +++++++ .../SqlObjectCreateScalarExpression.cs | 34 ++++++++++++++++--- .../Visitors/SqlObjectObfuscator.cs | 2 +- .../Pagination/InMemoryContainer.cs | 2 +- .../AggregateProjectionTransformer.cs | 4 +-- .../JTokenToSqlScalarExpression.cs | 2 +- .../ScalarExpressionEvaluatorTests.cs | 3 +- .../SqlObjectVisitorBaselineTests.cs | 4 ++- 12 files changed, 59 insertions(+), 16 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs b/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs index 476774e137..fca4b5fcba 100644 --- a/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs +++ b/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs @@ -855,7 +855,7 @@ private static SqlScalarExpression VisitNew(NewExpression inputExpression, Trans } SqlObjectProperty[] propertyBindings = ExpressionToSql.CreateInitializers(inputExpression.Arguments, inputExpression.Members, context); - SqlObjectCreateScalarExpression create = SqlObjectCreateScalarExpression.Create(propertyBindings); + SqlObjectCreateScalarExpression create = SqlObjectCreateScalarExpression.Create(context.linqSerializerOptions?.CustomerCosmosSerializer, propertyBindings); return create; } else @@ -869,7 +869,7 @@ private static SqlScalarExpression VisitMemberInit(MemberInitExpression inputExp { ExpressionToSql.VisitNew(inputExpression.NewExpression, context); // Return value is ignored SqlObjectProperty[] propertyBindings = ExpressionToSql.VisitBindingList(inputExpression.Bindings, context); - SqlObjectCreateScalarExpression create = SqlObjectCreateScalarExpression.Create(propertyBindings); + SqlObjectCreateScalarExpression create = SqlObjectCreateScalarExpression.Create(context.linqSerializerOptions?.CustomerCosmosSerializer, propertyBindings); return create; } @@ -2004,7 +2004,7 @@ public SqlScalarExpression Visit(CosmosObject cosmosObject) properties.Add(property); } - return SqlObjectCreateScalarExpression.Create(properties.ToImmutableArray()); + return SqlObjectCreateScalarExpression.Create(null, properties.ToImmutableArray()); } public SqlScalarExpression Visit(CosmosString cosmosString) diff --git a/Microsoft.Azure.Cosmos/src/Linq/GeometrySqlExpressionFactory.cs b/Microsoft.Azure.Cosmos/src/Linq/GeometrySqlExpressionFactory.cs index 610c3f1b5f..b62f1961c1 100644 --- a/Microsoft.Azure.Cosmos/src/Linq/GeometrySqlExpressionFactory.cs +++ b/Microsoft.Azure.Cosmos/src/Linq/GeometrySqlExpressionFactory.cs @@ -87,7 +87,7 @@ private static SqlScalarExpression FromJToken(JToken jToken) FromJToken(p.Value))) .ToArray(); - return SqlObjectCreateScalarExpression.Create(properties); + return SqlObjectCreateScalarExpression.Create(null, properties); case JTokenType.Float: case JTokenType.Integer: diff --git a/Microsoft.Azure.Cosmos/src/Linq/SqlExpressionManipulation.cs b/Microsoft.Azure.Cosmos/src/Linq/SqlExpressionManipulation.cs index c6b4f5de45..c415330a61 100644 --- a/Microsoft.Azure.Cosmos/src/Linq/SqlExpressionManipulation.cs +++ b/Microsoft.Azure.Cosmos/src/Linq/SqlExpressionManipulation.cs @@ -67,6 +67,7 @@ public static SqlScalarExpression Substitute(SqlScalarExpression replacement, Sq case SqlObjectCreateScalarExpression objExp: { return SqlObjectCreateScalarExpression.Create( + null, objExp .Properties .Select(prop => SqlObjectProperty.Create(prop.Name, Substitute(replacement, toReplace, prop.Value))) diff --git a/Microsoft.Azure.Cosmos/src/Query/Core/Parser/CstToAstVisitor.cs b/Microsoft.Azure.Cosmos/src/Query/Core/Parser/CstToAstVisitor.cs index 6b1de2883e..ca1d60438d 100644 --- a/Microsoft.Azure.Cosmos/src/Query/Core/Parser/CstToAstVisitor.cs +++ b/Microsoft.Azure.Cosmos/src/Query/Core/Parser/CstToAstVisitor.cs @@ -690,7 +690,7 @@ public override SqlObject VisitObjectCreateScalarExpression([NotNull] sqlParser. } } - return SqlObjectCreateScalarExpression.Create(properties.ToImmutableArray()); + return SqlObjectCreateScalarExpression.Create(null, properties.ToImmutableArray()); } public override SqlObject VisitObject_property([NotNull] sqlParser.Object_propertyContext context) diff --git a/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs b/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs index b7523b2c6a..71cc70c74e 100644 --- a/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs +++ b/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs @@ -20,6 +20,9 @@ public sealed class CosmosLinqSerializerOptions public CosmosLinqSerializerOptions() { this.PropertyNamingPolicy = CosmosPropertyNamingPolicy.Default; + this.CustomerCosmosSerializer = CosmosSqlQuerySpecJsonConverter.CreateSqlQuerySpecSerializer( + cosmosSerializer: null, + propertiesSerializer: new CosmosJsonSerializerWrapper(new CosmosJsonDotNetSerializer())); } /// @@ -30,5 +33,15 @@ public CosmosLinqSerializerOptions() /// The default value is CosmosPropertyNamingPolicy.Default /// public CosmosPropertyNamingPolicy PropertyNamingPolicy { get; set; } + + /// + /// Gets or sets the user defined customer serializer. If no customer serializer was defined, + /// then the value is set to the default value + /// + /// + /// The default value of CustomerCosmosSerializer.cosmosSerializer is null + /// The default value of CustomerCosmosSerializer.propertiesSerializer is CosmosJsonDotNetSerializer + /// + public CosmosSerializer CustomerCosmosSerializer { get; set; } } } diff --git a/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs b/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs index 8876d64a02..bb2aafe200 100644 --- a/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs +++ b/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs @@ -6,8 +6,10 @@ namespace Microsoft.Azure.Cosmos.SqlObjects using System; using System.Collections.Generic; using System.Collections.Immutable; + using System.Globalization; + using System.IO; + using Microsoft.Azure.Cosmos.Query.Core; using Microsoft.Azure.Cosmos.SqlObjects.Visitors; - #if INTERNAL #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member #pragma warning disable SA1600 // Elements should be documented @@ -17,7 +19,7 @@ namespace Microsoft.Azure.Cosmos.SqlObjects #endif sealed class SqlObjectCreateScalarExpression : SqlScalarExpression { - private SqlObjectCreateScalarExpression(ImmutableArray properties) + private SqlObjectCreateScalarExpression(ImmutableArray properties, CosmosSerializer userSerializer = null) { if (properties == null) { @@ -33,13 +35,16 @@ private SqlObjectCreateScalarExpression(ImmutableArray proper } this.Properties = properties; + this.UserSerializer = userSerializer; //nullable } public ImmutableArray Properties { get; } - public static SqlObjectCreateScalarExpression Create(params SqlObjectProperty[] properties) => new SqlObjectCreateScalarExpression(properties.ToImmutableArray()); + public CosmosSerializer UserSerializer { get; } + + public static SqlObjectCreateScalarExpression Create(CosmosSerializer userSerializer, params SqlObjectProperty[] properties) => new SqlObjectCreateScalarExpression(properties.ToImmutableArray(), userSerializer); - public static SqlObjectCreateScalarExpression Create(ImmutableArray properties) => new SqlObjectCreateScalarExpression(properties); + public static SqlObjectCreateScalarExpression Create(CosmosSerializer userSerializer, ImmutableArray properties) => new SqlObjectCreateScalarExpression(properties, userSerializer); public override void Accept(SqlObjectVisitor visitor) => visitor.Visit(this); @@ -52,5 +57,26 @@ private SqlObjectCreateScalarExpression(ImmutableArray proper public override TResult Accept(SqlScalarExpressionVisitor visitor) => visitor.Visit(this); public override TResult Accept(SqlScalarExpressionVisitor visitor, T input) => visitor.Visit(this, input); + + public override string ToString() + { + if (this.UserSerializer != null) + { + StringWriter writer = new StringWriter(CultureInfo.InvariantCulture); + + // Use the user serializer for the parameter values so custom conversions are correctly handled + using (Stream str = this.UserSerializer.ToStream(this.Properties)) + { + using (StreamReader streamReader = new StreamReader(str)) + { + string propertyValue = streamReader.ReadToEnd(); + writer.Write(propertyValue); + return writer.ToString(); + } + } + } + + return base.ToString(); + } } } diff --git a/Microsoft.Azure.Cosmos/src/SqlObjects/Visitors/SqlObjectObfuscator.cs b/Microsoft.Azure.Cosmos/src/SqlObjects/Visitors/SqlObjectObfuscator.cs index 7fa52c4437..50f8c43f47 100644 --- a/Microsoft.Azure.Cosmos/src/SqlObjects/Visitors/SqlObjectObfuscator.cs +++ b/Microsoft.Azure.Cosmos/src/SqlObjects/Visitors/SqlObjectObfuscator.cs @@ -238,7 +238,7 @@ public override SqlObject Visit(SqlObjectCreateScalarExpression sqlObjectCreateS properties.Add(property.Accept(this) as SqlObjectProperty); } - return SqlObjectCreateScalarExpression.Create(properties.ToImmutableArray()); + return SqlObjectCreateScalarExpression.Create(null, properties.ToImmutableArray()); } public override SqlObject Visit(SqlObjectProperty sqlObjectProperty) diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Pagination/InMemoryContainer.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Pagination/InMemoryContainer.cs index e2aa61a094..230734419e 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Pagination/InMemoryContainer.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Pagination/InMemoryContainer.cs @@ -1501,7 +1501,7 @@ public SqlScalarExpression Visit(CosmosObject cosmosObject) properties.Add(property); } - return SqlObjectCreateScalarExpression.Create(properties.ToImmutableArray()); + return SqlObjectCreateScalarExpression.Create(null, properties.ToImmutableArray()); } public SqlScalarExpression Visit(CosmosString cosmosString) diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngine/AggregateProjectionTransformer.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngine/AggregateProjectionTransformer.cs index 15411612f1..a47ea6a18e 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngine/AggregateProjectionTransformer.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngine/AggregateProjectionTransformer.cs @@ -312,7 +312,7 @@ public override SqlScalarExpression Visit(SqlObjectCreateScalarExpression sqlObj properties.Add(SqlObjectProperty.Create(property.Name, property.Value.Accept(this))); } - return SqlObjectCreateScalarExpression.Create(properties.ToImmutableArray()); + return SqlObjectCreateScalarExpression.Create(null, properties.ToImmutableArray()); } public override SqlScalarExpression Visit(SqlParameterRefScalarExpression scalarExpression) @@ -402,7 +402,7 @@ public SqlScalarExpression Visit(CosmosObject cosmosObject) properties.Add(property); } - return SqlObjectCreateScalarExpression.Create(properties.ToImmutableArray()); + return SqlObjectCreateScalarExpression.Create(null, properties.ToImmutableArray()); } public SqlScalarExpression Visit(CosmosString cosmosString) diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/JTokenToSqlScalarExpression.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/JTokenToSqlScalarExpression.cs index f9d5251d66..180de53a24 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/JTokenToSqlScalarExpression.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/JTokenToSqlScalarExpression.cs @@ -75,7 +75,7 @@ public static SqlScalarExpression Convert(JToken token) properties.Add(property); } - return SqlObjectCreateScalarExpression.Create(properties.ToArray()); + return SqlObjectCreateScalarExpression.Create(null, properties.ToArray()); } case JTokenType.String: diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/ScalarExpressionEvaluatorTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/ScalarExpressionEvaluatorTests.cs index 8b404b4eaa..58daccf02b 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/ScalarExpressionEvaluatorTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/ScalarExpressionEvaluatorTests.cs @@ -140,7 +140,7 @@ public void SqlBinaryScalarExpressionTest() SqlArrayCreateScalarExpression arrayCreateScalarExpresion1 = SqlArrayCreateScalarExpression.Create(); SqlArrayCreateScalarExpression arrayCreateScalarExpresion2 = SqlArrayCreateScalarExpression.Create(five); - SqlObjectCreateScalarExpression objectCreateScalarExpression = SqlObjectCreateScalarExpression.Create(); + SqlObjectCreateScalarExpression objectCreateScalarExpression = SqlObjectCreateScalarExpression.Create(null); SqlBinaryScalarExpression fivePlusThree = SqlBinaryScalarExpression.Create(SqlBinaryScalarOperatorKind.Add, five, three); AssertEvaluation(CosmosNumber64.Create(3 + 5), fivePlusThree); @@ -471,6 +471,7 @@ public void SqlObjectCreateScalarExpressionTest() }); SqlObjectCreateScalarExpression john = SqlObjectCreateScalarExpression.Create( + null, SqlObjectProperty.Create(SqlPropertyName.Create("name"), SqlLiteralScalarExpression.Create(SqlStringLiteral.Create("John")))); AssertEvaluation(expected, john); diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/SqlObjects/SqlObjectVisitorBaselineTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/SqlObjects/SqlObjectVisitorBaselineTests.cs index 9f5f249237..b8cd525397 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/SqlObjects/SqlObjectVisitorBaselineTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/SqlObjects/SqlObjectVisitorBaselineTests.cs @@ -180,11 +180,12 @@ public void SqlScalarExpression() inputs.Add(new SqlObjectVisitorInput( nameof(SqlObjectCreateScalarExpression) + " Empty", - SqlObjectCreateScalarExpression.Create())); + SqlObjectCreateScalarExpression.Create(null))); inputs.Add(new SqlObjectVisitorInput( nameof(SqlObjectCreateScalarExpression) + " OneProperty", SqlObjectCreateScalarExpression.Create( + null, SqlObjectProperty.Create( SqlPropertyName.Create("Hello"), SqlLiteralScalarExpression.Create(SqlStringLiteral.Create("World")))))); @@ -192,6 +193,7 @@ public void SqlScalarExpression() inputs.Add(new SqlObjectVisitorInput( nameof(SqlObjectCreateScalarExpression) + " MultiProperty", SqlObjectCreateScalarExpression.Create( + null, SqlObjectProperty.Create( SqlPropertyName.Create("Hello"), SqlLiteralScalarExpression.Create(SqlStringLiteral.Create("World"))), From e186f37aa48312d051daddf0356c9a94ce757396 Mon Sep 17 00:00:00 2001 From: Minh Le Date: Mon, 22 Aug 2022 14:00:11 -0700 Subject: [PATCH 02/12] Provide serializer fix --- .../src/Linq/ExpressionToSQL.cs | 17 +++++++++++++++++ .../Resource/Container/ContainerCore.Items.cs | 7 +++++-- .../Serializer/CosmosLinqSerializerOptions.cs | 7 ++----- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs b/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs index fca4b5fcba..dca42bd365 100644 --- a/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs +++ b/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs @@ -10,6 +10,7 @@ namespace Microsoft.Azure.Cosmos.Linq using System.Collections.ObjectModel; using System.Diagnostics; using System.Globalization; + using System.IO; using System.Linq; using System.Linq.Expressions; using System.Reflection; @@ -712,6 +713,22 @@ public static SqlScalarExpression VisitConstant(ConstantExpression inputExpressi return SqlArrayCreateScalarExpression.Create(arrayItems.ToImmutableArray()); } + if (context.linqSerializerOptions?.CustomerCosmosSerializer != null) + { + StringWriter writer = new StringWriter(CultureInfo.InvariantCulture); + + // Use the user serializer for the parameter values so custom conversions are correctly handled + using (Stream str = context.linqSerializerOptions.CustomerCosmosSerializer.ToStream(inputExpression.Value)) + { + using (StreamReader streamReader = new StreamReader(str)) + { + string propertyValue = streamReader.ReadToEnd(); + writer.Write(propertyValue); + return CosmosElement.Parse(writer.ToString()).Accept(CosmosElementToSqlScalarExpressionVisitor.Singleton); + } + } + } + return CosmosElement.Parse(JsonConvert.SerializeObject(inputExpression.Value)).Accept(CosmosElementToSqlScalarExpressionVisitor.Singleton); } diff --git a/Microsoft.Azure.Cosmos/src/Resource/Container/ContainerCore.Items.cs b/Microsoft.Azure.Cosmos/src/Resource/Container/ContainerCore.Items.cs index f1054e8f1f..e47d310bab 100644 --- a/Microsoft.Azure.Cosmos/src/Resource/Container/ContainerCore.Items.cs +++ b/Microsoft.Azure.Cosmos/src/Resource/Container/ContainerCore.Items.cs @@ -503,11 +503,14 @@ public override IOrderedQueryable GetItemLinqQueryable( { requestOptions ??= new QueryRequestOptions(); - if (linqSerializerOptions == null && this.ClientContext.ClientOptions.SerializerOptions != null) + if (linqSerializerOptions == null && this.ClientContext.ClientOptions != null) { linqSerializerOptions = new CosmosLinqSerializerOptions { - PropertyNamingPolicy = this.ClientContext.ClientOptions.SerializerOptions.PropertyNamingPolicy + PropertyNamingPolicy = this.ClientContext.ClientOptions.SerializerOptions != null + ? this.ClientContext.ClientOptions.SerializerOptions.PropertyNamingPolicy + : CosmosPropertyNamingPolicy.Default, + CustomerCosmosSerializer = this.ClientContext.ClientOptions.Serializer }; } diff --git a/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs b/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs index 71cc70c74e..a025f901c9 100644 --- a/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs +++ b/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs @@ -20,9 +20,7 @@ public sealed class CosmosLinqSerializerOptions public CosmosLinqSerializerOptions() { this.PropertyNamingPolicy = CosmosPropertyNamingPolicy.Default; - this.CustomerCosmosSerializer = CosmosSqlQuerySpecJsonConverter.CreateSqlQuerySpecSerializer( - cosmosSerializer: null, - propertiesSerializer: new CosmosJsonSerializerWrapper(new CosmosJsonDotNetSerializer())); + this.CustomerCosmosSerializer = null; } /// @@ -39,8 +37,7 @@ public CosmosLinqSerializerOptions() /// then the value is set to the default value /// /// - /// The default value of CustomerCosmosSerializer.cosmosSerializer is null - /// The default value of CustomerCosmosSerializer.propertiesSerializer is CosmosJsonDotNetSerializer + /// The default value is null /// public CosmosSerializer CustomerCosmosSerializer { get; set; } } From b1eae2a79b80430eeecf9ce9836ce26f23104366 Mon Sep 17 00:00:00 2001 From: Minh Le Date: Wed, 24 Aug 2022 11:21:11 -0700 Subject: [PATCH 03/12] Clean up code change --- .../src/Linq/ExpressionToSQL.cs | 10 +- .../src/Linq/GeometrySqlExpressionFactory.cs | 2 +- .../src/Linq/SqlExpressionManipulation.cs | 1 - .../src/Query/Core/Parser/CstToAstVisitor.cs | 2 +- .../SqlObjectCreateScalarExpression.cs | 23 +-- .../Visitors/SqlObjectObfuscator.cs | 2 +- ...BaselineTests.TestLiteralSerialization.xml | 2 +- .../LinqTestsCommon.cs | 4 +- .../LinqTranslationBaselineTests.cs | 2 +- ...TranslationWithCustomSerializerBaseline.cs | 161 ++++++++++++++++++ ...sitorBaselineTests.SqlScalarExpression.xml | 9 +- .../Contracts/DotNetSDKAPI.json | 19 +++ 12 files changed, 200 insertions(+), 37 deletions(-) create mode 100644 Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs diff --git a/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs b/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs index dca42bd365..76da936b03 100644 --- a/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs +++ b/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs @@ -718,9 +718,9 @@ public static SqlScalarExpression VisitConstant(ConstantExpression inputExpressi StringWriter writer = new StringWriter(CultureInfo.InvariantCulture); // Use the user serializer for the parameter values so custom conversions are correctly handled - using (Stream str = context.linqSerializerOptions.CustomerCosmosSerializer.ToStream(inputExpression.Value)) + using (Stream stream = context.linqSerializerOptions.CustomerCosmosSerializer.ToStream(inputExpression.Value)) { - using (StreamReader streamReader = new StreamReader(str)) + using (StreamReader streamReader = new StreamReader(stream)) { string propertyValue = streamReader.ReadToEnd(); writer.Write(propertyValue); @@ -872,7 +872,7 @@ private static SqlScalarExpression VisitNew(NewExpression inputExpression, Trans } SqlObjectProperty[] propertyBindings = ExpressionToSql.CreateInitializers(inputExpression.Arguments, inputExpression.Members, context); - SqlObjectCreateScalarExpression create = SqlObjectCreateScalarExpression.Create(context.linqSerializerOptions?.CustomerCosmosSerializer, propertyBindings); + SqlObjectCreateScalarExpression create = SqlObjectCreateScalarExpression.Create(propertyBindings); return create; } else @@ -886,7 +886,7 @@ private static SqlScalarExpression VisitMemberInit(MemberInitExpression inputExp { ExpressionToSql.VisitNew(inputExpression.NewExpression, context); // Return value is ignored SqlObjectProperty[] propertyBindings = ExpressionToSql.VisitBindingList(inputExpression.Bindings, context); - SqlObjectCreateScalarExpression create = SqlObjectCreateScalarExpression.Create(context.linqSerializerOptions?.CustomerCosmosSerializer, propertyBindings); + SqlObjectCreateScalarExpression create = SqlObjectCreateScalarExpression.Create(propertyBindings); return create; } @@ -2021,7 +2021,7 @@ public SqlScalarExpression Visit(CosmosObject cosmosObject) properties.Add(property); } - return SqlObjectCreateScalarExpression.Create(null, properties.ToImmutableArray()); + return SqlObjectCreateScalarExpression.Create(properties.ToImmutableArray()); } public SqlScalarExpression Visit(CosmosString cosmosString) diff --git a/Microsoft.Azure.Cosmos/src/Linq/GeometrySqlExpressionFactory.cs b/Microsoft.Azure.Cosmos/src/Linq/GeometrySqlExpressionFactory.cs index b62f1961c1..610c3f1b5f 100644 --- a/Microsoft.Azure.Cosmos/src/Linq/GeometrySqlExpressionFactory.cs +++ b/Microsoft.Azure.Cosmos/src/Linq/GeometrySqlExpressionFactory.cs @@ -87,7 +87,7 @@ private static SqlScalarExpression FromJToken(JToken jToken) FromJToken(p.Value))) .ToArray(); - return SqlObjectCreateScalarExpression.Create(null, properties); + return SqlObjectCreateScalarExpression.Create(properties); case JTokenType.Float: case JTokenType.Integer: diff --git a/Microsoft.Azure.Cosmos/src/Linq/SqlExpressionManipulation.cs b/Microsoft.Azure.Cosmos/src/Linq/SqlExpressionManipulation.cs index c415330a61..c6b4f5de45 100644 --- a/Microsoft.Azure.Cosmos/src/Linq/SqlExpressionManipulation.cs +++ b/Microsoft.Azure.Cosmos/src/Linq/SqlExpressionManipulation.cs @@ -67,7 +67,6 @@ public static SqlScalarExpression Substitute(SqlScalarExpression replacement, Sq case SqlObjectCreateScalarExpression objExp: { return SqlObjectCreateScalarExpression.Create( - null, objExp .Properties .Select(prop => SqlObjectProperty.Create(prop.Name, Substitute(replacement, toReplace, prop.Value))) diff --git a/Microsoft.Azure.Cosmos/src/Query/Core/Parser/CstToAstVisitor.cs b/Microsoft.Azure.Cosmos/src/Query/Core/Parser/CstToAstVisitor.cs index ca1d60438d..6b1de2883e 100644 --- a/Microsoft.Azure.Cosmos/src/Query/Core/Parser/CstToAstVisitor.cs +++ b/Microsoft.Azure.Cosmos/src/Query/Core/Parser/CstToAstVisitor.cs @@ -690,7 +690,7 @@ public override SqlObject VisitObjectCreateScalarExpression([NotNull] sqlParser. } } - return SqlObjectCreateScalarExpression.Create(null, properties.ToImmutableArray()); + return SqlObjectCreateScalarExpression.Create(properties.ToImmutableArray()); } public override SqlObject VisitObject_property([NotNull] sqlParser.Object_propertyContext context) diff --git a/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs b/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs index bb2aafe200..ddd1ae8ce5 100644 --- a/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs +++ b/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs @@ -19,7 +19,7 @@ namespace Microsoft.Azure.Cosmos.SqlObjects #endif sealed class SqlObjectCreateScalarExpression : SqlScalarExpression { - private SqlObjectCreateScalarExpression(ImmutableArray properties, CosmosSerializer userSerializer = null) + private SqlObjectCreateScalarExpression(ImmutableArray properties) { if (properties == null) { @@ -35,16 +35,15 @@ private SqlObjectCreateScalarExpression(ImmutableArray proper } this.Properties = properties; - this.UserSerializer = userSerializer; //nullable } public ImmutableArray Properties { get; } public CosmosSerializer UserSerializer { get; } - public static SqlObjectCreateScalarExpression Create(CosmosSerializer userSerializer, params SqlObjectProperty[] properties) => new SqlObjectCreateScalarExpression(properties.ToImmutableArray(), userSerializer); + public static SqlObjectCreateScalarExpression Create(params SqlObjectProperty[] properties) => new SqlObjectCreateScalarExpression(properties.ToImmutableArray()); - public static SqlObjectCreateScalarExpression Create(CosmosSerializer userSerializer, ImmutableArray properties) => new SqlObjectCreateScalarExpression(properties, userSerializer); + public static SqlObjectCreateScalarExpression Create(ImmutableArray properties) => new SqlObjectCreateScalarExpression(properties); public override void Accept(SqlObjectVisitor visitor) => visitor.Visit(this); @@ -60,22 +59,6 @@ private SqlObjectCreateScalarExpression(ImmutableArray proper public override string ToString() { - if (this.UserSerializer != null) - { - StringWriter writer = new StringWriter(CultureInfo.InvariantCulture); - - // Use the user serializer for the parameter values so custom conversions are correctly handled - using (Stream str = this.UserSerializer.ToStream(this.Properties)) - { - using (StreamReader streamReader = new StreamReader(str)) - { - string propertyValue = streamReader.ReadToEnd(); - writer.Write(propertyValue); - return writer.ToString(); - } - } - } - return base.ToString(); } } diff --git a/Microsoft.Azure.Cosmos/src/SqlObjects/Visitors/SqlObjectObfuscator.cs b/Microsoft.Azure.Cosmos/src/SqlObjects/Visitors/SqlObjectObfuscator.cs index 50f8c43f47..7fa52c4437 100644 --- a/Microsoft.Azure.Cosmos/src/SqlObjects/Visitors/SqlObjectObfuscator.cs +++ b/Microsoft.Azure.Cosmos/src/SqlObjects/Visitors/SqlObjectObfuscator.cs @@ -238,7 +238,7 @@ public override SqlObject Visit(SqlObjectCreateScalarExpression sqlObjectCreateS properties.Add(property.Accept(this) as SqlObjectProperty); } - return SqlObjectCreateScalarExpression.Create(null, properties.ToImmutableArray()); + return SqlObjectCreateScalarExpression.Create(properties.ToImmutableArray()); } public override SqlObject Visit(SqlObjectProperty sqlObjectProperty) diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationBaselineTests.TestLiteralSerialization.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationBaselineTests.TestLiteralSerialization.xml index c4c2fb38dd..b72807f399 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationBaselineTests.TestLiteralSerialization.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationBaselineTests.TestLiteralSerialization.xml @@ -435,7 +435,7 @@ FROM root]]> diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTestsCommon.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTestsCommon.cs index 5907d861fc..2b8f5c2d4a 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTestsCommon.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTestsCommon.cs @@ -455,9 +455,7 @@ Family createDataObj(Random random) return getQuery; } - public static Func> GenerateSimpleCosmosData( - Cosmos.Database cosmosDatabase - ) + public static Func> GenerateSimpleCosmosData(Cosmos.Database cosmosDatabase) { const int DocumentCount = 10; PartitionKeyDefinition partitionKeyDefinition = new PartitionKeyDefinition { Paths = new System.Collections.ObjectModel.Collection(new[] { "/Pk" }), Kind = PartitionKind.Hash }; diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationBaselineTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationBaselineTests.cs index d4b411b067..86bf5ede7a 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationBaselineTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationBaselineTests.cs @@ -1,5 +1,5 @@ //----------------------------------------------------------------------- -// +// // Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs new file mode 100644 index 0000000000..999f699660 --- /dev/null +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs @@ -0,0 +1,161 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +//----------------------------------------------------------------------- +namespace Microsoft.Azure.Cosmos.Services.Management.Tests.LinqProviderTests +{ + using BaselineTest; + using Microsoft.Azure.Cosmos.Linq; + using Microsoft.Azure.Cosmos.Spatial; + using Microsoft.VisualStudio.TestTools.UnitTesting; + using System; + using System.Collections.Generic; + using System.Globalization; + using System.Linq; + using System.Linq.Dynamic; + using System.Text; + using System.Text.Json; + using Microsoft.Azure.Documents; + using Microsoft.Azure.Cosmos.SDK.EmulatorTests; + using System.Threading.Tasks; + using global::Azure.Core.Serialization; + using System.IO; + using System.Text.Json.Serialization; + + [Microsoft.Azure.Cosmos.SDK.EmulatorTests.TestClass] + public class LinqTranslationWithCustomSerializerBaseline : BaselineTests + { + private static CosmosClient cosmosClient; + private static Cosmos.Database testDb; + private static Container testContainer; + + [ClassInitialize] + public async static Task Initialize(TestContext textContext) + { + string authKey = Utils.ConfigurationManager.AppSettings["MasterKey"]; + Uri uri = new Uri(Utils.ConfigurationManager.AppSettings["GatewayEndpoint"]); + ConnectionPolicy connectionPolicy = new ConnectionPolicy + { + ConnectionMode = ConnectionMode.Gateway, + EnableEndpointDiscovery = true, + }; + + cosmosClient = TestCommon.CreateCosmosClient((cosmosClientBuilder) + => cosmosClientBuilder.WithCustomSerializer(new SystemTextJsonSerializer(new JsonSerializerOptions())).WithConnectionModeGateway()); + + string dbName = $"{nameof(LinqTranslationBaselineTests)}-{Guid.NewGuid().ToString("N")}"; + testDb = await cosmosClient.CreateDatabaseAsync(dbName); + } + + [ClassCleanup] + public async static Task CleanUp() + { + if (testDb != null) + { + await testDb.DeleteStreamAsync(); + } + } + + [TestInitialize] + public async Task TestInitialize() + { + testContainer = await testDb.CreateContainerAsync(new ContainerProperties(id: Guid.NewGuid().ToString(), partitionKeyPath: "/Pk")); + } + + [TestCleanup] + public async Task TestCleanUp() + { + await testContainer.DeleteContainerStreamAsync(); + } + + // Custom serializer that uses System.Text.Json.JsonSerializer instead of NewtonsoftJson.JsonSerializer + private class SystemTextJsonSerializer : CosmosSerializer + { + private readonly JsonObjectSerializer systemTextJsonSerializer; + + public SystemTextJsonSerializer(JsonSerializerOptions jsonSerializerOptions) + { + this.systemTextJsonSerializer = new JsonObjectSerializer(jsonSerializerOptions); + } + + public override T FromStream(Stream stream) + { + if (stream == null) + throw new ArgumentNullException(nameof(stream)); + + using (stream) + { + if (stream.CanSeek && stream.Length == 0) + { + return default; + } + + if (typeof(Stream).IsAssignableFrom(typeof(T))) + { + return (T)(object)stream; + } + + return (T)this.systemTextJsonSerializer.Deserialize(stream, typeof(T), default); + } + } + + public override Stream ToStream(T input) + { + MemoryStream streamPayload = new MemoryStream(); + this.systemTextJsonSerializer.Serialize(streamPayload, input, typeof(T), default); + streamPayload.Position = 0; + return streamPayload; + } + } + + internal class DataObject : LinqTestObject + { + [JsonPropertyName("number")] + public double NumericField { get; set; } + + [JsonPropertyName("String_value")] + public string StringField { get; set; } + + [JsonPropertyName("id")] + public string Id { get; set; } + + [JsonPropertyName("Pk")] + public string Pk { get; set; } + } + + [TestMethod] + public void TestMemberInitializer() + { + const int Records = 100; + const int NumAbsMax = 500; + const int MaxStringLength = 100; + DataObject createDataObj(Random random) + { + DataObject obj = new DataObject + { + NumericField = random.Next(NumAbsMax * 2) - NumAbsMax, + StringField = LinqTestsCommon.RandomString(random, random.Next(MaxStringLength)), + Id = Guid.NewGuid().ToString(), + Pk = "Test" + }; + return obj; + } + Func> getQuery = LinqTestsCommon.GenerateTestCosmosData(createDataObj, Records, testContainer); + + List inputs = new List + { + new LinqTestInput("Select w/ DataObject initializer", b => getQuery(b).Select(doc => new DataObject() { NumericField = doc.NumericField, StringField = doc.StringField })), + new LinqTestInput("Filter w/ DataObject initializer with constant value", b => getQuery(b).Where(doc => doc == new DataObject() { NumericField = 12, StringField = "12" })), + new LinqTestInput("Filter w/ DataObject initializer with member initialization", b => getQuery(b).Where(doc => doc == new DataObject() { NumericField = doc.NumericField, StringField = doc.StringField })) + }; + this.ExecuteTestSuite(inputs); + } + + + public override LinqTestOutput ExecuteTest(LinqTestInput input) + { + return LinqTestsCommon.ExecuteTest(input); + } + } +} \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/SqlObjectVisitorBaselineTests.SqlScalarExpression.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/SqlObjectVisitorBaselineTests.SqlScalarExpression.xml index 12f955ea05..3dca91ff59 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/SqlObjectVisitorBaselineTests.SqlScalarExpression.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/SqlObjectVisitorBaselineTests.SqlScalarExpression.xml @@ -298,7 +298,8 @@ SqlObjectCreateScalarExpression Empty @@ -325,7 +326,8 @@ } } } - ] + ], + "UserSerializer": null }]]> @@ -372,7 +374,8 @@ } } } - ] + ], + "UserSerializer": null }]]> diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json index f97055c667..18f0b3a57a 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json @@ -3244,11 +3244,30 @@ "Attributes": [], "MethodInfo": "Microsoft.Azure.Cosmos.CosmosPropertyNamingPolicy PropertyNamingPolicy;CanRead:True;CanWrite:True;Microsoft.Azure.Cosmos.CosmosPropertyNamingPolicy get_PropertyNamingPolicy();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_PropertyNamingPolicy(Microsoft.Azure.Cosmos.CosmosPropertyNamingPolicy);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" }, + "Microsoft.Azure.Cosmos.CosmosSerializer CustomerCosmosSerializer": { + "Type": "Property", + "Attributes": [], + "MethodInfo": "Microsoft.Azure.Cosmos.CosmosSerializer CustomerCosmosSerializer;CanRead:True;CanWrite:True;Microsoft.Azure.Cosmos.CosmosSerializer get_CustomerCosmosSerializer();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_CustomerCosmosSerializer(Microsoft.Azure.Cosmos.CosmosSerializer);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "Microsoft.Azure.Cosmos.CosmosSerializer get_CustomerCosmosSerializer()[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Type": "Method", + "Attributes": [ + "CompilerGeneratedAttribute" + ], + "MethodInfo": "Microsoft.Azure.Cosmos.CosmosSerializer get_CustomerCosmosSerializer();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, "Void .ctor()": { "Type": "Constructor", "Attributes": [], "MethodInfo": "[Void .ctor(), Void .ctor()]" }, + "Void set_CustomerCosmosSerializer(Microsoft.Azure.Cosmos.CosmosSerializer)[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Type": "Method", + "Attributes": [ + "CompilerGeneratedAttribute" + ], + "MethodInfo": "Void set_CustomerCosmosSerializer(Microsoft.Azure.Cosmos.CosmosSerializer);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, "Void set_PropertyNamingPolicy(Microsoft.Azure.Cosmos.CosmosPropertyNamingPolicy)[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { "Type": "Method", "Attributes": [ From 13da7af125a5684933932b12d75b045471b718db Mon Sep 17 00:00:00 2001 From: Minh Le Date: Wed, 24 Aug 2022 12:06:43 -0700 Subject: [PATCH 04/12] more clean up, removing the ToString from SqlObjectCreate fix --- .../SqlObjectCreateScalarExpression.cs | 7 ------ ...rializerBaseline.TestMemberInitializer.xml | 25 +++++++++++++++++++ ...TranslationWithCustomSerializerBaseline.cs | 7 ++++-- ...sitorBaselineTests.SqlScalarExpression.xml | 9 +++---- .../Pagination/InMemoryContainer.cs | 2 +- .../AggregateProjectionTransformer.cs | 4 +-- .../JTokenToSqlScalarExpression.cs | 2 +- .../ScalarExpressionEvaluatorTests.cs | 2 +- .../SqlObjectVisitorBaselineTests.cs | 4 +-- 9 files changed, 39 insertions(+), 23 deletions(-) create mode 100644 Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationWithCustomSerializerBaseline.TestMemberInitializer.xml diff --git a/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs b/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs index ddd1ae8ce5..80ef8988f9 100644 --- a/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs +++ b/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs @@ -39,8 +39,6 @@ private SqlObjectCreateScalarExpression(ImmutableArray proper public ImmutableArray Properties { get; } - public CosmosSerializer UserSerializer { get; } - public static SqlObjectCreateScalarExpression Create(params SqlObjectProperty[] properties) => new SqlObjectCreateScalarExpression(properties.ToImmutableArray()); public static SqlObjectCreateScalarExpression Create(ImmutableArray properties) => new SqlObjectCreateScalarExpression(properties); @@ -56,10 +54,5 @@ private SqlObjectCreateScalarExpression(ImmutableArray proper public override TResult Accept(SqlScalarExpressionVisitor visitor) => visitor.Visit(this); public override TResult Accept(SqlScalarExpressionVisitor visitor, T input) => visitor.Visit(this, input); - - public override string ToString() - { - return base.ToString(); - } } } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationWithCustomSerializerBaseline.TestMemberInitializer.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationWithCustomSerializerBaseline.TestMemberInitializer.xml new file mode 100644 index 0000000000..1662e2cc6d --- /dev/null +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationWithCustomSerializerBaseline.TestMemberInitializer.xml @@ -0,0 +1,25 @@ + + + + + (doc == new DataObject() {NumericField = 12, StringField = "12"}))]]> + + + + + + + + + new DataObject() {NumericField = 12, StringField = "12"})]]> + + + + + + \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs index 999f699660..8f5b88d7b1 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs @@ -145,9 +145,12 @@ DataObject createDataObj(Random random) List inputs = new List { - new LinqTestInput("Select w/ DataObject initializer", b => getQuery(b).Select(doc => new DataObject() { NumericField = doc.NumericField, StringField = doc.StringField })), new LinqTestInput("Filter w/ DataObject initializer with constant value", b => getQuery(b).Where(doc => doc == new DataObject() { NumericField = 12, StringField = "12" })), - new LinqTestInput("Filter w/ DataObject initializer with member initialization", b => getQuery(b).Where(doc => doc == new DataObject() { NumericField = doc.NumericField, StringField = doc.StringField })) + new LinqTestInput("Select w/ DataObject initializer", b => getQuery(b).Select(doc => new DataObject() { NumericField = 12, StringField = "12" })) + + // Negative test case: serializing only field name using custom serializer not currently supported + //new LinqTestInput("Select w/ DataObject initializer", b => getQuery(b).Select(doc => new DataObject() { NumericField = doc.NumericField, StringField = doc.StringField })), + //new LinqTestInput("Filter w/ DataObject initializer with member initialization", b => getQuery(b).Where(doc => doc == new DataObject() { NumericField = doc.NumericField, StringField = doc.StringField })) }; this.ExecuteTestSuite(inputs); } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/SqlObjectVisitorBaselineTests.SqlScalarExpression.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/SqlObjectVisitorBaselineTests.SqlScalarExpression.xml index 3dca91ff59..12f955ea05 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/SqlObjectVisitorBaselineTests.SqlScalarExpression.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/BaselineTest/TestBaseline/SqlObjectVisitorBaselineTests.SqlScalarExpression.xml @@ -298,8 +298,7 @@ SqlObjectCreateScalarExpression Empty @@ -326,8 +325,7 @@ } } } - ], - "UserSerializer": null + ] }]]> @@ -374,8 +372,7 @@ } } } - ], - "UserSerializer": null + ] }]]> diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Pagination/InMemoryContainer.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Pagination/InMemoryContainer.cs index 230734419e..e2aa61a094 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Pagination/InMemoryContainer.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Pagination/InMemoryContainer.cs @@ -1501,7 +1501,7 @@ public SqlScalarExpression Visit(CosmosObject cosmosObject) properties.Add(property); } - return SqlObjectCreateScalarExpression.Create(null, properties.ToImmutableArray()); + return SqlObjectCreateScalarExpression.Create(properties.ToImmutableArray()); } public SqlScalarExpression Visit(CosmosString cosmosString) diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngine/AggregateProjectionTransformer.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngine/AggregateProjectionTransformer.cs index a47ea6a18e..15411612f1 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngine/AggregateProjectionTransformer.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngine/AggregateProjectionTransformer.cs @@ -312,7 +312,7 @@ public override SqlScalarExpression Visit(SqlObjectCreateScalarExpression sqlObj properties.Add(SqlObjectProperty.Create(property.Name, property.Value.Accept(this))); } - return SqlObjectCreateScalarExpression.Create(null, properties.ToImmutableArray()); + return SqlObjectCreateScalarExpression.Create(properties.ToImmutableArray()); } public override SqlScalarExpression Visit(SqlParameterRefScalarExpression scalarExpression) @@ -402,7 +402,7 @@ public SqlScalarExpression Visit(CosmosObject cosmosObject) properties.Add(property); } - return SqlObjectCreateScalarExpression.Create(null, properties.ToImmutableArray()); + return SqlObjectCreateScalarExpression.Create(properties.ToImmutableArray()); } public SqlScalarExpression Visit(CosmosString cosmosString) diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/JTokenToSqlScalarExpression.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/JTokenToSqlScalarExpression.cs index 180de53a24..f9d5251d66 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/JTokenToSqlScalarExpression.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/JTokenToSqlScalarExpression.cs @@ -75,7 +75,7 @@ public static SqlScalarExpression Convert(JToken token) properties.Add(property); } - return SqlObjectCreateScalarExpression.Create(null, properties.ToArray()); + return SqlObjectCreateScalarExpression.Create(properties.ToArray()); } case JTokenType.String: diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/ScalarExpressionEvaluatorTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/ScalarExpressionEvaluatorTests.cs index 58daccf02b..71060264af 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/ScalarExpressionEvaluatorTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/ScalarExpressionEvaluatorTests.cs @@ -140,7 +140,7 @@ public void SqlBinaryScalarExpressionTest() SqlArrayCreateScalarExpression arrayCreateScalarExpresion1 = SqlArrayCreateScalarExpression.Create(); SqlArrayCreateScalarExpression arrayCreateScalarExpresion2 = SqlArrayCreateScalarExpression.Create(five); - SqlObjectCreateScalarExpression objectCreateScalarExpression = SqlObjectCreateScalarExpression.Create(null); + SqlObjectCreateScalarExpression objectCreateScalarExpression = SqlObjectCreateScalarExpression.Create(); SqlBinaryScalarExpression fivePlusThree = SqlBinaryScalarExpression.Create(SqlBinaryScalarOperatorKind.Add, five, three); AssertEvaluation(CosmosNumber64.Create(3 + 5), fivePlusThree); diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/SqlObjects/SqlObjectVisitorBaselineTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/SqlObjects/SqlObjectVisitorBaselineTests.cs index b8cd525397..9f5f249237 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/SqlObjects/SqlObjectVisitorBaselineTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/SqlObjects/SqlObjectVisitorBaselineTests.cs @@ -180,12 +180,11 @@ public void SqlScalarExpression() inputs.Add(new SqlObjectVisitorInput( nameof(SqlObjectCreateScalarExpression) + " Empty", - SqlObjectCreateScalarExpression.Create(null))); + SqlObjectCreateScalarExpression.Create())); inputs.Add(new SqlObjectVisitorInput( nameof(SqlObjectCreateScalarExpression) + " OneProperty", SqlObjectCreateScalarExpression.Create( - null, SqlObjectProperty.Create( SqlPropertyName.Create("Hello"), SqlLiteralScalarExpression.Create(SqlStringLiteral.Create("World")))))); @@ -193,7 +192,6 @@ public void SqlScalarExpression() inputs.Add(new SqlObjectVisitorInput( nameof(SqlObjectCreateScalarExpression) + " MultiProperty", SqlObjectCreateScalarExpression.Create( - null, SqlObjectProperty.Create( SqlPropertyName.Create("Hello"), SqlLiteralScalarExpression.Create(SqlStringLiteral.Create("World"))), From e6e2a1d782a6c7cfc3e5781db6154d0b7ddbb052 Mon Sep 17 00:00:00 2001 From: Minh Le Date: Wed, 24 Aug 2022 12:23:40 -0700 Subject: [PATCH 05/12] undo some old changes that no longer apply --- .../src/SqlObjects/SqlObjectCreateScalarExpression.cs | 5 +---- .../OfflineEngineTests/ScalarExpressionEvaluatorTests.cs | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs b/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs index 80ef8988f9..fda6076791 100644 --- a/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs +++ b/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs @@ -6,9 +6,6 @@ namespace Microsoft.Azure.Cosmos.SqlObjects using System; using System.Collections.Generic; using System.Collections.Immutable; - using System.Globalization; - using System.IO; - using Microsoft.Azure.Cosmos.Query.Core; using Microsoft.Azure.Cosmos.SqlObjects.Visitors; #if INTERNAL #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member @@ -17,7 +14,7 @@ namespace Microsoft.Azure.Cosmos.SqlObjects #else internal #endif - sealed class SqlObjectCreateScalarExpression : SqlScalarExpression + sealed class f : SqlScalarExpression { private SqlObjectCreateScalarExpression(ImmutableArray properties) { diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/ScalarExpressionEvaluatorTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/ScalarExpressionEvaluatorTests.cs index 71060264af..8b404b4eaa 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/ScalarExpressionEvaluatorTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/OfflineEngineTests/ScalarExpressionEvaluatorTests.cs @@ -471,7 +471,6 @@ public void SqlObjectCreateScalarExpressionTest() }); SqlObjectCreateScalarExpression john = SqlObjectCreateScalarExpression.Create( - null, SqlObjectProperty.Create(SqlPropertyName.Create("name"), SqlLiteralScalarExpression.Create(SqlStringLiteral.Create("John")))); AssertEvaluation(expected, john); From 46f4ff9d72726c7b78edda523c1a5b88c0a04ac9 Mon Sep 17 00:00:00 2001 From: Minh Le Date: Thu, 25 Aug 2022 16:25:33 -0700 Subject: [PATCH 06/12] revert accidental change --- .../src/SqlObjects/SqlObjectCreateScalarExpression.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs b/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs index fda6076791..8876d64a02 100644 --- a/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs +++ b/Microsoft.Azure.Cosmos/src/SqlObjects/SqlObjectCreateScalarExpression.cs @@ -7,6 +7,7 @@ namespace Microsoft.Azure.Cosmos.SqlObjects using System.Collections.Generic; using System.Collections.Immutable; using Microsoft.Azure.Cosmos.SqlObjects.Visitors; + #if INTERNAL #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member #pragma warning disable SA1600 // Elements should be documented @@ -14,7 +15,7 @@ namespace Microsoft.Azure.Cosmos.SqlObjects #else internal #endif - sealed class f : SqlScalarExpression + sealed class SqlObjectCreateScalarExpression : SqlScalarExpression { private SqlObjectCreateScalarExpression(ImmutableArray properties) { From d47b8bac177260d8b807b02f045e5b336e9fcd34 Mon Sep 17 00:00:00 2001 From: Minh Le Date: Mon, 10 Oct 2022 11:21:51 -0700 Subject: [PATCH 07/12] Address code reivew --- .../Serializer/CosmosLinqSerializerOptions.cs | 1 - ...rializerBaseline.TestMemberInitializer.xml | 35 +++++++++++++++++++ ...TranslationWithCustomSerializerBaseline.cs | 11 +++--- ...icrosoft.Azure.Cosmos.EmulatorTests.csproj | 4 +++ 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs b/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs index a025f901c9..152952a12b 100644 --- a/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs +++ b/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs @@ -20,7 +20,6 @@ public sealed class CosmosLinqSerializerOptions public CosmosLinqSerializerOptions() { this.PropertyNamingPolicy = CosmosPropertyNamingPolicy.Default; - this.CustomerCosmosSerializer = null; } /// diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationWithCustomSerializerBaseline.TestMemberInitializer.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationWithCustomSerializerBaseline.TestMemberInitializer.xml index 1662e2cc6d..38f60a19ae 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationWithCustomSerializerBaseline.TestMemberInitializer.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationWithCustomSerializerBaseline.TestMemberInitializer.xml @@ -22,4 +22,39 @@ SELECT VALUE {"number": 12, "String_value": "12", "id": null, "Pk": null} FROM root]]> + + + + IIF((doc.NumericField > 12), new DataObject() {NumericField = 12, StringField = "12"}, new DataObject() {NumericField = 12, StringField = "12"}))]]> + + + 12) ? {"number": 12, "String_value": "12", "id": null, "Pk": null} : {"number": 12, "String_value": "12", "id": null, "Pk": null}) +FROM root]]> + + + + + + new DataObject() {NumericField = doc.NumericField, StringField = doc.StringField})]]> + + + + + + + + + + (doc == new DataObject() {NumericField = doc.NumericField, StringField = doc.StringField}))]]> + + + + + \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs index 8f5b88d7b1..646efcf2cf 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs @@ -134,8 +134,8 @@ DataObject createDataObj(Random random) { DataObject obj = new DataObject { - NumericField = random.Next(NumAbsMax * 2) - NumAbsMax, - StringField = LinqTestsCommon.RandomString(random, random.Next(MaxStringLength)), + NumericField = 1, + StringField = "a", Id = Guid.NewGuid().ToString(), Pk = "Test" }; @@ -146,11 +146,12 @@ DataObject createDataObj(Random random) List inputs = new List { new LinqTestInput("Filter w/ DataObject initializer with constant value", b => getQuery(b).Where(doc => doc == new DataObject() { NumericField = 12, StringField = "12" })), - new LinqTestInput("Select w/ DataObject initializer", b => getQuery(b).Select(doc => new DataObject() { NumericField = 12, StringField = "12" })) + new LinqTestInput("Select w/ DataObject initializer", b => getQuery(b).Select(doc => new DataObject() { NumericField = 12, StringField = "12" })), + new LinqTestInput("Deeper than top level reference", b => getQuery(b).Select(doc => doc.NumericField > 12 ? new DataObject() { NumericField = 12, StringField = "12" } : new DataObject() { NumericField = 12, StringField = "12" })), + // Negative test case: serializing only field name using custom serializer not currently supported - //new LinqTestInput("Select w/ DataObject initializer", b => getQuery(b).Select(doc => new DataObject() { NumericField = doc.NumericField, StringField = doc.StringField })), - //new LinqTestInput("Filter w/ DataObject initializer with member initialization", b => getQuery(b).Where(doc => doc == new DataObject() { NumericField = doc.NumericField, StringField = doc.StringField })) + new LinqTestInput("Filter w/ DataObject initializer with member initialization", b => getQuery(b).Where(doc => doc == new DataObject() { NumericField = doc.NumericField, StringField = doc.StringField }).Select(b => "A")) }; this.ExecuteTestSuite(inputs); } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Microsoft.Azure.Cosmos.EmulatorTests.csproj b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Microsoft.Azure.Cosmos.EmulatorTests.csproj index 89e3b69291..a0e6d0860d 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Microsoft.Azure.Cosmos.EmulatorTests.csproj +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Microsoft.Azure.Cosmos.EmulatorTests.csproj @@ -36,6 +36,7 @@ + @@ -242,6 +243,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest From 4bc167353cf4bfc176e11c185dc3be80e3c46cd4 Mon Sep 17 00:00:00 2001 From: Minh Le Date: Mon, 10 Oct 2022 12:30:52 -0700 Subject: [PATCH 08/12] fix some unused var --- ...mSerializerBaseline.TestMemberInitializer.xml | 16 ++-------------- ...inqTranslationWithCustomSerializerBaseline.cs | 4 ++-- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationWithCustomSerializerBaseline.TestMemberInitializer.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationWithCustomSerializerBaseline.TestMemberInitializer.xml index 38f60a19ae..8763ef6866 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationWithCustomSerializerBaseline.TestMemberInitializer.xml +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationWithCustomSerializerBaseline.TestMemberInitializer.xml @@ -33,26 +33,14 @@ SELECT VALUE ((root["NumericField"] > 12) ? {"number": 12, "String_value": "12", FROM root]]> - - - - new DataObject() {NumericField = doc.NumericField, StringField = doc.StringField})]]> - - - - - - - (doc == new DataObject() {NumericField = doc.NumericField, StringField = doc.StringField}))]]> + (doc == new DataObject() {NumericField = doc.NumericField, StringField = doc.StringField})).Select(b => "A")]]> diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs index 646efcf2cf..9486ee1313 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs @@ -134,8 +134,8 @@ DataObject createDataObj(Random random) { DataObject obj = new DataObject { - NumericField = 1, - StringField = "a", + NumericField = random.Next(NumAbsMax * 2) - NumAbsMax, + StringField = LinqTestsCommon.RandomString(random, random.Next(MaxStringLength)), Id = Guid.NewGuid().ToString(), Pk = "Test" }; From e320d7d0ea65969574e99a7b6624d99ffe5bf67c Mon Sep 17 00:00:00 2001 From: Minh Le Date: Mon, 10 Oct 2022 15:21:06 -0700 Subject: [PATCH 09/12] remove gateway policy --- .../LinqTranslationWithCustomSerializerBaseline.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs index 9486ee1313..be3412e05f 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/LinqTranslationWithCustomSerializerBaseline.cs @@ -33,14 +33,6 @@ public class LinqTranslationWithCustomSerializerBaseline : BaselineTests cosmosClientBuilder.WithCustomSerializer(new SystemTextJsonSerializer(new JsonSerializerOptions())).WithConnectionModeGateway()); From 663ea3fdcfc98809809c2d24e8abdcda46714d01 Mon Sep 17 00:00:00 2001 From: Minh Le Date: Tue, 11 Oct 2022 09:11:54 -0700 Subject: [PATCH 10/12] Change name for the Options property --- Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs | 4 ++-- .../src/Resource/Container/ContainerCore.Items.cs | 2 +- .../src/Serializer/CosmosLinqSerializerOptions.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs b/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs index 76da936b03..d15f67fece 100644 --- a/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs +++ b/Microsoft.Azure.Cosmos/src/Linq/ExpressionToSQL.cs @@ -713,12 +713,12 @@ public static SqlScalarExpression VisitConstant(ConstantExpression inputExpressi return SqlArrayCreateScalarExpression.Create(arrayItems.ToImmutableArray()); } - if (context.linqSerializerOptions?.CustomerCosmosSerializer != null) + if (context.linqSerializerOptions?.CustomCosmosSerializer != null) { StringWriter writer = new StringWriter(CultureInfo.InvariantCulture); // Use the user serializer for the parameter values so custom conversions are correctly handled - using (Stream stream = context.linqSerializerOptions.CustomerCosmosSerializer.ToStream(inputExpression.Value)) + using (Stream stream = context.linqSerializerOptions.CustomCosmosSerializer.ToStream(inputExpression.Value)) { using (StreamReader streamReader = new StreamReader(stream)) { diff --git a/Microsoft.Azure.Cosmos/src/Resource/Container/ContainerCore.Items.cs b/Microsoft.Azure.Cosmos/src/Resource/Container/ContainerCore.Items.cs index 7304d92fe8..60b8db6776 100644 --- a/Microsoft.Azure.Cosmos/src/Resource/Container/ContainerCore.Items.cs +++ b/Microsoft.Azure.Cosmos/src/Resource/Container/ContainerCore.Items.cs @@ -510,7 +510,7 @@ public override IOrderedQueryable GetItemLinqQueryable( PropertyNamingPolicy = this.ClientContext.ClientOptions.SerializerOptions != null ? this.ClientContext.ClientOptions.SerializerOptions.PropertyNamingPolicy : CosmosPropertyNamingPolicy.Default, - CustomerCosmosSerializer = this.ClientContext.ClientOptions.Serializer + CustomCosmosSerializer = this.ClientContext.ClientOptions.Serializer }; } diff --git a/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs b/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs index 152952a12b..c6ceb1e580 100644 --- a/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs +++ b/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs @@ -38,6 +38,6 @@ public CosmosLinqSerializerOptions() /// /// The default value is null /// - public CosmosSerializer CustomerCosmosSerializer { get; set; } + public CosmosSerializer CustomCosmosSerializer { get; set; } } } From 8e3329cb483710f91c01abc3dde3701bf66f6d2f Mon Sep 17 00:00:00 2001 From: Minh Le Date: Tue, 11 Oct 2022 10:42:52 -0700 Subject: [PATCH 11/12] contract change --- .../Contracts/DotNetSDKAPI.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json index 2bf9ce022c..2feef253f7 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json @@ -3240,29 +3240,29 @@ "Attributes": [], "MethodInfo": "Microsoft.Azure.Cosmos.CosmosPropertyNamingPolicy PropertyNamingPolicy;CanRead:True;CanWrite:True;Microsoft.Azure.Cosmos.CosmosPropertyNamingPolicy get_PropertyNamingPolicy();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_PropertyNamingPolicy(Microsoft.Azure.Cosmos.CosmosPropertyNamingPolicy);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" }, - "Microsoft.Azure.Cosmos.CosmosSerializer CustomerCosmosSerializer": { + "Microsoft.Azure.Cosmos.CosmosSerializer CustomCosmosSerializer": { "Type": "Property", "Attributes": [], - "MethodInfo": "Microsoft.Azure.Cosmos.CosmosSerializer CustomerCosmosSerializer;CanRead:True;CanWrite:True;Microsoft.Azure.Cosmos.CosmosSerializer get_CustomerCosmosSerializer();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_CustomerCosmosSerializer(Microsoft.Azure.Cosmos.CosmosSerializer);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + "MethodInfo": "Microsoft.Azure.Cosmos.CosmosSerializer CustomCosmosSerializer;CanRead:True;CanWrite:True;Microsoft.Azure.Cosmos.CosmosSerializer get_CustomCosmosSerializer();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_CustomCosmosSerializer(Microsoft.Azure.Cosmos.CosmosSerializer);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" }, - "Microsoft.Azure.Cosmos.CosmosSerializer get_CustomerCosmosSerializer()[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Microsoft.Azure.Cosmos.CosmosSerializer get_CustomCosmosSerializer()[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { "Type": "Method", "Attributes": [ "CompilerGeneratedAttribute" ], - "MethodInfo": "Microsoft.Azure.Cosmos.CosmosSerializer get_CustomerCosmosSerializer();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + "MethodInfo": "Microsoft.Azure.Cosmos.CosmosSerializer get_CustomCosmosSerializer();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" }, "Void .ctor()": { "Type": "Constructor", "Attributes": [], "MethodInfo": "[Void .ctor(), Void .ctor()]" }, - "Void set_CustomerCosmosSerializer(Microsoft.Azure.Cosmos.CosmosSerializer)[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { + "Void set_CustomCosmosSerializer(Microsoft.Azure.Cosmos.CosmosSerializer)[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { "Type": "Method", "Attributes": [ "CompilerGeneratedAttribute" ], - "MethodInfo": "Void set_CustomerCosmosSerializer(Microsoft.Azure.Cosmos.CosmosSerializer);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + "MethodInfo": "Void set_CustomCosmosSerializer(Microsoft.Azure.Cosmos.CosmosSerializer);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" }, "Void set_PropertyNamingPolicy(Microsoft.Azure.Cosmos.CosmosPropertyNamingPolicy)[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { "Type": "Method", From 4359ec7acc9be0397e5b7bffdc04604b801425ca Mon Sep 17 00:00:00 2001 From: Minh Le Date: Wed, 12 Oct 2022 14:02:43 -0700 Subject: [PATCH 12/12] change field to be internal --- .../Serializer/CosmosLinqSerializerOptions.cs | 16 ++++++++-------- .../Contracts/DotNetSDKAPI.json | 19 ------------------- 2 files changed, 8 insertions(+), 27 deletions(-) diff --git a/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs b/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs index c6ceb1e580..0affdde976 100644 --- a/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs +++ b/Microsoft.Azure.Cosmos/src/Serializer/CosmosLinqSerializerOptions.cs @@ -23,21 +23,21 @@ public CosmosLinqSerializerOptions() } /// - /// Gets or sets whether the naming policy used to convert a string-based name to another format, - /// such as a camel-casing format. + /// Gets or sets the user defined customer serializer. If no customer serializer was defined, + /// then the value is set to the default value /// /// - /// The default value is CosmosPropertyNamingPolicy.Default + /// The default value is null /// - public CosmosPropertyNamingPolicy PropertyNamingPolicy { get; set; } + internal CosmosSerializer CustomCosmosSerializer { get; set; } /// - /// Gets or sets the user defined customer serializer. If no customer serializer was defined, - /// then the value is set to the default value + /// Gets or sets whether the naming policy used to convert a string-based name to another format, + /// such as a camel-casing format. /// /// - /// The default value is null + /// The default value is CosmosPropertyNamingPolicy.Default /// - public CosmosSerializer CustomCosmosSerializer { get; set; } + public CosmosPropertyNamingPolicy PropertyNamingPolicy { get; set; } } } diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json index 2feef253f7..4e18b8084b 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json @@ -3240,30 +3240,11 @@ "Attributes": [], "MethodInfo": "Microsoft.Azure.Cosmos.CosmosPropertyNamingPolicy PropertyNamingPolicy;CanRead:True;CanWrite:True;Microsoft.Azure.Cosmos.CosmosPropertyNamingPolicy get_PropertyNamingPolicy();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_PropertyNamingPolicy(Microsoft.Azure.Cosmos.CosmosPropertyNamingPolicy);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" }, - "Microsoft.Azure.Cosmos.CosmosSerializer CustomCosmosSerializer": { - "Type": "Property", - "Attributes": [], - "MethodInfo": "Microsoft.Azure.Cosmos.CosmosSerializer CustomCosmosSerializer;CanRead:True;CanWrite:True;Microsoft.Azure.Cosmos.CosmosSerializer get_CustomCosmosSerializer();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_CustomCosmosSerializer(Microsoft.Azure.Cosmos.CosmosSerializer);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" - }, - "Microsoft.Azure.Cosmos.CosmosSerializer get_CustomCosmosSerializer()[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { - "Type": "Method", - "Attributes": [ - "CompilerGeneratedAttribute" - ], - "MethodInfo": "Microsoft.Azure.Cosmos.CosmosSerializer get_CustomCosmosSerializer();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" - }, "Void .ctor()": { "Type": "Constructor", "Attributes": [], "MethodInfo": "[Void .ctor(), Void .ctor()]" }, - "Void set_CustomCosmosSerializer(Microsoft.Azure.Cosmos.CosmosSerializer)[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { - "Type": "Method", - "Attributes": [ - "CompilerGeneratedAttribute" - ], - "MethodInfo": "Void set_CustomCosmosSerializer(Microsoft.Azure.Cosmos.CosmosSerializer);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" - }, "Void set_PropertyNamingPolicy(Microsoft.Azure.Cosmos.CosmosPropertyNamingPolicy)[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": { "Type": "Method", "Attributes": [