From ce044684248e92b4e14a27f090e47bb9ebfdfcf5 Mon Sep 17 00:00:00 2001 From: Bobo Date: Sat, 8 Feb 2025 15:31:39 +0800 Subject: [PATCH] feat: entgo. --- entgo/query/filter.go | 7 +-- entgo/query/filter_test.go | 98 ++++++++++++++++++++++++++++++++++++-- tag.bat | 2 +- 3 files changed, 98 insertions(+), 9 deletions(-) diff --git a/entgo/query/filter.go b/entgo/query/filter.go index 31f7421..5011c5c 100644 --- a/entgo/query/filter.go +++ b/entgo/query/filter.go @@ -237,7 +237,8 @@ func makeFieldFilter(s *sql.Selector, keys []string, value string) *sql.Predicat if len(jsonFields) != 2 { 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) @@ -250,7 +251,7 @@ func makeFieldFilter(s *sql.Selector, keys []string, value string) *sql.Predicat if isJsonFieldKey(field) { jsonFields := splitJsonFieldKey(field) if len(jsonFields) == 2 { - field = filterJsonbField(s, op, field) + field = filterJsonbField(s, jsonFields[1], jsonFields[0]) value = "'" + value + "'" } } @@ -284,7 +285,7 @@ func makeFieldFilter(s *sql.Selector, keys []string, value string) *sql.Predicat if isJsonFieldKey(field) { jsonFields := splitJsonFieldKey(field) if len(jsonFields) == 2 { - field = filterJsonbField(s, op2, field) + field = filterJsonbField(s, jsonFields[1], jsonFields[0]) value = "'" + value + "'" } } diff --git a/entgo/query/filter_test.go b/entgo/query/filter_test.go index 3c4fbfa..051b204 100644 --- a/entgo/query/filter_test.go +++ b/entgo/query/filter_test.go @@ -7,7 +7,6 @@ import ( "entgo.io/ent/dialect" "entgo.io/ent/dialect/sql" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -689,8 +688,97 @@ func TestFilter(t *testing.T) { } func TestFilterJsonbField(t *testing.T) { - s := sql.Dialect(dialect.Postgres).Select("*").From(sql.Table("app_profile")) - str := filterJsonbField(s, "daily_email", "preferences") - fmt.Println(str) - assert.Equal(t, str, "\"app_profile\".\"preferences\" ->> 'daily_email'") + t.Run("filterJsonbField", func(t *testing.T) { + s := sql.Dialect(dialect.Postgres).Select("*").From(sql.Table("app_profile")) + str := filterJsonbField(s, "daily_email", "preferences") + 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'") + }) } diff --git a/tag.bat b/tag.bat index d81b135..926a335 100644 --- a/tag.bat +++ b/tag.bat @@ -3,7 +3,7 @@ git tag v1.1.13 git tag bank_card/v1.1.3 git tag geoip/v1.1.3 -git tag entgo/v1.1.21 +git tag entgo/v1.1.22 git tag gorm/v1.1.3 git push origin --tags