11package za .co .absa .db .mag .core
22
33import scala .language .implicitConversions
4+ import za .co .absa .db .mag .core .SqlEntry ._
45
56object SqlEntryComposition {
67
7- private def columnsToSqlEntry (fields : Seq [ColumnReference ]): Option [SqlEntry ] = {
8- if (fields.isEmpty) {
9- None
10- } else {
11- val fieldEntries = fields.map(_.sqlEntry.entry)
12- Some (SqlEntry (fieldEntries.mkString(" , " )))
13- }
14- }
15-
168 sealed class SelectFragment private [SqlEntryComposition ]() {
17- private val select = SqlEntry (" SELECT" )
18-
199 def apply (firstField : ColumnReference , fields : ColumnReference * ): SelectWithFieldsFragment = {
2010 val allFields = firstField +: fields
21- new SelectWithFieldsFragment (select + columnsToSqlEntry( allFields))
11+ new SelectWithFieldsFragment (select + allFields.map(_.sqlEntry).mkSqlEntry( " , " ))
2212 }
2313
2414 def apply (sqlConstant : SqlEntryConstant ): SelectWithFieldsFragment = new SelectWithFieldsFragment (select + sqlConstant.sqlConstant)
2515 }
2616
2717 sealed class InsertFragment private [SqlEntryComposition ]() {
2818 def INTO (intoEntry : SqlEntry ): QueryInsertIntoFragment = {
29- new QueryInsertIntoFragment (SqlEntry ( " INSERT INTO " ) + intoEntry)
19+ new QueryInsertIntoFragment (insertInto + intoEntry)
3020 }
3121 }
3222
3323 sealed class QueryInsertIntoFragment private [SqlEntryComposition ](sqlEntry : SqlEntry ) {
34- def VALUES (firstValue : String , otherValues : String * ): QueryInsert = {
35- val valuesLine = (firstValue +: otherValues).mkString(" , " )
36- new QueryInsert (sqlEntry + SqlEntry (s " VALUES( $valuesLine) " ))
24+ def VALUES (firstValue : SqlEntry , otherValues : SqlEntry * ): QueryInsert = {
25+ VALUES (firstValue +: otherValues)
26+ }
27+ def VALUES (values : Seq [SqlEntry ]): QueryInsert = {
28+ val valuesEntry = values.mkSqlEntry(" VALUES(" , " , " , " )" )
29+ new QueryInsert (sqlEntry + valuesEntry)
3730 }
3831 }
3932
4033 sealed class DeleteFragment private [SqlEntryComposition ]() {
41- def FROM (fromEntry : SqlEntry ): QueryDelete = new QueryDelete (SqlEntry ( " DELETE FROM " ) + fromEntry)
34+ def FROM (fromEntry : SqlEntry ): QueryDelete = new QueryDelete (deleteFrom + fromEntry)
4235 }
4336
4437 private object SelectFragment extends SelectFragment ()
4538 private object InsertFragment extends InsertFragment ()
4639 private object DeleteFragment extends DeleteFragment
4740
4841 sealed class SelectWithFieldsFragment private [SqlEntryComposition ](val sql : SqlEntry ) {
49- def FROM (fromEntry : SqlEntry ): QuerySelect = new QuerySelect (sql + SqlEntry ( " FROM " ) + fromEntry)
42+ def FROM (fromEntry : SqlEntry ): QuerySelect = new QuerySelect (sql + from + fromEntry)
5043 }
5144
5245 sealed class OrderByFragment private [SqlEntryComposition ](orderingEntry : Option [SqlEntry ]) {
53- val sqlEntry : Option [SqlEntry ] = orderingEntry.prefix(" ORDER BY " )
46+ val sqlEntry : Option [SqlEntry ] = orderingEntry.prefix(orderBy )
5447 }
5548
5649 trait OrderByMixIn {
@@ -60,12 +53,12 @@ object SqlEntryComposition {
6053
6154 trait ReturningMixIn {
6255 def sqlEntry : SqlEntry
63- def RETURNING (returning : SqlEntryConstant ): QueryWithReturning = {
64- new QueryWithReturning (sqlEntry + SqlEntry ( " RETURNING " ) + returning .sqlConstant)
56+ def RETURNING (returningFields : SqlEntryConstant ): QueryWithReturning = {
57+ new QueryWithReturning (sqlEntry + returning + returningFields .sqlConstant)
6558 }
6659 def RETURNING (firstField : ColumnReference , otherFields : ColumnReference * ): QueryWithReturning = {
6760 val allFields = firstField +: otherFields
68- new QueryWithReturning (sqlEntry + SqlEntry ( " RETURNING " ) + columnsToSqlEntry(allFields))
61+ new QueryWithReturning (sqlEntry + returning + columnsToSqlEntry(allFields))
6962 }
7063 }
7164
@@ -75,9 +68,8 @@ object SqlEntryComposition {
7568 extends Query (sqlEntry) with OrderByMixIn {
7669 def WHERE (condition : SqlEntry ): QuerySelectConditioned = WHERE (condition.toOption)
7770 def WHERE (condition : Option [SqlEntry ]): QuerySelectConditioned = {
78- new QuerySelectConditioned (sqlEntry + condition.prefix(" WHERE " ))
71+ new QuerySelectConditioned (sqlEntry + condition.prefix(where ))
7972 }
80- // def apply(paramsLine: String): QuerySelectWithParams = new QuerySelectWithParams(sqlEntry + SqlEntry(s"($paramsLine)"))
8173 }
8274
8375 sealed class QuerySelectConditioned private [SqlEntryComposition ](sqlEntry : SqlEntry )
@@ -91,7 +83,7 @@ object SqlEntryComposition {
9183 sealed class QueryDelete private [SqlEntryComposition ](sqlEntry : SqlEntry ) extends Query (sqlEntry) with ReturningMixIn {
9284 def WHERE (condition : SqlEntry ): QueryDeleteConditioned = WHERE (condition.toOption)
9385 def WHERE (condition : Option [SqlEntry ]): QueryDeleteConditioned = {
94- new QueryDeleteConditioned (sqlEntry + condition.prefix(" WHERE " ))
86+ new QueryDeleteConditioned (sqlEntry + condition.prefix(where ))
9587 }
9688 }
9789
@@ -116,5 +108,23 @@ object SqlEntryComposition {
116108 def BY (columns : ColumnReference * ): OrderByFragment = new OrderByFragment (columnsToSqlEntry(columns))
117109
118110 implicit def QueryToSqlEntry (query : Query ): SqlEntry = query.sqlEntry
111+ implicit def StringToSqlEntry (string : String ): SqlEntry = SqlEntry (string)
112+
113+ private val select = SqlEntry (" SELECT" )
114+ private val insertInto = SqlEntry (" INSERT INTO" )
115+ private val deleteFrom = SqlEntry (" DELETE FROM" )
116+ private val from = SqlEntry (" FROM" )
117+ private val where = SqlEntry (" WHERE" )
118+ private val orderBy = SqlEntry (" ORDER BY" )
119+ private val returning = SqlEntry (" RETURNING" )
120+
121+ private def columnsToSqlEntry (fields : Seq [ColumnReference ]): Option [SqlEntry ] = {
122+ if (fields.isEmpty) {
123+ None
124+ } else {
125+ val fieldEntries = fields.map(_.sqlEntry.entry)
126+ Some (SqlEntry (fieldEntries.mkString(" , " )))
127+ }
128+ }
119129
120130}
0 commit comments