Skip to content

Commit 7a43356

Browse files
committed
Removed ObjectListFilter.NoFilter case
1 parent 65a5009 commit 7a43356

File tree

5 files changed

+74
-79
lines changed

5 files changed

+74
-79
lines changed

src/FSharp.Data.GraphQL.Server.Middleware/DefineExtensions.fs

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ open FSharp.Data.GraphQL
66
/// Contains extensions for the Define module.
77
[<AutoOpen>]
88
module DefineExtensions =
9+
910
type Define with
1011
/// <summary>
1112
/// Creates a query weight middleware, with the specified query weight threshold.
@@ -48,4 +49,4 @@ module DefineExtensions =
4849
/// </param>
4950
static member LiveQueryMiddleware(?identityName : IdentityNameResolver) : IExecutorMiddleware =
5051
let identityName = defaultArg identityName (fun _ -> "Id")
51-
upcast LiveQueryMiddleware(identityName)
52+
upcast LiveQueryMiddleware(identityName)

src/FSharp.Data.GraphQL.Server.Middleware/MiddlewareDefinitions.fs

+4-4
Original file line numberDiff line numberDiff line change
@@ -92,15 +92,15 @@ type internal ObjectListFilterMiddleware<'ObjectType, 'ListType>(reportToMetadat
9292
field.Ast.Arguments
9393
|> Seq.map (fun x ->
9494
match x.Name, x.Value with
95-
| "filter", (VariableName variableName) -> Ok (ctx.Variables[variableName] :?> ObjectListFilter)
96-
| "filter", inlineConstant -> ObjectListFilterType.CoerceInput (InlineConstant inlineConstant)
97-
| _ -> Ok NoFilter)
95+
| "filter", (VariableName variableName) -> Ok (ValueSome (ctx.Variables[variableName] :?> ObjectListFilter))
96+
| "filter", inlineConstant -> ObjectListFilterType.CoerceInput (InlineConstant inlineConstant) |> Result.map ValueOption.ofObj
97+
| _ -> Ok ValueNone)
9898
|> Seq.toList
9999
match filterResults |> splitSeqErrorsList with
100100
| Error errs -> Error errs
101101
| Ok filters ->
102102
filters
103-
|> removeNoFilter
103+
|> Seq.vchoose id
104104
|> Seq.map (fun x -> KeyValuePair (currentPath |> List.rev, x))
105105
|> Seq.toList
106106
|> Ok

src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs

+41-46
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ type ObjectListFilter =
2121
| Contains of FieldFilter<string>
2222
| OfTypes of Type list
2323
| FilterField of FieldFilter<ObjectListFilter>
24-
| NoFilter
2524

2625
open System.Linq
2726
open System.Linq.Expressions
@@ -174,7 +173,6 @@ module ObjectListFilter =
174173
let rec buildFilterExpr (param : SourceExpression) buildTypeDiscriminatorCheck filter : Expression =
175174
let build = buildFilterExpr param buildTypeDiscriminatorCheck
176175
match filter with
177-
| NoFilter -> Expression.Constant (true)
178176
| Not f -> f |> build |> Expression.Not :> Expression
179177
| And (f1, f2) -> Expression.AndAlso (build f1, build f2)
180178
| Or (f1, f2) -> Expression.OrElse (build f1, build f2)
@@ -230,50 +228,47 @@ module ObjectListFilter =
230228
buildFilterExpr (SourceExpression paramExpr) buildTypeDiscriminatorCheck f.Value
231229

