-
Notifications
You must be signed in to change notification settings - Fork 335
/
cast.go
79 lines (61 loc) · 2.49 KB
/
cast.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package drivers
import (
"github.com/cortezaproject/corteza/server/pkg/dal"
"github.com/doug-martin/goqu/v9/exp"
)
var (
CheckID = exp.NewLiteralExpression(`'^[0-9]+$'`)
CheckNumber = exp.NewLiteralExpression(`'^[+-]?[0-9]+(\.[0-9]+)?$'`)
CheckFullISO8061 = exp.NewLiteralExpression(`'^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2}(\.[0-9]*)?)((-([0-9]{2}):([0-9]{2})|Z)?)$'`)
CheckDateISO8061 = exp.NewLiteralExpression(`'^([0-9]{4})-([0-9]{2})-([0-9]{2})(T([0-9]{2}):([0-9]{2}):([0-9]{2}(\.[0-9]*)?)((-([0-9]{2}):([0-9]{2})|Z)?))?$'`)
CheckTimeISO8061 = exp.NewLiteralExpression(`'^(([0-9]{4})-([0-9]{2})-([0-9]{2}))?T?([0-9]{2}):([0-9]{2}):([0-9]{2}(\.[0-9]*)?)((-([0-9]{2}):([0-9]{2})|Z)?)$'`)
LiteralNULL = exp.NewLiteralExpression(`NULL`)
LiteralFALSE = exp.NewLiteralExpression(`FALSE`)
LiteralTRUE = exp.NewLiteralExpression(`TRUE`)
)
func RegexpLike(format, val exp.Expression) exp.BooleanExpression {
return exp.NewBooleanExpression(exp.RegexpLikeOp, val, format)
}
func BooleanCheck(val exp.Expression) exp.Expression {
return exp.NewCaseExpression().
When(exp.NewBooleanExpression(exp.InOp, val, []any{LiteralTRUE, exp.NewLiteralExpression(`'true'`)}), LiteralTRUE).
When(exp.NewBooleanExpression(exp.InOp, val, []any{LiteralFALSE, exp.NewLiteralExpression(`'false'`)}), LiteralFALSE).
Else(LiteralNULL)
}
func AttributeCast(attr *dal.Attribute, val exp.Expression) (exp.Expression, error) {
var (
c exp.CastExpression
)
switch attr.Type.(type) {
case *dal.TypeID, *dal.TypeRef:
ce := exp.NewCaseExpression().
When(RegexpLike(CheckID, val), val).
Else(LiteralNULL)
c = exp.NewCastExpression(ce, "BIGINT")
case *dal.TypeNumber:
ce := exp.NewCaseExpression().
When(RegexpLike(CheckNumber, val), val).
Else(LiteralNULL)
c = exp.NewCastExpression(ce, "NUMERIC")
case *dal.TypeTimestamp:
ce := exp.NewCaseExpression().
When(RegexpLike(CheckFullISO8061, val), val).
Else(LiteralNULL)
c = exp.NewCastExpression(ce, "TIMESTAMPTZ")
case *dal.TypeDate:
ce := exp.NewCaseExpression().
When(RegexpLike(CheckDateISO8061, val), val).
Else(LiteralNULL)
c = exp.NewCastExpression(ce, "DATE")
case *dal.TypeTime:
ce := exp.NewCaseExpression().
When(RegexpLike(CheckTimeISO8061, val), val).
Else(LiteralNULL)
c = exp.NewCastExpression(ce, "TIMETZ")
case *dal.TypeBoolean:
c = exp.NewCastExpression(BooleanCheck(val), "BOOLEAN")
default:
return val, nil
}
return exp.NewLiteralExpression("?", c), nil
}