Skip to content

Commit 556380d

Browse files
committed
Parse operation name from query if omitted
fix #264
1 parent 6451779 commit 556380d

File tree

3 files changed

+99
-40
lines changed

3 files changed

+99
-40
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package graphql.kickstart.execution;
22

3+
import static graphql.kickstart.execution.OperationNameExtractor.extractOperationName;
4+
35
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
46
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
57

@@ -12,59 +14,57 @@
1214
*/
1315
@JsonIgnoreProperties(ignoreUnknown = true)
1416
public class GraphQLRequest {
15-
private String query;
16-
@JsonDeserialize(using = VariablesDeserializer.class)
17-
private Map<String, Object> variables = new HashMap<>();
18-
private String operationName;
1917

20-
public GraphQLRequest() {
21-
}
18+
private String query;
19+
@JsonDeserialize(using = VariablesDeserializer.class)
20+
private Map<String, Object> variables = new HashMap<>();
21+
private String operationName;
2222

23-
public GraphQLRequest(String query, Map<String, Object> variables, String operationName) {
24-
this.query = query;
25-
this.operationName = operationName;
26-
if (variables != null) {
27-
this.variables = variables;
28-
}
29-
}
23+
public GraphQLRequest() {
24+
}
3025

31-
public static GraphQLRequest createIntrospectionRequest() {
32-
return new GraphQLRequest(IntrospectionQuery.INTROSPECTION_QUERY, new HashMap<>(), null);
26+
public GraphQLRequest(String query, Map<String, Object> variables, String operationName) {
27+
this.query = query;
28+
this.operationName = operationName;
29+
if (variables != null) {
30+
this.variables = variables;
3331
}
32+
}
3433

35-
public static GraphQLRequest createQueryOnlyRequest(String query) {
36-
return new GraphQLRequest(query, new HashMap<>(), null);
37-
}
34+
public static GraphQLRequest createIntrospectionRequest() {
35+
return new GraphQLRequest(IntrospectionQuery.INTROSPECTION_QUERY, new HashMap<>(), "IntrospectionQuery");
36+
}
3837

39-
public String getQuery() {
40-
return query;
41-
}
38+
public static GraphQLRequest createQueryOnlyRequest(String query) {
39+
return new GraphQLRequest(query, new HashMap<>(), null);
40+
}
4241

43-
public void setQuery(String query) {
44-
this.query = query;
45-
}
42+
public String getQuery() {
43+
return query;
44+
}
4645

47-
public Map<String, Object> getVariables() {
48-
return variables;
49-
}
46+
public void setQuery(String query) {
47+
this.query = query;
48+
}
49+
50+
public Map<String, Object> getVariables() {
51+
return variables;
52+
}
5053

51-
public void setVariables(Map<String, Object> variables) {
52-
if (variables != null) {
53-
this.variables = variables;
54-
}
54+
public void setVariables(Map<String, Object> variables) {
55+
if (variables != null) {
56+
this.variables = variables;
5557
}
58+
}
5659

57-
public String getOperationName() {
58-
if (operationName != null && !operationName.isEmpty()) {
59-
return operationName;
60-
}
60+
public String getOperationName() {
61+
return extractOperationName(query, operationName, null);
62+
}
6163

62-
return null;
63-
}
64+
public void setOperationName(String operationName) {
65+
this.operationName = operationName;
66+
}
6467

65-
public void setOperationName(String operationName) {
66-
this.operationName = operationName;
67-
}
6868
}
6969

7070

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package graphql.kickstart.execution;
2+
3+
import static graphql.kickstart.execution.StringUtils.isNotEmpty;
4+
5+
import graphql.language.Document;
6+
import graphql.language.OperationDefinition;
7+
import graphql.parser.InvalidSyntaxException;
8+
import graphql.parser.Parser;
9+
import java.util.List;
10+
import lombok.AccessLevel;
11+
import lombok.NoArgsConstructor;
12+
13+
@NoArgsConstructor(access = AccessLevel.PRIVATE)
14+
class OperationNameExtractor {
15+
16+
static String extractOperationName(String gqlQuery, String requestedOperationName, String defaultIfNotFound) {
17+
if (isNotEmpty(requestedOperationName)) {
18+
return requestedOperationName;
19+
}
20+
if (isNotEmpty(gqlQuery)) {
21+
return parseForOperationName(gqlQuery, defaultIfNotFound);
22+
}
23+
return defaultIfNotFound;
24+
}
25+
26+
private static String parseForOperationName(String gqlQuery, String defaultIfNotFound) {
27+
try {
28+
Document document = new Parser().parseDocument(gqlQuery);
29+
List<OperationDefinition> operations = document.getDefinitionsOfType(OperationDefinition.class);
30+
if (operations.size() == 1) {
31+
String name = operations.get(0).getName();
32+
if (isNotEmpty(name)) {
33+
return name;
34+
}
35+
}
36+
} catch (InvalidSyntaxException ignored) {
37+
// ignored
38+
}
39+
return defaultIfNotFound;
40+
}
41+
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package graphql.kickstart.execution;
2+
3+
import lombok.AccessLevel;
4+
import lombok.NoArgsConstructor;
5+
6+
@NoArgsConstructor(access = AccessLevel.PRIVATE)
7+
class StringUtils {
8+
9+
static boolean isNotEmpty(CharSequence cs) {
10+
return !isEmpty(cs);
11+
}
12+
13+
static boolean isEmpty(final CharSequence cs) {
14+
return cs == null || cs.length() == 0;
15+
}
16+
17+
}

0 commit comments

Comments
 (0)