condition.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package clause
  2. import "strings"
  3. type Conditions struct {
  4. queries []string
  5. args [][]any
  6. err error
  7. }
  8. func NewConditions() *Conditions {
  9. return &Conditions{
  10. queries: make([]string, 0),
  11. args: make([][]any, 0),
  12. }
  13. }
  14. func (conditions *Conditions) AddCondition(query string, args ...any) *Conditions {
  15. conditions.queries = append(conditions.queries, query)
  16. conditions.args = append(conditions.args, args)
  17. return conditions
  18. }
  19. func (conditions *Conditions) Equal(columnName string, arg any) *Conditions {
  20. if conditions.err != nil {
  21. return conditions
  22. }
  23. conditions.appendQuery(columnName, " = ?")
  24. conditions.args = append(conditions.args, []any{arg})
  25. return conditions
  26. }
  27. func (conditions *Conditions) Like(columnName string, arg string) *Conditions {
  28. if conditions.err != nil {
  29. return conditions
  30. }
  31. conditions.appendQuery(columnName, " LIKE ?")
  32. conditions.args = append(conditions.args, []any{arg})
  33. return conditions
  34. }
  35. func (conditions *Conditions) In(columnName string, arg any) *Conditions {
  36. if conditions.err != nil {
  37. return conditions
  38. }
  39. conditions.appendQuery(columnName, " IN ?")
  40. conditions.args = append(conditions.args, []any{arg})
  41. return conditions
  42. }
  43. func (conditions *Conditions) NotIn(columnName string, arg any) *Conditions {
  44. if conditions.err != nil {
  45. return conditions
  46. }
  47. conditions.appendQuery(columnName, " NOT IN ?")
  48. conditions.args = append(conditions.args, []any{arg})
  49. return conditions
  50. }
  51. func (conditions *Conditions) Not(columnName string, arg any) *Conditions {
  52. if conditions.err != nil {
  53. return conditions
  54. }
  55. conditions.appendQuery(columnName, " != ?")
  56. conditions.args = append(conditions.args, []any{arg})
  57. return conditions
  58. }
  59. func (conditions *Conditions) LessThan(columnName string, arg any) *Conditions {
  60. if conditions.err != nil {
  61. return conditions
  62. }
  63. conditions.appendQuery(columnName, " < ?")
  64. conditions.args = append(conditions.args, []any{arg})
  65. return conditions
  66. }
  67. func (conditions *Conditions) LessThanAndEqual(columnName string, arg any) *Conditions {
  68. if conditions.err != nil {
  69. return conditions
  70. }
  71. conditions.appendQuery(columnName, " <= ?")
  72. conditions.args = append(conditions.args, []any{arg})
  73. return conditions
  74. }
  75. func (conditions *Conditions) GreaterThan(columnName string, arg any) *Conditions {
  76. if conditions.err != nil {
  77. return conditions
  78. }
  79. conditions.appendQuery(columnName, " > ?")
  80. conditions.args = append(conditions.args, []any{arg})
  81. return conditions
  82. }
  83. func (conditions *Conditions) GreaterThanAndEqual(columnName string, arg any) *Conditions {
  84. if conditions.err != nil {
  85. return conditions
  86. }
  87. conditions.appendQuery(columnName, " >= ?")
  88. conditions.args = append(conditions.args, []any{arg})
  89. return conditions
  90. }
  91. func (conditions *Conditions) And() *And {
  92. return &And{conditions: conditions}
  93. }
  94. func (conditions *Conditions) Or() *Or {
  95. return &Or{conditions: conditions}
  96. }
  97. func (conditions *Conditions) appendQuery(columnName string, expr string) {
  98. conditions.queries = append(conditions.queries, `"`+columnName+`"`+expr)
  99. }
  100. func (conditions *Conditions) formClause(conditionOperator string) (string, error) {
  101. if conditions.queries == nil || len(conditions.queries) == 0 {
  102. return "", nil
  103. }
  104. stringBuilder := strings.Builder{}
  105. for i, query := range conditions.queries {
  106. stringBuilder.WriteString(query)
  107. if i != len(conditions.queries)-1 {
  108. stringBuilder.WriteString(" " + conditionOperator + " ")
  109. }
  110. }
  111. return stringBuilder.String(), nil
  112. }
  113. func (conditions *Conditions) formArgs() []any {
  114. args := make([]any, 0)
  115. for _, conditionArgs := range conditions.args {
  116. if conditionArgs == nil {
  117. continue
  118. }
  119. if len(conditionArgs) == 1 {
  120. args = append(args, conditionArgs[0])
  121. } else {
  122. args = append(args, conditionArgs)
  123. }
  124. }
  125. return args
  126. }
  127. type And struct {
  128. conditions *Conditions
  129. }
  130. func (and *And) Clause() (string, error) {
  131. return and.conditions.formClause("AND")
  132. }
  133. func (and *And) Args() []any {
  134. return and.conditions.formArgs()
  135. }
  136. type Or struct {
  137. conditions *Conditions
  138. }
  139. func (or *Or) Clause() (string, error) {
  140. return or.conditions.formClause("OR")
  141. }
  142. func (or *Or) Args() []any {
  143. return or.conditions.formArgs()
  144. }