getFieldsToExcludeFromGeneration();
+ /**
+ * Fields that require DataFetcherResult.
+ *
+ * Values should be defined here in format: TypeName, TypeName.fieldName, @directive
+ *
+ *
+ *
E.g.:
+ *
+ * - {@code @dataFetcherResult}
+ *
+ *
+ * @return Set of types and fields that should have DataFetcherResult.
+ */
+ Set getFieldsWithDataFetcherResult();
+
/**
* Specifies whether return types of generated API interface should be wrapped into java.util.Optional
*
diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java
index f172b5c80..b67ca9b55 100644
--- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java
+++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java
@@ -65,6 +65,7 @@ public class MappingConfig implements GraphQLCodegenConfiguration, Combinable fieldsWithResolvers = new HashSet<>();
private Set fieldsWithoutResolvers = new HashSet<>();
private Set fieldsToExcludeFromGeneration = new HashSet<>();
+ private Set fieldsWithDataFetcherResult = new HashSet<>();
// parent interfaces configs:
private String queryResolverParentInterface;
@@ -195,6 +196,7 @@ public void combine(MappingConfig source) {
parametrizedInputSuffix = getValueOrDefaultToThis(source,
GraphQLCodegenConfiguration::getParametrizedInputSuffix);
fieldsWithResolvers = combineSet(fieldsWithResolvers, source.fieldsWithResolvers);
+ fieldsWithDataFetcherResult = combineSet(fieldsWithDataFetcherResult, source.fieldsWithDataFetcherResult);
fieldsWithoutResolvers = combineSet(fieldsWithoutResolvers, source.fieldsWithoutResolvers);
fieldsToExcludeFromGeneration = combineSet(fieldsToExcludeFromGeneration, source.fieldsToExcludeFromGeneration);
customTypesMapping = combineMap(customTypesMapping, source.customTypesMapping);
@@ -622,6 +624,15 @@ public void setFieldsToExcludeFromGeneration(Set fieldsToExcludeFromGene
this.fieldsToExcludeFromGeneration = fieldsToExcludeFromGeneration;
}
+ @Override
+ public Set getFieldsWithDataFetcherResult() {
+ return fieldsWithDataFetcherResult;
+ }
+
+ public void setFieldsWithDataFetcherResult(Set fieldsWithDataFetcherResult) {
+ this.fieldsWithDataFetcherResult = fieldsWithDataFetcherResult;
+ }
+
@Override
public String getQueryResolverParentInterface() {
return queryResolverParentInterface;
diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java
index 937d07cb6..544b5f812 100644
--- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java
+++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java
@@ -279,6 +279,11 @@ public Set getFieldsToExcludeFromGeneration() {
return config.getFieldsToExcludeFromGeneration();
}
+ @Override
+ public Set getFieldsWithDataFetcherResult() {
+ return config.getFieldsWithDataFetcherResult();
+ }
+
@Override
public Boolean getGenerateClient() {
return config.getGenerateClient();
diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsWithDataFetcherTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsWithDataFetcherTest.java
new file mode 100644
index 000000000..9998173f8
--- /dev/null
+++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsWithDataFetcherTest.java
@@ -0,0 +1,113 @@
+package com.kobylynskyi.graphql.codegen;
+
+import com.kobylynskyi.graphql.codegen.java.JavaGraphQLCodegen;
+import com.kobylynskyi.graphql.codegen.model.MappingConfig;
+import com.kobylynskyi.graphql.codegen.utils.Utils;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+
+import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName;
+import static java.util.Arrays.asList;
+import static java.util.Collections.singleton;
+import static java.util.Collections.singletonList;
+import static java.util.stream.Collectors.toList;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class GraphQLCodegenFieldsWithDataFetcherTest {
+
+ private final File outputBuildDir = new File("build/generated");
+ private final File outputJavaClassesDir = new File("build/generated/com/github/graphql");
+ private final MappingConfig mappingConfig = new MappingConfig();
+
+ @BeforeEach
+ void init() {
+ mappingConfig.setPackageName("com.github.graphql");
+ mappingConfig.setFieldsWithDataFetcherResult(new HashSet<>(singleton("@dataFetcherResult")));
+ }
+
+ @AfterEach
+ void cleanup() {
+ Utils.deleteDir(outputBuildDir);
+ }
+
+ @Test
+ void generate_fieldsWithDataFetcherResult_with_directives() throws Exception {
+ generate("src/test/resources/schemas/fields-with-data-fetcher-result.graphqls");
+
+ File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
+ Assertions.assertNotNull(files);
+
+ List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList());
+ assertEquals(
+ asList("Cart.java", "Item.java", "Order.java", "QueryResolver.java", "User.java",
+ "UserCurrentQueryResolver.java"),
+ generatedFileNames
+ );
+
+ File user = getFileByName(files, "User.java");
+ String userContext = Utils.getFileContent(user.getPath()).trim();
+
+ assertTrue(userContext.contains("java.util.List>"));
+ assertTrue(userContext.contains("graphql.execution.DataFetcherResult"));
+ }
+
+ @Test
+ void generate_fieldsWithDataFetcherResult_with_typename() throws Exception {
+ mappingConfig.getFieldsWithDataFetcherResult().add("Item");
+
+ generate("src/test/resources/schemas/fields-with-data-fetcher-result.graphqls");
+
+ File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
+ Assertions.assertNotNull(files);
+
+ List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList());
+ assertEquals(
+ asList("Cart.java", "Item.java", "Order.java", "QueryResolver.java", "User.java",
+ "UserCurrentQueryResolver.java"),
+ generatedFileNames
+ );
+
+ File cart = getFileByName(files, "Cart.java");
+ String userContext = Utils.getFileContent(cart.getPath()).trim();
+
+ assertTrue(userContext.contains("java.util.List>"));
+ }
+
+ @Test
+ void generate_fieldsWithDataFetcherResult_with_name() throws Exception {
+ mappingConfig.getFieldsWithDataFetcherResult().add("Item.items");
+
+ generate("src/test/resources/schemas/fields-with-data-fetcher-result.graphqls");
+
+ File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
+ Assertions.assertNotNull(files);
+
+ List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList());
+ assertEquals(
+ asList("Cart.java", "Item.java", "Order.java", "QueryResolver.java", "User.java",
+ "UserCurrentQueryResolver.java"),
+ generatedFileNames
+ );
+
+ File cart = getFileByName(files, "Cart.java");
+ String userContext = Utils.getFileContent(cart.getPath()).trim();
+
+ assertTrue(userContext.contains("java.util.List>"));
+ }
+
+ private void generate(String o) throws IOException {
+ new JavaGraphQLCodegen(singletonList(o), outputBuildDir, mappingConfig,
+ TestUtils.getStaticGeneratedInfo(mappingConfig))
+ .generate();
+ }
+}
diff --git a/src/test/resources/schemas/fields-with-data-fetcher-result.graphqls b/src/test/resources/schemas/fields-with-data-fetcher-result.graphqls
new file mode 100644
index 000000000..56b3a2c18
--- /dev/null
+++ b/src/test/resources/schemas/fields-with-data-fetcher-result.graphqls
@@ -0,0 +1,32 @@
+# A GraphQL schema provides a root type for each kind of operation.
+schema {
+ # The query root.
+ query: Query
+}
+
+type Query {
+ userCurrent: User
+}
+
+type User {
+ username: String!
+ email: String!
+ orders: [Order!]! @dataFetcherResult
+ cart: Cart! @dataFetcherResult
+}
+
+type Order {
+ number: String!
+ price: String!
+}
+
+type Cart {
+ id: Long!
+ items: [Item!]!
+}
+
+type Item {
+ id: String
+}
+
+directive @dataFetcherResult on FIELD_DEFINITION