/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 ĠAnd ers ĠM ikk els en Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġcom . n anno q . tools . repository . utils Ċ Ċ import Ġcom . n anno q . tools . repository . models . ValidationError Ċ import Ġjava . util . Objects Ċ import Ġorg . apache . commons . lang 3 . StringUtils Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġdefines Ġprojection Ġconfigurations Ġfor Ġcross Ġtable Ġqueries . Ċ Ġ* Ċ Ġ* Ġ@ author ĠAnd ers ĠM ikk els en Ċ Ġ* Ġ@ version Ġ 1 7 . 1 1 . 2 0 1 7 Ċ Ġ*/ Ċ class ĠCross Table Projection Ġ@ Jvm Over loads Ġconstructor ( val Ġmodels : ĠList < String >? Ġ= Ġnull , ĠTABLES : ĠList < String >? Ġ= Ġnull , Ġval Ġfields : ĠList < String >? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġprivate Ġvar ĠTABLES : ĠList < String >? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . TABLE S Ġ= ĠTABLES ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset TABLE S ( TABLE S : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . TABLE S Ġ= ĠTABLES ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvalidate ( function : ĠAggregate Functions ): ĠList < ValidationError > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerrors Ġ= ĠArrayList < ValidationError >() ĊĊĠĠĠĠĠĠĠ Ġmodels ?. forEach Ġ{ Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! TABLE S !!. contains ( model )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add ( ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ model Ġis Ġnot Ġa Ġvalid Ġmodel !", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" models _$ model ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġerrors . add ( ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" models _ error ", Ġ" Models Ġcannot Ġbe Ġnull Ġfor ! ")) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields Ġ== Ġnull Ġ&& Ġfunction Ġ!= ĠAggregate Functions . COUNT Ġ-> Ġerrors . add ( ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" fields _ error ", Ġ" Fields Ġcannot Ġbe Ġnull Ġfor : Ġ" Ġ+ Ġfunction . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields Ġ!= Ġnull Ġ&& Ġfunction Ġ!= ĠAggregate Functions . COUNT Ġ-> Ġfields . forEach Ġ{ Ġfield Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( StringUtils . count Matches ( field , Ġ". ") Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add ( ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ field Ġinvalid ! ĠMust Ġbe Ġin Ġthis Ġformat : Ġ< model Name Pl ural ized >.< fieldName >", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" fields _$ field ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Split Ġ= Ġfield . split ("\\ .". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! field Split [ 0 ]. endsWith (" s ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add ( ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ field Ġis Ġnot Ġplural ized !", Ġ" fields _$ field ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields Ġ!= Ġnull Ġ-> Ġerrors . add ( ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" fields _ error ", Ġ" Fields Ġmust Ġbe Ġnull Ġfor : Ġ" Ġ+ Ġfunction . name )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġerrors ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( o : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġo ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( o Ġ== Ġnull Ġ|| Ġjava Class Ġ!= Ġo . java Class ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġthat Ġ= Ġo Ġas ĠCross Table Projection ? ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTABLES Ġ== Ġthat !!. TABLE S Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodels Ġ== Ġthat . models Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields Ġ== Ġthat . fields ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObjects . hash ( TABLE S , Ġmodels , Ġfields ) ĊĠĠĠ Ġ} Ċ } Ċ