@@ -19,31 +19,42 @@ func (m *PostgreSQL) Mark() string {
19
19
return t
20
20
}
21
21
22
- func (m * PostgreSQL ) IsJSON (name string ) (string , bool ) {
23
- if ! strings .HasPrefix (name , "json:" ) {
24
- return name , false
22
+ func (m * PostgreSQL ) IsJSON (v string ) (string , bool ) {
23
+ //table.json:field.name:type
24
+ parts := strings .Split (v , "." )
25
+ offset := len (parts ) - 2
26
+ if offset < 0 || ! strings .HasPrefix (parts [0 + offset ], "json:" ) {
27
+ return v , false
25
28
}
26
29
27
- //json:table.field.name:type
28
- meta := strings .Split (name , ":" )
29
- parts := strings .SplitN (meta [1 ], "." , 3 )
30
+ var table string
31
+ var tp string = "text"
30
32
31
- //apply type
32
- tp := "text"
33
- if len (meta ) > 2 {
34
- tp = meta [2 ]
33
+ if offset == 1 {
34
+ table = parts [0 ]
35
35
}
36
+
37
+ // json:field
38
+ field := parts [0 + offset ][5 :]
39
+
40
+ // name:type
41
+ parts = strings .Split (parts [1 + offset ], ":" )
42
+ if len (parts ) == 2 {
43
+ tp = parts [1 ]
44
+ }
45
+ name := parts [0 ]
46
+
36
47
var s , e string
37
48
if tp == "date" {
38
49
s = "CAST("
39
50
e = " AS DATE)"
40
51
tp = "text"
41
52
}
42
53
43
- if len ( parts ) == 3 {
44
- name = fmt .Sprintf ("%s(\" %s\" .%s ->'%s')::%s%s" , s , parts [ 0 ], parts [ 1 ], parts [ 2 ] , tp , e )
45
- } else if len ( parts ) == 2 {
46
- name = fmt .Sprintf ("%s(%s ->'%s')::%s%s" , s , parts [ 0 ], parts [ 1 ] , tp , e )
54
+ if table != "" {
55
+ name = fmt .Sprintf ("%s(\" %s\" .\" %s \" ->'%s')::%s%s" , s , table , field , name , tp , e )
56
+ } else {
57
+ name = fmt .Sprintf ("%s(\" %s \" ->'%s')::%s%s" , s , field , name , tp , e )
47
58
}
48
59
return name , true
49
60
}
0 commit comments