diff --git a/entgo/query/filter.go b/entgo/query/filter.go index 5011c5c..824acad 100644 --- a/entgo/query/filter.go +++ b/entgo/query/filter.go @@ -3,14 +3,13 @@ package entgo import ( "encoding/json" "fmt" + "github.com/tx7do/go-utils/stringcase" "strings" "entgo.io/ent/dialect" "entgo.io/ent/dialect/sql" "github.com/go-kratos/kratos/v2/encoding" - - "github.com/tx7do/go-utils/stringcase" ) type FilterOp int @@ -202,9 +201,7 @@ func QueryCommandToWhereConditions(strJson string, isOr bool) (error, func(s *sq func processQueryMap(s *sql.Selector, queryMap map[string]string) []*sql.Predicate { var ps []*sql.Predicate for k, v := range queryMap { - key := stringcase.ToSnakeCase(k) - - keys := splitQueryKey(key) + keys := splitQueryKey(k) if cond := makeFieldFilter(s, keys, v); cond != nil { ps = append(ps, cond) @@ -235,11 +232,18 @@ func makeFieldFilter(s *sql.Selector, keys []string, value string) *sql.Predicat if isJsonFieldKey(field) { jsonFields := splitJsonFieldKey(field) if len(jsonFields) != 2 { + field = stringcase.ToSnakeCase(field) return filterEqual(s, p, field, value) } value = "'" + value + "'" - return filterJsonb(s, p, jsonFields[1], jsonFields[0]).EQ("", value) + return filterJsonb( + s, p, + stringcase.ToSnakeCase(jsonFields[1]), + stringcase.ToSnakeCase(jsonFields[0]), + ). + EQ("", value) } + field = stringcase.ToSnakeCase(field) return filterEqual(s, p, field, value) case 2: @@ -251,9 +255,14 @@ func makeFieldFilter(s *sql.Selector, keys []string, value string) *sql.Predicat if isJsonFieldKey(field) { jsonFields := splitJsonFieldKey(field) if len(jsonFields) == 2 { - field = filterJsonbField(s, jsonFields[1], jsonFields[0]) + field = filterJsonbField(s, + stringcase.ToSnakeCase(jsonFields[1]), + stringcase.ToSnakeCase(jsonFields[0]), + ) value = "'" + value + "'" } + } else { + field = stringcase.ToSnakeCase(field) } var cond *sql.Predicate @@ -288,9 +297,12 @@ func makeFieldFilter(s *sql.Selector, keys []string, value string) *sql.Predicat field = filterJsonbField(s, jsonFields[1], jsonFields[0]) value = "'" + value + "'" } + } else { + field = stringcase.ToSnakeCase(field) } str := filterDatePartField(s, op1, field) + if hasOperations(op2) { return processOp(s, p, op2, str, value) } @@ -618,6 +630,8 @@ func filterDatePartField(s *sql.Selector, datePart, field string) string { // filterJsonb 提取JSONB字段 // Postgresql: WHERE ("app_profile"."preferences" ->> 'daily_email') = 'true' func filterJsonb(s *sql.Selector, p *sql.Predicate, jsonbField, field string) *sql.Predicate { + field = stringcase.ToSnakeCase(field) + p.Append(func(b *sql.Builder) { switch s.Builder.Dialect() { case dialect.Postgres: @@ -637,6 +651,8 @@ func filterJsonb(s *sql.Selector, p *sql.Predicate, jsonbField, field string) *s // filterJsonbField JSONB字段 func filterJsonbField(s *sql.Selector, jsonbField, field string) string { + field = stringcase.ToSnakeCase(field) + p := sql.P() switch s.Builder.Dialect() { case dialect.Postgres: diff --git a/entgo/query/query_test.go b/entgo/query/query_test.go index 5490e75..a1aabe2 100644 --- a/entgo/query/query_test.go +++ b/entgo/query/query_test.go @@ -110,19 +110,22 @@ func TestBuildQuerySelectorDefault(t *testing.T) { {"PostgreSQL_NoPagination", dialect.Postgres, "", "", true, "SELECT * FROM \"users\" ORDER BY \"users\".\"created_at\" DESC"}, {"MySQL_JsonbQuery", dialect.MySQL, "{\"preferences__daily_email\" : \"true\"}", "", true, "SELECT * FROM `users` WHERE JSON_EXTRACT(`users`.`preferences`, '$.daily_email') = ? ORDER BY `users`.`created_at` DESC"}, - {"PostgreSQL_JsonbQuery", dialect.Postgres, "{\"preferences__daily_email\" : \"true\"}", "", true, "SELECT * FROM \"users\" WHERE \"users\".\"preferences\" -> daily_email = $1 ORDER BY \"users\".\"created_at\" DESC"}, + {"PostgreSQL_JsonbQuery", dialect.Postgres, "{\"preferences__daily_email\" : \"true\"}", "", true, "SELECT * FROM \"users\" WHERE \"users\".\"preferences\" ->> 'daily_email' = $1 ORDER BY \"users\".\"created_at\" DESC"}, {"MySQL_DatePartQuery", dialect.MySQL, "{\"created_at__date\" : \"2023-01-01\"}", "", true, "SELECT * FROM `users` WHERE DATE(`users`.`created_at`) = ? ORDER BY `users`.`created_at` DESC"}, {"PostgreSQL_DatePartQuery", dialect.Postgres, "{\"created_at__date\" : \"2023-01-01\"}", "", true, "SELECT * FROM \"users\" WHERE EXTRACT('DATE' FROM \"users\".\"created_at\") = $1 ORDER BY \"users\".\"created_at\" DESC"}, {"MySQL_JsonbCombineQuery", dialect.MySQL, "{\"preferences__pub_date__not\" : \"true\"}", "", true, "SELECT * FROM `users` WHERE NOT JSON_EXTRACT(`users`.`preferences`, '$.pub_date') = ? ORDER BY `users`.`created_at` DESC"}, - {"PostgreSQL_JsonbCombineQuery", dialect.Postgres, "{\"preferences__pub_date__not\" : \"true\"}", "", true, "SELECT * FROM \"users\" WHERE NOT \"users\".\"preferences\" -> pub_date = $1 ORDER BY \"users\".\"created_at\" DESC"}, + {"PostgreSQL_JsonbCombineQuery", dialect.Postgres, "{\"preferences__pub_date__not\" : \"true\"}", "", true, "SELECT * FROM \"users\" WHERE NOT \"users\".\"preferences\" ->> 'pub_date' = $1 ORDER BY \"users\".\"created_at\" DESC"}, {"MySQL_DatePartCombineQuery", dialect.MySQL, "{\"pub_date__date__not\" : \"true\"}", "", true, "SELECT * FROM `users` WHERE NOT DATE(`users`.`pub_date`) = ? ORDER BY `users`.`created_at` DESC"}, {"PostgreSQL_DatePartCombineQuery", dialect.Postgres, "{\"pub_date__date__not\" : \"true\"}", "", true, "SELECT * FROM \"users\" WHERE NOT EXTRACT('DATE' FROM \"users\".\"pub_date\") = $1 ORDER BY \"users\".\"created_at\" DESC"}, {"MySQL_DatePartRangeQuery", dialect.MySQL, "{\"pub_date__date__range\" : \"[\\\"2023-10-25\\\", \\\"2024-10-25\\\"]\"}", "", true, "SELECT * FROM `users` WHERE DATE(`users`.`pub_date`) >= ? AND DATE(`users`.`pub_date`) <= ? ORDER BY `users`.`created_at` DESC"}, {"PostgreSQL_DatePartRangeQuery", dialect.Postgres, "{\"pub_date__date__range\" : \"[\\\"2023-10-25\\\", \\\"2024-10-25\\\"]\"}", "", true, "SELECT * FROM \"users\" WHERE EXTRACT('DATE' FROM \"users\".\"pub_date\") >= $1 AND EXTRACT('DATE' FROM \"users\".\"pub_date\") <= $2 ORDER BY \"users\".\"created_at\" DESC"}, + + {"MySQL_JsonQuery", dialect.MySQL, "{\"meta.title\" : \"preferences__daily_email\"}", "", true, "SELECT * FROM `users` WHERE JSON_EXTRACT(`users`.`meta`, '$.title') = ? ORDER BY `users`.`created_at` DESC"}, + {"PostgreSQL_JsonQuery", dialect.Postgres, "{\"meta.title\" : \"preferences__daily_email\"}", "", true, "SELECT * FROM \"users\" WHERE \"users\".\"meta\" ->> 'title' = $1 ORDER BY \"users\".\"created_at\" DESC"}, } for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { diff --git a/tag.bat b/tag.bat index 926a335..eb2f1d4 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.22 +git tag entgo/v1.1.23 git tag gorm/v1.1.3 git push origin --tags