Skip to content

Upgrade to GraphQL-Java 17.3 #262

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java</artifactId>
<version>16.2</version>
<version>17.3</version>
</dependency>
<dependency>
<groupId>org.atteo</groupId>
Expand Down
6 changes: 3 additions & 3 deletions core/src/main/kotlin/org/neo4j/graphql/DynamicProperties.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,18 @@ object DynamicProperties {
}

@Throws(CoercingParseLiteralException::class)
override fun parseLiteral(o: Any): Any? {
override fun parseLiteral(o: Any): Any {
return parse(o, emptyMap())
}
})
.build()


@Throws(CoercingParseLiteralException::class)
private fun parse(input: Any, variables: Map<String, Any>): Any? {
private fun parse(input: Any, variables: Map<String, Any>): Any {
return when (input) {
!is Value<*> -> throw CoercingParseLiteralException("Expected AST type 'StringValue' but was '${input::class.java.simpleName}'.")
is NullValue -> null
is NullValue -> throw CoercingParseLiteralException("Expected non null value.")
is ObjectValue -> input.objectFields.associate { it.name to parseNested(it.value, variables) }
else -> Assert.assertShouldNeverHappen("Only maps structures are expected")
}
Expand Down
11 changes: 6 additions & 5 deletions core/src/main/kotlin/org/neo4j/graphql/GraphQLExtensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ fun GraphQLFieldsContainer.label(): String = when {
this.isRelationType() ->
(this as? GraphQLDirectiveContainer)
?.getDirective(DirectiveConstants.RELATION)
?.getArgument(RELATION_NAME)?.value?.toJavaValue()?.toString()
?.getArgument(RELATION_NAME)?.argumentValue?.value?.toJavaValue()?.toString()
?: this.name
else -> name
}
Expand Down Expand Up @@ -150,10 +150,11 @@ fun <T> GraphQLDirective.getMandatoryArgument(argumentName: String, defaultValue
fun <T> GraphQLDirective.getArgument(argumentName: String, defaultValue: T? = null): T? {
val argument = getArgument(argumentName)
@Suppress("UNCHECKED_CAST")
return argument?.value as T?
?: argument.defaultValue as T?
?: defaultValue
?: throw IllegalStateException("No default value for @${this.name}::$argumentName")
return when {
argument.argumentValue.isSet && argument.argumentValue.value != null -> argument.argumentValue.value?.toJavaValue() as T?
argument.argumentDefaultValue.isSet -> argument.argumentDefaultValue.value?.toJavaValue() as T?
else -> defaultValue ?: throw IllegalStateException("No default value for @${this.name}::$argumentName")
}
}

fun GraphQLFieldDefinition.cypherDirective(): CypherDirective? = getDirective(CYPHER)?.let {
Expand Down
9 changes: 7 additions & 2 deletions core/src/main/kotlin/org/neo4j/graphql/NoOpCoercing.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package org.neo4j.graphql

import graphql.schema.Coercing
import graphql.schema.CoercingParseLiteralException
import graphql.schema.CoercingParseValueException

object NoOpCoercing : Coercing<Any, Any> {
override fun parseLiteral(input: Any?) = input?.toJavaValue()

override fun serialize(dataFetcherResult: Any?) = dataFetcherResult
override fun parseLiteral(input: Any) = input.toJavaValue()
?: throw CoercingParseLiteralException("literal should not be null")

override fun serialize(dataFetcherResult: Any) = dataFetcherResult

override fun parseValue(input: Any) = input.toJavaValue()
?: throw CoercingParseValueException("literal should not be null")
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ abstract class BaseDataFetcherForContainer(schemaConfig: SchemaConfig) : BaseDat
.arguments
.filterNot { listOf(FIRST, OFFSET, ORDER_BY, NATIVE_ID, OPTIONS).contains(it.name) }
.onEach { arg ->
if (arg.defaultValue != null) {
defaultFields[arg.name] = arg.defaultValue
if (arg.argumentDefaultValue.isSet) {
arg.argumentDefaultValue.value?.let { defaultFields[arg.name] = it }
}
}
.mapNotNull { type.getRelevantFieldDefinition(it.name) }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.neo4j.graphql.handler.projection

import graphql.Scalars.GraphQLString
import graphql.schema.*
import org.neo4j.cypherdsl.core.*
import org.neo4j.cypherdsl.core.Cypher.*
Expand Down Expand Up @@ -49,8 +50,10 @@ open class ProjectionBase(
override fun getName(): String = TYPE_NAME
override fun getQualifiedName(): String = TYPE_NAME
override fun getFullyQualifiedName(): String = TYPE_NAME
override fun getObjectType(): GraphQLObjectType? = null
override fun getFieldDefinition(): GraphQLFieldDefinition? = null
override fun getObjectTypes(): List<GraphQLObjectType> = emptyList()
override fun getObjectTypeNames(): List<String> = emptyList()
override fun getFieldDefinitions(): List<GraphQLFieldDefinition> = emptyList()
override fun getType(): GraphQLOutputType = GraphQLString
override fun getArguments(): Map<String, Any> = emptyMap()
override fun getLevel(): Int = 0
override fun isConditional(): Boolean = false
Expand Down Expand Up @@ -81,7 +84,8 @@ open class ProjectionBase(
val options = args[OPTIONS] as? Map<*, *>
val defaultOptions = (fieldDefinition?.getArgument(OPTIONS)?.type as? GraphQLInputObjectType)

val sortArray = (options?.get(SORT) ?: defaultOptions?.getField(SORT)?.defaultValue?.toJavaValue())
val sortArray = (options?.get(SORT)
?: defaultOptions?.getField(SORT)?.inputFieldDefaultValue?.value?.toJavaValue())
as? List<*> ?: return null

return sortArray
Expand All @@ -100,7 +104,7 @@ open class ProjectionBase(
): List<SortItem>? {

val orderBy = args[ORDER_BY]
?: fieldDefinition?.getArgument(ORDER_BY)?.defaultValue
?: fieldDefinition?.getArgument(ORDER_BY)?.argumentDefaultValue?.value
return orderBy
?.let { it ->
when (it) {
Expand Down Expand Up @@ -257,7 +261,8 @@ open class ProjectionBase(
}
projectField(propertyContainer, variable, it, nodeType, env, variableSuffix)
} else {
projectField(propertyContainer, variable, it, it.objectType, env, variableSuffix)
projectField(propertyContainer, variable, it, it.objectTypes.firstOrNull()
?: throw IllegalStateException("only one object type is supported"), env, variableSuffix)
}
projections.addAll(pro)
subQueries += sub
Expand Down Expand Up @@ -391,8 +396,8 @@ open class ProjectionBase(
.forEach { (name, value) -> args[name] = queryParameter(value, ctxVariable.value, name).`as`(name) }
fieldDefinition.arguments
.filterNot { SPECIAL_FIELDS.contains(it.name) }
.filter { it.defaultValue != null && !args.containsKey(it.name) }
.forEach { args[it.name] = queryParameter(it.defaultValue, ctxVariable.value, it.name).`as`(it.name) }
.filter { it.argumentDefaultValue.value != null && !args.containsKey(it.name) }
.forEach { args[it.name] = queryParameter(it.argumentDefaultValue.value, ctxVariable.value, it.name).`as`(it.name) }

var reading: OrderableOngoingReadingAndWithWithoutWhere? = null
if (thisValue != null) {
Expand Down Expand Up @@ -594,14 +599,14 @@ open class ProjectionBase(

private fun convertArgument(variable: String, arguments: Map<String, Any>, fieldDefinition: GraphQLFieldDefinition?, name: String): Parameter<*>? {
val value = arguments[name]
?: fieldDefinition?.getArgument(name)?.defaultValue
?: fieldDefinition?.getArgument(name)?.argumentDefaultValue?.value
?: return null
return queryParameter(value, variable, name)
}

private fun convertOptionField(variable: String, options: Map<*, *>?, defaultOptions: GraphQLInputObjectType?, name: String): Parameter<*>? {
val value = options?.get(name)
?: defaultOptions?.getField(name)?.defaultValue
?: defaultOptions?.getField(name)?.inputFieldDefaultValue?.value
?: return null
return queryParameter(value, variable, name)
}
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/kotlin/org/neo4j/graphql/parser/QueryParser.kt
Original file line number Diff line number Diff line change
Expand Up @@ -118,11 +118,11 @@ object QueryParser {
.toMap(mutableMapOf())
var index = queriedFields.size
fieldDefinition.arguments
.filter { it.defaultValue != null }
.filter { it.argumentDefaultValue.value != null }
.filterNot { queriedFields.containsKey(it.name) }
.filterNot { ProjectionBase.SPECIAL_FIELDS.contains(it.name) }
.forEach { argument ->
queriedFields[argument.name] = index++ to argument.defaultValue
queriedFields[argument.name] = index++ to argument.argumentDefaultValue.value
}

return createParsedQuery(queriedFields, type)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,6 @@ internal class AdditionalDataFetcherTest(

companion object {
@Container
private val neo4jServer = Neo4jContainer<Nothing>("neo4j:4.2.4")
private val neo4jServer = Neo4jContainer<Nothing>("neo4j:4.4.1")
}
}
2 changes: 1 addition & 1 deletion examples/graphql-spring-boot/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

<properties>
<testcontainers.version>1.16.2</testcontainers.version>
<graphql-kotlin.version>5.2.0</graphql-kotlin.version>
<graphql-kotlin.version>5.3.1</graphql-kotlin.version>
<spring-boot.version>2.6.1</spring-boot.version>
</properties>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ internal class QueriesIT(

companion object {
@Container
private val neo4jServer = Neo4jContainer<Nothing>("neo4j:4.2.4")
private val neo4jServer = Neo4jContainer<Nothing>("neo4j:4.4.1")

}

Expand Down