Skip to content

Commit 6553955

Browse files
authored
Remove short circuit empty query hint (#747)
1 parent 4e4cff3 commit 6553955

32 files changed

Lines changed: 25 additions & 560 deletions

lib/src/main/java/graphql/nadel/NadelExecutionHints.kt

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,13 @@ import graphql.nadel.hints.NadelNoInterfaceToObjectFragmentExpansionHint
1212
import graphql.nadel.hints.NadelReachableUnderlyingServiceTypesHint
1313
import graphql.nadel.hints.NadelShadowUnderlyingTypeNameInvestigation
1414
import graphql.nadel.hints.NadelSharedTypeRenamesHint
15-
import graphql.nadel.hints.NadelShortCircuitEmptyQueryHint
1615
import graphql.nadel.hints.NadelVirtualTypeSupportHint
1716

1817
data class NadelExecutionHints(
1918
val legacyOperationNames: LegacyOperationNamesHint,
2019
val allDocumentVariablesHint: AllDocumentVariablesHint,
2120
val deferSupport: NadelDeferSupportHint,
2221
val sharedTypeRenames: NadelSharedTypeRenamesHint,
23-
val shortCircuitEmptyQuery: NadelShortCircuitEmptyQueryHint,
2422
val virtualTypeSupport: NadelVirtualTypeSupportHint,
2523
val executeOnEngineSchema: NadelExecuteOnEngineSchemaHint,
2624
val hydrationFilterObjectTypes: NadelHydrationFilterObjectTypesHint,
@@ -45,7 +43,6 @@ data class NadelExecutionHints(
4543
private var legacyOperationNames = LegacyOperationNamesHint { false }
4644
private var allDocumentVariablesHint = AllDocumentVariablesHint { false }
4745
private var deferSupport = NadelDeferSupportHint { false }
48-
private var shortCircuitEmptyQuery = NadelShortCircuitEmptyQueryHint { false }
4946
private var sharedTypeRenames = NadelSharedTypeRenamesHint { false }
5047
private var virtualTypeSupport = NadelVirtualTypeSupportHint { false }
5148
private var executeOnEngineSchema = NadelExecuteOnEngineSchemaHint { false }
@@ -63,7 +60,6 @@ data class NadelExecutionHints(
6360
legacyOperationNames = nadelExecutionHints.legacyOperationNames
6461
allDocumentVariablesHint = nadelExecutionHints.allDocumentVariablesHint
6562
deferSupport = nadelExecutionHints.deferSupport
66-
shortCircuitEmptyQuery = nadelExecutionHints.shortCircuitEmptyQuery
6763
sharedTypeRenames = nadelExecutionHints.sharedTypeRenames
6864
virtualTypeSupport = nadelExecutionHints.virtualTypeSupport
6965
executeOnEngineSchema = nadelExecutionHints.executeOnEngineSchema
@@ -91,11 +87,6 @@ data class NadelExecutionHints(
9187
return this
9288
}
9389

94-
fun shortCircuitEmptyQuery(flag: NadelShortCircuitEmptyQueryHint): Builder {
95-
shortCircuitEmptyQuery = flag
96-
return this
97-
}
98-
9990
fun sharedTypeRenames(flag: NadelSharedTypeRenamesHint): Builder {
10091
sharedTypeRenames = flag
10192
return this
@@ -152,7 +143,6 @@ data class NadelExecutionHints(
152143
allDocumentVariablesHint,
153144
deferSupport,
154145
sharedTypeRenames,
155-
shortCircuitEmptyQuery,
156146
virtualTypeSupport,
157147
executeOnEngineSchema,
158148
hydrationFilterObjectTypes,

lib/src/main/java/graphql/nadel/NextgenEngine.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import graphql.nadel.engine.transform.query.DynamicServiceResolution
2626
import graphql.nadel.engine.transform.query.NadelFieldToService
2727
import graphql.nadel.engine.transform.query.NadelQueryTransformer
2828
import graphql.nadel.engine.transform.result.NadelResultTransformer
29+
import graphql.nadel.engine.transform.skipInclude.NadelSkipIncludeTransform.Companion.isSkipIncludeArtificialField
2930
import graphql.nadel.engine.util.MutableJsonMap
3031
import graphql.nadel.engine.util.beginExecute
3132
import graphql.nadel.engine.util.compileToDocument
@@ -411,7 +412,7 @@ internal class NextgenEngine(
411412
.firstOrNull() ?: topLevelFields.first(),
412413
)
413414

414-
val serviceExecution = getServiceExecution(service, topLevelFields, executionContext.hints)
415+
val serviceExecution = getServiceExecution(service, topLevelFields)
415416
val serviceExecResult = try {
416417
serviceExecution.execute(serviceExecParams)
417418
.asDeferred()
@@ -469,13 +470,12 @@ internal class NextgenEngine(
469470
private fun getServiceExecution(
470471
service: Service,
471472
topLevelFields: List<ExecutableNormalizedField>,
472-
hints: NadelExecutionHints,
473473
): ServiceExecution {
474-
if (hints.shortCircuitEmptyQuery(service) && isOnlyTopLevelFieldTypename(topLevelFields, service)) {
475-
return engineSchemaIntrospectionService.serviceExecution
474+
return if (isOnlyTopLevelFieldTypename(topLevelFields, service)) {
475+
engineSchemaIntrospectionService.serviceExecution
476+
} else {
477+
service.serviceExecution
476478
}
477-
478-
return service.serviceExecution
479479
}
480480

481481
private fun isOnlyTopLevelFieldTypename(
@@ -491,6 +491,7 @@ internal class NextgenEngine(
491491
return isNamespacedFieldLike(service, topLevelField)
492492
&& topLevelField.hasChildren()
493493
&& topLevelField.children.all { it.name == TypeNameMetaFieldDef.name }
494+
&& topLevelField.children.none(::isSkipIncludeArtificialField)
494495
}
495496

496497
private fun getDocumentVariablePredicate(hints: NadelExecutionHints, service: Service): VariablePredicate {

lib/src/main/java/graphql/nadel/engine/transform/skipInclude/NadelSkipIncludeTransform.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,16 @@ import graphql.schema.GraphQLSchema
3838
internal class NadelSkipIncludeTransform : NadelTransform<State> {
3939
companion object {
4040
private const val skipFieldName = "__skip"
41+
private const val skipIncludeTag = "skip_include"
4142

4243
fun isSkipIncludeSpecialField(enf: ExecutableNormalizedField): Boolean {
4344
return enf.name == skipFieldName
4445
}
46+
47+
fun isSkipIncludeArtificialField(enf: ExecutableNormalizedField): Boolean {
48+
return enf.name == Introspection.TypeNameMetaFieldDef.name
49+
&& enf.resultKey == "${Introspection.TypeNameMetaFieldDef.name}__${skipIncludeTag}__${skipFieldName}"
50+
}
4551
}
4652

4753
class State(
@@ -81,7 +87,7 @@ internal class NadelSkipIncludeTransform : NadelTransform<State> {
8187
return if (overallField.name == skipFieldName) {
8288
State(
8389
aliasHelper = NadelAliasHelper.forField(
84-
tag = "skip_include",
90+
tag = skipIncludeTag,
8591
field = overallField,
8692
),
8793
)

lib/src/main/java/graphql/nadel/hints/NadelShortCircuitEmptyQueryHint.kt

Lines changed: 0 additions & 14 deletions
This file was deleted.

test/src/test/kotlin/graphql/nadel/tests/hooks/remove-fields.kt

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package graphql.nadel.tests.hooks
33
import graphql.ErrorClassification
44
import graphql.GraphQLError
55
import graphql.nadel.Nadel
6-
import graphql.nadel.NadelExecutionHints
76
import graphql.nadel.hooks.NadelExecutionHooks
87
import graphql.nadel.tests.EngineTestHook
98
import graphql.nadel.tests.UseHook
@@ -98,61 +97,46 @@ class `one-of-top-level-fields-is-removed` : EngineTestHook {
9897
@UseHook
9998
class `top-level-field-is-removed` : EngineTestHook {
10099
override val customTransforms = listOf(RemoveFieldTestTransform())
101-
override fun makeExecutionHints(builder: NadelExecutionHints.Builder) = builder.shortCircuitEmptyQuery { true }
102100
}
103101

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

110107
@UseHook
111108
class `top-level-field-is-removed-for-a-subscription-with-namespaced-field` : EngineTestHook {
112109
override val customTransforms = listOf(RemoveFieldTestTransform())
113-
override fun makeExecutionHints(builder: NadelExecutionHints.Builder) = builder.shortCircuitEmptyQuery { true }
114-
}
115-
116-
@UseHook
117-
class `top-level-field-is-removed-hint-is-off` : EngineTestHook {
118-
override val customTransforms = listOf(RemoveFieldTestTransform())
119-
override fun makeExecutionHints(builder: NadelExecutionHints.Builder) = builder.shortCircuitEmptyQuery { false }
120110
}
121111

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

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

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

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

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

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

158142
// @UseHook

test/src/test/kotlin/graphql/nadel/tests/legacy/field removed/top level field is removed hint is off snapshot.kt

Lines changed: 0 additions & 82 deletions
This file was deleted.

test/src/test/kotlin/graphql/nadel/tests/legacy/field removed/top level field is removed hint is off.kt

Lines changed: 0 additions & 47 deletions
This file was deleted.

test/src/test/kotlin/graphql/nadel/tests/legacy/new hydration/basic hydration with static arg boolean snapshot.kt

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,6 @@ private suspend fun main() {
2121
@Suppress("unused")
2222
public class `basic hydration with static arg boolean snapshot` : TestSnapshot() {
2323
override val calls: List<ExpectedServiceCall> = listOf(
24-
ExpectedServiceCall(
25-
service = "service1",
26-
query = """
27-
| {
28-
| foo {
29-
| __typename__hydration__bar: __typename
30-
| }
31-
| }
32-
""".trimMargin(),
33-
variables = "{}",
34-
result = """
35-
| {
36-
| "data": {
37-
| "foo": {
38-
| "__typename__hydration__bar": "Foo"
39-
| }
40-
| }
41-
| }
42-
""".trimMargin(),
43-
delayedResults = listOfJsonStrings(
44-
),
45-
),
4624
ExpectedServiceCall(
4725
service = "service2",
4826
query = """

test/src/test/kotlin/graphql/nadel/tests/legacy/new hydration/basic hydration with static arg float snapshot.kt

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,6 @@ private suspend fun main() {
2121
@Suppress("unused")
2222
public class `basic hydration with static arg float snapshot` : TestSnapshot() {
2323
override val calls: List<ExpectedServiceCall> = listOf(
24-
ExpectedServiceCall(
25-
service = "service1",
26-
query = """
27-
| {
28-
| foo {
29-
| __typename__hydration__bar: __typename
30-
| }
31-
| }
32-
""".trimMargin(),
33-
variables = "{}",
34-
result = """
35-
| {
36-
| "data": {
37-
| "foo": {
38-
| "__typename__hydration__bar": "Foo"
39-
| }
40-
| }
41-
| }
42-
""".trimMargin(),
43-
delayedResults = listOfJsonStrings(
44-
),
45-
),
4624
ExpectedServiceCall(
4725
service = "service2",
4826
query = """

0 commit comments

Comments
 (0)