From ef5b3a7a4d9a42bc4cfa9b3a420bce647050dd6d Mon Sep 17 00:00:00 2001 From: Viktor Tochonov Date: Wed, 2 Apr 2025 14:38:59 +0300 Subject: [PATCH 1/9] Implemented new tests for scalar wrappers --- Packages.props | 1 + .../ObjectListFilter.fs | 35 ++++- .../FSharp.Data.GraphQL.Tests.fsproj | 2 + .../ObjectListFilterLinqGenerateTests.fs | 126 ++++++++++++++++++ 4 files changed, 161 insertions(+), 3 deletions(-) create mode 100644 tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs diff --git a/Packages.props b/Packages.props index 9af4a0d3..81da55d5 100644 --- a/Packages.props +++ b/Packages.props @@ -75,6 +75,7 @@ + diff --git a/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs b/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs index f3977dfa..416f8432 100644 --- a/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs +++ b/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs @@ -141,6 +141,21 @@ module ObjectListFilter = let private StringStartsWithMethod = typeof.GetMethod ("StartsWith", [| typeof |]) let private StringEndsWithMethod = typeof.GetMethod ("EndsWith", [| typeof |]) let private StringContainsMethod = typeof.GetMethod ("Contains", [| typeof |]) + let private MemberStartsWithMethod (memberType : Type) = + let method = memberType.GetMethod ("StartsWith", [| memberType |]) + if method = null then + raise (MissingMemberException "Method 'StartsWith' not found on member type") + else method + let private MemberEndsWithMethod (memberType : Type) = + let method = memberType.GetMethod ("EndsWith", [| memberType |]) + if method = null then + raise (MissingMemberException "Method 'EndsWith' not found on member type") + else method + let private MemberContainsMethod (memberType : Type) = + let method = memberType.GetMethod ("Contains", [| memberType |]) + if method = null then + raise (MissingMemberException "Method 'Contains' not found on member type") + else method let private getEnumerableContainsMethod (memberType : Type) = match typeof @@ -183,8 +198,18 @@ module ObjectListFilter = | LessThan f -> Expression.LessThan (Expression.PropertyOrField (param, f.FieldName), Expression.Constant (f.Value)) | GreaterThanOrEqual f -> Expression.GreaterThanOrEqual (Expression.PropertyOrField (param, f.FieldName), Expression.Constant (f.Value)) | LessThanOrEqual f -> Expression.LessThanOrEqual (Expression.PropertyOrField (param, f.FieldName), Expression.Constant (f.Value)) - | StartsWith f -> Expression.Call (Expression.PropertyOrField (param, f.FieldName), StringStartsWithMethod, Expression.Constant (f.Value)) - | EndsWith f -> Expression.Call (Expression.PropertyOrField (param, f.FieldName), StringEndsWithMethod, Expression.Constant (f.Value)) + | StartsWith f -> + let ``member`` = Expression.PropertyOrField (param, f.FieldName) + if ``member``.Type = typeof then + Expression.Call (``member``, StringStartsWithMethod, Expression.Constant (f.Value)) + else + Expression.Call (``member``, MemberStartsWithMethod ``member``.Type, Expression.Constant (f.Value)) + | EndsWith f -> + let ``member`` = Expression.PropertyOrField (param, f.FieldName) + if ``member``.Type = typeof then + Expression.Call (``member``, StringEndsWithMethod, Expression.Constant (f.Value)) + else + Expression.Call (``member``, MemberEndsWithMethod ``member``.Type, Expression.Constant (f.Value)) | Contains f -> let ``member`` = Expression.PropertyOrField (param, f.FieldName) let isEnumerable (memberType : Type) = @@ -214,7 +239,11 @@ module ObjectListFilter = Expression.PropertyOrField (param, f.FieldName), Expression.Constant (f.Value) ) - | _ -> Expression.Call (``member``, StringContainsMethod, Expression.Constant (f.Value)) + | _ -> + if ``member``.Type = typeof then + Expression.Call (``member``, StringContainsMethod, Expression.Constant (f.Value)) + else + Expression.Call (``member``, MemberContainsMethod ``member``.Type, Expression.Constant (f.Value)) | In f -> let ``member`` = Expression.PropertyOrField (param, f.FieldName) f.Value diff --git a/tests/FSharp.Data.GraphQL.Tests/FSharp.Data.GraphQL.Tests.fsproj b/tests/FSharp.Data.GraphQL.Tests/FSharp.Data.GraphQL.Tests.fsproj index f4352578..0b0390c2 100644 --- a/tests/FSharp.Data.GraphQL.Tests/FSharp.Data.GraphQL.Tests.fsproj +++ b/tests/FSharp.Data.GraphQL.Tests/FSharp.Data.GraphQL.Tests.fsproj @@ -15,6 +15,7 @@ + @@ -65,6 +66,7 @@ + diff --git a/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs b/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs new file mode 100644 index 00000000..662a5769 --- /dev/null +++ b/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs @@ -0,0 +1,126 @@ +module FSharp.Data.GraphQL.Tests.ObjectListFilterLinqGenerateTests + +open Xunit +open System +open System.Numerics +open Microsoft.Azure.Cosmos.Linq +open Microsoft.Azure.Cosmos +open FSharp.Data.GraphQL.Shared +open FSharp.Data.GraphQL.Server.Middleware + +[] +type ValidStringStruct = + internal + | ValidStringStruct of string + static member op_Equality (ValidStringStruct left, ValidStringStruct right) = left = right + static member op_Inequality (ValidStringStruct left, ValidStringStruct right) = left <> right + + static member op_Equality (ValidStringStruct left, right) = left = right + static member op_Inequality (ValidStringStruct left, right) = left <> right + static member op_GreaterThan (ValidStringStruct left, right) = left > right + static member op_GreaterThanOrEqual (ValidStringStruct left, right) = left >= right + static member op_LessThan (ValidStringStruct left, right) = left < right + static member op_LessThanOrEqual (ValidStringStruct left, right) = left <= right + interface IEqualityOperators with + static member op_Equality (ValidStringStruct left, right) = left = right + static member op_Inequality (ValidStringStruct left, right) = left <> right + interface IComparisonOperators with + static member op_GreaterThan (ValidStringStruct left, right) = left > right + static member op_GreaterThanOrEqual (ValidStringStruct left, right) = left >= right + static member op_LessThan (ValidStringStruct left, right) = left < right + static member op_LessThanOrEqual (ValidStringStruct left, right) = left <= right + +type ValidStringObject = + internal + | ValidStringObject of string + static member op_Equality (ValidStringObject left, ValidStringObject right) = left = right + static member op_Inequality (ValidStringObject left, ValidStringObject right) = left <> right + + static member op_Equality (ValidStringObject left, right) = left = right + static member op_Inequality (ValidStringObject left, right) = left <> right + static member op_GreaterThan (ValidStringObject left, right) = left > right + static member op_GreaterThanOrEqual (ValidStringObject left, right) = left >= right + static member op_LessThan (ValidStringObject left, right) = left < right + static member op_LessThanOrEqual (ValidStringObject left, right) = left <= right + //interface IEqualityOperators with + // static member op_Equality (ValidStringObject left, ValidStringObject right) = left = right + // static member op_Inequality (ValidStringObject left, ValidStringObject right) = left <> right + //interface IComparisonOperators with + // static member op_GreaterThan (ValidStringObject left, ValidStringObject right) = left > right + // static member op_GreaterThanOrEqual (ValidStringObject left, ValidStringObject right) = left >= right + // static member op_LessThan (ValidStringObject left, ValidStringObject right) = left < right + // static member op_LessThanOrEqual (ValidStringObject left, ValidStringObject right) = left <= right + interface IEqualityOperators with + static member op_Equality (ValidStringObject left, right) = left = right + static member op_Inequality (ValidStringObject left, right) = left <> right + interface IComparisonOperators with + static member op_GreaterThan (ValidStringObject left, right) = left > right + static member op_GreaterThanOrEqual (ValidStringObject left, right) = left >= right + static member op_LessThan (ValidStringObject left, right) = left < right + static member op_LessThanOrEqual (ValidStringObject left, right) = left <= right + +[] +type ValidIntStruct = + internal + | ValidIntStruct of Int64 + static member op_Equality (ValidIntStruct left, ValidIntStruct right) = left = right + static member op_Inequality (ValidIntStruct left, ValidIntStruct right) = left <> right + static member op_GreaterThan (ValidIntStruct left, right : Int64) = left > right + +type ValidIntObject = + internal + | ValidIntObject of Int64 + static member op_Equality (ValidIntObject left, ValidIntObject right) = left = right + static member op_Inequality (ValidIntObject left, ValidIntObject right) = left <> right + static member op_GreaterThan (ValidIntObject left, right : Int64) = left > right + +type Butafor = { + ValidStringStruct : ValidStringStruct + ValidStringObject : ValidStringObject + string : string + ValidIntStruct : ValidIntStruct + ValidIntObject : ValidIntObject + int : Int64 +} + +let jsonOptions = Json.getSerializerOptions Seq.empty +let cosmosClient = + let options = CosmosClientOptions(UseSystemTextJsonSerializerWithOptions = jsonOptions) + new CosmosClient ("https://localhost:8081/", "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==", options) +let container = cosmosClient.GetContainer("database", "container") +let filterOptions = + ObjectListFilterLinqOptions.None + +[] +let ``ObjectListFilter works with Equals operator for ValidStringStruct`` () = + let queryable = container.GetItemLinqQueryable () + let filter = Equals { FieldName = "validStringStruct"; Value = "Jonathan"} + let filterQuery = queryable.Apply (filter, filterOptions) + let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery + () + +[] +let ``ObjectListFilter works with Equals operator for ValidStringObject`` () = + let filter = Equals { FieldName = "validStringObject"; Value = ValidStringObject "Jonathan" } + let queryable = container.GetItemLinqQueryable () + let filterQuery = queryable.Apply (filter) + let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery + () + +[] +let ``ObjectListFilter works with GreaterThan operator for ValidIntStruct`` () = + let queryable = container.GetItemLinqQueryable () + let filter = GreaterThan { FieldName = "validIntStruct"; Value = 6L } + let filterQuery = queryable.Apply (filter, filterOptions) + let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery + () + +[] +let ``ObjectListFilter works with GreaterThan operator for ValidIntObject`` () = + let filter = GreaterThan { FieldName = "validIntObject"; Value = 6L } + let queryable = container.GetItemLinqQueryable () + let filterQuery = queryable.Apply (filter) + let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery + () + + From 975483724920c578f46930b739d540c02b2a30cb Mon Sep 17 00:00:00 2001 From: Viktor Tochonov Date: Wed, 2 Apr 2025 15:10:16 +0300 Subject: [PATCH 2/9] PR fixes --- .../ObjectListFilter.fs | 18 +++--- .../ObjectListFilterLinqGenerateTests.fs | 55 ++++++++----------- 2 files changed, 33 insertions(+), 40 deletions(-) diff --git a/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs b/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs index 416f8432..fae32d8a 100644 --- a/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs +++ b/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs @@ -143,19 +143,19 @@ module ObjectListFilter = let private StringContainsMethod = typeof.GetMethod ("Contains", [| typeof |]) let private MemberStartsWithMethod (memberType : Type) = let method = memberType.GetMethod ("StartsWith", [| memberType |]) - if method = null then - raise (MissingMemberException "Method 'StartsWith' not found on member type") - else method + match method with + | null -> raise (MissingMemberException "Method 'StartsWith' not found on member type") + | _ -> method let private MemberEndsWithMethod (memberType : Type) = let method = memberType.GetMethod ("EndsWith", [| memberType |]) - if method = null then - raise (MissingMemberException "Method 'EndsWith' not found on member type") - else method + match method with + | null -> raise (MissingMemberException "Method 'EndsWith' not found on member type") + | _ -> method let private MemberContainsMethod (memberType : Type) = let method = memberType.GetMethod ("Contains", [| memberType |]) - if method = null then - raise (MissingMemberException "Method 'Contains' not found on member type") - else method + match method with + | null -> raise (MissingMemberException "Method 'Contains' not found on member type") + | _ -> method let private getEnumerableContainsMethod (memberType : Type) = match typeof diff --git a/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs b/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs index 662a5769..d7fa8db1 100644 --- a/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs +++ b/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs @@ -12,15 +12,16 @@ open FSharp.Data.GraphQL.Server.Middleware type ValidStringStruct = internal | ValidStringStruct of string - static member op_Equality (ValidStringStruct left, ValidStringStruct right) = left = right - static member op_Inequality (ValidStringStruct left, ValidStringStruct right) = left <> right + static member internal op_Equality (ValidStringStruct left, ValidStringStruct right) = left = right + static member internal op_Inequality (ValidStringStruct left, ValidStringStruct right) = left <> right - static member op_Equality (ValidStringStruct left, right) = left = right - static member op_Inequality (ValidStringStruct left, right) = left <> right - static member op_GreaterThan (ValidStringStruct left, right) = left > right - static member op_GreaterThanOrEqual (ValidStringStruct left, right) = left >= right - static member op_LessThan (ValidStringStruct left, right) = left < right - static member op_LessThanOrEqual (ValidStringStruct left, right) = left <= right + static member internal op_Equality (ValidStringStruct left, right) = left = right + static member internal op_Inequality (ValidStringStruct left, right) = left <> right + static member internal op_GreaterThan (ValidStringStruct left, right) = left > right + static member internal op_GreaterThanOrEqual (ValidStringStruct left, right) = left >= right + static member internal op_LessThan (ValidStringStruct left, right) = left < right + static member internal op_LessThanOrEqual (ValidStringStruct left, right) = left <= right + // Just for demo purposes interface IEqualityOperators with static member op_Equality (ValidStringStruct left, right) = left = right static member op_Inequality (ValidStringStruct left, right) = left <> right @@ -33,23 +34,15 @@ type ValidStringStruct = type ValidStringObject = internal | ValidStringObject of string - static member op_Equality (ValidStringObject left, ValidStringObject right) = left = right - static member op_Inequality (ValidStringObject left, ValidStringObject right) = left <> right - - static member op_Equality (ValidStringObject left, right) = left = right - static member op_Inequality (ValidStringObject left, right) = left <> right - static member op_GreaterThan (ValidStringObject left, right) = left > right - static member op_GreaterThanOrEqual (ValidStringObject left, right) = left >= right - static member op_LessThan (ValidStringObject left, right) = left < right - static member op_LessThanOrEqual (ValidStringObject left, right) = left <= right - //interface IEqualityOperators with - // static member op_Equality (ValidStringObject left, ValidStringObject right) = left = right - // static member op_Inequality (ValidStringObject left, ValidStringObject right) = left <> right - //interface IComparisonOperators with - // static member op_GreaterThan (ValidStringObject left, ValidStringObject right) = left > right - // static member op_GreaterThanOrEqual (ValidStringObject left, ValidStringObject right) = left >= right - // static member op_LessThan (ValidStringObject left, ValidStringObject right) = left < right - // static member op_LessThanOrEqual (ValidStringObject left, ValidStringObject right) = left <= right + static member internal op_Equality (ValidStringObject left, ValidStringObject right) = left = right + static member internal op_Inequality (ValidStringObject left, ValidStringObject right) = left <> right + static member internal op_Equality (ValidStringObject left, right) = left = right + static member internal op_Inequality (ValidStringObject left, right) = left <> right + static member internal op_GreaterThan (ValidStringObject left, right) = left > right + static member internal op_GreaterThanOrEqual (ValidStringObject left, right) = left >= right + static member internal op_LessThan (ValidStringObject left, right) = left < right + static member internal op_LessThanOrEqual (ValidStringObject left, right) = left <= right + // Just for demo purposes interface IEqualityOperators with static member op_Equality (ValidStringObject left, right) = left = right static member op_Inequality (ValidStringObject left, right) = left <> right @@ -63,16 +56,16 @@ type ValidStringObject = type ValidIntStruct = internal | ValidIntStruct of Int64 - static member op_Equality (ValidIntStruct left, ValidIntStruct right) = left = right - static member op_Inequality (ValidIntStruct left, ValidIntStruct right) = left <> right - static member op_GreaterThan (ValidIntStruct left, right : Int64) = left > right + static member internal op_Equality (ValidIntStruct left, ValidIntStruct right) = left = right + static member internal op_Inequality (ValidIntStruct left, ValidIntStruct right) = left <> right + static member internal op_GreaterThan (ValidIntStruct left, right : Int64) = left > right type ValidIntObject = internal | ValidIntObject of Int64 - static member op_Equality (ValidIntObject left, ValidIntObject right) = left = right - static member op_Inequality (ValidIntObject left, ValidIntObject right) = left <> right - static member op_GreaterThan (ValidIntObject left, right : Int64) = left > right + static member internal op_Equality (ValidIntObject left, ValidIntObject right) = left = right + static member internal op_Inequality (ValidIntObject left, ValidIntObject right) = left <> right + static member internal op_GreaterThan (ValidIntObject left, right : Int64) = left > right type Butafor = { ValidStringStruct : ValidStringStruct From b13318be6579e3faa2d5a0568c2447e3164ffdf6 Mon Sep 17 00:00:00 2001 From: Viktor Tochonov Date: Wed, 2 Apr 2025 15:29:59 +0300 Subject: [PATCH 3/9] PR fixes --- .../ObjectListFilter.fs | 15 +++--- .../ObjectListFilterLinqGenerateTests.fs | 50 ++++++++++--------- 2 files changed, 32 insertions(+), 33 deletions(-) diff --git a/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs b/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs index fae32d8a..b5a82b30 100644 --- a/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs +++ b/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs @@ -142,20 +142,17 @@ module ObjectListFilter = let private StringEndsWithMethod = typeof.GetMethod ("EndsWith", [| typeof |]) let private StringContainsMethod = typeof.GetMethod ("Contains", [| typeof |]) let private MemberStartsWithMethod (memberType : Type) = - let method = memberType.GetMethod ("StartsWith", [| memberType |]) - match method with + match memberType.GetMethod ("StartsWith", [| memberType |]) with | null -> raise (MissingMemberException "Method 'StartsWith' not found on member type") - | _ -> method + | method -> method let private MemberEndsWithMethod (memberType : Type) = - let method = memberType.GetMethod ("EndsWith", [| memberType |]) - match method with + match memberType.GetMethod ("EndsWith", [| memberType |]) with | null -> raise (MissingMemberException "Method 'EndsWith' not found on member type") - | _ -> method + | method -> method let private MemberContainsMethod (memberType : Type) = - let method = memberType.GetMethod ("Contains", [| memberType |]) - match method with + match memberType.GetMethod ("Contains", [| memberType |]) with | null -> raise (MissingMemberException "Method 'Contains' not found on member type") - | _ -> method + | method -> method let private getEnumerableContainsMethod (memberType : Type) = match typeof diff --git a/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs b/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs index d7fa8db1..a254a9b4 100644 --- a/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs +++ b/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs @@ -21,15 +21,16 @@ type ValidStringStruct = static member internal op_GreaterThanOrEqual (ValidStringStruct left, right) = left >= right static member internal op_LessThan (ValidStringStruct left, right) = left < right static member internal op_LessThanOrEqual (ValidStringStruct left, right) = left <= right - // Just for demo purposes - interface IEqualityOperators with - static member op_Equality (ValidStringStruct left, right) = left = right - static member op_Inequality (ValidStringStruct left, right) = left <> right - interface IComparisonOperators with - static member op_GreaterThan (ValidStringStruct left, right) = left > right - static member op_GreaterThanOrEqual (ValidStringStruct left, right) = left >= right - static member op_LessThan (ValidStringStruct left, right) = left < right - static member op_LessThanOrEqual (ValidStringStruct left, right) = left <= right + + // Just for demo purposes + interface IEqualityOperators with + static member op_Equality (ValidStringStruct left, ValidStringStruct right) = left = right + static member op_Inequality (ValidStringStruct left, ValidStringStruct right) = left <> right + interface IComparisonOperators with + static member op_GreaterThan (ValidStringStruct left, ValidStringStruct right) = left > right + static member op_GreaterThanOrEqual (ValidStringStruct left, ValidStringStruct right) = left >= right + static member op_LessThan (ValidStringStruct left, ValidStringStruct right) = left < right + static member op_LessThanOrEqual (ValidStringStruct left, ValidStringStruct right) = left <= right type ValidStringObject = internal @@ -42,15 +43,16 @@ type ValidStringObject = static member internal op_GreaterThanOrEqual (ValidStringObject left, right) = left >= right static member internal op_LessThan (ValidStringObject left, right) = left < right static member internal op_LessThanOrEqual (ValidStringObject left, right) = left <= right - // Just for demo purposes - interface IEqualityOperators with - static member op_Equality (ValidStringObject left, right) = left = right - static member op_Inequality (ValidStringObject left, right) = left <> right - interface IComparisonOperators with - static member op_GreaterThan (ValidStringObject left, right) = left > right - static member op_GreaterThanOrEqual (ValidStringObject left, right) = left >= right - static member op_LessThan (ValidStringObject left, right) = left < right - static member op_LessThanOrEqual (ValidStringObject left, right) = left <= right + + // Just for demo purposes + interface IEqualityOperators with + static member op_Equality (ValidStringObject left, ValidStringObject right) = left = right + static member op_Inequality (ValidStringObject left, ValidStringObject right) = left <> right + interface IComparisonOperators with + static member op_GreaterThan (ValidStringObject left, ValidStringObject right) = left > right + static member op_GreaterThanOrEqual (ValidStringObject left, ValidStringObject right) = left >= right + static member op_LessThan (ValidStringObject left, ValidStringObject right) = left < right + static member op_LessThanOrEqual (ValidStringObject left, ValidStringObject right) = left <= right [] type ValidIntStruct = @@ -67,7 +69,7 @@ type ValidIntObject = static member internal op_Inequality (ValidIntObject left, ValidIntObject right) = left <> right static member internal op_GreaterThan (ValidIntObject left, right : Int64) = left > right -type Butafor = { +type FakeEntity = { ValidStringStruct : ValidStringStruct ValidStringObject : ValidStringObject string : string @@ -82,11 +84,11 @@ let cosmosClient = new CosmosClient ("https://localhost:8081/", "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==", options) let container = cosmosClient.GetContainer("database", "container") let filterOptions = - ObjectListFilterLinqOptions.None + ObjectListFilterLinqOptions.None [] let ``ObjectListFilter works with Equals operator for ValidStringStruct`` () = - let queryable = container.GetItemLinqQueryable () + let queryable = container.GetItemLinqQueryable () let filter = Equals { FieldName = "validStringStruct"; Value = "Jonathan"} let filterQuery = queryable.Apply (filter, filterOptions) let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery @@ -95,14 +97,14 @@ let ``ObjectListFilter works with Equals operator for ValidStringStruct`` () = [] let ``ObjectListFilter works with Equals operator for ValidStringObject`` () = let filter = Equals { FieldName = "validStringObject"; Value = ValidStringObject "Jonathan" } - let queryable = container.GetItemLinqQueryable () + let queryable = container.GetItemLinqQueryable () let filterQuery = queryable.Apply (filter) let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery () [] let ``ObjectListFilter works with GreaterThan operator for ValidIntStruct`` () = - let queryable = container.GetItemLinqQueryable () + let queryable = container.GetItemLinqQueryable () let filter = GreaterThan { FieldName = "validIntStruct"; Value = 6L } let filterQuery = queryable.Apply (filter, filterOptions) let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery @@ -111,7 +113,7 @@ let ``ObjectListFilter works with GreaterThan operator for ValidIntStruct`` () = [] let ``ObjectListFilter works with GreaterThan operator for ValidIntObject`` () = let filter = GreaterThan { FieldName = "validIntObject"; Value = 6L } - let queryable = container.GetItemLinqQueryable () + let queryable = container.GetItemLinqQueryable () let filterQuery = queryable.Apply (filter) let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery () From 19c2a7ceb7ae01eec62028db491d58b7646b3666 Mon Sep 17 00:00:00 2001 From: Viktor Tochonov Date: Wed, 2 Apr 2025 15:37:21 +0300 Subject: [PATCH 4/9] PR fixes --- .../ObjectListFilter.fs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs b/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs index b5a82b30..e7f9511b 100644 --- a/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs +++ b/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs @@ -143,15 +143,15 @@ module ObjectListFilter = let private StringContainsMethod = typeof.GetMethod ("Contains", [| typeof |]) let private MemberStartsWithMethod (memberType : Type) = match memberType.GetMethod ("StartsWith", [| memberType |]) with - | null -> raise (MissingMemberException "Method 'StartsWith' not found on member type") + | null -> raise (MissingMemberException $"Method 'StartsWith' not found on `{memberType.FullName}`") | method -> method let private MemberEndsWithMethod (memberType : Type) = match memberType.GetMethod ("EndsWith", [| memberType |]) with - | null -> raise (MissingMemberException "Method 'EndsWith' not found on member type") + | null -> raise (MissingMemberException $"Method 'EndsWith' not found on `{memberType.FullName}`") | method -> method let private MemberContainsMethod (memberType : Type) = match memberType.GetMethod ("Contains", [| memberType |]) with - | null -> raise (MissingMemberException "Method 'Contains' not found on member type") + | null -> raise (MissingMemberException $"Method 'Contains' not found on `{memberType.FullName}`") | method -> method let private getEnumerableContainsMethod (memberType : Type) = match From d923302198f54250ffb21a5ad0b472c1dd7c0911 Mon Sep 17 00:00:00 2001 From: Viktor Tochonov Date: Wed, 2 Apr 2025 15:44:03 +0300 Subject: [PATCH 5/9] PR fixes --- .../ObjectListFilter.fs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs b/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs index e7f9511b..b40b494f 100644 --- a/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs +++ b/src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs @@ -143,15 +143,15 @@ module ObjectListFilter = let private StringContainsMethod = typeof.GetMethod ("Contains", [| typeof |]) let private MemberStartsWithMethod (memberType : Type) = match memberType.GetMethod ("StartsWith", [| memberType |]) with - | null -> raise (MissingMemberException $"Method 'StartsWith' not found on `{memberType.FullName}`") + | null -> raise (MissingMemberException $"Method 'StartsWith' not found on '{memberType.FullName}'") | method -> method let private MemberEndsWithMethod (memberType : Type) = match memberType.GetMethod ("EndsWith", [| memberType |]) with - | null -> raise (MissingMemberException $"Method 'EndsWith' not found on `{memberType.FullName}`") + | null -> raise (MissingMemberException $"Method 'EndsWith' not found on '{memberType.FullName}'") | method -> method let private MemberContainsMethod (memberType : Type) = match memberType.GetMethod ("Contains", [| memberType |]) with - | null -> raise (MissingMemberException $"Method 'Contains' not found on `{memberType.FullName}`") + | null -> raise (MissingMemberException $"Method 'Contains' not found on '{memberType.FullName}'") | method -> method let private getEnumerableContainsMethod (memberType : Type) = match From f3300d99c06805232ea4ecedc26e06095e968a50 Mon Sep 17 00:00:00 2001 From: Viktor Tochonov Date: Wed, 2 Apr 2025 15:55:00 +0300 Subject: [PATCH 6/9] PR fixes --- .../ObjectListFilterLinqGenerateTests.fs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs b/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs index a254a9b4..56e14dd1 100644 --- a/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs +++ b/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs @@ -92,6 +92,7 @@ let ``ObjectListFilter works with Equals operator for ValidStringStruct`` () = let filter = Equals { FieldName = "validStringStruct"; Value = "Jonathan"} let filterQuery = queryable.Apply (filter, filterOptions) let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery + Assert.Equal (queryDefinition.QueryText, """SELECT VALUE root FROM root WHERE (root["validStringStruct"] = "Jonathan")""") () [] @@ -100,6 +101,7 @@ let ``ObjectListFilter works with Equals operator for ValidStringObject`` () = let queryable = container.GetItemLinqQueryable () let filterQuery = queryable.Apply (filter) let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery + Assert.Equal (queryDefinition.QueryText, """SELECT VALUE root FROM root WHERE (root["validStringObject"] = "Jonathan")""") () [] @@ -108,6 +110,7 @@ let ``ObjectListFilter works with GreaterThan operator for ValidIntStruct`` () = let filter = GreaterThan { FieldName = "validIntStruct"; Value = 6L } let filterQuery = queryable.Apply (filter, filterOptions) let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery + Assert.Equal (queryDefinition.QueryText, """SELECT VALUE root FROM root WHERE (root["validIntStruct"] > 6)""") () [] @@ -116,6 +119,7 @@ let ``ObjectListFilter works with GreaterThan operator for ValidIntObject`` () = let queryable = container.GetItemLinqQueryable () let filterQuery = queryable.Apply (filter) let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery + Assert.Equal (queryDefinition.QueryText, """SELECT VALUE root FROM root WHERE (root["validIntObject"] > 6)""") () From be7960a3e41a52b9da64db171a0e169672a88370 Mon Sep 17 00:00:00 2001 From: Viktor Tochonov Date: Wed, 2 Apr 2025 16:16:42 +0300 Subject: [PATCH 7/9] PR fixes --- .../ObjectListFilterLinqGenerateTests.fs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs b/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs index 56e14dd1..6fee3e36 100644 --- a/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs +++ b/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs @@ -92,8 +92,7 @@ let ``ObjectListFilter works with Equals operator for ValidStringStruct`` () = let filter = Equals { FieldName = "validStringStruct"; Value = "Jonathan"} let filterQuery = queryable.Apply (filter, filterOptions) let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery - Assert.Equal (queryDefinition.QueryText, """SELECT VALUE root FROM root WHERE (root["validStringStruct"] = "Jonathan")""") - () + equals queryDefinition.QueryText """SELECT VALUE root FROM root WHERE (root["validStringStruct"] = "Jonathan")""" [] let ``ObjectListFilter works with Equals operator for ValidStringObject`` () = @@ -101,8 +100,7 @@ let ``ObjectListFilter works with Equals operator for ValidStringObject`` () = let queryable = container.GetItemLinqQueryable () let filterQuery = queryable.Apply (filter) let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery - Assert.Equal (queryDefinition.QueryText, """SELECT VALUE root FROM root WHERE (root["validStringObject"] = "Jonathan")""") - () + equals queryDefinition.QueryText, """SELECT VALUE root FROM root WHERE (root["validStringObject"] = "Jonathan")""" [] let ``ObjectListFilter works with GreaterThan operator for ValidIntStruct`` () = @@ -110,8 +108,7 @@ let ``ObjectListFilter works with GreaterThan operator for ValidIntStruct`` () = let filter = GreaterThan { FieldName = "validIntStruct"; Value = 6L } let filterQuery = queryable.Apply (filter, filterOptions) let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery - Assert.Equal (queryDefinition.QueryText, """SELECT VALUE root FROM root WHERE (root["validIntStruct"] > 6)""") - () + equals queryDefinition.QueryText, """SELECT VALUE root FROM root WHERE (root["validIntStruct"] > 6)""" [] let ``ObjectListFilter works with GreaterThan operator for ValidIntObject`` () = @@ -119,7 +116,6 @@ let ``ObjectListFilter works with GreaterThan operator for ValidIntObject`` () = let queryable = container.GetItemLinqQueryable () let filterQuery = queryable.Apply (filter) let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery - Assert.Equal (queryDefinition.QueryText, """SELECT VALUE root FROM root WHERE (root["validIntObject"] > 6)""") - () + equals queryDefinition.QueryText, """SELECT VALUE root FROM root WHERE (root["validIntObject"] > 6)""" From 48e468f96beee55554c0569a2567d8e04550ca2e Mon Sep 17 00:00:00 2001 From: Viktor Tochonov Date: Wed, 2 Apr 2025 16:17:16 +0300 Subject: [PATCH 8/9] PR fixes --- .../ObjectListFilterLinqGenerateTests.fs | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs b/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs index 6fee3e36..009cc5d6 100644 --- a/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs +++ b/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs @@ -117,5 +117,3 @@ let ``ObjectListFilter works with GreaterThan operator for ValidIntObject`` () = let filterQuery = queryable.Apply (filter) let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery equals queryDefinition.QueryText, """SELECT VALUE root FROM root WHERE (root["validIntObject"] > 6)""" - - From 282b181a2f979431b798634c129fa514d1641422 Mon Sep 17 00:00:00 2001 From: Andrii Chebukin Date: Wed, 2 Apr 2025 17:18:09 +0400 Subject: [PATCH 9/9] Update tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs --- .../ObjectListFilterLinqGenerateTests.fs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs b/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs index 009cc5d6..077b3b16 100644 --- a/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs +++ b/tests/FSharp.Data.GraphQL.Tests/ObjectListFilterLinqGenerateTests.fs @@ -117,3 +117,4 @@ let ``ObjectListFilter works with GreaterThan operator for ValidIntObject`` () = let filterQuery = queryable.Apply (filter) let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery equals queryDefinition.QueryText, """SELECT VALUE root FROM root WHERE (root["validIntObject"] > 6)""" +