package Ġcom . xx uz . pic lane . fol t ia api . dao Ċ Ċ import Ġcom . xx uz . pic lane . fol t ia api . model . Program Ċ import Ġcom . xx uz . pic lane . fol t ia api . model . Video Type Ċ import Ġcom . xx uz . pic lane . fol t ia api . model . vo . Program Query Input Ċ import Ġcom . xx uz . pic lane . fol t ia api . model . vo . Program Result Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . cache . annotation . Cache able Ċ import Ġorg . springframework . dao . Empty Result Data AccessException Ċ import Ġorg . springframework . jdbc . core . Row Mapper Ċ import Ġorg . springframework . jdbc . core . named param . Named Parameter Jdbc Template Ċ import Ġorg . springframework . stereotype . Repository Ċ import Ġjava . sql . ResultSet Ċ import Ġjava . time . LocalDate Ċ import Ġkotlin . math . floor Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* Ġ çķª çµĦ Dao Ċ Ġ*/ Ċ @ Repository Ċ class ĠProgram Dao ( ĊĠĠĠĠĠĠĠ Ġ@ Autowired ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġj t : ĠNamed Parameter Jdbc Template Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠID Ġ ãģĭãĤī æĶ¾ éĢģ ãĤĴåıĸå¾Ĺ ãģĹãģ¾ãģĻ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Cache able ( cache Names Ġ= Ġ[" fol t ia "], Ġkey Ġ= Ġ"' program : t Id =' Ġ+ Ġ# t Id ") ĊĠĠĠ Ġfun Ġget ( t Id : ĠLong ): ĠProgram ? Ġ= ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj t . query For Object ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFROM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfol t ia _ program ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWHERE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtid Ġ= Ġ: t Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" t Id " Ġto Ġt Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRow Mapper Impl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠEmpty Result Data AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çķª çµĦ ãĤĴ æ¤ ľç´¢ ãģĹãģ¾ãģĻ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġquery Ġ ãĤ¯ ãĤ¨ ãĥª ĊĠĠĠĠ Ġ* Ġ@ param Ġoffset Ġæ ¤ ľç´¢ ãģ® åħĪ éł Ń ãģĭãĤī ãģ® ãĤª ãĥķ ãĤ»ãĥĥãĥĪ ĊĠĠĠĠ Ġ* Ġ@ param Ġlimit Ġæ ¤ ľç´¢ çµĲæŀľ ãģ® æľĢå¤§ åıĸå¾Ĺ ä»¶ æķ° ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext Data Ġ ä»»æĦı ãģ® ãĤ³ãĥ³ ãĥĨ ãĤŃ ãĤ¹ãĥĪ ãĥĩãĥ¼ãĤ¿ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfind ( query : ĠProgram Query Input ?, Ġoffset : ĠInt , Ġlimit : ĠInt , Ġcontext Data : ĠString ? Ġ= Ġnull ): ĠProgram Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconditions Ġ= Ġmutable ListOf < String >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" tid ĠNOT ĠIN Ġ(: t Id Keyword , Ġ: t Id E pg )" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġmutable Map Of < String , ĠAny >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" offset " Ġto Ġoffset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" limit " Ġto Ġlimit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" t Id Keyword " Ġto ĠProgram . TID _ KEYWORD , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" t Id E pg " Ġto ĠProgram . TID _ EP G , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif ( query ?. first Light After Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconditions . add (" P . first light Ġ>= Ġ: first Light After ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams [" first Light After "] Ġ= Ġquery . first Light After . year Ġ* Ġ 1 0 0 Ġ+ Ġquery . first Light After . month Value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif ( query ?. first Light Before Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconditions . add (" P . first light Ġ<= Ġ: first Light Before ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams [" first Light Before "] Ġ= Ġquery . first Light Before . year Ġ* Ġ 1 0 0 Ġ+ Ġquery . first Light Before . month Value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif ( query ?. title Contains Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconditions . add (""" ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP . title ĠLIKE Ġ: title Contains ĠOR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP . short title ĠLIKE Ġ: title Contains ĠOR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP . title y omi ĠLIKE Ġ: title Contains ĠOR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP . title en ĠLIKE Ġ: title Contains ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) """. trim Indent ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams [" title Contains "] Ġ= Ġ"% ${ query . title Contains } %" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif ( query ?. has Recording Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconditions . add (""" EXISTS ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFROM Ġfol t ia _ subtitle ĠAS ĠS ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWHERE ĠS . tid Ġ= ĠP . tid ĠAND Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( S . m 2 p filename ĠIS ĠNOT ĠNULL ĠAND ĠEXISTS ( SELECT Ġ 1 ĠFROM Ġfol t ia _ m 2 p files ĠAS ĠTS ĠWHERE ĠTS . m 2 p filename Ġ= ĠS . m 2 p filename )) ĠOR ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( S . p sp filename ĠIS ĠNOT ĠNULL ĠAND ĠEXISTS ( SELECT Ġ 1 ĠFROM Ġfol t ia _ mp 4 files ĠAS ĠSD ĠWHERE ĠSD . mp 4 filename Ġ= ĠS . p sp filename )) ĠOR ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( S . mp 4 hd ĠIS ĠNOT ĠNULL ĠAND ĠEXISTS ( SELECT Ġ 1 ĠFROM Ġfol t ia _ hd mp 4 files ĠAS ĠHD ĠWHERE ĠHD . hd mp 4 filename Ġ= ĠS . mp 4 hd )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) """. trim Indent ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( query ?. has Recording Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconditions . add (""" EXISTS ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFROM Ġfol t ia _ subtitle ĠAS ĠS ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWHERE ĠS . tid Ġ= ĠP . tid ĠAND Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS . m 2 p filename ĠIS ĠNULL ĠAND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS . p sp filename ĠIS ĠNULL ĠAND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS . mp 4 hd ĠIS ĠNULL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) """. trim Indent ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif ( query ?. video Types ?. isNotEmpty () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( query . video Types . contains ( Video Type . TS )) Ġit . add ("( S . m 2 p filename ĠIS ĠNOT ĠNULL ĠAND ĠEXISTS ( SELECT Ġ 1 ĠFROM Ġfol t ia _ m 2 p files ĠAS ĠTS ĠWHERE ĠTS . m 2 p filename Ġ= ĠS . m 2 p filename )) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( query . video Types . contains ( Video Type . SD )) Ġit . add ("( S . p sp filename ĠIS ĠNOT ĠNULL ĠAND ĠEXISTS ( SELECT Ġ 1 ĠFROM Ġfol t ia _ mp 4 files ĠAS ĠSD ĠWHERE ĠSD . mp 4 filename Ġ= ĠS . p sp filename )) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( query . video Types . contains ( Video Type . HD )) Ġit . add ("( S . mp 4 hd ĠIS ĠNOT ĠNULL ĠAND ĠEXISTS ( SELECT Ġ 1 ĠFROM Ġfol t ia _ hd mp 4 files ĠAS ĠHD ĠWHERE ĠHD . hd mp 4 filename Ġ= ĠS . mp 4 hd )) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString (" ĠOR Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconditions . add (""" EXISTS ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFROM Ġfol t ia _ subtitle ĠAS ĠS ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWHERE ĠS . tid Ġ= ĠP . tid ĠAND Ġ(${ it }) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) """. trim Indent ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġwhere Ġ= Ġif ( conditions . isEmpty ()) Ġ"" Ġelse Ġ" WHERE Ġ${ conditions . join ToString (" ĠAND Ġ") }" ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġ Ġj t . query ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFROM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfol t ia _ program ĠAS ĠP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ$ where ĊĠĠĠĠĠĠĠĠĠĠĠ ĠORDER ĠBY Ġfirst light ĠDESC , Ġtid ĠDESC ĠĊĠĠĠĠĠĠĠĠĠĠĠ ĠLIMIT Ġ: limit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOFFSET Ġ: offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRow Mapper Impl ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġtotal Ġ= Ġj t . query For Object ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOUNT (*) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFROM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfol t ia _ program ĠAS ĠP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ$ where ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠProgram Result ( offset , Ġlimit , Ġcontext Data , Ġtotal Ġ?: Ġ 0 , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠResultSet Ġ ãģĭãĤī ĠProgram Ġãģ« ãĥŀ ãĥĥ ãĥĶ ãĥ³ãĤ° ãģĻãĤĭ ĠRow Mapper ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġobject ĠRow Mapper Impl Ġ: ĠRow Mapper < Program > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmap Row ( rs : ĠResultSet , Ġrow Num : ĠInt ): ĠProgram Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProgram ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt Id Ġ= Ġrs . getLong (" tid "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġrs . getString (" title "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Light Ġ= Ġrs . getInt (" first light "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rs . was Null ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġyear Ġ= Ġfloor ( it Ġ/ Ġ 1 0 0 . 0 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmonth Ġ= Ġmin ( 1 2 , Ġmax ( 1 , Ġit Ġ% Ġ 1 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . of ( year , Ġmonth , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaspect Ġ= Ġrs . getLong (" aspect "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshort Title Ġ= Ġrs . getString (" short title ") Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Y omi Ġ= Ġrs . getString (" title y omi ") Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle En Ġ= Ġrs . getString (" title en ") Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } ĊĊĊ