Skip to content

Commit bbb7f3a

Browse files
committed
[fix] recognize and parse json-fields
1 parent 3196188 commit bbb7f3a

File tree

1 file changed

+25
-14
lines changed

1 file changed

+25
-14
lines changed

postgresql.go

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,31 +19,42 @@ func (m *PostgreSQL) Mark() string {
1919
return t
2020
}
2121

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
2528
}
2629

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"
3032

31-
//apply type
32-
tp := "text"
33-
if len(meta) > 2 {
34-
tp = meta[2]
33+
if offset == 1 {
34+
table = parts[0]
3535
}
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+
3647
var s, e string
3748
if tp == "date" {
3849
s = "CAST("
3950
e = " AS DATE)"
4051
tp = "text"
4152
}
4253

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)
4758
}
4859
return name, true
4960
}

0 commit comments

Comments
 (0)