package Ġai . plat on . pulsar . ql . h 2 . ud fs Ċ Ċ import Ġai . plat on . pulsar . common . options . Load Options Ċ import Ġai . plat on . pulsar . ql . annotation . U DF Group Ċ import Ġai . plat on . pulsar . ql . annotation . UD Function Ċ import Ġai . plat on . pulsar . ql . h 2 . H 2 SessionFactory Ċ import Ġorg . h 2 . engine . Session Ċ import Ġorg . h 2 . ext . pulsar . annotation . H 2 Context Ċ import Ġorg . h 2 . tools . Simple ResultSet Ċ import Ġorg . h 2 . value . DataType Ċ import Ġorg . h 2 . value . Value Ċ import Ġorg . h 2 . value . Value Array Ċ import Ġjava . sql . ResultSet Ċ import Ġjava . sql . Types Ċ import Ġkotlin . reflect . K Callable Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Parameter Ċ import Ġkotlin . reflect . jvm . java Type Ċ Ċ @ U DF Group Ċ object ĠCommon Function Tables Ġ{ ĊĊĠĠĠ Ġ@ UD Function ( determin istic Ġ= Ġtrue , Ġdescription Ġ= Ġ" Show Ġall Ġload Ġoptions , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" almost Ġevery Ġuser Ġdefined Ġfunctions Ġwho Ġhave Ġan Ġurl Ġparameter Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" can Ġbe Ġconfigured Ġby Ġadding Ġload Ġoptions Ġto Ġthe Ġurl Ġparameter ") ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġload Options (): ĠResultSet Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrs Ġ= ĠSimple ResultSet () ĊĠĠĠĠĠĠĠ Ġrs . auto Close Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġrs . addColumn (" OPTION ") ĊĠĠĠĠĠĠĠ Ġrs . addColumn (" TYPE ") ĊĠĠĠĠĠĠĠ Ġrs . addColumn (" DEFAULT ") ĊĠĠĠĠĠĠĠ Ġrs . addColumn (" DESCRIPTION ") ĊĊĠĠĠĠĠĠĠ ĠLoad Options . help List . forEach Ġ{ Ġrs . add Row (* it . to Typed Array ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ UD Function ( determin istic Ġ= Ġtrue , Ġdescription Ġ= Ġ" Show Ġall ĠX - SQL Ġfunctions ") ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġx sql Help (@ H 2 Context Ġh 2 session : ĠSession ): ĠResultSet Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrs Ġ= ĠSimple ResultSet () ĊĠĠĠĠĠĠĠ Ġrs . auto Close Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġrs . addColumn (" NAMESPACE ") ĊĠĠĠĠĠĠĠ Ġrs . addColumn (" X SQL ĠFUNCTION ") ĊĠĠĠĠĠĠĠ Ġrs . addColumn (" NATIVE ĠFUNCTION ") ĊĠĠĠĠĠĠĠ Ġrs . addColumn (" DESCRIPTION ") ĊĊĠĠĠĠĠĠĠ Ġval Ġsession Ġ= ĠH 2 SessionFactory . getSession ( h 2 session . serial Id ) ĊĠĠĠĠĠĠĠ Ġsession . registered U df Classes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġget Metadata Of U dfs ( it . kotlin ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit [ 0 ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġrs . add Row (* it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ UD Function ( determin istic Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" Create Ġa ĠResultSet Ġfrom Ġa Ġlist Ġof Ġvalues , Ġthe Ġvalues Ġshould Ġhave Ġformat Ġk vk v Ġ... Ġkv ") ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġmap ( var arg Ġk vs : ĠValue ): ĠResultSet Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrs Ġ= ĠSimple ResultSet () ĊĠĠĠĠĠĠĠ Ġrs . auto Close Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġrs . addColumn (" KEY ") ĊĠĠĠĠĠĠĠ Ġrs . addColumn (" VALUE ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( k vs . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrs ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġk vs . size Ġ/ Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrs . add Row ( k vs [ i ], Ġk vs [ i Ġ+ Ġ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ UD Function ( determin istic Ġ= Ġtrue , Ġdescription Ġ= Ġ" Create Ġan Ġempty ĠResultSet ") ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġexplode (): ĠResultSet Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrs Ġ= ĠSimple ResultSet () ĊĠĠĠĠĠĠĠ Ġrs . auto Close Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġrs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ UD Function ( determin istic Ġ= Ġtrue , Ġdescription Ġ= Ġ" Create Ġa ĠResultSet Ġfrom Ġan Ġarray ") ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġexplode (@ H 2 Context Ġh 2 session : ĠSession , Ġvalues : ĠValue Array , Ġcol : ĠString Ġ= Ġ" COL "): ĠResultSet Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrs Ġ= ĠSimple ResultSet () ĊĠĠĠĠĠĠĠ Ġrs . auto Close Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( values . list . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrs ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= Ġvalues . list [ 0 ] ĊĊĠĠĠĠĠĠĠ Ġval Ġdt Ġ= ĠDataType . get DataType ( template . type ) ĊĠĠĠĠĠĠĠ Ġrs . addColumn ( col , Ġdt . sql Type , Ġtemplate . precision . toInt (), Ġtemplate . scale ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġvalues . list . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġvalues . list [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrs . add Row ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ UD Function ( determin istic Ġ= Ġtrue , Ġdescription Ġ= Ġ" Create Ġan Ġempty ĠResultSet ") ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġpo sex plo de (): ĠResultSet Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrs Ġ= ĠSimple ResultSet () ĊĠĠĠĠĠĠĠ Ġrs . auto Close Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġrs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ UD Function ( determin istic Ġ= Ġtrue , Ġdescription Ġ= Ġ" Create Ġa ĠResultSet Ġfrom Ġan Ġarray Ġwith Ġthe Ġposition Ġin Ġthe Ġarray ") ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġpo sex plo de ( values : ĠValue Array , Ġcol : ĠString Ġ= Ġ" COL "): ĠResultSet Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrs Ġ= ĠSimple ResultSet () ĊĠĠĠĠĠĠĠ Ġrs . auto Close Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( values . list . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrs ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrs . addColumn (" POS ", ĠTypes . INTEGER , Ġ 1 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= Ġvalues . list [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġdt Ġ= ĠDataType . get DataType ( template . type ) ĊĠĠĠĠĠĠĠ Ġrs . addColumn ( col , Ġdt . sql Type , Ġtemplate . precision . toInt (), Ġtemplate . scale ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġvalues . list . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrs . add Row ( i Ġ+ Ġ 1 , Ġvalues . list [ i ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġrs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġmetadata Ġof ĠU DF s Ġin Ġan ĠU DF Ġclass ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Metadata Of U dfs ( udf Class : ĠK Class < out ĠAny >): ĠList < Array < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= Ġud f Class . simple Name ĊĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= Ġud f Class . annotations . first Ġ{ Ġit Ġis ĠU DF Group Ġ} Ġas ĠU DF Group ĊĠĠĠĠĠĠĠ Ġval Ġnamespace Ġ= Ġgroup . namespace ĊĊĠĠĠĠĠĠĠ Ġreturn Ġud f Class . members . map NotNull Ġ{ Ġ( it . annotations . first OrNull Ġ{ Ġit Ġis ĠU D Function Ġ} Ġas ? ĠU D Function )?. to ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( annotation , Ġmethod ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Shortcut Ġ= Ġannotation . has Shortcut ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġget Parameters ( method ). join ToString Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Shortcut ) Ġ"$ namespace ( Ign orable )" Ġelse Ġnamespace , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Alias ( udf Class , Ġmethod . name , Ġnamespace ) Ġ+ Ġ"(" Ġ+ Ġparameters . toUpperCase () Ġ+ Ġ" )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclassName Ġ+ Ġ"." Ġ+ Ġmethod . name Ġ+ Ġ"(" Ġ+ Ġparameters Ġ+ Ġ" )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetDescription ( method ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegister Ġuser Ġdefined Ġfunctions ĊĠĠĠĠ Ġ* ĠWe Ġsupport Ġarbitrary Ġ"_" Ġin Ġa ĠU DF Ġname , Ġfor Ġexample , Ġthe Ġfollowing Ġfunctions Ġare Ġthe Ġsame : ĊĠĠĠĠ Ġ* Ġsome _ fun _ (), Ġ__ ___ some _ fun _ (), Ġsome ______ fun () ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Alias ( udf Class : ĠK Class < out ĠAny >, Ġmethod : ĠString , Ġnamespace : ĠString Ġ= Ġ"") : ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġalias Ġ= Ġmethod . split (" (? = \\ p { Upper }) ". to Regex ()). join ToString ("_ ") Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġalias Ġ= Ġif Ġ( namespace . isEmpty ()) Ġalias Ġelse Ġnamespace Ġ+ Ġ"_" Ġ+ Ġalias ĊĠĠĠĠĠĠĠ Ġreturn Ġalias . toUpperCase () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Parameters ( udf : ĠK Callable < *> ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġud f . parameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . kind Ġ== ĠK Parameter . Kind . VALUE Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! it . annotations . any Ġ{ Ġit Ġis ĠH 2 Context Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ"${ it . name }: Ġ${ it . type . java Type . typeName . substring After Last (".") }" Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetDescription ( udf : ĠK Callable < *> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġud f . annotations . map NotNull Ġ{ Ġit Ġas ? ĠU D Function Ġ}. first OrNull ()?. description ?: "" ĊĠĠĠ Ġ} Ċ } Ċ