Skip to content
This repository was archived by the owner on Jul 25, 2024. It is now read-only.

Commit 7a8a19b

Browse files
author
Josh Price
committed
Merge pull request #24 from joshprice/revert-23-object-fields
Revert "Added support for object fields"
2 parents 2fc6deb + d4c484f commit 7a8a19b

File tree

3 files changed

+18
-63
lines changed

3 files changed

+18
-63
lines changed

lib/graphql.ex

+18-34
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ defmodule GraphQL do
3030
# {:ok, %{hello: "world"}}
3131
"""
3232

33+
alias GraphQL.Schema
34+
alias GraphQL.SyntaxError
35+
3336
defmodule ObjectType do
3437
defstruct name: "RootQueryType", description: "", fields: []
3538
end
@@ -93,47 +96,28 @@ defmodule GraphQL do
9396
"""
9497
def execute(schema, query) do
9598
case parse(query) do
96-
{:ok, document} -> execute_definition(hd(document[:definitions]), schema)
97-
{:error, error} -> {:error, error}
98-
end
99-
end
99+
{:ok, document} ->
100+
query_fields = hd(document[:definitions])[:selectionSet][:selections]
100101

101-
defp execute_definition(%{operation: :query}=definition, schema) do
102-
{:ok, Enum.map(definition[:selectionSet][:selections], fn(selection) -> execute_field(selection, schema.query) end)
103-
|> Enum.filter(fn(item) -> item != nil end)
104-
|> Enum.into(%{})}
105-
end
102+
%Schema{
103+
query: _query_root = %ObjectType{
104+
name: "RootQueryType",
105+
fields: fields
106+
}
107+
} = schema
106108

107-
defp execute_field(%{kind: :Field, selectionSet: selection_set}=field, schema) do
108-
fields = Enum.map(selection_set[:selections], fn(selection) ->
109-
schema_fragment = Enum.find(schema.fields, fn(fd) -> fd.name == field[:name] end)
110-
execute_field(selection, schema_fragment)
111-
end)
109+
result = for fd <- fields, qf <- query_fields, qf[:name] == fd.name do
110+
arguments = Map.get(qf, :arguments, [])
111+
|> Enum.map(&parse_argument/1)
112112

113-
fields = Enum.filter(fields, fn(item) -> item != nil end)
113+
{String.to_atom(fd.name), fd.resolve.(arguments)}
114+
end
114115

115-
if Enum.count(fields) > 0 do
116-
{String.to_atom(field[:name]), Enum.into(fields, %{})}
117-
else
118-
nil
119-
end
120-
121-
end
122-
123-
defp execute_field(%{kind: :Field}=field, schema) do
124-
arguments = Map.get(field, :arguments, []) |> Enum.map(&parse_argument/1)
125-
schema_fragment = Enum.find(schema.fields, fn(fd) -> fd.name == field[:name] end)
126-
case resolve(schema_fragment, arguments) do
127-
{:ok, value} -> {String.to_atom(field[:name]), value}
128-
{:error, _} -> nil
116+
{:ok, Enum.into(result, %{})}
117+
{:error, error} -> {:error, error}
129118
end
130119
end
131120

132-
defp resolve(nil, _), do: {:error, nil}
133-
defp resolve(field, arguments) do
134-
{:ok, field.resolve.(arguments)}
135-
end
136-
137121
defp parse_argument(%{kind: :Argument, loc: _, name: name, value: %{kind: _, loc: _, value: value}}) do
138122
{String.to_atom(name), value}
139123
end

lib/graphql/exceptions.ex

-1
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,3 @@ defmodule GraphQL.SyntaxError do
88
"#{exception.errors} on line #{exception.line}"
99
end
1010
end
11-

test/graphql_executor_test.exs

-28
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,6 @@ defmodule GraphqlExecutorTest do
1616
name: "greeting",
1717
type: "String",
1818
resolve: &greeting/1,
19-
},
20-
%GraphQL.ObjectType{
21-
name: "person",
22-
fields: [
23-
%GraphQL.FieldDefinition{
24-
name: "name",
25-
type: "String",
26-
resolve: &person_name/1
27-
}
28-
]
2919
}
3020
]
3121
}
@@ -34,8 +24,6 @@ defmodule GraphqlExecutorTest do
3424

3525
def greeting(name: name), do: "Hello, #{name}!"
3626
def greeting(_), do: greeting(name: "world")
37-
38-
def person_name(_), do: "Nick"
3927
end
4028

4129
test "basic query execution" do
@@ -48,22 +36,6 @@ defmodule GraphqlExecutorTest do
4836
assert GraphQL.execute(TestSchema.schema, query) == {:ok, %{greeting: "Hello, Elixir!"}}
4937
end
5038

51-
test "query object type fields" do
52-
query = "{ greeting, person { name } }"
53-
assert GraphQL.execute(TestSchema.schema, query) == {:ok, %{greeting: "Hello, world!", person: %{name: "Nick"} }}
54-
end
55-
56-
test "query undefined field" do
57-
query = "{ undefined }"
58-
assert GraphQL.execute(TestSchema.schema, query) == {:ok, %{}}
59-
end
60-
61-
test "query nested undefined field" do
62-
query = "{ greeting, person { title } }"
63-
assert GraphQL.execute(TestSchema.schema, query) == {:ok, %{greeting: "Hello, world!"}}
64-
end
65-
66-
6739

6840
# test "simple selection set" do
6941
#

0 commit comments

Comments
 (0)