condition.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package query
  2. import (
  3. "fmt"
  4. "git.nspix.com/golang/rest/internal/empty"
  5. "strings"
  6. )
  7. type Condition struct {
  8. Field string `json:"field"`
  9. Value interface{} `json:"value"`
  10. Operator string `json:"operator"`
  11. }
  12. func buildConditions(operator string, filter bool, conds ...*Condition) (condition string, params []interface{}) {
  13. var (
  14. sb strings.Builder
  15. )
  16. params = make([]interface{}, 0)
  17. for _, cond := range conds {
  18. if filter {
  19. if empty.Is(cond.Value) {
  20. continue
  21. }
  22. }
  23. if cond.Operator == "" {
  24. cond.Operator = "="
  25. }
  26. switch strings.ToUpper(cond.Operator) {
  27. case "=", "<>", ">", "<", ">=", "<=", "!=":
  28. if sb.Len() > 0 {
  29. sb.WriteString(" " + operator + " ")
  30. }
  31. if cond.Operator == "=" && cond.Value == nil {
  32. sb.WriteString(cond.Field + " IS NULL")
  33. } else {
  34. sb.WriteString(cond.Field + " " + cond.Operator + " ?")
  35. params = append(params, cond.Value)
  36. }
  37. case "LIKE":
  38. if sb.Len() > 0 {
  39. sb.WriteString(" " + operator + " ")
  40. }
  41. cond.Value = fmt.Sprintf("%%%s%%", cond.Value)
  42. sb.WriteString(cond.Field + " LIKE ?")
  43. params = append(params, cond.Value)
  44. case "IN":
  45. if sb.Len() > 0 {
  46. sb.WriteString(" " + operator + " ")
  47. }
  48. sb.WriteString(cond.Field + " IN (" + fmt.Sprint(cond.Value) + ")")
  49. case "BETWEEN":
  50. default:
  51. continue
  52. }
  53. }
  54. condition = sb.String()
  55. return
  56. }
  57. func NewCondition(field string, value interface{}) *Condition {
  58. return &Condition{
  59. Field: field,
  60. Value: value,
  61. Operator: "=",
  62. }
  63. }
  64. func NewConditionWithOperator(operator, field string, value interface{}) *Condition {
  65. cond := &Condition{
  66. Field: field,
  67. Value: value,
  68. Operator: operator,
  69. }
  70. return cond
  71. }