dialect/sql/sqljson: use the builtin string predciates in sqljson and improve tests

This commit is contained in:
Ariel Mashraki
2021-11-16 10:07:34 +02:00
3 changed files with 159 additions and 0 deletions

View File

@@ -243,6 +243,80 @@ func TestWritePath(t *testing.T) {
Where(sqljson.ValueIsNull("c", sqljson.Path("a"))),
wantQuery: "SELECT * FROM `users` WHERE JSON_TYPE(`c`, \"$.a\") = 'null'",
},
{
input: sql.Dialect(dialect.Postgres).
Select("*").
From(sql.Table("users")).
Where(sqljson.StringContains("a", "substr", sqljson.Path("b", "c", "[1]", "d"))),
wantQuery: `SELECT * FROM "users" WHERE "a"->'b'->'c'->1->>'d' LIKE $1`,
wantArgs: []interface{}{"%substr%"},
},
{
input: sql.Dialect(dialect.Postgres).
Select("*").
From(sql.Table("users")).
Where(
sql.And(
sqljson.StringContains("a", "c", sqljson.Path("a")),
sqljson.StringContains("b", "d", sqljson.Path("b")),
),
),
wantQuery: `SELECT * FROM "users" WHERE "a"->>'a' LIKE $1 AND "b"->>'b' LIKE $2`,
wantArgs: []interface{}{"%c%", "%d%"},
},
{
input: sql.Dialect(dialect.MySQL).
Select("*").
From(sql.Table("users")).
Where(sqljson.StringContains("a", "substr", sqljson.Path("b", "c", "[1]", "d"))),
wantQuery: "SELECT * FROM `users` WHERE JSON_UNQUOTE(JSON_EXTRACT(`a`, \"$.b.c[1].d\")) LIKE ?",
wantArgs: []interface{}{"%substr%"},
},
{
input: sql.Dialect(dialect.MySQL).
Select("*").
From(sql.Table("users")).
Where(
sql.And(
sqljson.StringContains("a", "c", sqljson.Path("a")),
sqljson.StringContains("b", "d", sqljson.Path("b")),
),
),
wantQuery: "SELECT * FROM `users` WHERE JSON_UNQUOTE(JSON_EXTRACT(`a`, \"$.a\")) LIKE ? AND JSON_UNQUOTE(JSON_EXTRACT(`b`, \"$.b\")) LIKE ?",
wantArgs: []interface{}{"%c%", "%d%"},
},
{
input: sql.Dialect(dialect.Postgres).
Select("*").
From(sql.Table("users")).
Where(sqljson.StringHasPrefix("a", "substr", sqljson.Path("b", "c", "[1]", "d"))),
wantQuery: `SELECT * FROM "users" WHERE "a"->'b'->'c'->1->>'d' LIKE $1`,
wantArgs: []interface{}{"substr%"},
},
{
input: sql.Dialect(dialect.MySQL).
Select("*").
From(sql.Table("users")).
Where(sqljson.StringHasPrefix("a", "substr", sqljson.Path("b", "c", "[1]", "d"))),
wantQuery: "SELECT * FROM `users` WHERE JSON_UNQUOTE(JSON_EXTRACT(`a`, \"$.b.c[1].d\")) LIKE ?",
wantArgs: []interface{}{"substr%"},
},
{
input: sql.Dialect(dialect.Postgres).
Select("*").
From(sql.Table("users")).
Where(sqljson.StringHasSuffix("a", "substr", sqljson.Path("b", "c", "[1]", "d"))),
wantQuery: `SELECT * FROM "users" WHERE "a"->'b'->'c'->1->>'d' LIKE $1`,
wantArgs: []interface{}{"%substr"},
},
{
input: sql.Dialect(dialect.MySQL).
Select("*").
From(sql.Table("users")).
Where(sqljson.StringHasSuffix("a", "substr", sqljson.Path("b", "c", "[1]", "d"))),
wantQuery: "SELECT * FROM `users` WHERE JSON_UNQUOTE(JSON_EXTRACT(`a`, \"$.b.c[1].d\")) LIKE ?",
wantArgs: []interface{}{"%substr"},
},
}
for i, tt := range tests {
t.Run(strconv.Itoa(i), func(t *testing.T) {