nl_tokens: the selections could be several types recursively handle each type here
pl_tokens: 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 . <mask> 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 ) } } }