Skip to content

bug: cycle between steps causes an infinite loop #281

@kamilkisiela

Description

@kamilkisiela
supergraph
schema
  @link(url: "https://specs.apollo.dev/link/v1.0")
  @link(url: "https://specs.apollo.dev/join/v0.3", for: EXECUTION) {
  query: Query
}

directive @join__enumValue(graph: join__Graph!) repeatable on ENUM_VALUE

directive @join__field(
  graph: join__Graph
  requires: join__FieldSet
  provides: join__FieldSet
  type: String
  external: Boolean
  override: String
  usedOverridden: Boolean
) repeatable on FIELD_DEFINITION | INPUT_FIELD_DEFINITION

directive @join__graph(name: String!, url: String!) on ENUM_VALUE

directive @join__implements(
  graph: join__Graph!
  interface: String!
) repeatable on OBJECT | INTERFACE

directive @join__type(
  graph: join__Graph!
  key: join__FieldSet
  extension: Boolean! = false
  resolvable: Boolean! = true
  isInterfaceObject: Boolean! = false
) repeatable on OBJECT | INTERFACE | UNION | ENUM | INPUT_OBJECT | SCALAR

directive @join__unionMember(
  graph: join__Graph!
  member: String!
) repeatable on UNION

directive @link(
  url: String
  as: String
  for: link__Purpose
  import: [link__Import]
) repeatable on SCHEMA

type AnonymousReview @join__type(graph: A) {
  anonymous_body: String!
  product: Product
}

scalar join__FieldSet

enum join__Graph {
  A @join__graph(name: "a", url: "http://localhost:4200/union-overfetching/a")
  B @join__graph(name: "b", url: "http://localhost:4200/union-overfetching/b")
  C @join__graph(name: "c", url: "http://localhost:4200/union-overfetching/c")
  D @join__graph(name: "d", url: "http://localhost:4200/union-overfetching/d")
}

scalar link__Import

enum link__Purpose {
  """
  `SECURITY` features provide metadata necessary to securely resolve fields.
  """
  SECURITY

  """
  `EXECUTION` features provide metadata necessary for operation execution.
  """
  EXECUTION
}

type Product
  @join__type(graph: A, key: "newId")
  @join__type(graph: B, key: "newId")
  @join__type(graph: B, key: "oldId")
  @join__type(graph: C, key: "oldId")
  @join__type(graph: D, key: "oldId") {
  newId: ID! @join__field(graph: A) @join__field(graph: B)
  oldId: ID!
    @join__field(graph: B)
    @join__field(graph: C)
    @join__field(graph: D)
  b: String! @join__field(graph: B)
  c: String! @join__field(graph: C)
  d: String! @join__field(graph: D)
}

type Query
  @join__type(graph: A)
  @join__type(graph: B)
  @join__type(graph: C)
  @join__type(graph: D) {
  viewer: Viewer! @join__field(graph: A)
}

union Review
  @join__type(graph: A)
  @join__unionMember(graph: A, member: "AnonymousReview")
  @join__unionMember(graph: A, member: "UserReview") =
  | AnonymousReview
  | UserReview

type UserReview @join__type(graph: A) {
  user_body: String!
  product: Product
}

type Viewer @join__type(graph: A) {
  review: Review
}
query
{
  viewer {
    review {
      ... on AnonymousReview {
        __typename
        anonymous_body
        product {
          b
        }
      }
      ... on UserReview {
        __typename
        user_body
        product {
          c
          d
        }
      }
    }
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions