package Ġnet . nem eros a . on track . repository Ċ Ċ import Ġnet . nem eros a . on track . model . exceptions . Build NotFoundException Ċ import Ġnet . nem eros a . on track . model . structure .* Ċ import Ġnet . nem eros a . on track . model . support . On track Config Properties Ċ import Ġnet . nem eros a . on track . repository . support . Abstract Jdbc Repository Ċ import Ġorg . apache . commons . lang 3 . StringUtils Ċ import Ġorg . apache . commons . lang 3 . StringUtils . isNotBlank Ċ import Ġorg . springframework . jdbc . core . named param . Map Sql Parameter Source Ċ import Ġorg . springframework . stereotype . Repository Ċ import Ġjava . lang . String . format Ċ import Ġjava . util .* Ċ import Ġjavax . sql . DataSource Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ @ Repository Ċ class ĠCore Build Filter Jdbc Repository ( ĊĠĠĠĠĠĠĠ ĠdataSource : ĠDataSource , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstructure Repository : ĠStructure Repository , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon track Config Properties : ĠOn track Config Properties Ċ ) Ġ: ĠAbstract Jdbc Repository ( dataSource ), ĠCore Build Filter Repository Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġfat Ġjoin Ġquery Ġ( dream ing Ġof ĠNeo 4 J ) Ġdefines Ġthe Ġfollowing Ġcolumns : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĠB Ġ( BUIL DS ) ĊĠĠĠĠ Ġ* ĠPR Ġ( PRO MOT ION _ RUN S ) ĊĠĠĠĠ Ġ* ĠPL Ġ( PRO MOT ION _ LEVEL S ) ĊĠĠĠĠ Ġ* ĠS Ġ( last Ġvalidation Ġrun Ġstatus ) ĊĠĠĠĠ Ġ* ĠVALID ATION STAMP ID ĊĠĠĠĠ Ġ* ĠVALID ATION RUN STATUS ID ĊĠĠĠĠ Ġ* ĠPP Ġ( PROPERTIES ) ĊĠĠĠĠ Ġ* ĠB DF ROM Ġ( builds Ġlinked Ġfrom ) ĊĠĠĠĠ Ġ* ĠBR FROM Ġ( branches Ġlinked Ġfrom ) ĊĠĠĠĠ Ġ* ĠP J FROM Ġ( projects Ġlinked Ġfrom ) ĊĠĠĠĠ Ġ* ĠPL FROM Ġ( prom otions Ġlinked Ġfrom ) ĊĠĠĠĠ Ġ* ĠB DTO Ġ( builds Ġlinked Ġto ) ĊĠĠĠĠ Ġ* ĠBR TO Ġ( branches Ġlinked Ġto ) ĊĠĠĠĠ Ġ* ĠP J TO Ġ( projects Ġlinked Ġto ) ĊĠĠĠĠ Ġ* ĠPL TO Ġ( prom otions Ġlinked Ġto ) ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġstandard Filter ( branch : ĠBranch , Ġdata : ĠStandard Build Filter Data , Ġproperty Type Accessor : Ġ( String ) Ġ-> ĠProperty Type < *> ): ĠList < Build > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠQuery Ġroot ĊĠĠĠĠĠĠĠ Ġval Ġtables Ġ= ĠStringBuilder (" SELECT ĠDISTINCT ( B . ID ) ĠFROM ĠBU IL DS ĠB Ġ") ĊĠĠĠĠĠĠĠ Ġ// ĠC riter ias ĊĠĠĠĠĠĠĠ Ġval Ġcriteria Ġ= ĠStringBuilder (" ĠWHERE ĠB . BRANCH ID Ġ= Ġ: branch ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠParameters ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠMap Sql Parameter Source (" branch ", Ġbranch . id ()) ĊĠĠĠĠĠĠĠ Ġvar Ġsince Build Id : ĠInt ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// Ġsince Promotion Level ĊĠĠĠĠĠĠĠ Ġval Ġsince Promotion Level Ġ= Ġdata . since Promotion Level ĊĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( since Promotion Level )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGets Ġthe Ġpromotion Ġlevel ĠID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpromotion Level Id Ġ= Ġstructure Repository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Promotion Level ByName ( branch , Ġsince Promotion Level ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . id () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGets Ġthe Ġlast Ġbuild Ġhaving Ġthis Ġpromotion Ġlevel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġfind Last Build With Promotion Level ( promotion Level Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsince Build Id Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġwith Promotion Level ĊĠĠĠĠĠĠĠ Ġval Ġwith Promotion Level Ġ= Ġdata . with Promotion Level ĊĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( with Promotion Level )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtables . append ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠLEFT ĠJOIN ĠP ROM OT ION _ RUN S ĠPR ĠON ĠPR . BUILD ID Ġ= ĠB . ID " Ġ+ Ġ" ĠLEFT ĠJOIN ĠP ROM OT ION _ LEVEL S ĠPL ĠON ĠPL . ID Ġ= ĠPR . PRO MOT ION LEVEL ID ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria . append (" ĠAND ĠPL . NAME Ġ= Ġ: with Promotion Level ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" with Promotion Level ", Ġwith Promotion Level ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġafter Date ĊĠĠĠĠĠĠĠ Ġval Ġafter Date Ġ= Ġdata . after Date ĊĠĠĠĠĠĠĠ Ġif Ġ( after Date Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria . append (" ĠAND ĠB . CRE ATION Ġ>= Ġ: after Date ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" after Date ", ĠdateTime For DB ( after Date . at Time ( 0 , Ġ 0 ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġbefore Date ĊĠĠĠĠĠĠĠ Ġval Ġbefore Date Ġ= Ġdata . before Date ĊĠĠĠĠĠĠĠ Ġif Ġ( before Date Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria . append (" ĠAND ĠB . CRE ATION Ġ<= Ġ: before Date ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" before Date ", ĠdateTime For DB ( before Date . at Time ( 2 3 , Ġ 5 9 , Ġ 5 9 ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġsince Validation Stamp ĊĠĠĠĠĠĠĠ Ġval Ġsince Validation Stamp Ġ= Ġdata . since Validation Stamp ĊĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( since Validation Stamp )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGets Ġthe Ġvalidation Ġstamp ĠID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalidation Stamp Id Ġ= Ġget Validation Stamp Id ( branch , Ġsince Validation Stamp ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGets Ġthe Ġlast Ġbuild Ġhaving Ġthis Ġvalidation Ġstamp Ġand Ġthe Ġvalidation Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġfind Last Build With Validation Stamp ( validation Stamp Id , Ġdata . since Validation Stamp Status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsince Build Id Ġ= Ġif Ġ( since Build Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax ( since Build Id , Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġwith Validation Stamp ĊĠĠĠĠĠĠĠ Ġval Ġwith Validation Stamp Ġ= Ġdata . with Validation Stamp ĊĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( with Validation Stamp )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtables . append ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ ĠLEFT ĠJOIN Ġ(" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠSELECT ĠR . BUILD ID , Ġ ĠR . VALIDATION STAMP ID , ĠV RS . VALIDATION RUN STATUS ID Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠFROM ĠVALID ATION _ RUN S ĠR " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠINNER ĠJOIN ĠVALID ATION _ RUN _ STAT USE S ĠV RS ĠON ĠV RS . ID Ġ= Ġ( SELECT ĠID ĠFROM ĠVALID ATION _ RUN _ STAT USE S ĠWHERE ĠVALID ATION RUN ID Ġ= ĠR . ID ĠORDER ĠBY ĠID ĠDESC ĠLIMIT Ġ 1 )" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠAND ĠR . ID Ġ= Ġ( SELECT ĠMAX ( ID ) ĠFROM ĠVALID ATION _ RUN S ĠWHERE ĠBUILD ID Ġ= ĠR . BUILD ID ĠAND ĠVALID ATION STAMP ID Ġ= ĠR . VALIDATION STAMP ID )" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ) ĠS ĠON ĠS . BUILD ID Ġ= ĠB . ID " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGets Ġthe Ġvalidation Ġstamp ĠID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalidation Stamp Id Ġ= Ġget Validation Stamp Id ( branch , Ġwith Validation Stamp ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria . append (" ĠAND Ġ( S . VALIDATION STAMP ID Ġ= Ġ: validation Stamp Id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" validation Stamp Id ", Ġvalidation Stamp Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwith Validation Stamp Status ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwith Validation Stamp Status Ġ= Ġdata . with Validation Stamp Status ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( with Validation Stamp Status )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria . append (" ĠAND ĠS . VALIDATION RUN STATUS ID Ġ= Ġ: with Validation Stamp Status ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" with Validation Stamp Status ", Ġwith Validation Stamp Status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria . append (" )") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġwith Property ĊĠĠĠĠĠĠĠ Ġval Ġwith Property Ġ= Ġdata . with Property ĊĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( with Property )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtables . append (" ĠLEFT ĠJOIN ĠPROPER TIES ĠPP ĠON ĠPP . BUILD Ġ= ĠB . ID ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria . append (" ĠAND ĠPP . TYPE Ġ= Ġ: with Property ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" with Property ", Ġwith Property ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwith PropertyValue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwith PropertyValue Ġ= Ġdata . with PropertyValue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( with PropertyValue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGets Ġthe Ġproperty Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Type Ġ= Ġproperty Type Accessor ( with Property ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGets Ġthe Ġsearch Ġarguments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsearch Arguments Ġ= Ġproperty Type . get Search Arguments ( with PropertyValue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġdefined Ġuse Ġthem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( search Arguments Ġ!= Ġnull Ġ&& Ġsearch Arguments . isDefined ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Jdbc Repository . prepare Query For PropertyValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Arguments , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtables , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġmatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġsince Property ĊĠĠĠĠĠĠĠ Ġval Ġsince Property Ġ= Ġdata . since Property ĊĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( since Property )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsince PropertyValue Ġ= Ġdata . since PropertyValue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġfind Last Build With PropertyValue ( branch , Ġsince Property , Ġsince PropertyValue , Ġproperty Type Accessor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsince Build Id Ġ= Ġif Ġ( since Build Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax ( since Build Id , Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġlinked From ĊĠĠĠĠĠĠĠ Ġval Ġlinked From Ġ= Ġdata . linked From ĊĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( linked From )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtables . append ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠLEFT ĠJOIN ĠBUILD _ LIN KS ĠBL FROM ĠON ĠBL FROM . TARGET BUILD ID Ġ= ĠB . ID " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠLEFT ĠJOIN ĠBU IL DS ĠB DF ROM ĠON ĠB DF ROM . ID Ġ= ĠBL FROM . BUILD ID " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠLEFT ĠJOIN ĠB RANCH ES ĠBR FROM ĠON ĠBR FROM . ID Ġ= ĠB DF ROM . BRANCH ID " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠLEFT ĠJOIN ĠPROJECT S ĠP J FROM ĠON ĠP J FROM . ID Ġ= ĠBR FROM . PROJECT ID " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Ġ= ĠStringUtils . substring Before ( linked From , Ġ": ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria . append (" ĠAND ĠP J FROM . NAME Ġ= Ġ: from Project ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" from Project ", Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Pattern Ġ= ĠStringUtils . substring After ( linked From , Ġ": ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( build Pattern )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( StringUtils . contains ( build Pattern , Ġ"* ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria . append (" ĠAND ĠB DF ROM . NAME ĠLIKE Ġ: build From ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" build From ", ĠStringUtils . replace ( build Pattern , Ġ"*", Ġ"% ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria . append (" ĠAND ĠB DF ROM . NAME Ġ= Ġ: build From ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" build From ", Ġbuild Pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlinked From Promotion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlinked From Promotion Ġ= Ġdata . linked From Promotion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( linked From Promotion )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtables . append ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠLEFT ĠJOIN ĠP ROM OT ION _ RUN S ĠPR FROM ĠON ĠPR FROM . BUILD ID Ġ= ĠB DF ROM . ID " Ġ+ Ġ" ĠLEFT ĠJOIN ĠP ROM OT ION _ LEVEL S ĠPL FROM ĠON ĠPL FROM . ID Ġ= ĠPR FROM . PRO MOT ION LEVEL ID " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria . append (" ĠAND ĠPL FROM . NAME Ġ= Ġ: linked From Promotion ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" linked From Promotion ", Ġlinked From Promotion ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġlinked To ĊĠĠĠĠĠĠĠ Ġval Ġlinked To Ġ= Ġdata . linked To ĊĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( linked To )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtables . append ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠLEFT ĠJOIN ĠBUILD _ LIN KS ĠBL TO ĠON ĠBL TO . BUILD ID Ġ= ĠB . ID " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠLEFT ĠJOIN ĠBU IL DS ĠB DTO ĠON ĠB DTO . ID Ġ= ĠBL TO . TARGET BUILD ID " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠLEFT ĠJOIN ĠB RANCH ES ĠBR TO ĠON ĠBR TO . ID Ġ= ĠB DTO . BRANCH ID " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠLEFT ĠJOIN ĠPROJECT S ĠP J TO ĠON ĠP J TO . ID Ġ= ĠBR TO . PROJECT ID " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Ġ= ĠStringUtils . substring Before ( linked To , Ġ": ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria . append (" ĠAND ĠP J TO . NAME Ġ= Ġ: to Project ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" to Project ", Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Pattern Ġ= ĠStringUtils . substring After ( linked To , Ġ": ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( build Pattern )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( StringUtils . contains ( build Pattern , Ġ"* ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria . append (" ĠAND ĠB DTO . NAME ĠLIKE Ġ: build To ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" build To ", ĠStringUtils . replace ( build Pattern , Ġ"*", Ġ"% ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria . append (" ĠAND ĠB DTO . NAME Ġ= Ġ: build To ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" build To ", Ġbuild Pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlinked To Promotion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlinked To Promotion Ġ= Ġdata . linked To Promotion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( linked To Promotion )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtables . append ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠLEFT ĠJOIN ĠP ROM OT ION _ RUN S ĠPR TO ĠON ĠPR TO . BUILD ID Ġ= ĠB DTO . ID " Ġ+ Ġ" ĠLEFT ĠJOIN ĠP ROM OT ION _ LEVEL S ĠPL TO ĠON ĠPL TO . ID Ġ= ĠPR TO . PRO MOT ION LEVEL ID " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria . append (" ĠAND ĠPL TO . NAME Ġ= Ġ: linked To Promotion ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" linked To Promotion ", Ġlinked To Promotion ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSince Ġbuild ? ĊĠĠĠĠĠĠĠ Ġif Ġ( since Build Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria . append (" ĠAND ĠB . ID Ġ>= Ġ: since Build Id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" since Build Id ", Ġsince Build Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠFinal ĠSQL ĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= Ġformat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"% s Ġ% s ĠORDER ĠBY ĠB . ID ĠDESC ĠLIMIT Ġ: count ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtables , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria ) ĊĠĠĠĠĠĠĠ Ġparams . add Value (" count ", Ġmin ( data . count , Ġon track Config Properties . build Filter Count Max )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRunning Ġthe Ġquery ĊĠĠĠĠĠĠĠ Ġreturn Ġload Build s ( sql , Ġparams ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Build s ( sql : ĠString , Ġparams : ĠMap Sql Parameter Source ): ĠList < Build > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnamed Parameter Jdbc Template !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. query For List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġid Ġ-> Ġstructure Repository . get Build ( ID . of ( id )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġname Filter ( branch : ĠBranch , Ġfrom Build : ĠString ?, Ġto Build : ĠString ?, Ġwith Promotion Level : ĠString ?, Ġcount : ĠInt ): ĠList < Build > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠQuery Ġroot ĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= ĠStringBuilder (" SELECT ĠDISTINCT ( B . ID ) ĠFROM ĠBU IL DS ĠB " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT ĠJOIN ĠP ROM OT ION _ RUN S ĠPR ĠON ĠPR . BUILD ID Ġ= ĠB . ID " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT ĠJOIN ĠP ROM OT ION _ LEVEL S ĠPL ĠON ĠPL . ID Ġ= ĠPR . PRO MOT ION LEVEL ID " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBranch Ġcriteria ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWHERE ĠB . BRANCH ID Ġ= Ġ: branch ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠParameters ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠMap Sql Parameter Source (" branch ", Ġbranch . id ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠFrom Ġbuild ĊĠĠĠĠĠĠĠ Ġval Ġfrom Build Id Ġ= Ġlast Build ( branch , Ġfrom Build , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . id () Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! from Build Id . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsql . append (" ĠAND ĠB . ID Ġ>= Ġ: from Build Id ") ĊĠĠĠĠĠĠĠ Ġparams . add Value (" from Build Id ", Ġfrom Build Id . get ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTo Ġbuild ĊĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( to Build )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Build Id Ġ= Ġlast Build ( branch , Ġto Build , Ġnull ). map Ġ{ Ġit . id () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to Build Id . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" ĠAND ĠB . ID Ġ<= Ġ: to Build Id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" to Build Id ", Ġto Build Id . get ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWith Ġpromotion ĊĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( with Promotion Level )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" ĠAND ĠPL . NAME Ġ= Ġ: with Promotion Level ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" with Promotion Level ", Ġwith Promotion Level ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOrdering ĊĠĠĠĠĠĠĠ Ġsql . append (" ĠORDER ĠBY ĠB . ID ĠDESC ") ĊĠĠĠĠĠĠĠ Ġ// ĠLimit ĊĠĠĠĠĠĠĠ Ġsql . append (" ĠLIMIT Ġ: count ") ĊĠĠĠĠĠĠĠ Ġparams . add Value (" count ", Ġmin ( count , Ġon track Config Properties . build Filter Count Max )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRunning Ġthe Ġquery ĊĠĠĠĠĠĠĠ Ġreturn Ġload Build s ( sql . toString (), Ġparams ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlast Build ( branch : ĠBranch , Ġsince Build : ĠString ?, Ġwith Promotion Level : ĠString ?): ĠOptional < Build > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠQuery Ġroot ĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= ĠStringBuilder (" SELECT ĠDISTINCT ( B . ID ) ĠFROM ĠBU IL DS ĠB " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT ĠJOIN ĠP ROM OT ION _ RUN S ĠPR ĠON ĠPR . BUILD ID Ġ= ĠB . ID " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT ĠJOIN ĠP ROM OT ION _ LEVEL S ĠPL ĠON ĠPL . ID Ġ= ĠPR . PRO MOT ION LEVEL ID " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBranch Ġcriteria ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWHERE ĠB . BRANCH ID Ġ= Ġ: branch ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠParameters ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠMap Sql Parameter Source (" branch ", Ġbranch . id ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSince Ġbuild ĊĠĠĠĠĠĠĠ Ġif Ġ( StringUtils . contains ( since Build , Ġ"* ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" ĠAND ĠB . NAME ĠLIKE Ġ: build Name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" build Name ", ĠStringUtils . replace ( since Build , Ġ"*", Ġ"% ")) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" ĠAND ĠB . NAME Ġ= Ġ: build Name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" build Name ", Ġsince Build ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWith Ġpromotion ĊĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( with Promotion Level )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" ĠAND ĠPL . NAME Ġ= Ġ: with Promotion Level ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" with Promotion Level ", Ġwith Promotion Level ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOrdering ĊĠĠĠĠĠĠĠ Ġsql . append (" ĠORDER ĠBY ĠB . ID ĠDESC ") ĊĠĠĠĠĠĠĠ Ġ// ĠLimit ĊĠĠĠĠĠĠĠ Ġsql . append (" ĠLIMIT Ġ 1 ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠRunning Ġthe Ġquery ĊĠĠĠĠĠĠĠ Ġreturn Ġload Build s ( sql . toString (), Ġparams ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. findFirst () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbetween ( branch : ĠBranch , Ġfrom : ĠString ?, Ġto : ĠString ?): ĠList < Build > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= ĠStringBuilder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SELECT ĠID ĠFROM ĠBU IL DS ĠWHERE Ġ" Ġ+ Ġ" BRANCH ID Ġ= Ġ: branch Id Ġ" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġparams (" branch Id ", Ġbranch . id ()) ĊĠĠĠĠĠĠĠ Ġvar Ġfrom Id : ĠInt ? ĊĠĠĠĠĠĠĠ Ġvar Ġto Id : ĠInt ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFrom Ġbuild ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Id Ġ= Ġstructure Repository . get Build ByName ( branch . project . name , Ġbranch . name , Ġfrom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse Throw Ġ{ ĠBuild NotFoundException ( branch . project . name , Ġbranch . name , Ġfrom ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. id () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTo Ġbuild ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( to )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Id Ġ= Ġstructure Repository . get Build ByName ( branch . project . name , Ġbranch . name , Ġto ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse Throw Ġ{ ĠBuild NotFoundException ( branch . project . name , Ġbranch . name , Ġto ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠBuild NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġone Ġof Ġthe Ġboundaries Ġis Ġnot Ġfound , Ġreturns Ġan Ġempty Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( to Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to Id Ġ< Ġfrom Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġto Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Id Ġ= Ġfrom Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Id Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsql . append (" ĠAND ĠID Ġ>= Ġ: from Id ") ĊĠĠĠĠĠĠĠ Ġparams . add Value (" from Id ", Ġfrom Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( to Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" ĠAND ĠID Ġ<= Ġ: to Id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" to Id ", Ġto Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOrdering ĊĠĠĠĠĠĠĠ Ġsql . append (" ĠORDER ĠBY ĠID ĠDESC ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠQuery ĊĠĠĠĠĠĠĠ Ġreturn Ġload Build s ( sql . toString (), Ġparams ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Last Build With PropertyValue ( branch : ĠBranch , Ġproperty TypeName : ĠString , Ġproperty Value : ĠString ?, Ġproperty Type Accessor : Ġ( String ) Ġ-> ĠProperty Type < *> ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSQL ĊĠĠĠĠĠĠĠ Ġval Ġtables Ġ= ĠStringBuilder (" SELECT ĠB . ID Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" FROM ĠBU IL DS ĠB Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" LEFT ĠJOIN ĠPROPER TIES ĠPP ĠON ĠPP . BUILD Ġ= ĠB . ID Ġ" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġcriteria Ġ= ĠStringBuilder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" WHERE ĠB . BRANCH ID Ġ= Ġ: branch Id Ġ" Ġ+ Ġ" AND ĠPP . TYPE Ġ= Ġ: property Type Ġ" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġparams (" branch Id ", Ġbranch . id ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Value (" property Type ", Ġproperty TypeName ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( property Value )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGets Ġthe Ġproperty Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Type Ġ= Ġproperty Type Accessor ( property TypeName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGets Ġthe Ġsearch Ġarguments Ġfor Ġa Ġproperty Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsearch Arguments Ġ= Ġproperty Type . get Search Arguments ( property Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġdefined Ġuse Ġthem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( search Arguments Ġ!= Ġnull Ġ&& Ġsearch Arguments . isDefined ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Jdbc Repository . prepare Query For PropertyValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Arguments , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtables , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġmatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠBuild ĠID ĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= Ġtables . toString () Ġ+ Ġ" Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria Ġ+ Ġ"" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠORDER ĠBY ĠB . ID ĠDESC ĠLIMIT Ġ 1 " ĊĊĠĠĠĠĠĠĠ Ġ// ĠRuns Ġthe Ġquery ĊĠĠĠĠĠĠĠ Ġreturn Ġget First Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Validation Stamp Id ( branch : ĠBranch , Ġvalidation Stamp Name : ĠString ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstructure Repository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Validation Stamp ByName ( branch , Ġvalidation Stamp Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . id () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse (- 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Last Build With Validation Stamp ( validation Stamp Id : ĠInt , Ġstatus : ĠString ?): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= ĠStringBuilder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SELECT ĠVR . BUILD ID ĠFROM ĠVALID ATION _ RUN _ STAT USE S ĠV RS \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" INNER ĠJOIN ĠVALID ATION _ RUN S ĠVR ĠON ĠVR . ID Ġ= ĠV RS . VALIDATION RUN ID \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" WHERE ĠVR . VALIDATION STAMP ID Ġ= Ġ: validation Stamp Id \ n " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠParameters ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġparams (" validation Stamp Id ", Ġvalidation Stamp Id ) ĊĠĠĠĠĠĠĠ Ġ// ĠStatus Ġcriteria ĊĠĠĠĠĠĠĠ Ġif Ġ( isNotBlank ( status )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql . append (" AND ĠV RS . VALIDATION RUN STATUS ID Ġ= Ġ: status \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . add Value (" status ", Ġstatus ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠOrder Ġ& Ġlimit ĊĠĠĠĠĠĠĠ Ġsql . append (" ORDER ĠBY ĠVR . BUILD ID ĠDESC ĠLIMIT Ġ 1 \ n ") ĊĠĠĠĠĠĠĠ Ġ// ĠBuild ĠID ĊĠĠĠĠĠĠĠ Ġreturn Ġget First Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Last Build With Promotion Level ( promotion Level Id : ĠInt ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget First Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SELECT ĠBUILD ID ĠFROM ĠP ROM OT ION _ RUN S ĠWHERE ĠP ROM OT ION LEVEL ID Ġ= Ġ: promotion Level Id ĠORDER ĠBY ĠBUILD ID ĠDESC ĠLIMIT Ġ 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams (" promotion Level Id ", Ġpromotion Level Id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