package Ġorg . ev om aster . core . database Ċ Ċ import Ġorg . ev om aster . client . java . controller . api . dto . database . schema . Database Type Ċ import Ġorg . ev om aster . core . database . schema . Column Ċ import Ġorg . ev om aster . core . database . schema . Column DataType Ċ import Ġorg . ev om aster . core . database . schema . ForeignKey Ċ import Ġorg . ev om aster . core . database . schema . Table Ċ import Ġorg . ev om aster . core . parser . Regex Handler . create Gene For Postgres Like Ċ import Ġorg . ev om aster . core . parser . Regex Handler . create Gene For Postgres Similar To Ċ import Ġorg . ev om aster . core . search . gene .* Ċ import Ġorg . ev om aster . core . search . gene . regex . Dis junction List Rx Gene Ċ import Ġorg . ev om aster . core . search . gene . regex . Regex Gene Ċ import Ġorg . ev om aster . core . search . gene . sql .* Ċ Ċ class ĠDb Action Gene Builder Ġ{ ĊĊĊĠĠĠ Ġprivate Ġfun Ġget ForeignKey ( table : ĠTable , Ġcolumn : ĠColumn ): ĠForeign Key ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// TODO : Ġwhat Ġif Ġa Ġcolumn Ġis Ġpart Ġof Ġmore Ġthan Ġ 1 ĠFK ? Ġis Ġthat Ġeven Ġpossible ? ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtable . foreign Keys . find Ġ{ Ġit . source Columns . contains ( column ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Gene ( id : ĠLong , Ġtable : ĠTable , Ġcolumn : ĠColumn ): ĠGene Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġfk Ġ= Ġget ForeignKey ( table , Ġcolumn ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġgene Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġhandle Ġall Ġconstraints Ġand Ġcases ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn . auto Increment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSql Auto Increment Gene ( column . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfk Ġ!= Ġnull Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSql ForeignKey Gene ( column . name , Ġid , Ġfk . target Table , Ġcolumn . nullable ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( column . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠBOOLEAN ( 1 ) Ġis Ġassumed Ġto Ġbe Ġa Ġboolean / Boolean Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn DataType . BOOLEAN , ĠColumn DataType . BOOL Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Boolean Column ( column ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠT IN Y INT ( 3 ) Ġis Ġassumed Ġto Ġbe Ġrepresenting Ġa Ġbyte / Byte Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn DataType . TIN Y INT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Tiny Int Column ( column ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠSMALL INT ( 5 ) Ġis Ġassumed Ġas Ġa Ġshort / Short Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn DataType . INT 2 , ĠColumn DataType . SMALLINT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Small Int Column ( column ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠCHAR ( 2 5 5 ) Ġis Ġassumed Ġto Ġbe Ġa Ġchar / Character Ġfield . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠA ĠString Gene Ġof Ġlength Ġ 1 Ġis Ġused Ġto Ġrepresent Ġthe Ġdata . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn DataType . CHAR Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Char Column ( column ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠINT 4 / INTEGER ( 1 0 ) Ġis Ġa Ġint / Integer Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn DataType . INT 4 , ĠColumn DataType . INTEGER Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Integer Column ( column ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠBIGINT ( 1 9 ) Ġis Ġa Ġlong / Long Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn DataType . INT 8 , ĠColumn DataType . BIG INT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle BigInt Column ( column ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠDOUBLE ( 1 7 ) Ġis Ġassumed Ġto Ġbe Ġa Ġdouble / Double Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn DataType . DOUBLE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Double Column ( column ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠVARCHAR ( N ) Ġis Ġassumed Ġto Ġbe Ġa ĠString Ġwith Ġa Ġmaximum Ġlength Ġof ĠN . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠN Ġcould Ġbe Ġas Ġlarge Ġas ĠInteger . MAX _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn DataType . TEXT , ĠColumn DataType . VARCHAR , ĠColumn DataType . C LOB Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Text Column ( column ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠTIMESTAMP Ġis Ġassumed Ġto Ġbe Ġa ĠDate Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn DataType . TIMESTAMP Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Timestamp Column ( column ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠDATE Ġis Ġa Ġdate Ġwithout Ġtime Ġof Ġday ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn DataType . DATE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDate Gene ( column . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// column . type . equals (" VAR BINARY ", Ġignore Case Ġ= Ġtrue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// handle Var Binary ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠCould Ġbe Ġany Ġkind Ġof Ġbinary Ġdata ... Ġso Ġlet 's Ġjust Ġuse Ġa Ġstring , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġwhich Ġalso Ġsimpl ifies Ġwhen Ġneeding Ġgenerate Ġthe Ġtest Ġfiles ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn DataType . BLOB Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle BLOB Column ( column ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn DataType . REAL Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Real Column ( column ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn DataType . DECIMAL Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Decimal Column ( column ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠPostgres ĠUUID Ġcolumn Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn DataType . UUID Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSql UUID Gene ( column . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠPostgres ĠJSON B Ġcolumn Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn DataType . JSON , ĠColumn DataType . JSON B Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSql JSON Gene ( column . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠPostgres ĠXML Ġcolumn Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumn DataType . XML Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSql XML Gene ( column . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Cannot Ġhandle : Ġ$ column .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( column . primaryKey ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgene Ġ= ĠSql PrimaryKey Gene ( column . name , Ġtable . name , Ġgene , Ġid ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( column . nullable Ġ&& Ġfk Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// FK s Ġhandle Ġnull ability Ġin Ġtheir Ġown Ġcustom Ġway ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgene Ġ= ĠSql Nullable ( column . name , Ġgene ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġgene ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle BigInt Column ( column : ĠColumn ): ĠGene Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( column . enum Values As Strings Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp anion . check NotEmpty ( column . enum Values As Strings ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEnum Gene ( column . name , Ġcolumn . enum Values As Strings . map Ġ{ Ġit . to Long () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLong Gene ( column . name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Integer Column ( column : ĠColumn ): ĠGene Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( column . enum Values As Strings Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp anion . check NotEmpty ( column . enum Values As Strings ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEnum Gene ( column . name , Ġcolumn . enum Values As Strings . map Ġ{ Ġit . toInt () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInteger Gene ( column . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Ġ= Ġcolumn . lower Bound Ġ?: ĠInt . MIN _ VALUE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ= Ġcolumn . upper Bound Ġ?: ĠInt . MAX _ VALUE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Char Column ( column : ĠColumn ): ĠGene Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠTODO ĠHow Ġto Ġdiscover Ġif Ġit Ġis Ġa Ġchar Ġor Ġa Ġchar [] Ġof Ġ 2 5 5 Ġelements ? ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( column . enum Values As Strings Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck NotEmpty ( column . enum Values As Strings ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEnum Gene ( name Ġ= Ġcolumn . name , Ġdata Ġ= Ġcolumn . enum Values As Strings ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString Gene ( name Ġ= Ġcolumn . name , Ġvalue Ġ= Ġ" f ", Ġmin Length Ġ= Ġ 0 , ĠmaxLength Ġ= Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Double Column ( column : ĠColumn ): ĠGene Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO ĠHow Ġto Ġdiscover Ġif Ġthe Ġsource Ġfield Ġis Ġa Ġfloat / Float Ġfield ? ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( column . enum Values As Strings Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck NotEmpty ( column . enum Values As Strings ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEnum Gene ( name Ġ= Ġcolumn . name , Ġdata Ġ= Ġcolumn . enum Values As Strings . map Ġ{ Ġit . toDouble () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Gene ( column . name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Small Int Column ( column : ĠColumn ): ĠGene Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( column . enum Values As Strings Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column . enum Values As Strings . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" the Ġlist Ġof Ġenum erated Ġvalues Ġcannot Ġbe Ġempty ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEnum Gene ( column . name , Ġcolumn . enum Values As Strings . map Ġ{ Ġit . toInt () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInteger Gene ( column . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Ġ= Ġcolumn . lower Bound Ġ?: ĠShort . MIN _ VALUE . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ= Ġcolumn . upper Bound Ġ?: ĠShort . MAX _ VALUE . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Tiny Int Column ( column : ĠColumn ): ĠGene Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( column . enum Values As Strings Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column . enum Values As Strings . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" the Ġlist Ġof Ġenum erated Ġvalues Ġcannot Ġbe Ġempty ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEnum Gene ( column . name , Ġcolumn . enum Values As Strings . map Ġ{ Ġit . toInt () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInteger Gene ( column . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Ġ= Ġcolumn . lower Bound Ġ?: ĠByte . MIN _ VALUE . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ= Ġcolumn . upper Bound Ġ?: ĠByte . MAX _ VALUE . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Text Column ( column : ĠColumn ): ĠGene Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( column . enum Values As Strings Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column . enum Values As Strings . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" the Ġlist Ġof Ġenum erated Ġvalues Ġcannot Ġbe Ġempty ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEnum Gene ( name Ġ= Ġcolumn . name , Ġdata Ġ= Ġcolumn . enum Values As Strings ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column . similar To Patterns Ġ!= Ġnull Ġ&& Ġcolumn . similar To Patterns . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcolumnName Ġ= Ġcolumn . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsimilar To Patterns : ĠList < String > Ġ= Ġcolumn . similar To Patterns ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Similar To Regex Gene ( columnName , Ġsimilar To Patterns , Ġdatabase Type Ġ= Ġcolumn . database Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( column . like Patterns Ġ!= Ġnull Ġ&& Ġcolumn . like Patterns . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcolumnName Ġ= Ġcolumn . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlike Patterns Ġ= Ġcolumn . like Patterns ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Like Regex Gene ( columnName , Ġlike Patterns , Ġdatabase Type Ġ= Ġcolumn . database Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString Gene ( name Ġ= Ġcolumn . name , Ġmin Length Ġ= Ġ 0 , ĠmaxLength Ġ= Ġcolumn . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġa ĠRegex Gene Ġusing Ġa Ġname Ġand Ġa Ġlist Ġof ĠLIKE Ġpatterns . ĊĠĠĠĠ Ġ* ĠThe Ġresulting Ġgene Ġis Ġa Ġdis junction Ġof Ġthe Ġgiven Ġpatterns ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Like Regex Gene ( gene Name : ĠString , Ġlike Patterns : ĠList < String >, Ġdatabase Type : ĠDatabase Type ): ĠRegex Gene Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Type Ġ== ĠDatabase Type . POST GRES Ġ-> Ġbuild Postgres Like Regex Gene ( gene Name , Ġlike Patterns ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : Ġsupport Ġother Ġdatabase ĠSIM IL AR _ TO Ġcheck Ġexpressions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException (" Must Ġimplement ĠLIKE Ġexpressions Ġfor Ġdatabase Ġ% s ". format ( database Type )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Postgres Like Regex Gene ( gene Name : ĠString , Ġlike Patterns : ĠList < String >): ĠRegex Gene Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdis junction Rx Gen es Ġ= Ġlike Patterns ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcreate Gene For Postgres Like ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . dis junction s Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . dis junction s Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatten () ĊĠĠĠĠĠĠĠ Ġreturn ĠRegex Gene ( gene Name , Ġdis junction s Ġ= ĠDis junction List Rx Gene ( dis junction s Ġ= Ġdis junction Rx Gen es )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġa ĠRegex Gene Ġusing Ġa Ġname Ġand Ġa Ġlist Ġof ĠSIM IL AR _ TO Ġpatterns . ĊĠĠĠĠ Ġ* ĠThe Ġresulting Ġgene Ġis Ġa Ġdis junction Ġof Ġthe Ġgiven Ġpatterns ĊĠĠĠĠ Ġ* Ġaccording Ġto Ġthe Ġdatabase Ġwe Ġare Ġusing ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Similar To Regex Gene ( gene Name : ĠString , Ġsimilar To Patterns : ĠList < String >, Ġdatabase Type : ĠDatabase Type ): ĠRegex Gene Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Type Ġ== ĠDatabase Type . POST GRES Ġ-> Ġbuild Postgres Similar To Regex Gene ( gene Name , Ġsimilar To Patterns ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : Ġsupport Ġother Ġdatabase ĠSIM IL AR _ TO Ġcheck Ġexpressions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException (" Must Ġimplement Ġsimilar To Ġexpressions Ġfor Ġdatabase Ġ% s ". format ( database Type )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Postgres Similar To Regex Gene ( gene Name : ĠString , Ġsimilar To Patterns : ĠList < String >): ĠRegex Gene Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdis junction Rx Gen es Ġ= Ġsimilar To Patterns ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcreate Gene For Postgres Similar To ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . dis junction s Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . dis junction s Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatten () ĊĠĠĠĠĠĠĠ Ġreturn ĠRegex Gene ( gene Name , Ġdis junction s Ġ= ĠDis junction List Rx Gene ( dis junction s Ġ= Ġdis junction Rx Gen es )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Sql Timestamp Gene ( name : ĠString ): ĠDateTime Gene Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDateTime Gene ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Ġ= ĠDate Gene (" date ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyear Ġ= ĠInteger Gene (" year ", Ġ 2 0 1 6 , Ġ 1 9 0 0 , Ġ 2 1 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmonth Ġ= ĠInteger Gene (" month ", Ġ 3 , Ġ 1 , Ġ 1 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġday Ġ= ĠInteger Gene (" day ", Ġ 1 2 , Ġ 1 , Ġ 3 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġonly Valid Dates Ġ= Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= ĠTime Gene (" time ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhour Ġ= ĠInteger Gene (" hour ", Ġ 0 , Ġ 0 , Ġ 2 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminute Ġ= ĠInteger Gene (" minute ", Ġ 0 , Ġ 0 , Ġ 5 9 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Ġ= ĠInteger Gene (" second ", Ġ 0 , Ġ 0 , Ġ 5 9 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdateTime Gene Format Ġ= Ġ ĠDateTime Gene . DateTime Gene Format . DEFAULT _ DATE _ TIME ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Timestamp Column ( column : ĠColumn ): ĠDateTime Gene Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( column . enum Values As Strings Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Unsupported Ġenum Ġin ĠTIMESTAMP . ĠPlease Ġimplement ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuild Sql Timestamp Gene ( column . name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle C LOB Column ( column : ĠColumn ): ĠGene Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( column . enum Values As Strings Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck NotEmpty ( column . enum Values As Strings ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEnum Gene ( name Ġ= Ġcolumn . name , Ġdata Ġ= Ġcolumn . enum Values As Strings ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString Gene ( name Ġ= Ġcolumn . name , Ġmin Length Ġ= Ġ 0 , ĠmaxLength Ġ= Ġcolumn . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle BLOB Column ( column : ĠColumn ): ĠGene Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( column . enum Values As Strings Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck NotEmpty ( column . enum Values As Strings ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEnum Gene ( name Ġ= Ġcolumn . name , Ġdata Ġ= Ġcolumn . enum Values As Strings ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString Gene ( name Ġ= Ġcolumn . name , Ġmin Length Ġ= Ġ 0 , ĠmaxLength Ġ= Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Real Column ( column : ĠColumn ): ĠGene Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠREAL Ġis Ġidentical Ġto Ġthe Ġfloating Ġpoint Ġstatement Ġfloat ( 2 4 ). ĊĠĠĠĠĠĠĠĠ Ġ* ĠTODO ĠHow Ġto Ġdiscover Ġif Ġthe Ġsource Ġfield Ġis Ġa Ġfloat / Float Ġfield ? ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( column . enum Values As Strings Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck NotEmpty ( column . enum Values As Strings ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEnum Gene ( name Ġ= Ġcolumn . name , Ġdata Ġ= Ġcolumn . enum Values As Strings . map Ġ{ Ġit . toDouble () Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Gene ( column . name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Decimal Column ( column : ĠColumn ): ĠGene Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠTODO : ĠDEC IMAL Ġprecision Ġis Ġlower Ġthan Ġa Ġfloat Ġgene ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( column . enum Values As Strings Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck NotEmpty ( column . enum Values As Strings ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEnum Gene ( name Ġ= Ġcolumn . name , Ġdata Ġ= Ġcolumn . enum Values As Strings . map Ġ{ Ġit . toFloat () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFloat Gene ( column . name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Boolean Column ( column : ĠColumn ): ĠGene Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( column . enum Values As Strings Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck NotEmpty ( column . enum Values As Strings ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEnum Gene ( column . name , Ġcolumn . enum Values As Strings . map Ġ{ Ġit . to Boolean () Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBoolean Gene ( column . name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThrows Ġan Ġexception Ġif Ġthe Ġenum Ġvalues Ġis Ġnon - null Ġand Ġempty ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcheck NotEmpty ( enum Values As Strings : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enum Values As Strings Ġ!= Ġnull Ġ&& Ġenum Values As Strings . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" the Ġlist Ġof Ġenum erated Ġvalues Ġcannot Ġbe Ġempty ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }