package Ġcom . k ame o code . any dao . context Ċ Ċ import Ġcom . k ame o code . any dao . I Expression Ċ import Ġcom . k ame o code . any dao . K Select Ċ import Ġcom . k ame o code . any dao . wrap s . Path Wrap Ċ import Ġjavax . persistence . EntityManager Ċ import Ġjavax . persistence . criteria . Common Abstract Criteria Ċ import Ġjavax . persistence . criteria . Criteria Builder Ċ import Ġjavax . persistence . criteria . Order Ċ import Ġjavax . persistence . criteria . Predicate Ċ import Ġjavax . persistence . criteria . Root ĊĊ Ċ val ĠOr Pred : Ġ() Ġ-> ĠPredicate ? Ġ= Ġ{ Ġnull Ġ} Ċ Ċ abstract Ġclass ĠPath Context < G > Ċ constructor ( ĊĠĠĠĠĠĠĠ Ġval Ġem : ĠEntity Manager , ĊĠĠĠĠĠĠĠ Ġopen Ġval Ġcriteria : ĠCommon Abstract Criteria , ĊĠĠĠĠĠĠĠ Ġval Ġcb : ĠCriteria Builder Ġ= Ġem . criteria Builder ) Ġ{ ĊĊĠĠĠ Ġval Ġorders : ĠMutable List < Order > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġprivate Ġval Ġarrays Stack : ĠMutable List < Mutable List < () Ġ-> ĠPredicate ? >> Ġ= Ġmutable ListOf () ĊĠĠĠ Ġprivate Ġvar Ġcurrent Array : ĠMutable List < () Ġ-> ĠPredicate ?> Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġvar Ġskip : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġtake : ĠInt ? Ġ= Ġnull ĊĊĠĠĠ Ġopen Ġlateinit Ġvar Ġroot : ĠRoot < Any > ĊĠĠĠĠĠĠĠ Ġprotected Ġset ĊĠĠĠ Ġlateinit Ġvar Ġroot Wrap : ĠPath Wrap < *, ĠG > ĊĠĠĠĠĠĠĠ Ġprotected Ġset ĊĠĠĠ Ġvar Ġdefault Selection : ĠK Select < Any >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprotected Ġset ĊĠĠĠ Ġprivate Ġvar Ġgroup By List : ĠMutable List < I Expression < *, Ġ* >> ? Ġ= Ġnull ĊĊĊĠĠĠ Ġfun Ġadd Order ( o : ĠOrder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġorders . add ( o ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd ( function : Ġ() Ġ-> ĠPredicate ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Array . add ( function ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġstack New Array ( new Arr : ĠMutable List < () Ġ-> ĠPredicate ?> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġarrays Stack . add ( current Array ) ĊĠĠĠĠĠĠĠ Ġcurrent Array Ġ= Ġnew Arr ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġun stack Array () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Array Ġ= Ġarrays Stack . last () ĊĠĠĠĠĠĠĠ Ġarrays Stack . remove ( current Array ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinternal Ġfun Ġget Predicate (): ĠPredicate ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( arrays Stack . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" In Ġor ĠOr Ġclause Ġhas Ġnot Ġbeen Ġclosed ") ĊĠĠĠĠĠĠĠ Ġval Ġpredicates Ġ= ĠPred icates Extractor ( cb ). to Pred icates ( current Array ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpredicates . isEmpty () Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpredicates . size Ġ== Ġ 1 Ġ-> Ġpredicates [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcb . and (* predicates . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgroup By ( expressions : ĠArray < out ĠI Expression < *, Ġ* >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġgroup By List Ġ= Ġexpressions . to Mutable List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġget GroupBy (): ĠList < I Expression < *, Ġ* >> Ġ= Ġgroup By List Ġ?: Ġempty List () ĊĊ Ċ } Ċ Ċ internal Ġclass ĠPred icates Extractor ( val Ġcb : ĠCriteria Builder ) Ġ{ ĊĠĠĠ Ġfun Ġto Pred icates ( list : ĠList < () Ġ-> ĠPredicate ?> ): ĠMutable List < Predicate > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġor Pred s Ġ= Ġlist . find Ġ{ Ġit Ġ== ĠOr Pred Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( or Pred s Ġ!= Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġor Chunks : ĠMutable List < Predicate > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfi Ġ= Ġ 0 ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġitem ) Ġin Ġlist . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġ== ĠOr Pred ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev List : ĠList < () Ġ-> ĠPredicate ?> Ġ= Ġlist . sub List ( fi , Ġindex ). toList (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious : ĠPredicate ? Ġ= Ġcalculate And ( prev List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( previous Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor Chunks . add ( previous ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfi Ġ= Ġindex Ġ+ Ġ 1 ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fi Ġ< Ġlist . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev List : ĠList < () Ġ-> ĠPredicate ?> Ġ= Ġlist . sub List ( fi , Ġlist . size ). toList (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious : ĠPredicate ? Ġ= Ġcalculate And ( prev List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( previous Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor Chunks . add ( previous ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmutable ListOf ( cb . or (* or Chunks . to Typed Array ())) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlist . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit . invoke () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate And ( list : ĠList < () Ġ-> ĠPredicate ?> ): ĠPredicate ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġaggregate Pred icates ( list ) Ġ{ Ġcb . and (* it )} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġaggregate Pred icates ( list : ĠList < () Ġ-> ĠPredicate ? >, Ġag gregator : Ġ( Array < Predicate >) Ġ-> ĠPredicate ): ĠPredicate ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpredicates Ġ= Ġto Pred icates ( list ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( predicates . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( predicates . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpredicates [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġag gregator . invoke ( predicates . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĊ Ċ }