diff --git a/store/db/mysql/memo_filter.go b/store/db/mysql/memo_filter.go index e32ab41d..6622c0f5 100644 --- a/store/db/mysql/memo_filter.go +++ b/store/db/mysql/memo_filter.go @@ -102,6 +102,25 @@ func ConvertExprToSQL(ctx *filter.ConvertContext, expr *exprv1.Expr) error { return err } ctx.Args = append(ctx.Args, timestamp.Unix()) + } else if identifier == "visibility" || identifier == "content" { + if operator != "=" && operator != "!=" { + return errors.Errorf("invalid operator for %s", v.CallExpr.Function) + } + valueStr, ok := value.(string) + if !ok { + return errors.New("invalid string value") + } + + var factor string + if identifier == "visibility" { + factor = "`memo`.`visibility`" + } else if identifier == "content" { + factor = "`memo`.`content`" + } + if _, err := ctx.Buffer.WriteString(fmt.Sprintf("%s %s ?", factor, operator)); err != nil { + return err + } + ctx.Args = append(ctx.Args, valueStr) } case "@in": if len(v.CallExpr.Args) != 2 { diff --git a/store/db/postgres/memo_filter.go b/store/db/postgres/memo_filter.go index 4e6608bb..9096dab7 100644 --- a/store/db/postgres/memo_filter.go +++ b/store/db/postgres/memo_filter.go @@ -59,7 +59,7 @@ func ConvertExprToSQL(ctx *filter.ConvertContext, expr *exprv1.Expr) error { if err != nil { return err } - if !slices.Contains([]string{"create_time", "update_time"}, identifier) { + if !slices.Contains([]string{"create_time", "update_time", "visibility", "content"}, identifier) { return errors.Errorf("invalid identifier for %s", v.CallExpr.Function) } value, err := filter.GetConstValue(v.CallExpr.Args[1]) @@ -102,6 +102,25 @@ func ConvertExprToSQL(ctx *filter.ConvertContext, expr *exprv1.Expr) error { return err } ctx.Args = append(ctx.Args, timestamp.Unix()) + } else if identifier == "visibility" || identifier == "content" { + if operator != "=" && operator != "!=" { + return errors.Errorf("invalid operator for %s", v.CallExpr.Function) + } + valueStr, ok := value.(string) + if !ok { + return errors.New("invalid string value") + } + + var factor string + if identifier == "visibility" { + factor = "memo.visibility" + } else if identifier == "content" { + factor = "memo.content" + } + if _, err := ctx.Buffer.WriteString(fmt.Sprintf("%s %s %s", factor, operator, placeholder(len(ctx.Args)+ctx.ArgsOffset+1))); err != nil { + return err + } + ctx.Args = append(ctx.Args, valueStr) } case "@in": if len(v.CallExpr.Args) != 2 { diff --git a/store/db/sqlite/memo_filter.go b/store/db/sqlite/memo_filter.go index 3103a1ed..496b759b 100644 --- a/store/db/sqlite/memo_filter.go +++ b/store/db/sqlite/memo_filter.go @@ -59,7 +59,7 @@ func ConvertExprToSQL(ctx *filter.ConvertContext, expr *exprv1.Expr) error { if err != nil { return err } - if !slices.Contains([]string{"create_time", "update_time"}, identifier) { + if !slices.Contains([]string{"create_time", "update_time", "visibility", "content"}, identifier) { return errors.Errorf("invalid identifier for %s", v.CallExpr.Function) } value, err := filter.GetConstValue(v.CallExpr.Args[1]) @@ -102,6 +102,25 @@ func ConvertExprToSQL(ctx *filter.ConvertContext, expr *exprv1.Expr) error { return err } ctx.Args = append(ctx.Args, timestamp.Unix()) + } else if identifier == "visibility" || identifier == "content" { + if operator != "=" && operator != "!=" { + return errors.Errorf("invalid operator for %s", v.CallExpr.Function) + } + valueStr, ok := value.(string) + if !ok { + return errors.New("invalid string value") + } + + var factor string + if identifier == "visibility" { + factor = "`memo`.`visibility`" + } else if identifier == "content" { + factor = "`memo`.`content`" + } + if _, err := ctx.Buffer.WriteString(fmt.Sprintf("%s %s ?", factor, operator)); err != nil { + return err + } + ctx.Args = append(ctx.Args, valueStr) } case "@in": if len(v.CallExpr.Args) != 2 {