Skip to content

Commit 797558d

Browse files
authored
Consider union and interface projections ("...on") in all$ method #1375 (#1376)
* Fix all$ generation for unions
1 parent 41480c0 commit 797558d

File tree

11 files changed

+253
-6
lines changed

11 files changed

+253
-6
lines changed

src/main/resources/templates/java-lang/response_projection.ftl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,10 @@ public class ${className} extends GraphQLResponseProjection {
5454
public ${className} all$(int maxDepth) {
5555
<#list fields as field>
5656
<#if field.type?has_content>
57-
<#if field.methodName?substring(0,2) != "on">
5857
if (projectionDepthOnFields.getOrDefault("${className}.${field.type}.${field.methodName}", 0) <= maxDepth) {
5958
projectionDepthOnFields.put("${className}.${field.type}.${field.methodName}", projectionDepthOnFields.getOrDefault("${className}.${field.type}.${field.methodName}", 0) + 1);
6059
this.${field.methodName}(new ${field.type}().all$(maxDepth - projectionDepthOnFields.getOrDefault("${className}.${field.type}.${field.methodName}", 0)));
6160
}
62-
</#if>
6361
<#else>
6462
this.${field.methodName}();
6563
</#if>

src/main/resources/templates/kotlin-lang/response_projection.ftl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,10 @@ open class ${className} : GraphQLResponseProjection {
4040
fun `all$`(maxDepth: Int): ${className} {
4141
<#list fields as field>
4242
<#if field.type?has_content>
43-
<#if field.methodName?substring(0, 2) != "on">
4443
if (projectionDepthOnFields.getOrDefault("${className}.${field.type}.${field.methodName}", 0) <= maxDepth) {
4544
projectionDepthOnFields["${className}.${field.type}.${field.methodName}"] = projectionDepthOnFields.getOrDefault("${className}.${field.type}.${field.methodName}", 0) + 1
4645
this.${field.methodName}(${field.type}().`all$`(maxDepth - projectionDepthOnFields.getOrDefault("${className}.${field.type}.${field.methodName}", 0)))
4746
}
48-
</#if>
4947
<#else>
5048
this.${field.methodName}()
5149
</#if>

src/main/resources/templates/scala-lang/response_projection.ftl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,10 @@ class ${className}() extends GraphQLResponseProjection() {
6060
def all$(maxDepth: Int): ${className} = {
6161
<#list fields as field>
6262
<#if field.type?has_content>
63-
<#if field.methodName?substring(0, 2) != "on">
6463
if (projectionDepthOnFields.getOrElse("${className}.${field.type}.${field.methodName}", 0) <= maxDepth) {
6564
projectionDepthOnFields.put("${className}.${field.type}.${field.methodName}", projectionDepthOnFields.getOrElse("${className}.${field.type}.${field.methodName}", 0) + 1)
6665
this.${field.methodName}(new ${field.type}().all$(maxDepth - projectionDepthOnFields.getOrElse("${className}.${field.type}.${field.methodName}", 0)))
6766
}
68-
</#if>
6967
<#else>
7068
this.${field.methodName}()
7169
</#if>
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.kobylynskyi.graphql.codegen;
2+
3+
import com.kobylynskyi.graphql.codegen.java.JavaGraphQLCodegen;
4+
import com.kobylynskyi.graphql.codegen.model.MappingConfig;
5+
import com.kobylynskyi.graphql.codegen.utils.Utils;
6+
import org.junit.jupiter.api.AfterEach;
7+
import org.junit.jupiter.api.BeforeEach;
8+
import org.junit.jupiter.api.Test;
9+
10+
import java.io.File;
11+
import java.io.IOException;
12+
import java.util.Objects;
13+
14+
import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent;
15+
import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName;
16+
import static java.util.Collections.singletonList;
17+
18+
class GraphQLCodegenUnionProjectionTest {
19+
20+
private final File outputBuildDir = new File("build/generated");
21+
22+
private MappingConfig mappingConfig;
23+
24+
@BeforeEach
25+
void init() {
26+
mappingConfig = new MappingConfig();
27+
mappingConfig.setGenerateClient(true);
28+
}
29+
30+
@AfterEach
31+
void cleanup() {
32+
Utils.deleteDir(outputBuildDir);
33+
}
34+
35+
@Test
36+
void generate_CheckFiles_with_projections() throws Exception {
37+
generate();
38+
39+
File outputJavaClassesDir = new File("build/generated");
40+
File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
41+
42+
assertSameTrimmedContent(new File("src/test/resources/expected-classes/" +
43+
"UnionToResolveResponseProjection.java.txt"),
44+
getFileByName(files, "UnionToResolveResponseProjection.java"));
45+
}
46+
47+
private void generate() throws IOException {
48+
new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/union-projection.graphqls"),
49+
outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo(mappingConfig))
50+
.generate();
51+
}
52+
53+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseField;
2+
import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection;
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.List;
6+
7+
/**
8+
* Response projection for UnionToResolve
9+
*/
10+
@javax.annotation.Generated(
11+
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
12+
date = "2020-12-31T23:59:59-0500"
13+
)
14+
public class UnionToResolveResponseProjection extends GraphQLResponseProjection {
15+
16+
private final Map<String, Integer> projectionDepthOnFields = new HashMap<>();
17+
18+
public UnionToResolveResponseProjection() {
19+
}
20+
21+
public UnionToResolveResponseProjection(UnionToResolveResponseProjection projection) {
22+
super(projection);
23+
}
24+
25+
public UnionToResolveResponseProjection(List<UnionToResolveResponseProjection> projections) {
26+
super(projections);
27+
}
28+
29+
public UnionToResolveResponseProjection all$() {
30+
return all$(3);
31+
}
32+
33+
public UnionToResolveResponseProjection all$(int maxDepth) {
34+
if (projectionDepthOnFields.getOrDefault("UnionToResolveResponseProjection.UnionMemberAResponseProjection.onUnionMemberA", 0) <= maxDepth) {
35+
projectionDepthOnFields.put("UnionToResolveResponseProjection.UnionMemberAResponseProjection.onUnionMemberA", projectionDepthOnFields.getOrDefault("UnionToResolveResponseProjection.UnionMemberAResponseProjection.onUnionMemberA", 0) + 1);
36+
this.onUnionMemberA(new UnionMemberAResponseProjection().all$(maxDepth - projectionDepthOnFields.getOrDefault("UnionToResolveResponseProjection.UnionMemberAResponseProjection.onUnionMemberA", 0)));
37+
}
38+
if (projectionDepthOnFields.getOrDefault("UnionToResolveResponseProjection.UnionMemberBResponseProjection.onUnionMemberB", 0) <= maxDepth) {
39+
projectionDepthOnFields.put("UnionToResolveResponseProjection.UnionMemberBResponseProjection.onUnionMemberB", projectionDepthOnFields.getOrDefault("UnionToResolveResponseProjection.UnionMemberBResponseProjection.onUnionMemberB", 0) + 1);
40+
this.onUnionMemberB(new UnionMemberBResponseProjection().all$(maxDepth - projectionDepthOnFields.getOrDefault("UnionToResolveResponseProjection.UnionMemberBResponseProjection.onUnionMemberB", 0)));
41+
}
42+
this.typename();
43+
return this;
44+
}
45+
46+
public UnionToResolveResponseProjection onUnionMemberA(UnionMemberAResponseProjection subProjection) {
47+
return onUnionMemberA(null, subProjection);
48+
}
49+
50+
public UnionToResolveResponseProjection onUnionMemberA(String alias, UnionMemberAResponseProjection subProjection) {
51+
add$(new GraphQLResponseField("...on UnionMemberA").alias(alias).projection(subProjection));
52+
return this;
53+
}
54+
55+
public UnionToResolveResponseProjection onUnionMemberB(UnionMemberBResponseProjection subProjection) {
56+
return onUnionMemberB(null, subProjection);
57+
}
58+
59+
public UnionToResolveResponseProjection onUnionMemberB(String alias, UnionMemberBResponseProjection subProjection) {
60+
add$(new GraphQLResponseField("...on UnionMemberB").alias(alias).projection(subProjection));
61+
return this;
62+
}
63+
64+
public UnionToResolveResponseProjection typename() {
65+
return typename(null);
66+
}
67+
68+
public UnionToResolveResponseProjection typename(String alias) {
69+
add$(new GraphQLResponseField("__typename").alias(alias));
70+
return this;
71+
}
72+
73+
@Override
74+
public UnionToResolveResponseProjection deepCopy$() {
75+
return new UnionToResolveResponseProjection(this);
76+
}
77+
78+
79+
}

src/test/resources/expected-classes/kt/SearchResultItemResponseProjection.kt.txt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,34 @@ open class SearchResultItemResponseProjection : GraphQLResponseProjection {
2424
fun `all$`(): SearchResultItemResponseProjection = `all$`(3)
2525

2626
fun `all$`(maxDepth: Int): SearchResultItemResponseProjection {
27+
if (projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.AppResponseProjection.onApp", 0) <= maxDepth) {
28+
projectionDepthOnFields["SearchResultItemResponseProjection.AppResponseProjection.onApp"] = projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.AppResponseProjection.onApp", 0) + 1
29+
this.onApp(AppResponseProjection().`all$`(maxDepth - projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.AppResponseProjection.onApp", 0)))
30+
}
31+
if (projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.RepositoryResponseProjection.onRepository", 0) <= maxDepth) {
32+
projectionDepthOnFields["SearchResultItemResponseProjection.RepositoryResponseProjection.onRepository"] = projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.RepositoryResponseProjection.onRepository", 0) + 1
33+
this.onRepository(RepositoryResponseProjection().`all$`(maxDepth - projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.RepositoryResponseProjection.onRepository", 0)))
34+
}
35+
if (projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.IssueResponseProjection.onIssue", 0) <= maxDepth) {
36+
projectionDepthOnFields["SearchResultItemResponseProjection.IssueResponseProjection.onIssue"] = projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.IssueResponseProjection.onIssue", 0) + 1
37+
this.onIssue(IssueResponseProjection().`all$`(maxDepth - projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.IssueResponseProjection.onIssue", 0)))
38+
}
39+
if (projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.OrganizationResponseProjection.onOrganization", 0) <= maxDepth) {
40+
projectionDepthOnFields["SearchResultItemResponseProjection.OrganizationResponseProjection.onOrganization"] = projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.OrganizationResponseProjection.onOrganization", 0) + 1
41+
this.onOrganization(OrganizationResponseProjection().`all$`(maxDepth - projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.OrganizationResponseProjection.onOrganization", 0)))
42+
}
43+
if (projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.UserResponseProjection.onUser", 0) <= maxDepth) {
44+
projectionDepthOnFields["SearchResultItemResponseProjection.UserResponseProjection.onUser"] = projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.UserResponseProjection.onUser", 0) + 1
45+
this.onUser(UserResponseProjection().`all$`(maxDepth - projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.UserResponseProjection.onUser", 0)))
46+
}
47+
if (projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.MarketplaceListingResponseProjection.onMarketplaceListing", 0) <= maxDepth) {
48+
projectionDepthOnFields["SearchResultItemResponseProjection.MarketplaceListingResponseProjection.onMarketplaceListing"] = projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.MarketplaceListingResponseProjection.onMarketplaceListing", 0) + 1
49+
this.onMarketplaceListing(MarketplaceListingResponseProjection().`all$`(maxDepth - projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.MarketplaceListingResponseProjection.onMarketplaceListing", 0)))
50+
}
51+
if (projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.PullRequestResponseProjection.onPullRequest", 0) <= maxDepth) {
52+
projectionDepthOnFields["SearchResultItemResponseProjection.PullRequestResponseProjection.onPullRequest"] = projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.PullRequestResponseProjection.onPullRequest", 0) + 1
53+
this.onPullRequest(PullRequestResponseProjection().`all$`(maxDepth - projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.PullRequestResponseProjection.onPullRequest", 0)))
54+
}
2755
this.typename()
2856
return this
2957
}

src/test/resources/expected-classes/projection-with-selectAll/LocationResponseProjection.java.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ public class LocationResponseProjection extends GraphQLResponseProjection {
3535
public LocationResponseProjection all$(int maxDepth) {
3636
this.id();
3737
this.locationType();
38+
if (projectionDepthOnFields.getOrDefault("LocationResponseProjection.CustomerLocationResponseProjection.onCustomerLocation", 0) <= maxDepth) {
39+
projectionDepthOnFields.put("LocationResponseProjection.CustomerLocationResponseProjection.onCustomerLocation", projectionDepthOnFields.getOrDefault("LocationResponseProjection.CustomerLocationResponseProjection.onCustomerLocation", 0) + 1);
40+
this.onCustomerLocation(new CustomerLocationResponseProjection().all$(maxDepth - projectionDepthOnFields.getOrDefault("LocationResponseProjection.CustomerLocationResponseProjection.onCustomerLocation", 0)));
41+
}
42+
if (projectionDepthOnFields.getOrDefault("LocationResponseProjection.DealerLocationResponseProjection.onDealerLocation", 0) <= maxDepth) {
43+
projectionDepthOnFields.put("LocationResponseProjection.DealerLocationResponseProjection.onDealerLocation", projectionDepthOnFields.getOrDefault("LocationResponseProjection.DealerLocationResponseProjection.onDealerLocation", 0) + 1);
44+
this.onDealerLocation(new DealerLocationResponseProjection().all$(maxDepth - projectionDepthOnFields.getOrDefault("LocationResponseProjection.DealerLocationResponseProjection.onDealerLocation", 0)));
45+
}
3846
this.typename();
3947
return this;
4048
}

src/test/resources/expected-classes/response/LocationResponseProjection.java.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ public class LocationResponseProjection extends GraphQLResponseProjection {
3535
public LocationResponseProjection all$(int maxDepth) {
3636
this.id();
3737
this.locationType();
38+
if (projectionDepthOnFields.getOrDefault("LocationResponseProjection.CustomerLocationResponseProjection.onCustomerLocation", 0) <= maxDepth) {
39+
projectionDepthOnFields.put("LocationResponseProjection.CustomerLocationResponseProjection.onCustomerLocation", projectionDepthOnFields.getOrDefault("LocationResponseProjection.CustomerLocationResponseProjection.onCustomerLocation", 0) + 1);
40+
this.onCustomerLocation(new CustomerLocationResponseProjection().all$(maxDepth - projectionDepthOnFields.getOrDefault("LocationResponseProjection.CustomerLocationResponseProjection.onCustomerLocation", 0)));
41+
}
42+
if (projectionDepthOnFields.getOrDefault("LocationResponseProjection.DealerLocationResponseProjection.onDealerLocation", 0) <= maxDepth) {
43+
projectionDepthOnFields.put("LocationResponseProjection.DealerLocationResponseProjection.onDealerLocation", projectionDepthOnFields.getOrDefault("LocationResponseProjection.DealerLocationResponseProjection.onDealerLocation", 0) + 1);
44+
this.onDealerLocation(new DealerLocationResponseProjection().all$(maxDepth - projectionDepthOnFields.getOrDefault("LocationResponseProjection.DealerLocationResponseProjection.onDealerLocation", 0)));
45+
}
3846
this.typename();
3947
return this;
4048
}

src/test/resources/expected-classes/response/SearchResultItemResponseProjection.java.txt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,34 @@ public class SearchResultItemResponseProjection extends GraphQLResponseProjectio
3333
}
3434

3535
public SearchResultItemResponseProjection all$(int maxDepth) {
36+
if (projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.AppResponseProjection.onApp", 0) <= maxDepth) {
37+
projectionDepthOnFields.put("SearchResultItemResponseProjection.AppResponseProjection.onApp", projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.AppResponseProjection.onApp", 0) + 1);
38+
this.onApp(new AppResponseProjection().all$(maxDepth - projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.AppResponseProjection.onApp", 0)));
39+
}
40+
if (projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.RepositoryResponseProjection.onRepository", 0) <= maxDepth) {
41+
projectionDepthOnFields.put("SearchResultItemResponseProjection.RepositoryResponseProjection.onRepository", projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.RepositoryResponseProjection.onRepository", 0) + 1);
42+
this.onRepository(new RepositoryResponseProjection().all$(maxDepth - projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.RepositoryResponseProjection.onRepository", 0)));
43+
}
44+
if (projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.IssueResponseProjection.onIssue", 0) <= maxDepth) {
45+
projectionDepthOnFields.put("SearchResultItemResponseProjection.IssueResponseProjection.onIssue", projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.IssueResponseProjection.onIssue", 0) + 1);
46+
this.onIssue(new IssueResponseProjection().all$(maxDepth - projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.IssueResponseProjection.onIssue", 0)));
47+
}
48+
if (projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.OrganizationResponseProjection.onOrganization", 0) <= maxDepth) {
49+
projectionDepthOnFields.put("SearchResultItemResponseProjection.OrganizationResponseProjection.onOrganization", projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.OrganizationResponseProjection.onOrganization", 0) + 1);
50+
this.onOrganization(new OrganizationResponseProjection().all$(maxDepth - projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.OrganizationResponseProjection.onOrganization", 0)));
51+
}
52+
if (projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.UserResponseProjection.onUser", 0) <= maxDepth) {
53+
projectionDepthOnFields.put("SearchResultItemResponseProjection.UserResponseProjection.onUser", projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.UserResponseProjection.onUser", 0) + 1);
54+
this.onUser(new UserResponseProjection().all$(maxDepth - projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.UserResponseProjection.onUser", 0)));
55+
}
56+
if (projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.MarketplaceListingResponseProjection.onMarketplaceListing", 0) <= maxDepth) {
57+
projectionDepthOnFields.put("SearchResultItemResponseProjection.MarketplaceListingResponseProjection.onMarketplaceListing", projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.MarketplaceListingResponseProjection.onMarketplaceListing", 0) + 1);
58+
this.onMarketplaceListing(new MarketplaceListingResponseProjection().all$(maxDepth - projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.MarketplaceListingResponseProjection.onMarketplaceListing", 0)));
59+
}
60+
if (projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.PullRequestResponseProjection.onPullRequest", 0) <= maxDepth) {
61+
projectionDepthOnFields.put("SearchResultItemResponseProjection.PullRequestResponseProjection.onPullRequest", projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.PullRequestResponseProjection.onPullRequest", 0) + 1);
62+
this.onPullRequest(new PullRequestResponseProjection().all$(maxDepth - projectionDepthOnFields.getOrDefault("SearchResultItemResponseProjection.PullRequestResponseProjection.onPullRequest", 0)));
63+
}
3664
this.typename();
3765
return this;
3866
}

0 commit comments

Comments
 (0)