Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
10 changes: 0 additions & 10 deletions lib/src/main/java/graphql/nadel/NadelExecutionHints.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import graphql.nadel.hints.NadelNoInterfaceToObjectFragmentExpansionHint
import graphql.nadel.hints.NadelReachableUnderlyingServiceTypesHint
import graphql.nadel.hints.NadelShadowUnderlyingTypeNameInvestigation
import graphql.nadel.hints.NadelSharedTypeRenamesHint
import graphql.nadel.hints.NadelShortCircuitEmptyQueryHint
import graphql.nadel.hints.NadelVirtualTypeSupportHint
import graphql.nadel.hints.NewResultMergerAndNamespacedTypename

Expand All @@ -22,7 +21,6 @@ data class NadelExecutionHints(
val newResultMergerAndNamespacedTypename: NewResultMergerAndNamespacedTypename,
val deferSupport: NadelDeferSupportHint,
val sharedTypeRenames: NadelSharedTypeRenamesHint,
val shortCircuitEmptyQuery: NadelShortCircuitEmptyQueryHint,
val virtualTypeSupport: NadelVirtualTypeSupportHint,
val executeOnEngineSchema: NadelExecuteOnEngineSchemaHint,
val hydrationFilterObjectTypes: NadelHydrationFilterObjectTypesHint,
Expand All @@ -48,7 +46,6 @@ data class NadelExecutionHints(
private var allDocumentVariablesHint = AllDocumentVariablesHint { false }
private var newResultMergerAndNamespacedTypename = NewResultMergerAndNamespacedTypename { false }
private var deferSupport = NadelDeferSupportHint { false }
private var shortCircuitEmptyQuery = NadelShortCircuitEmptyQueryHint { false }
private var sharedTypeRenames = NadelSharedTypeRenamesHint { false }
private var virtualTypeSupport = NadelVirtualTypeSupportHint { false }
private var executeOnEngineSchema = NadelExecuteOnEngineSchemaHint { false }
Expand All @@ -67,7 +64,6 @@ data class NadelExecutionHints(
allDocumentVariablesHint = nadelExecutionHints.allDocumentVariablesHint
newResultMergerAndNamespacedTypename = nadelExecutionHints.newResultMergerAndNamespacedTypename
deferSupport = nadelExecutionHints.deferSupport
shortCircuitEmptyQuery = nadelExecutionHints.shortCircuitEmptyQuery
sharedTypeRenames = nadelExecutionHints.sharedTypeRenames
virtualTypeSupport = nadelExecutionHints.virtualTypeSupport
executeOnEngineSchema = nadelExecutionHints.executeOnEngineSchema
Expand Down Expand Up @@ -100,11 +96,6 @@ data class NadelExecutionHints(
return this
}

fun shortCircuitEmptyQuery(flag: NadelShortCircuitEmptyQueryHint): Builder {
shortCircuitEmptyQuery = flag
return this
}

fun sharedTypeRenames(flag: NadelSharedTypeRenamesHint): Builder {
sharedTypeRenames = flag
return this
Expand Down Expand Up @@ -162,7 +153,6 @@ data class NadelExecutionHints(
newResultMergerAndNamespacedTypename,
deferSupport,
sharedTypeRenames,
shortCircuitEmptyQuery,
virtualTypeSupport,
executeOnEngineSchema,
hydrationFilterObjectTypes,
Expand Down
13 changes: 7 additions & 6 deletions lib/src/main/java/graphql/nadel/NextgenEngine.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import graphql.nadel.engine.transform.query.DynamicServiceResolution
import graphql.nadel.engine.transform.query.NadelFieldToService
import graphql.nadel.engine.transform.query.NadelQueryTransformer
import graphql.nadel.engine.transform.result.NadelResultTransformer
import graphql.nadel.engine.transform.skipInclude.NadelSkipIncludeTransform.Companion.isSkipIncludeArtificialField
import graphql.nadel.engine.util.MutableJsonMap
import graphql.nadel.engine.util.beginExecute
import graphql.nadel.engine.util.compileToDocument
Expand Down Expand Up @@ -416,7 +417,7 @@ internal class NextgenEngine(
.firstOrNull() ?: topLevelFields.first(),
)

val serviceExecution = getServiceExecution(service, topLevelFields, executionContext.hints)
val serviceExecution = getServiceExecution(service, topLevelFields)
val serviceExecResult = try {
serviceExecution.execute(serviceExecParams)
.asDeferred()
Expand Down Expand Up @@ -474,13 +475,12 @@ internal class NextgenEngine(
private fun getServiceExecution(
service: Service,
topLevelFields: List<ExecutableNormalizedField>,
hints: NadelExecutionHints,
): ServiceExecution {
if (hints.shortCircuitEmptyQuery(service) && isOnlyTopLevelFieldTypename(topLevelFields, service)) {
return engineSchemaIntrospectionService.serviceExecution
return if (isOnlyTopLevelFieldTypename(topLevelFields, service)) {
engineSchemaIntrospectionService.serviceExecution
} else {
service.serviceExecution
}

return service.serviceExecution
}

private fun isOnlyTopLevelFieldTypename(
Expand All @@ -496,6 +496,7 @@ internal class NextgenEngine(
return isNamespacedFieldLike(service, topLevelField)
&& topLevelField.hasChildren()
&& topLevelField.children.all { it.name == TypeNameMetaFieldDef.name }
&& topLevelField.children.none(::isSkipIncludeArtificialField)
}

private fun getDocumentVariablePredicate(hints: NadelExecutionHints, service: Service): VariablePredicate {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,16 @@ import graphql.schema.GraphQLSchema
internal class NadelSkipIncludeTransform : NadelTransform<State> {
companion object {
private const val skipFieldName = "__skip"
private const val skipIncludeTag = "skip_include"

fun isSkipIncludeSpecialField(enf: ExecutableNormalizedField): Boolean {
return enf.name == skipFieldName
}

fun isSkipIncludeArtificialField(enf: ExecutableNormalizedField): Boolean {
return enf.name == Introspection.TypeNameMetaFieldDef.name
&& enf.resultKey == "${Introspection.TypeNameMetaFieldDef.name}__${skipIncludeTag}__${skipFieldName}"
}
}

class State(
Expand Down Expand Up @@ -81,7 +87,7 @@ internal class NadelSkipIncludeTransform : NadelTransform<State> {
return if (overallField.name == skipFieldName) {
State(
aliasHelper = NadelAliasHelper.forField(
tag = "skip_include",
tag = skipIncludeTag,
field = overallField,
),
)
Expand Down

This file was deleted.

16 changes: 0 additions & 16 deletions test/src/test/kotlin/graphql/nadel/tests/hooks/remove-fields.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package graphql.nadel.tests.hooks
import graphql.ErrorClassification
import graphql.GraphQLError
import graphql.nadel.Nadel
import graphql.nadel.NadelExecutionHints
import graphql.nadel.hooks.NadelExecutionHooks
import graphql.nadel.tests.EngineTestHook
import graphql.nadel.tests.UseHook
Expand Down Expand Up @@ -98,61 +97,46 @@ class `one-of-top-level-fields-is-removed` : EngineTestHook {
@UseHook
class `top-level-field-is-removed` : EngineTestHook {
override val customTransforms = listOf(RemoveFieldTestTransform())
override fun makeExecutionHints(builder: NadelExecutionHints.Builder) = builder.shortCircuitEmptyQuery { true }
}

@UseHook
class `top-level-field-is-removed-for-a-subscription` : EngineTestHook {
override val customTransforms = listOf(RemoveFieldTestTransform())
override fun makeExecutionHints(builder: NadelExecutionHints.Builder) = builder.shortCircuitEmptyQuery { true }
}

@UseHook
class `top-level-field-is-removed-for-a-subscription-with-namespaced-field` : EngineTestHook {
override val customTransforms = listOf(RemoveFieldTestTransform())
override fun makeExecutionHints(builder: NadelExecutionHints.Builder) = builder.shortCircuitEmptyQuery { true }
}

@UseHook
class `top-level-field-is-removed-hint-is-off` : EngineTestHook {
override val customTransforms = listOf(RemoveFieldTestTransform())
override fun makeExecutionHints(builder: NadelExecutionHints.Builder) = builder.shortCircuitEmptyQuery { false }
}

@UseHook
class `hydration-top-level-field-is-removed` : EngineTestHook {
override val customTransforms = listOf(RemoveFieldTestTransform())
override fun makeExecutionHints(builder: NadelExecutionHints.Builder) = builder.shortCircuitEmptyQuery { true }
}

@UseHook
class `namespaced-hydration-top-level-field-is-removed` : EngineTestHook {
override val customTransforms = listOf(RemoveFieldTestTransform())
override fun makeExecutionHints(builder: NadelExecutionHints.Builder) = builder.shortCircuitEmptyQuery { true }
}

@UseHook
class `hidden-namespaced-hydration-top-level-field-is-removed` : EngineTestHook {
override val customTransforms = listOf(RemoveFieldTestTransform())
override fun makeExecutionHints(builder: NadelExecutionHints.Builder) = builder.shortCircuitEmptyQuery { true }
}

@UseHook
class `namespaced-field-is-removed` : EngineTestHook {
override val customTransforms = listOf(RemoveFieldTestTransform())
override fun makeExecutionHints(builder: NadelExecutionHints.Builder) = builder.shortCircuitEmptyQuery { true }
}

@UseHook
class `namespaced-field-is-removed-with-renames` : EngineTestHook {
override val customTransforms = listOf(RemoveFieldTestTransform())
override fun makeExecutionHints(builder: NadelExecutionHints.Builder) = builder.shortCircuitEmptyQuery { true }
}

@UseHook
class `renamed-top-level-field-is-not-removed-short-circuit-hint-is-on` : EngineTestHook {
override val customTransforms = listOf(RemoveFieldTestTransform())
override fun makeExecutionHints(builder: NadelExecutionHints.Builder) = builder.shortCircuitEmptyQuery { true }
}

// @UseHook
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -50,28 +50,6 @@ public class `typename is sent to owning service even when no fields are queried
delayedResults = listOfJsonStrings(
),
),
ExpectedServiceCall(
service = "Issues",
query = """
| {
| issue {
| __typename
| }
| }
""".trimMargin(),
variables = "{}",
result = """
| {
| "data": {
| "issue": {
| "__typename": "IssueQuery"
| }
| }
| }
""".trimMargin(),
delayedResults = listOfJsonStrings(
),
),
)

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,28 +21,6 @@ private suspend fun main() {
@Suppress("unused")
public class `basic hydration with static arg boolean snapshot` : TestSnapshot() {
override val calls: List<ExpectedServiceCall> = listOf(
ExpectedServiceCall(
service = "service1",
query = """
| {
| foo {
| __typename__hydration__bar: __typename
| }
| }
""".trimMargin(),
variables = "{}",
result = """
| {
| "data": {
| "foo": {
| "__typename__hydration__bar": "Foo"
| }
| }
| }
""".trimMargin(),
delayedResults = listOfJsonStrings(
),
),
ExpectedServiceCall(
service = "service2",
query = """
Expand Down
Loading
Loading