feat: entgo.
This commit is contained in:
@@ -237,7 +237,8 @@ func makeFieldFilter(s *sql.Selector, keys []string, value string) *sql.Predicat
|
|||||||
if len(jsonFields) != 2 {
|
if len(jsonFields) != 2 {
|
||||||
return filterEqual(s, p, field, value)
|
return filterEqual(s, p, field, value)
|
||||||
}
|
}
|
||||||
return filterJsonb(s, p, jsonFields[0], jsonFields[1]).EQ("", value)
|
value = "'" + value + "'"
|
||||||
|
return filterJsonb(s, p, jsonFields[1], jsonFields[0]).EQ("", value)
|
||||||
}
|
}
|
||||||
return filterEqual(s, p, field, value)
|
return filterEqual(s, p, field, value)
|
||||||
|
|
||||||
@@ -250,7 +251,7 @@ func makeFieldFilter(s *sql.Selector, keys []string, value string) *sql.Predicat
|
|||||||
if isJsonFieldKey(field) {
|
if isJsonFieldKey(field) {
|
||||||
jsonFields := splitJsonFieldKey(field)
|
jsonFields := splitJsonFieldKey(field)
|
||||||
if len(jsonFields) == 2 {
|
if len(jsonFields) == 2 {
|
||||||
field = filterJsonbField(s, op, field)
|
field = filterJsonbField(s, jsonFields[1], jsonFields[0])
|
||||||
value = "'" + value + "'"
|
value = "'" + value + "'"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -284,7 +285,7 @@ func makeFieldFilter(s *sql.Selector, keys []string, value string) *sql.Predicat
|
|||||||
if isJsonFieldKey(field) {
|
if isJsonFieldKey(field) {
|
||||||
jsonFields := splitJsonFieldKey(field)
|
jsonFields := splitJsonFieldKey(field)
|
||||||
if len(jsonFields) == 2 {
|
if len(jsonFields) == 2 {
|
||||||
field = filterJsonbField(s, op2, field)
|
field = filterJsonbField(s, jsonFields[1], jsonFields[0])
|
||||||
value = "'" + value + "'"
|
value = "'" + value + "'"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import (
|
|||||||
"entgo.io/ent/dialect"
|
"entgo.io/ent/dialect"
|
||||||
"entgo.io/ent/dialect/sql"
|
"entgo.io/ent/dialect/sql"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -689,8 +688,97 @@ func TestFilter(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestFilterJsonbField(t *testing.T) {
|
func TestFilterJsonbField(t *testing.T) {
|
||||||
s := sql.Dialect(dialect.Postgres).Select("*").From(sql.Table("app_profile"))
|
t.Run("filterJsonbField", func(t *testing.T) {
|
||||||
str := filterJsonbField(s, "daily_email", "preferences")
|
s := sql.Dialect(dialect.Postgres).Select("*").From(sql.Table("app_profile"))
|
||||||
fmt.Println(str)
|
str := filterJsonbField(s, "daily_email", "preferences")
|
||||||
assert.Equal(t, str, "\"app_profile\".\"preferences\" ->> 'daily_email'")
|
fmt.Println(str)
|
||||||
|
require.Equal(t, str, "\"app_profile\".\"preferences\" ->> 'daily_email'")
|
||||||
|
})
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
t.Run("MySQL_FilterEqual", func(t *testing.T) {
|
||||||
|
s := sql.Dialect(dialect.MySQL).Select("*").From(sql.Table("menus"))
|
||||||
|
|
||||||
|
p := sql.P()
|
||||||
|
|
||||||
|
p = makeFieldFilter(s, []string{"meta.title"}, "tom")
|
||||||
|
s.Where(p)
|
||||||
|
|
||||||
|
query, args := s.Query()
|
||||||
|
require.Equal(t, "SELECT * FROM `menus` WHERE JSON_EXTRACT(`menus`.`meta`, '$.title') = ?", query)
|
||||||
|
require.NotEmpty(t, args)
|
||||||
|
require.Equal(t, args[0], "'tom'")
|
||||||
|
})
|
||||||
|
t.Run("PostgreSQL_FilterEqual", func(t *testing.T) {
|
||||||
|
s := sql.Dialect(dialect.Postgres).Select("*").From(sql.Table("menus"))
|
||||||
|
|
||||||
|
p := sql.P()
|
||||||
|
|
||||||
|
p = makeFieldFilter(s, []string{"meta.title"}, "tom")
|
||||||
|
s.Where(p)
|
||||||
|
|
||||||
|
query, args := s.Query()
|
||||||
|
require.Equal(t, "SELECT * FROM \"menus\" WHERE \"menus\".\"meta\" ->> 'title' = $1", query)
|
||||||
|
require.NotEmpty(t, args)
|
||||||
|
require.Equal(t, args[0], "'tom'")
|
||||||
|
})
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
t.Run("MySQL_FilterNot", func(t *testing.T) {
|
||||||
|
s := sql.Dialect(dialect.MySQL).Select("*").From(sql.Table("users"))
|
||||||
|
|
||||||
|
p := sql.P()
|
||||||
|
|
||||||
|
p = makeFieldFilter(s, []string{"meta.title", "not"}, "tom")
|
||||||
|
s.Where(p)
|
||||||
|
|
||||||
|
query, args := s.Query()
|
||||||
|
require.Equal(t, "SELECT * FROM `users` WHERE NOT JSON_EXTRACT(`users`.`meta`, '$.title') = ?", query)
|
||||||
|
require.NotEmpty(t, args)
|
||||||
|
require.Equal(t, args[0], "'tom'")
|
||||||
|
})
|
||||||
|
t.Run("PostgreSQL_FilterNot", func(t *testing.T) {
|
||||||
|
s := sql.Dialect(dialect.Postgres).Select("*").From(sql.Table("users"))
|
||||||
|
|
||||||
|
p := sql.P()
|
||||||
|
|
||||||
|
p = makeFieldFilter(s, []string{"meta.title", "not"}, "tom")
|
||||||
|
s.Where(p)
|
||||||
|
|
||||||
|
query, args := s.Query()
|
||||||
|
require.Equal(t, "SELECT * FROM \"users\" WHERE NOT \"users\".\"meta\" ->> 'title' = $1", query)
|
||||||
|
require.NotEmpty(t, args)
|
||||||
|
require.Equal(t, args[0], "'tom'")
|
||||||
|
})
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
t.Run("MySQL_FilterNot_Date", func(t *testing.T) {
|
||||||
|
s := sql.Dialect(dialect.MySQL).Select("*").From(sql.Table("users"))
|
||||||
|
|
||||||
|
p := sql.P()
|
||||||
|
|
||||||
|
p = makeFieldFilter(s, []string{"meta.title", "date", "not"}, "2023-01-01")
|
||||||
|
s.Where(p)
|
||||||
|
|
||||||
|
query, args := s.Query()
|
||||||
|
require.Equal(t, "SELECT * FROM `users` WHERE NOT DATE(JSON_EXTRACT(`users`.`meta`, '$.title')) = ?", query)
|
||||||
|
require.NotEmpty(t, args)
|
||||||
|
require.Equal(t, args[0], "'2023-01-01'")
|
||||||
|
})
|
||||||
|
t.Run("PostgreSQL_FilterNot_Date", func(t *testing.T) {
|
||||||
|
s := sql.Dialect(dialect.Postgres).Select("*").From(sql.Table("users"))
|
||||||
|
|
||||||
|
p := sql.P()
|
||||||
|
|
||||||
|
p = makeFieldFilter(s, []string{"meta.title", "date", "not"}, "2023-01-01")
|
||||||
|
s.Where(p)
|
||||||
|
|
||||||
|
query, args := s.Query()
|
||||||
|
require.Equal(t, "SELECT * FROM \"users\" WHERE NOT EXTRACT('DATE' FROM \"users\".\"meta\" ->> 'title') = $1", query)
|
||||||
|
require.NotEmpty(t, args)
|
||||||
|
require.Equal(t, args[0], "'2023-01-01'")
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user