-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Expand file tree
/
Copy pathField.java
More file actions
324 lines (270 loc) · 10 KB
/
Field.java
File metadata and controls
324 lines (270 loc) · 10 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
package graphql.language;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import graphql.Internal;
import graphql.PublicApi;
import graphql.collect.ImmutableKit;
import graphql.util.Interning;
import graphql.util.TraversalControl;
import graphql.util.TraverserContext;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
import static com.google.common.collect.ImmutableMap.copyOf;
import static graphql.Assert.assertNotNull;
import static graphql.collect.ImmutableKit.addToMap;
import static graphql.collect.ImmutableKit.emptyList;
import static graphql.collect.ImmutableKit.emptyMap;
/*
* This is provided to a DataFetcher, therefore it is a public API.
* This might change in the future.
*/
@PublicApi
public class Field extends AbstractNode<Field> implements Selection<Field>, SelectionSetContainer<Field>, DirectivesContainer<Field>, NamedNode<Field> {
private final String name;
private final String alias;
private final ImmutableList<Argument> arguments;
private final NodeUtil.DirectivesHolder directives;
private final SelectionSet selectionSet;
public static final String CHILD_ARGUMENTS = "arguments";
public static final String CHILD_DIRECTIVES = "directives";
public static final String CHILD_SELECTION_SET = "selectionSet";
@Internal
protected Field(String name,
String alias,
List<Argument> arguments,
List<Directive> directives,
SelectionSet selectionSet,
SourceLocation sourceLocation,
List<Comment> comments,
IgnoredChars ignoredChars,
Map<String, String> additionalData) {
super(sourceLocation, comments, ignoredChars, additionalData);
this.name = name == null ? null : Interning.intern(name);
this.alias = alias;
this.arguments = ImmutableList.copyOf(arguments);
this.directives = NodeUtil.DirectivesHolder.of(directives);
this.selectionSet = selectionSet;
}
/**
* alternative to using a Builder for convenience
*
* @param name of the field
*/
public Field(String name) {
this(name, null, emptyList(), emptyList(), null, null, emptyList(), IgnoredChars.EMPTY, emptyMap());
}
/**
* alternative to using a Builder for convenience
*
* @param name of the field
* @param arguments to the field
*/
public Field(String name, List<Argument> arguments) {
this(name, null, arguments, emptyList(), null, null, emptyList(), IgnoredChars.EMPTY, emptyMap());
}
/**
* alternative to using a Builder for convenience
*
* @param name of the field
* @param arguments to the field
* @param selectionSet of the field
*/
public Field(String name, List<Argument> arguments, SelectionSet selectionSet) {
this(name, null, arguments, emptyList(), selectionSet, null, emptyList(), IgnoredChars.EMPTY, emptyMap());
}
/**
* alternative to using a Builder for convenience
*
* @param name of the field
* @param selectionSet of the field
*/
public Field(String name, SelectionSet selectionSet) {
this(name, null, emptyList(), emptyList(), selectionSet, null, emptyList(), IgnoredChars.EMPTY, emptyMap());
}
@Override
public List<Node> getChildren() {
List<Node> result = new ArrayList<>();
result.addAll(arguments);
result.addAll(directives.getDirectives());
if (selectionSet != null) {
result.add(selectionSet);
}
return result;
}
@Override
public NodeChildrenContainer getNamedChildren() {
return NodeChildrenContainer.newNodeChildrenContainer()
.children(CHILD_ARGUMENTS, arguments)
.children(CHILD_DIRECTIVES, directives.getDirectives())
.child(CHILD_SELECTION_SET, selectionSet)
.build();
}
@Override
public Field withNewChildren(NodeChildrenContainer newChildren) {
return transform(builder ->
builder.arguments(newChildren.getChildren(CHILD_ARGUMENTS))
.directives(newChildren.getChildren(CHILD_DIRECTIVES))
.selectionSet(newChildren.getChildOrNull(CHILD_SELECTION_SET))
);
}
@Override
public String getName() {
return name;
}
public String getAlias() {
return alias;
}
public String getResultKey() {
return alias != null ? alias : name;
}
public List<Argument> getArguments() {
return arguments;
}
@Override
public List<Directive> getDirectives() {
return directives.getDirectives();
}
@Override
public Map<String, List<Directive>> getDirectivesByName() {
return directives.getDirectivesByName();
}
@Override
public List<Directive> getDirectives(String directiveName) {
return directives.getDirectives(directiveName);
}
@Override
public boolean hasDirective(String directiveName) {
return directives.hasDirective(directiveName);
}
@Override
public SelectionSet getSelectionSet() {
return selectionSet;
}
@Override
public boolean isEqualTo(Node o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Field that = (Field) o;
return Objects.equals(this.name, that.name) && Objects.equals(this.alias, that.alias);
}
@Override
public Field deepCopy() {
return new Field(name,
alias,
deepCopy(arguments),
deepCopy(directives.getDirectives()),
deepCopy(selectionSet),
getSourceLocation(),
getComments(),
getIgnoredChars(),
getAdditionalData()
);
}
@Override
public String toString() {
return "Field{" +
"name='" + name + '\'' +
", alias='" + alias + '\'' +
", arguments=" + arguments +
", directives=" + directives +
", selectionSet=" + selectionSet +
'}';
}
@Override
public TraversalControl accept(TraverserContext<Node> context, NodeVisitor visitor) {
return visitor.visitField(this, context);
}
public static Builder newField() {
return new Builder();
}
public static Builder newField(String name) {
return new Builder().name(name);
}
public static Builder newField(String name, SelectionSet selectionSet) {
return new Builder().name(name).selectionSet(selectionSet);
}
public Field transform(Consumer<Builder> builderConsumer) {
Builder builder = new Builder(this);
builderConsumer.accept(builder);
return builder.build();
}
public static final class Builder implements NodeDirectivesBuilder {
private SourceLocation sourceLocation;
private ImmutableList<Comment> comments = emptyList();
private String name;
private String alias;
private ImmutableList<Argument> arguments = emptyList();
private ImmutableList<Directive> directives = emptyList();
private SelectionSet selectionSet;
private IgnoredChars ignoredChars = IgnoredChars.EMPTY;
private ImmutableMap<String, String> additionalData = emptyMap();
private Builder() {
}
private Builder(Field existing) {
this.sourceLocation = existing.getSourceLocation();
this.comments = ImmutableList.copyOf(existing.getComments());
this.name = existing.getName();
this.alias = existing.getAlias();
this.arguments = ImmutableList.copyOf(existing.getArguments());
this.directives = ImmutableList.copyOf(existing.getDirectives());
this.selectionSet = existing.getSelectionSet();
this.ignoredChars = existing.getIgnoredChars();
this.additionalData = copyOf(existing.getAdditionalData());
}
public Builder sourceLocation(SourceLocation sourceLocation) {
this.sourceLocation = sourceLocation;
return this;
}
public Builder comments(List<Comment> comments) {
this.comments = ImmutableList.copyOf(comments);
return this;
}
public Builder name(String name) {
this.name = name;
return this;
}
public Builder alias(String alias) {
this.alias = alias;
return this;
}
public Builder arguments(List<Argument> arguments) {
this.arguments = ImmutableList.copyOf(arguments);
return this;
}
@Override
public Builder directives(List<Directive> directives) {
this.directives = ImmutableList.copyOf(directives);
return this;
}
public Builder directive(Directive directive) {
this.directives = ImmutableKit.addToList(directives, directive);
return this;
}
public Builder selectionSet(SelectionSet selectionSet) {
this.selectionSet = selectionSet;
return this;
}
public Builder ignoredChars(IgnoredChars ignoredChars) {
this.ignoredChars = ignoredChars;
return this;
}
public Builder additionalData(Map<String, String> additionalData) {
this.additionalData = ImmutableMap.copyOf(assertNotNull(additionalData));
return this;
}
public Builder additionalData(String key, String value) {
this.additionalData = addToMap(this.additionalData, key, value);
return this;
}
public Field build() {
return new Field(name, alias, arguments, directives, selectionSet, sourceLocation, comments, ignoredChars, additionalData);
}
}
}