package Ġcom . github . b 1 4 1 2 . permission . graphql ĊĊ Ċ import Ġarrow . core . extensions . list . fold able . first Option Ċ import Ġarrow . core . getOrElse Ċ import Ġcom . github . b 1 4 1 2 . jpa . Jpa Util Ċ import Ġcom . github . b 1 4 1 2 . permission . jpa . QueryBuilder Ċ import Ġgraphql . language .* Ċ import Ġgraphql . schema .* Ċ import Ġjava . util .* Ċ import Ġjavax . persistence . EntityManager Ċ import Ġjavax . persistence . Typed Query Ċ import Ġjavax . persistence . met amodel . Attribute Ċ import Ġjavax . persistence . met amodel . EntityType Ċ import Ġjavax . persistence . met amodel . Pl ural Attribute Ċ import Ġkotlin . math . ceil Ċ Ċ open Ġclass ĠJ pa Data Fetcher ( ĊĠĠĠ Ġprivate Ġvar Ġentity Manager : ĠEntity Manager , ĊĠĠĠ Ġprivate Ġvar Ġentity Type : ĠEntityType < *> Ċ ) Ġ: ĠData Fetcher < Any > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget ( environment : ĠData Fetching Environment ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġenvironment . fields . iterator (). next () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠLinkedHashMap < String , ĠAny >() ĊĠĠĠĠĠĠĠ Ġval Ġpage Information Ġ= Ġextract Page Information ( environment , Ġfield ) ĊĠĠĠĠĠĠĠ Ġval Ġtotal Pages Selection Ġ= Ġget Selection Field ( field , Ġ" total Pages ") ĊĠĠĠĠĠĠĠ Ġval Ġtotal Elements Selection Ġ= Ġget Selection Field ( field , Ġ" total Elements ") ĊĠĠĠĠĠĠĠ Ġval Ġcontent Selection Ġ= Ġget Selection Field ( field , Ġ" content ") ĊĠĠĠĠĠĠĠ Ġif Ġ( content Selection . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtyped Query Ġ= Ġget Query ( environment , Ġfield , Ġcontent Selection . get ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [" content "] Ġ= Ġtyped Query ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set First Result (( page Information . page !! Ġ- Ġ 1 ) Ġ* Ġpage Information . size !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMax Results ( page Information . size !! ). result List ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( total Elements Selection . isPresent Ġ|| Ġtotal Pages Selection . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Elements Ġ= Ġcontent Selection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcontent Field Ġ-> Ġget Count Query ( environment , Ġcontent Field ). single Result Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse Get Ġ{ Ġget Count Query ( environment , ĠField ()). single Result Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [" total Elements "] Ġ= Ġtotal Elements ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [" total Pages "] Ġ= Ġceil ( total Elements !! Ġ/ Ġpage Information . size !!. toDouble ()). to Long () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Query ( environment : ĠData Fetching Environment , Ġroot Field : ĠField , Ġcontent Field : ĠField ): ĠTyped Query < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcb Ġ= Ġentity Manager . criteria Builder ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġcb . createQuery < Any >( entity Type . java Type Ġas ĠClass < Any >) ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġquery . from ( entity Type ) ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQuery Builder . query URL From Field ( root Field ). substring Before ("& embedded ") Ġ+ ĠQuery Builder . query URL From Field ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Field ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= ĠQuery Builder . query List ( url ) ĊĠĠĠĠĠĠĠ ĠJ pa Util . create Predicate ( filter , Ġroot , Ġcb ). fold ({}, Ġ{ Ġquery . where ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġgraph Ġ= ĠJ pa Util . create Entity Graph From URL ( entityManager , Ġentity Type . java Type , Ġfilter ) ĊĠĠĠĠĠĠĠ Ġreturn Ġentity Manager . createQuery ( query ). set Hint (" javax . persistence . fetch graph ", Ġgraph ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Java Type ( environment : ĠData Fetching Environment , Ġargument : ĠArgument ): ĠClass < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġargument Entity Attribute Ġ= Ġget Attribute ( environment , Ġargument ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( argument Entity Attribute Ġis ĠPl ural Attribute < *, Ġ*, Ġ* >) Ġargument Entity Attribute . elementType . java Type Ġelse Ġargument Entity Attribute . java Type ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġconvert Value ( environment : ĠData Fetching Environment , Ġargument : ĠArgument , Ġvalue : ĠValue < *> ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Value Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconverted Value Ġ= Ġenvironment . get Argument < Any >( argument . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconverted Value Ġ!= Ġnull Ġ-> Ġconverted Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġvalue . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVariable Reference Ġ-> Ġreturn Ġenvironment . arguments [ value . name ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArray Value Ġ-> Ġreturn Ġvalue . values . map Ġ{ Ġconvert Value ( environment , Ġargument , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEnum Value Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenum Type Ġ= Ġget Java Type ( environment , Ġargument ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// return ĠEnum . valueOf < Enum >( enum Type , Ġvalue . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInt Value Ġ-> Ġreturn Ġvalue . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBoolean Value Ġ-> Ġreturn Ġvalue . is Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Value Ġ-> Ġreturn Ġvalue . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġvalue . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Count Query ( environment : ĠData Fetching Environment , Ġfield : ĠField ): ĠTyped Query < Long > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcb Ġ= Ġentity Manager . criteria Builder ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġcb . createQuery ( Long :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġquery . from ( entity Type ) ĊĠĠĠĠĠĠĠ Ġval Ġid Attribute Ġ= Ġentity Type . getId ( Any :: class . java ) ĊĠĠĠĠĠĠĠ Ġquery . select ( cb . count ( root . get < Any >( id Attribute . name ))) ĊĠĠĠĠĠĠĠ Ġval Ġpredicates Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . arguments . map Ġ{ Ġcb . equal ( root . get < Any >( it . name ), Ġconvert Value ( environment , Ġit , Ġit . value )) Ġ} ĊĠĠĠĠĠĠĠ Ġquery . where (* predicates . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġentity Manager . createQuery ( query ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Selection Field ( field : ĠField , ĠfieldName : ĠString ): ĠOptional < Field > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfield . selection Set . selections . stream (). filter Ġ{ Ġit Ġis ĠField Ġ}. map Ġ{ Ġit Ġas ĠField Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ-> ĠfieldName Ġ== Ġit . name Ġ}. findFirst () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Page Information ( environment : ĠData Fetching Environment , Ġfield : ĠField ): ĠPage Information Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpagination Request Ġ= Ġfield . arguments . stream (). filter Ġ{ Ġ" page Request " Ġ== Ġit . name Ġ}. findFirst () ĊĠĠĠĠĠĠĠ Ġif Ġ( pagination Request . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . arguments . remove ( pagination Request . get ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpagination Values Ġ= Ġpagination Request . get (). value Ġas ĠObject Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġpagination Values . object Fields . first Option Ġ{ Ġ" page " Ġ== Ġit . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( it . value Ġas ĠInt Value ). value . toInt () Ġ}. getOrElse Ġ{ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġpagination Values . object Fields . first Option Ġ{ Ġ" size " Ġ== Ġit . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( it . value Ġas ĠInt Value ). value . toInt () Ġ}. getOrElse Ġ{ Ġ 2 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPage Information ( page , Ġsize ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPage Information ( 1 , ĠInteger . MAX _ VALUE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Attribute ( environment : ĠData Fetching Environment , Ġargument : ĠArgument ): ĠAttribute < *, Ġ*> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobject Type Ġ= Ġget ObjectType ( environment , Ġargument ) ĊĠĠĠĠĠĠĠ Ġval Ġentity Type Ġ= Ġget EntityType ( object Type ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġentity Type . getAttribute ( argument . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget EntityType ( object Type : ĠGraphQL ObjectType ?): ĠEntityType < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġentity Manager . met amodel . entities . stream (). filter Ġ{ Ġit . name Ġ== Ġobject Type !!. name Ġ}. findFirst (). get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget ObjectType ( environment : ĠData Fetching Environment , Ġargument : ĠArgument ): ĠGraphQL ObjectType ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġoutput Type : ĠGraphQL Type Ġ= Ġenvironment . fieldType ĊĠĠĠĠĠĠĠ Ġif Ġ( output Type Ġis ĠGraphQL List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Type Ġ= Ġoutput Type . wrapped Type ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( output Type Ġis ĠGraphQL ObjectType ) Ġoutput Type Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠPage Information ( var Ġpage : ĠInt ?, Ġvar Ġsize : ĠInt ?) Ċ } Ċ