diff --git a/.run/Run All tests including integration tests.run.xml b/.run/Run All tests including integration tests.run.xml
index c2f913c1..cd23a7fd 100644
--- a/.run/Run All tests including integration tests.run.xml
+++ b/.run/Run All tests including integration tests.run.xml
@@ -1,6 +1,6 @@
-
+
@@ -13,4 +13,4 @@
-
\ No newline at end of file
+
diff --git a/core/src/main/kotlin/org/neo4j/graphql/SchemaBuilder.kt b/core/src/main/kotlin/org/neo4j/graphql/SchemaBuilder.kt
index 7c302ab3..a9c4dc53 100644
--- a/core/src/main/kotlin/org/neo4j/graphql/SchemaBuilder.kt
+++ b/core/src/main/kotlin/org/neo4j/graphql/SchemaBuilder.kt
@@ -59,7 +59,6 @@ class SchemaBuilder(
val builder = RuntimeWiring.newRuntimeWiring()
val codeRegistryBuilder = GraphQLCodeRegistry.newCodeRegistry()
-
val schemaBuilder = SchemaBuilder(typeDefinitionRegistry, config)
schemaBuilder.augmentTypes()
schemaBuilder.registerScalars(builder)
@@ -196,6 +195,9 @@ class SchemaBuilder(
dataFetchingInterceptor: DataFetchingInterceptor?,
typeDefinitionRegistry: TypeDefinitionRegistry = this.typeDefinitionRegistry
) {
+ if (dataFetchingInterceptor != null) {
+ codeRegistryBuilder.defaultDataFetcher { AliasPropertyDataFetcher() }
+ }
addDataFetcher(typeDefinitionRegistry.queryTypeName(), OperationType.QUERY, dataFetchingInterceptor, codeRegistryBuilder)
addDataFetcher(typeDefinitionRegistry.mutationTypeName(), OperationType.MUTATION, dataFetchingInterceptor, codeRegistryBuilder)
}
@@ -275,4 +277,12 @@ class SchemaBuilder(
typeDefinitionRegistry.add(inputType)
return inputName
}
+
+ class AliasPropertyDataFetcher : DataFetcher {
+ override fun get(env: DataFetchingEnvironment): Any? {
+ val source = env.getSource() ?: return null
+ val propertyName = env.mergedField.singleField.alias ?: env.mergedField.singleField.name
+ return PropertyDataFetcherHelper.getPropertyValue(propertyName, source, env.fieldType, env)
+ }
+ }
}
diff --git a/core/src/test/resources/issues/gh-267-field-aliasing-does-not-work-if-using-datafetchinginterceptor.adoc b/core/src/test/resources/issues/gh-267-field-aliasing-does-not-work-if-using-datafetchinginterceptor.adoc
new file mode 100644
index 00000000..b05fbc97
--- /dev/null
+++ b/core/src/test/resources/issues/gh-267-field-aliasing-does-not-work-if-using-datafetchinginterceptor.adoc
@@ -0,0 +1,144 @@
+:toc:
+
+= Field aliasing does not work if using DataFetchingInterceptor
+
+== Issue
+
+https://github.com/neo4j-graphql/neo4j-graphql-java/issues/267
+
+== Schema
+
+[source,graphql,schema=true]
+----
+type Movie {
+ query: Int @cypher(statement: "RETURN 42", passThrough:true)
+ title: String
+ actors: [Actor!] @relation(name: "ACTED_IN", direction:IN)
+}
+type Actor {
+ name: String
+}
+----
+
+.Test-Data
+[source,cypher,test-data=true]
+----
+CREATE (m:Movie{ title: 'movie 1' }),
+ (max:Actor{ name: 'Max' }),
+ (marie:Actor{ name: 'Marie' }),
+ (max)-[:ACTED_IN]->(m),
+ (marie)-[:ACTED_IN]->(m);
+----
+
+== Queries
+
+.GraphQL-Query
+[source,graphql]
+----
+query {
+ movieAlias: movie {
+ title
+ title1: title
+ title2: title
+ query
+ number1: query
+ number2: query
+ actors(orderBy: [ name_asc ]) { name }
+ allMax: actors(filter: { name: "Max" }) { name }
+ allMarie: actors(filter: { name: "Marie" }) { name }
+ }
+}
+----
+
+.GraphQL-Response
+[source,json,response=true]
+----
+{
+ "movieAlias" : [ {
+ "title" : "movie 1",
+ "title1" : "movie 1",
+ "title2" : "movie 1",
+ "query" : 42,
+ "number1" : 42,
+ "number2" : 42,
+ "actors" : [ {
+ "name" : "Marie"
+ }, {
+ "name" : "Max"
+ } ],
+ "allMax" : [ {
+ "name" : "Max"
+ } ],
+ "allMarie" : [ {
+ "name" : "Marie"
+ } ]
+ } ]
+}
+----
+
+.Cypher Params
+[source,json]
+----
+{
+ "filterMovieAliasAllMarieName" : "Marie",
+ "filterMovieAliasAllMaxName" : "Max"
+}
+----
+
+.Cypher
+[source,cypher]
+----
+MATCH (movieAlias:Movie)
+CALL {
+ WITH movieAlias
+ WITH movieAlias AS this
+ RETURN 42 AS movieAliasQuery LIMIT 1
+}
+CALL {
+ WITH movieAlias
+ WITH movieAlias AS this
+ RETURN 42 AS movieAliasNumber1 LIMIT 1
+}
+CALL {
+ WITH movieAlias
+ WITH movieAlias AS this
+ RETURN 42 AS movieAliasNumber2 LIMIT 1
+}
+CALL {
+ WITH movieAlias
+ MATCH (movieAlias)<-[:ACTED_IN]-(movieAliasActors:Actor)
+ WITH movieAliasActors ORDER BY movieAliasActors.name ASC
+ RETURN collect(movieAliasActors {
+ .name
+ }) AS movieAliasActors
+}
+CALL {
+ WITH movieAlias
+ MATCH (movieAlias)<-[:ACTED_IN]-(movieAliasAllMax:Actor)
+ WHERE movieAliasAllMax.name = $filterMovieAliasAllMaxName
+ RETURN collect(movieAliasAllMax {
+ .name
+ }) AS movieAliasAllMax
+}
+CALL {
+ WITH movieAlias
+ MATCH (movieAlias)<-[:ACTED_IN]-(movieAliasAllMarie:Actor)
+ WHERE movieAliasAllMarie.name = $filterMovieAliasAllMarieName
+ RETURN collect(movieAliasAllMarie {
+ .name
+ }) AS movieAliasAllMarie
+}
+RETURN movieAlias {
+ .title,
+ title1: movieAlias.title,
+ title2: movieAlias.title,
+ query: movieAliasQuery,
+ number1: movieAliasNumber1,
+ number2: movieAliasNumber2,
+ actors: movieAliasActors,
+ allMax: movieAliasAllMax,
+ allMarie: movieAliasAllMarie
+} AS movieAlias
+----
+
+'''