1
1
extension PostgreSQLQuery {
2
- public enum Expression {
3
- public static func function( _ name: String , _ parameters: Expression ... , as alias: String ? = nil ) -> Expression {
4
- return . function( name, parameters, as: alias)
5
- }
6
-
7
- public static func function( _ name: String , _ parameters: [ Expression ] , as alias: String ? = nil ) -> Expression {
8
- return . function( . init( name: name, parameters: parameters) , alias: alias)
2
+ public enum Key {
3
+ public static func expression( _ expression: Expression ) -> Key {
4
+ return . expression( expression, alias: nil )
9
5
}
10
6
11
- public static func column( _ column: Column , as alias: String ? = nil ) -> Expression {
12
- return . column( column, alias: alias)
13
- }
7
+ /// *
8
+ case all
9
+ case expression( Expression , alias: String ? )
10
+ }
11
+
12
+
13
+ public struct Function {
14
+ var name : String
15
+ var parameters : [ Expression ] ?
14
16
15
- public struct Function {
16
- var name : String
17
- var parameters : [ Expression ]
17
+ public init ( name : String , parameters : [ Expression ] ? = nil ) {
18
+ self . name = name
19
+ self . parameters = parameters
18
20
}
19
-
20
- /// *
21
+ }
22
+
23
+ public enum Expression {
21
24
case all
22
- case column( Column , alias : String ? )
23
- case function( Function , alias : String ? )
25
+ case column( Column )
26
+ case function( Function )
24
27
case stringLiteral( String )
25
28
case literal( String )
26
29
}
27
30
}
28
31
32
+ extension PostgreSQLQuery . Function : ExpressibleByStringLiteral {
33
+ public init ( stringLiteral value: String ) {
34
+ self . init ( name: value)
35
+ }
36
+ }
37
+
29
38
extension PostgreSQLQuery . Expression : ExpressibleByIntegerLiteral {
30
39
public init ( integerLiteral value: Int ) {
31
40
self = . literal( value. description)
@@ -40,32 +49,56 @@ extension PostgreSQLQuery.Expression: ExpressibleByFloatLiteral {
40
49
41
50
extension PostgreSQLQuery . Expression : ExpressibleByStringLiteral {
42
51
public init ( stringLiteral value: String ) {
43
- self = . column( . init( stringLiteral: value) , alias: nil )
52
+ self = . stringLiteral( value. description)
53
+ }
54
+ }
55
+
56
+ extension PostgreSQLQuery . Key : ExpressibleByIntegerLiteral {
57
+ public init ( integerLiteral value: Int ) {
58
+ self = . expression( . init( integerLiteral: value) , alias: nil )
59
+ }
60
+ }
61
+
62
+ extension PostgreSQLQuery . Key : ExpressibleByFloatLiteral {
63
+ public init ( floatLiteral value: Double ) {
64
+ self = . expression( . init( floatLiteral: value) , alias: nil )
65
+ }
66
+ }
67
+
68
+ extension PostgreSQLQuery . Key : ExpressibleByStringLiteral {
69
+ public init ( stringLiteral value: String ) {
70
+ self = . expression( . column( . init( stringLiteral: value) ) , alias: nil )
44
71
}
45
72
}
46
73
47
74
extension PostgreSQLSerializer {
48
- internal func serialize( _ expression: PostgreSQLQuery . Expression ) -> String {
49
- switch expression {
50
- case . stringLiteral( let string) : return stringLiteral ( string)
51
- case . literal( let literal) : return literal
52
- case . column( let column, let alias) :
75
+ internal func serialize( _ key: PostgreSQLQuery . Key ) -> String {
76
+ switch key {
77
+ case . expression( let expression, let alias) :
53
78
if let alias = alias {
54
- return serialize ( column ) + " AS " + escapeString( alias)
79
+ return serialize ( expression ) + " AS " + escapeString( alias)
55
80
} else {
56
- return serialize ( column)
57
- }
58
- case . function( let function, let alias) :
59
- if let alias = alias {
60
- return serialize ( function) + " AS " + escapeString( alias)
61
- } else {
62
- return serialize ( function)
81
+ return serialize ( expression)
63
82
}
64
83
case . all: return " * "
65
84
}
66
85
}
67
86
68
- internal func serialize( _ function: PostgreSQLQuery . Expression . Function ) -> String {
69
- return function. name + group( function. parameters. map ( serialize) )
87
+ internal func serialize( _ expression: PostgreSQLQuery . Expression ) -> String {
88
+ switch expression {
89
+ case . all: return " * "
90
+ case . stringLiteral( let string) : return stringLiteral ( string)
91
+ case . literal( let literal) : return literal
92
+ case . column( let column) : return serialize ( column)
93
+ case . function( let function) : return serialize ( function)
94
+ }
95
+ }
96
+
97
+ internal func serialize( _ function: PostgreSQLQuery . Function ) -> String {
98
+ if let parameters = function. parameters {
99
+ return function. name + group( parameters. map ( serialize) )
100
+ } else {
101
+ return function. name
102
+ }
70
103
}
71
104
}
0 commit comments