function handleSelections(
  sqlASTNode,
  children,
  selections,
  gqlType,
  namespace,
  depth,
  options,
  context,
  internalOptions = {},
) {
  for (let selection of selections) {
    // we need to figure out what kind of selection this is
    switch (selection.kind) {
    // if its another field, recurse through that
    case 'Field':
      // has this field been requested once already? GraphQL does not protect against duplicates so we have to check for it
      const existingNode = children.find(child => child.fieldName === selection.name.value && child.type === 'table')
      let newNode = new SQLASTNode(sqlASTNode)
      if (existingNode) {
        newNode = existingNode
      } else {
        children.push(newNode)
      }
      if (internalOptions.defferedFrom) {
        newNode.defferedFrom = internalOptions.defferedFrom
      }
      populateASTNode.call(this, selection, gqlType, newNode, namespace, depth + 1, options, context)
      break
    // if its an inline fragment, it has some fields and we gotta recurse thru all them
    case 'InlineFragment':
      {
        // check to make sure the type of this fragment (or one of the interfaces it implements) matches the type being queried
        const selectionNameOfType = selection.typeCondition.name.value
        const sameType = selectionNameOfType === gqlType.name
        const interfaceType = (gqlType._interfaces || []).map(iface => iface.name).includes(selectionNameOfType)
        if (sameType || interfaceType) {
          handleSelections.call(
            this, sqlASTNode, children,
            selection.selectionSet.selections, gqlType, namespace,
            depth, options, context,
            internalOptions
          )
        }
      }
      break
    // if its a named fragment, we need to grab the fragment definition by its name and recurse over those fields
    case 'FragmentSpread':
      {
        const fragmentName = selection.name.value
        const fragment = this.fragments[fragmentName]
        // make sure fragment type (or one of the interfaces it implements) matches the type being queried
        const fragmentNameOfType = fragment.typeCondition.name.value
        const sameType = fragmentNameOfType === gqlType.name
        const interfaceType = gqlType._interfaces.map(iface => iface.name).indexOf(fragmentNameOfType) >= 0
        if (sameType || interfaceType) {
          handleSelections.call(
            this, sqlASTNode, children,
            fragment.selectionSet.selections, gqlType, namespace,
            depth, options, context,
            internalOptions
          )
        }
      }
      break
    /* istanbul ignore next */
    default:
      throw new Error('Unknown selection kind: ' + selection.kind)
    }
  }
}
function handleSelections(
  sqlASTNode,
  children,
  selections,
  gqlType,
  namespace,
  depth,
  options,
  context,
  internalOptions = {},
) {
  for (let selection of selections) {
    // we need to figure out what kind of selection this is
    switch (selection.kind) {
    // if its another field, recurse through that
    case 'Field':
      // has this field been requested once already? GraphQL does not protect against duplicates so we have to check for it
      const existingNode = children.find(child => child.fieldName === selection.name.value && child.type === 'table')
      let newNode = new SQLASTNode(sqlASTNode)
      if (existingNode) {
        newNode = existingNode
      } else {
        children.push(newNode)
      }
      if (internalOptions.defferedFrom) {
        newNode.defferedFrom = internalOptions.defferedFrom
      }
      populateASTNode.call(this, selection, gqlType, newNode, namespace, depth + 1, options, context)
      break
    // if its an inline fragment, it has some fields and we gotta recurse thru all them
    case 'InlineFragment':
      {
        // check to make sure the type of this fragment (or one of the interfaces it implements) matches the type being queried
        const selectionNameOfType = selection.typeCondition.name.value
        const sameType = selectionNameOfType === gqlType.name
        const interfaceType = (gqlType._interfaces || []).map(iface => iface.name).includes(selectionNameOfType)
        if (sameType || interfaceType) {
          handleSelections.call(
            this, sqlASTNode, children,
            selection.selectionSet.selections, gqlType, namespace,
            depth, options, context,
            internalOptions
          )
        }
      }
      break
    // if its a named fragment, we need to grab the fragment definition by its name and recurse over those fields
    case 'FragmentSpread':
      {
        const fragmentName = selection.name.value
        const fragment = this.fragments[fragmentName]
        // make sure fragment type (or one of the interfaces it implements) matches the type being queried
        const fragmentNameOfType = fragment.typeCondition.name.value
        const sameType = fragmentNameOfType === gqlType.name
        const interfaceType = gqlType._interfaces.map(iface => iface.name).indexOf(fragmentNameOfType) >= 0
        if (sameType || interfaceType) {
          handleSelections.call(
            this, sqlASTNode, children,
            fragment.selectionSet.selections, gqlType, namespace,
            depth, options, context,
            internalOptions
          )
        }
      }
      break
    /* istanbul ignore next */
    default:
      throw new Error('Unknown selection kind: ' + selection.kind)
    }
  }
}
function handleSelections ( sqlASTNode , children , selections , gqlType , namespace , depth , options , context , internalOptions = { } , ) { for ( let selection of selections ) { // we need to figure out what kind of selection this is switch ( selection . kind ) { // if its another field, recurse through that case 'Field' : // has this field been requested once already? GraphQL does not protect against duplicates so we have to check for it const existingNode = children . find ( child => child . fieldName === selection . name . value && child . type === 'table' ) let newNode = new SQLASTNode ( sqlASTNode ) if ( existingNode ) { newNode = existingNode } else { children . push ( newNode ) } if ( internalOptions . defferedFrom ) { newNode . defferedFrom = internalOptions . defferedFrom } populateASTNode . call ( this , selection , gqlType , newNode , namespace , depth + 1 , options , context ) break // if its an inline fragment, it has some fields and we gotta recurse thru all them case 'InlineFragment' : { // check to make sure the type of this fragment (or one of the interfaces it implements) matches the type being queried const selectionNameOfType = selection . typeCondition . name . value const sameType = selectionNameOfType === gqlType . name const interfaceType = ( gqlType . _interfaces || [ ] ) . map ( iface => iface . name ) . includes ( selectionNameOfType ) if ( sameType || interfaceType ) { handleSelections . call ( this , sqlASTNode , children , selection . selectionSet . selections , gqlType , namespace , depth , options , context , internalOptions ) } } break // if its a named fragment, we need to grab the fragment definition by its name and recurse over those fields case 'FragmentSpread' : { const fragmentName = selection . name . value const fragment = this . fragments [ fragmentName ] // make sure fragment type (or one of the interfaces it implements) matches the type being queried const fragmentNameOfType = fragment . typeCondition . name . value const sameType = fragmentNameOfType === gqlType . name const interfaceType = gqlType . _interfaces . map ( iface => iface . name ) . indexOf ( fragmentNameOfType ) >= 0 if ( sameType || interfaceType ) { handleSelections . call ( this , sqlASTNode , children , fragment . selectionSet . selections , gqlType , namespace , depth , options , context , internalOptions ) } } break /* istanbul ignore next */ default : throw new Error ( 'Unknown selection kind: ' + selection . kind ) } } }
the selections could be several types, recursively handle each type here
the selections could be several types recursively handle each type here