diff --git a/column.go b/column.go index b7a8cba..80b57f6 100644 --- a/column.go +++ b/column.go @@ -144,6 +144,9 @@ type Column interface { // In creates Condition for "column IN (values[0], values[1] ...)". Type for values is column's one or other Column. In(values ...interface{}) Condition + + // IntersectJSON creates Condition for "column @> value". The value is a JSON string. + IntersectJSON(data string) Condition } type aliasedColumn interface { @@ -319,6 +322,10 @@ func (left *columnImpl) In(val ...interface{}) Condition { return newInCondition(left, val...) } +func (left *columnImpl) IntersectJSON(data string) Condition { + return newIntersectJSONCondition(left, data) +} + func (b ColumnList) serialize(bldr *builder) { first := true for _, column := range b { @@ -403,6 +410,10 @@ func (left *errorColumn) In(val ...interface{}) Condition { return newInCondition(left, val...) } +func (left *errorColumn) IntersectJSON(data string) Condition { + return newIntersectJSONCondition(left, data) +} + type aliasColumn struct { column Column alias string @@ -475,3 +486,7 @@ func (left *aliasColumn) Between(lower, higher interface{}) Condition { func (left *aliasColumn) In(val ...interface{}) Condition { return newInCondition(left, val...) } + +func (left *aliasColumn) IntersectJSON(data string) Condition { + return newIntersectJSONCondition(left, data) +} diff --git a/condition.go b/condition.go index 0da1389..8a30647 100644 --- a/condition.go +++ b/condition.go @@ -207,3 +207,25 @@ func (c *inCondition) columns() []Column { } return list } + +type intersectJSONCondition struct { + left Column + data serializable +} + +func newIntersectJSONCondition(left Column, data string) Condition { + return &intersectJSONCondition{ + left: left, + data: toLiteral(data), + } +} + +func (c *intersectJSONCondition) serialize(bldr *builder) { + bldr.AppendItem(c.left) + bldr.Append(" @> ") + bldr.AppendItem(c.data) +} + +func (c *intersectJSONCondition) columns() []Column { + return []Column{c.left} +} diff --git a/sqlfunc.go b/sqlfunc.go index cbc5398..52f724f 100644 --- a/sqlfunc.go +++ b/sqlfunc.go @@ -100,6 +100,10 @@ func (left *sqlFuncImpl) In(vals ...interface{}) Condition { return newInCondition(left, vals...) } +func (left *sqlFuncImpl) IntersectJSON(data string) Condition { + return newIntersectJSONCondition(left, data) +} + func (m *sqlFuncImpl) columns() []Column { return m.args }