From efeeb8b675fcb7ba417a7aa5e8e5641767502fc8 Mon Sep 17 00:00:00 2001 From: xing Date: Thu, 23 Feb 2023 11:43:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9F=A5=E8=AF=A2=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E8=A7=A3=E6=9E=90=EF=BC=8Cwhere=E4=B8=AD=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=8F=AF=E4=BB=A5=E4=B8=8D=E7=94=A8=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=E7=9A=84=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model/parse.go | 35 ++++++++++++++++++----------------- model/querycondition_test.go | 8 +++++--- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/model/parse.go b/model/parse.go index 74dae43..705840a 100644 --- a/model/parse.go +++ b/model/parse.go @@ -2,18 +2,17 @@ package model import ( "github.com/fthvgb1/wp-go/helper/slice" + str "github.com/fthvgb1/wp-go/helper/strings" "strconv" "strings" ) func (w SqlBuilder) parseField(ss []string, s *strings.Builder) { if strings.Contains(ss[0], ".") && !strings.Contains(ss[0], "(") { - s.WriteString("`") - sx := strings.Split(ss[0], ".") - s.WriteString(sx[0]) - s.WriteString("`.`") - s.WriteString(sx[1]) - s.WriteString("`") + x := slice.Map(strings.Split(ss[0], "."), func(t string) string { + return str.Join("`", t, "`") + }) + s.WriteString(strings.Join(x, ".")) } else if !strings.Contains(ss[0], ".") && !strings.Contains(ss[0], "(") { s.WriteString("`") s.WriteString(ss[0]) @@ -26,13 +25,9 @@ func (w SqlBuilder) parseField(ss []string, s *strings.Builder) { func (w SqlBuilder) parseIn(ss []string, s *strings.Builder, c *int, args *[]any, in *[][]any) (t bool) { if slice.IsContained(ss[1], []string{"in", "not in"}) && len(*in) > 0 { s.WriteString(" (") - for _, p := range (*in)[*c] { - s.WriteString("?,") - *args = append(*args, p) - } - sx := s.String() - s.Reset() - s.WriteString(strings.TrimRight(sx, ",")) + x := strings.TrimRight(strings.Repeat("?,", len((*in)[*c])), ",") + s.WriteString(x) + *args = append(*args, (*in)[*c]...) s.WriteString(")") *c++ t = true @@ -81,11 +76,15 @@ func (w SqlBuilder) ParseWhere(in *[][]any) (string, []any, error) { args := make([]any, 0, len(w)) c := 0 for _, ss := range w { - if len(ss) == 2 { + switch len(ss) { + case 1: + s.WriteString(ss[0]) + s.WriteString(" and ") + case 2: w.parseField(ss, &s) s.WriteString("=? and ") args = append(args, ss[1]) - } else if len(ss) >= 3 && len(ss) < 5 { + case 3, 4: w.parseField(ss, &s) s.WriteString(ss[1]) if w.parseIn(ss, &s, &c, &args, in) { @@ -97,7 +96,9 @@ func (w SqlBuilder) ParseWhere(in *[][]any) (string, []any, error) { if err != nil { return "", nil, err } - } else if len(ss) >= 5 && len(ss)%5 == 0 { + } + + if len(ss) >= 5 && len(ss)%5 == 0 { j := len(ss) / 5 for i := 0; i < j; i++ { start := i * 5 @@ -149,7 +150,7 @@ func (w SqlBuilder) ParseWhere(in *[][]any) (string, []any, error) { func (w SqlBuilder) parseOrderBy() string { s := strings.Builder{} for _, ss := range w { - if len(ss) == 2 && ss[0] != "" && slice.IsContained(ss[1], []string{"asc", "desc"}) { + if len(ss) == 2 && ss[0] != "" && slice.IsContained(strings.ToLower(ss[1]), []string{"asc", "desc"}) { s.WriteString(" ") s.WriteString(ss[0]) s.WriteString(" ") diff --git a/model/querycondition_test.go b/model/querycondition_test.go index 93ef718..4bcc7f0 100644 --- a/model/querycondition_test.go +++ b/model/querycondition_test.go @@ -510,7 +510,7 @@ func Test_findScanner(t *testing.T) { func BenchmarkSqlxQueryXX(b *testing.B) { for i := 0; i < b.N; i++ { var r []options - err := ddb.Select(&r, "select * from wp_options where option_id<100") + err := ddb.Select(&r, "select * from wp_options where option_id<100 and option_id>50") if err != nil { panic(err) } @@ -523,7 +523,7 @@ func BenchmarkScannerXX(b *testing.B) { err := findScanner[options](glob, ctx, func(t options) { r = append(r, t) //fmt.Println(t) - }, Conditions(Where(SqlBuilder{{"option_id", "<", "100", "int"}}))) + }, Conditions(Where(SqlBuilder{{"option_id<100"}, {"option_id>50"}}))) if err != nil { panic(err) } @@ -532,7 +532,9 @@ func BenchmarkScannerXX(b *testing.B) { func BenchmarkFindsXX(b *testing.B) { for i := 0; i < b.N; i++ { - _, err := finds[options](glob, ctx, Conditions(Where(SqlBuilder{{"option_id", "<", "100", "int"}}))) + _, err := finds[options](glob, ctx, Conditions( + Where(SqlBuilder{{"option_id<100"}, {"option_id>50"}})), + ) if err != nil { panic(err) }