Skip to content

Commit dff1294

Browse files
authored
Merge pull request #575 from kyasu1/serialize-by-ordered-dict
Preserve the serialization order for mutations
2 parents 0680565 + 3c48022 commit dff1294

File tree

7 files changed

+41
-54
lines changed

7 files changed

+41
-54
lines changed

elm.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"elm/json": "1.1.1 <= v < 2.0.0",
2424
"elm/url": "1.0.0 <= v < 2.0.0",
2525
"elm-community/list-extra": "8.0.0 <= v < 9.0.0",
26+
"j-maas/elm-ordered-containers": "1.0.0 <= v < 2.0.0",
2627
"lukewestby/elm-string-interpolate": "1.0.4 <= v < 2.0.0"
2728
},
2829
"test-dependencies": {

ete_tests/elm.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"elm/json": "1.1.2",
1717
"elm/url": "1.0.0",
1818
"elm-community/list-extra": "8.0.0",
19+
"j-maas/elm-ordered-containers": "1.0.0",
1920
"krisajenkins/remotedata": "6.0.1",
2021
"lukewestby/elm-string-interpolate": "1.0.4"
2122
},

examples/complex/elm.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"elm/time": "1.0.0",
1818
"elm/url": "1.0.0",
1919
"elm-community/list-extra": "8.0.0",
20+
"j-maas/elm-ordered-containers": "1.0.0",
2021
"krisajenkins/remotedata": "6.0.1",
2122
"lukewestby/elm-string-interpolate": "1.0.4",
2223
"mdgriffith/elm-ui": "1.1.0",

examples/elm.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"elm/time": "1.0.0",
1717
"elm/url": "1.0.0",
1818
"elm-community/list-extra": "8.0.0",
19+
"j-maas/elm-ordered-containers": "1.0.0",
1920
"krisajenkins/remotedata": "6.0.1",
2021
"lukewestby/elm-string-interpolate": "1.0.4",
2122
"mdgriffith/elm-ui": "1.1.0",

examples/subscription/elm.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"elm/time": "1.0.0",
1818
"elm/url": "1.0.0",
1919
"elm-community/list-extra": "8.0.0",
20+
"j-maas/elm-ordered-containers": "1.0.0",
2021
"krisajenkins/remotedata": "6.0.1",
2122
"lukewestby/elm-string-interpolate": "1.0.4",
2223
"mdgriffith/elm-ui": "1.1.0",

src/Graphql/Document/Field.elm

Lines changed: 32 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
module Graphql.Document.Field exposing (hashedAliasName, serializeChildren)
22

3-
import Dict exposing (Dict)
43
import Graphql.Document.Argument as Argument
54
import Graphql.Document.Hash exposing (hashString)
65
import Graphql.Document.Indent as Indent
7-
import Graphql.Internal.Builder.Argument exposing (Argument)
86
import Graphql.RawField exposing (RawField(..))
7+
import OrderedDict as Dict
8+
9+
10+
type alias Dict comparable v =
11+
Dict.OrderedDict comparable v
912

1013

1114
hashedAliasName : RawField -> String
@@ -126,29 +129,11 @@ serializeChildren indentationLevel children =
126129

127130
mergedFields : List RawField -> List RawField
128131
mergedFields children =
129-
let
130-
mergeThing : MergedFields
131-
mergeThing =
132-
mergeFields children
133-
in
134-
(mergeThing.leaves |> Dict.values |> List.map leafToField)
135-
++ (mergeThing.composites |> Dict.values |> List.map compositeToField)
132+
Dict.values (mergeFields children)
136133

137134

138135
type alias MergedFields =
139-
{ leaves : Dict String ( { typeString : String, fieldName : String }, List Argument )
140-
, composites : Dict String ( { name : String, args : List Argument }, List RawField )
141-
}
142-
143-
144-
leafToField : ( { typeString : String, fieldName : String }, List Argument ) -> RawField
145-
leafToField ( record, arguments ) =
146-
Leaf record arguments
147-
148-
149-
compositeToField : ( { name : String, args : List Argument }, List RawField ) -> RawField
150-
compositeToField ( record, children ) =
151-
Composite record.name record.args children
136+
Dict String RawField
152137

153138

154139
{-| Fields will have collisions if there is more than one with the same field name or field alias.
@@ -160,36 +145,33 @@ mergeFields : List RawField -> MergedFields
160145
mergeFields rawFields =
161146
rawFields
162147
|> List.foldl
163-
(\field { leaves, composites } ->
148+
(\field mergedSoFar ->
164149
case field of
165-
Composite fieldName args children ->
166-
{ leaves = leaves
167-
, composites =
168-
composites
169-
|> Dict.update (hashedAliasName field)
170-
(\maybeChildrenSoFar ->
171-
maybeChildrenSoFar
172-
|> Maybe.withDefault ( { name = fieldName, args = args }, [] )
173-
|> Tuple.mapSecond ((++) children)
174-
|> Just
175-
)
176-
}
177-
178-
Leaf info args ->
179-
{ leaves =
180-
leaves
181-
|> Dict.update (hashedAliasName field)
182-
(\maybeChildrenSoFar ->
183-
maybeChildrenSoFar
184-
|> Maybe.withDefault ( info, args )
185-
|> Just
186-
)
187-
, composites = composites
188-
}
150+
Composite _ _ newChildren ->
151+
mergedSoFar
152+
|> Dict.update (hashedAliasName field)
153+
(\maybeChildrenSoFar ->
154+
case maybeChildrenSoFar of
155+
Nothing ->
156+
Just field
157+
158+
Just (Composite existingFieldName existingArgs existingChildren) ->
159+
Composite existingFieldName existingArgs (existingChildren ++ newChildren) |> Just
160+
161+
_ ->
162+
Just field
163+
)
164+
165+
Leaf _ _ ->
166+
mergedSoFar
167+
|> Dict.update (hashedAliasName field)
168+
(\maybeChildrenSoFar ->
169+
maybeChildrenSoFar
170+
|> Maybe.withDefault field
171+
|> Just
172+
)
189173
)
190-
{ leaves = Dict.empty
191-
, composites = Dict.empty
192-
}
174+
Dict.empty
193175

194176

195177
nonemptyChildren : List RawField -> List RawField

tests/DocumentTests.elm

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,8 @@ all =
178178
|> Expect.equal """query {
179179
me {
180180
firstName0: firstName
181-
lastName0: lastName
182181
middleName0: middleName
182+
lastName0: lastName
183183
}
184184
}"""
185185
, test "different arguments are not merged" <|
@@ -198,12 +198,12 @@ all =
198198
]
199199
|> Graphql.Document.serializeQuery
200200
|> Expect.equal """query {
201-
me1529416052: me(id: 456) {
202-
lastName0: lastName
203-
}
204201
me3003759287: me(id: 123) {
205202
firstName0: firstName
206203
}
204+
me1529416052: me(id: 456) {
205+
lastName0: lastName
206+
}
207207
}"""
208208
, test "identical leaves are de-duped" <|
209209
\() ->

0 commit comments

Comments
 (0)