11package graphql .execution ;
22
3+ import java .util .ArrayList ;
4+ import java .util .Collections ;
5+ import java .util .List ;
6+ import java .util .Optional ;
7+ import java .util .stream .Collectors ;
8+
39import graphql .ErrorType ;
410import graphql .GraphQLError ;
511import graphql .language .Field ;
612import graphql .language .SourceLocation ;
713import graphql .schema .DataFetcher ;
8-
9- import java .util .ArrayList ;
10- import java .util .Collections ;
1114import java .util .HashMap ;
12- import java .util .List ;
1315import java .util .Map ;
14- import java .util .Optional ;
15- import java .util .stream .Collectors ;
1616
1717import static graphql .Assert .assertNotNull ;
1818
@@ -67,6 +67,15 @@ public Map<String, Object> getExtensions() {
6767 return extentions ;
6868 }
6969
70+ /**
71+ * Creating absolute paths follows the following logic:
72+ * Relative path is null -> Absolute path null
73+ * Relative path is empty -> Absolute paths is path up to the field.
74+ * Relative path is not empty -> Absolute paths [base Path, relative Path]
75+ * @param relativeError relative error
76+ * @param executionStrategyParameters execution strategy params.
77+ * @return List of paths from the root.
78+ */
7079 private List <Object > createAbsolutePath (ExecutionStrategyParameters executionStrategyParameters ,
7180 GraphQLError relativeError ) {
7281 return Optional .ofNullable (relativeError .getPath ())
@@ -80,13 +89,28 @@ private List<Object> createAbsolutePath(ExecutionStrategyParameters executionStr
8089 .orElse (null );
8190 }
8291
92+ /**
93+ * Creating absolute locations follows the following logic:
94+ * Relative locations is null -> Absolute locations null
95+ * Relative locations is empty -> Absolute locations base locations of the field.
96+ * Relative locations is not empty -> Absolute locations [base line + relative line location]
97+ * @param relativeError relative error
98+ * @param fields fields on the current field.
99+ * @return List of locations from the root.
100+ */
83101 private List <SourceLocation > createAbsoluteLocations (GraphQLError relativeError , List <Field > fields ) {
84102 Optional <SourceLocation > baseLocation ;
85103 if (!fields .isEmpty ()) {
86104 baseLocation = Optional .ofNullable (fields .get (0 ).getSourceLocation ());
87105 } else {
88106 baseLocation = Optional .empty ();
89107 }
108+
109+ // relative error empty path should yield an absolute error with the base path
110+ if (relativeError .getLocations () != null && relativeError .getLocations ().isEmpty ()) {
111+ return baseLocation .map (Collections ::singletonList ).orElse (null );
112+ }
113+
90114 return Optional .ofNullable (
91115 relativeError .getLocations ())
92116 .map (locations -> locations .stream ()
0 commit comments