232230
let apply (options : ObjectListFilterLinqOptions<'T, 'D>) (filter : ObjectListFilter) (query : IQueryable<'T>) =
233-
match filter with
234-
| NoFilter -> query
235-
| _ ->
236-
// Helper for discriminator comparison
237-
let buildTypeDiscriminatorCheck (param : SourceExpression) (t : Type) =
238-
match options.CompareDiscriminator, options.GetDiscriminatorValue with
239-
| ValueNone, ValueNone ->
240-
Expression.Equal (
241-
// Default discriminator property
242-
Expression.PropertyOrField (param, "__typename"),
243-
// Default discriminator value
244-
Expression.Constant (t.FullName)
245-
) :> Expression
246-
| ValueSome discExpr, ValueNone ->
247-
Expression.Invoke (
248-
// Provided discriminator comparison
249-
discExpr,
250-
param,
251-
// Default discriminator value gathered from type
252-
Expression.Constant(t.FullName)
253-
) :> Expression
254-
| ValueNone, ValueSome discValueFn ->
255-
let discriminatorValue = discValueFn t
256-
Expression.Equal (
257-
// Default discriminator property
258-
Expression.PropertyOrField (param, "__typename"),
259-
// Provided discriminator value gathered from type
260-
Expression.Constant (discriminatorValue)
261-
) :> Expression
262-
| ValueSome discExpr, ValueSome discValueFn ->
263-
let discriminatorValue = discValueFn t
264-
Expression.Invoke (
265-
// Provided discriminator comparison
266-
discExpr,
267-
param,
268-
// Provided discriminator value gathered from type
269-
Expression.Constant (discriminatorValue)
270-
)
271-
let queryExpr =
272-
let param = Expression.Parameter (typeof<'T>, "x")
273-
let body = buildFilterExpr (SourceExpression param) buildTypeDiscriminatorCheck filter
274-
whereExpr<'T> query param body
275-
// Create and execute the final expression
276-
query.Provider.CreateQuery<'T> (queryExpr)
231+
// Helper for discriminator comparison
232+
let buildTypeDiscriminatorCheck (param : SourceExpression) (t : Type) =
233+
match options.CompareDiscriminator, options.GetDiscriminatorValue with
234+
| ValueNone, ValueNone ->
235+
Expression.Equal (
236+
// Default discriminator property
237+
Expression.PropertyOrField (param, "__typename"),
238+
// Default discriminator value
239+
Expression.Constant (t.FullName)
240+
) :> Expression
241+
| ValueSome discExpr, ValueNone ->
242+
Expression.Invoke (
243+
// Provided discriminator comparison
244+
discExpr,
245+
param,
246+
// Default discriminator value gathered from type
247+
Expression.Constant(t.FullName)
248+
) :> Expression
249+
| ValueNone, ValueSome discValueFn ->
250+
let discriminatorValue = discValueFn t
251+
Expression.Equal (
252+
// Default discriminator property
253+
Expression.PropertyOrField (param, "__typename"),
254+
// Provided discriminator value gathered from type
255+
Expression.Constant (discriminatorValue)
256+
) :> Expression
257+
| ValueSome discExpr, ValueSome discValueFn ->
258+
let discriminatorValue = discValueFn t
259+
Expression.Invoke (
260+
// Provided discriminator comparison
261+
discExpr,
262+
param,
263+
// Provided discriminator value gathered from type
264+
Expression.Constant (discriminatorValue)
265+
)
266+
let queryExpr =
267+
let param = Expression.Parameter (typeof<'T>, "x")
268+
let body = buildFilterExpr (SourceExpression param) buildTypeDiscriminatorCheck filter
269+
whereExpr<'T> query param body
270+
// Create and execute the final expression
271+
query.Provider.CreateQuery<'T> (queryExpr)
277272

278273
[<AutoOpen>]
279274
module ObjectListFilterExtensions =

src/FSharp.Data.GraphQL.Server.Middleware/SchemaDefinitions.fs

+26-27
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ open FSharp.Data.GraphQL
1010
open FSharp.Data.GraphQL.Types
1111
open FSharp.Data.GraphQL.Ast
1212

13-
let internal removeNoFilter = Seq.where (fun filter -> filter <> NoFilter)
14-
1513
type private ComparisonOperator =
1614
| EndsWith of string
1715
| StartsWith of string
@@ -22,7 +20,7 @@ type private ComparisonOperator =
2220
| LessThan of string
2321
| LessThanOrEqual of string
2422

25-
let rec private coerceObjectListFilterInput x : Result<ObjectListFilter, IGQLError list> =
23+
let rec private coerceObjectListFilterInput x : Result<ObjectListFilter voption, IGQLError list> =
2624

2725
let parseFieldCondition (s : string) =
2826
let s = s.ToLowerInvariant ()
@@ -66,19 +64,19 @@ let rec private coerceObjectListFilterInput x : Result<ObjectListFilter, IGQLErr
6664
| [] -> acc
6765
| x :: xs ->
6866
match acc with
69-
| NoFilter -> build (x) xs
70-
| acc -> build ((And (acc, x))) xs
71-
build NoFilter x
67+
| ValueNone -> build (ValueSome x) xs
68+
| ValueSome acc -> build (ValueSome (And (acc, x))) xs
69+
build ValueNone x
7270

7371
let buildOr x =
7472
let rec build acc x =
7573
match x with
7674
| [] -> acc
7775
| x :: xs ->
7876
match acc with
79-
| NoFilter -> build (x) xs
80-
| acc -> build ((Or (acc, x))) xs
81-
build NoFilter x
77+
| ValueNone -> build (ValueSome x) xs
78+
| ValueSome acc -> build (ValueSome (Or (acc, x))) xs
79+
build ValueNone x
8280

8381
let rec mapFilter (name : string, value : InputValue) =
8482
let mapFilters fields =
@@ -89,29 +87,29 @@ let rec private coerceObjectListFilterInput x : Result<ObjectListFilter, IGQLErr
8987
|> splitSeqErrorsList
9088
match coerceResults with
9189
| Error errs -> Error errs
92-
| Ok coerced -> coerced |> removeNoFilter |> Seq.toList |> Ok
90+
| Ok coerced -> coerced |> Seq.vchoose id |> Seq.toList |> Ok
9391
match parseFieldCondition name, value with
9492
| Equals "and", ListValue fields -> fields |> mapFilters |> Result.map buildAnd
9593
| Equals "or", ListValue fields -> fields |> mapFilters |> Result.map buildOr
9694
| Equals "not", ObjectValue value ->
9795
match mapInput value with
9896
| Error errs -> Error errs
99-
| Ok NoFilter -> Ok NoFilter
100-
| Ok filter -> Ok (Not filter)
101-
| EndsWith fname, StringValue value -> Ok (ObjectListFilter.EndsWith { FieldName = fname; Value = value })
102-
| StartsWith fname, StringValue value -> Ok (ObjectListFilter.StartsWith { FieldName = fname; Value = value })
103-
| Contains fname, StringValue value -> Ok (ObjectListFilter.Contains { FieldName = fname; Value = value })
97+
| Ok ValueNone -> Ok ValueNone
98+
| Ok (ValueSome filter) -> Ok (ValueSome (Not filter))
99+
| EndsWith fname, StringValue value -> Ok (ValueSome (ObjectListFilter.EndsWith { FieldName = fname; Value = value }))
100+
| StartsWith fname, StringValue value -> Ok (ValueSome (ObjectListFilter.StartsWith { FieldName = fname; Value = value }))
101+
| Contains fname, StringValue value -> Ok (ValueSome (ObjectListFilter.Contains { FieldName = fname; Value = value }))
104102
| Equals fname, ObjectValue value ->
105103
match mapInput value with
106104
| Error errs -> Error errs
107-
| Ok NoFilter -> Ok NoFilter
108-
| Ok filter -> Ok (FilterField { FieldName = fname; Value = filter })
109-
| Equals fname, EquatableValue value -> Ok (ObjectListFilter.Equals { FieldName = fname; Value = value })
110-
| GreaterThan fname, ComparableValue value -> Ok (ObjectListFilter.GreaterThan { FieldName = fname; Value = value })
111-
| GreaterThanOrEqual fname, ComparableValue value -> Ok (ObjectListFilter.GreaterThanOrEqual { FieldName = fname; Value = value })
112-
| LessThan fname, ComparableValue value -> Ok (ObjectListFilter.LessThan { FieldName = fname; Value = value })
113-
| LessThanOrEqual fname, ComparableValue value -> Ok (ObjectListFilter.LessThanOrEqual { FieldName = fname; Value = value })
114-
| _ -> Ok NoFilter
105+
| Ok ValueNone -> Ok ValueNone
106+
| Ok (ValueSome filter) -> Ok (ValueSome (FilterField { FieldName = fname; Value = filter }))
107+
| Equals fname, EquatableValue value -> Ok (ValueSome (ObjectListFilter.Equals { FieldName = fname; Value = value }))
108+
| GreaterThan fname, ComparableValue value -> Ok (ValueSome (ObjectListFilter.GreaterThan { FieldName = fname; Value = value }))
109+
| GreaterThanOrEqual fname, ComparableValue value -> Ok (ValueSome (ObjectListFilter.GreaterThanOrEqual { FieldName = fname; Value = value }))
110+
| LessThan fname, ComparableValue value -> Ok (ValueSome (ObjectListFilter.LessThan { FieldName = fname; Value = value }))
111+
| LessThanOrEqual fname, ComparableValue value -> Ok (ValueSome (ObjectListFilter.LessThanOrEqual { FieldName = fname; Value = value }))
112+
| _ -> Ok ValueNone
115113

116114
and mapInput value =
117115
let filterResults =
@@ -122,10 +120,11 @@ let rec private coerceObjectListFilterInput x : Result<ObjectListFilter, IGQLErr
122120
|> splitSeqErrorsList
123121
match filterResults with
124122
| Error errs -> Error errs
125-
| Ok filters -> filters |> removeNoFilter |> List.ofSeq |> buildAnd |> Ok
123+
| Ok filters -> filters |> Seq.vchoose id |> List.ofSeq |> buildAnd |> Ok
124+
126125
match x with
127126
| ObjectValue x -> mapInput x
128-
| NullValue -> NoFilter |> Ok
127+
| NullValue -> ValueNone |> Ok
129128
// TODO: Get union case
130129
| _ ->
131130
Error [
@@ -173,7 +172,7 @@ let ObjectListFilterType : ScalarDefinition<ObjectListFilter> = {
173172
"The `Filter` scalar type represents a filter on one or more fields of an object in an object list. The filter is represented by a JSON object where the fields are the complemented by specific suffixes to represent a query."
174173
CoerceInput =
175174
(function
176-
| InlineConstant c -> coerceObjectListFilterInput c
177-
| Variable json -> json |> jsonElementToInputValue |> coerceObjectListFilterInput)
175+
| InlineConstant c -> coerceObjectListFilterInput c |> Result.map ValueOption.toObj
176+
| Variable json -> json |> jsonElementToInputValue |> coerceObjectListFilterInput |> Result.map ValueOption.toObj)
178177
CoerceOutput = coerceObjectListFilterValue
179178
}

src/FSharp.Data.GraphQL.Server/ErrorsProcessing.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ let getSeqValues (items: Result<'t, IGQLError> seq) =
8080
| Error _ -> raise <| ArgumentException())
8181
|> Seq.toArray
8282

83-
let splitSeqErrors (items: Result<'t, IGQLError> list) =
83+
let splitSeqErrors (items: Result<'t, IGQLError> seq) =
8484
let errors = items |> getSeqErrors
8585

8686
if not errors.IsEmpty then

0 commit comments

Comments
 (0)