123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- package clause
- import "strings"
- type Conditions struct {
- queries []string
- args [][]any
- err error
- }
- func NewConditions() *Conditions {
- return &Conditions{
- queries: make([]string, 0),
- args: make([][]any, 0),
- }
- }
- func (conditions *Conditions) AddCondition(query string, args ...any) *Conditions {
- conditions.queries = append(conditions.queries, query)
- conditions.args = append(conditions.args, args)
- return conditions
- }
- func (conditions *Conditions) Equal(columnName string, arg any) *Conditions {
- if conditions.err != nil {
- return conditions
- }
- conditions.appendQuery(columnName, " = ?")
- conditions.args = append(conditions.args, []any{arg})
- return conditions
- }
- func (conditions *Conditions) Like(columnName string, arg string) *Conditions {
- if conditions.err != nil {
- return conditions
- }
- conditions.appendQuery(columnName, " LIKE ?")
- conditions.args = append(conditions.args, []any{arg})
- return conditions
- }
- func (conditions *Conditions) In(columnName string, arg any) *Conditions {
- if conditions.err != nil {
- return conditions
- }
- conditions.appendQuery(columnName, " IN ?")
- conditions.args = append(conditions.args, []any{arg})
- return conditions
- }
- func (conditions *Conditions) NotIn(columnName string, arg any) *Conditions {
- if conditions.err != nil {
- return conditions
- }
- conditions.appendQuery(columnName, " NOT IN ?")
- conditions.args = append(conditions.args, []any{arg})
- return conditions
- }
- func (conditions *Conditions) Not(columnName string, arg any) *Conditions {
- if conditions.err != nil {
- return conditions
- }
- conditions.appendQuery(columnName, " != ?")
- conditions.args = append(conditions.args, []any{arg})
- return conditions
- }
- func (conditions *Conditions) LessThan(columnName string, arg any) *Conditions {
- if conditions.err != nil {
- return conditions
- }
- conditions.appendQuery(columnName, " < ?")
- conditions.args = append(conditions.args, []any{arg})
- return conditions
- }
- func (conditions *Conditions) LessThanAndEqual(columnName string, arg any) *Conditions {
- if conditions.err != nil {
- return conditions
- }
- conditions.appendQuery(columnName, " <= ?")
- conditions.args = append(conditions.args, []any{arg})
- return conditions
- }
- func (conditions *Conditions) GreaterThan(columnName string, arg any) *Conditions {
- if conditions.err != nil {
- return conditions
- }
- conditions.appendQuery(columnName, " > ?")
- conditions.args = append(conditions.args, []any{arg})
- return conditions
- }
- func (conditions *Conditions) GreaterThanAndEqual(columnName string, arg any) *Conditions {
- if conditions.err != nil {
- return conditions
- }
- conditions.appendQuery(columnName, " >= ?")
- conditions.args = append(conditions.args, []any{arg})
- return conditions
- }
- func (conditions *Conditions) And() *And {
- return &And{conditions: conditions}
- }
- func (conditions *Conditions) Or() *Or {
- return &Or{conditions: conditions}
- }
- func (conditions *Conditions) appendQuery(columnName string, expr string) {
- conditions.queries = append(conditions.queries, `"`+columnName+`"`+expr)
- }
- func (conditions *Conditions) formClause(conditionOperator string) (string, error) {
- if conditions.queries == nil || len(conditions.queries) == 0 {
- return "", nil
- }
- stringBuilder := strings.Builder{}
- for i, query := range conditions.queries {
- stringBuilder.WriteString(query)
- if i != len(conditions.queries)-1 {
- stringBuilder.WriteString(" " + conditionOperator + " ")
- }
- }
- return stringBuilder.String(), nil
- }
- func (conditions *Conditions) formArgs() []any {
- args := make([]any, 0)
- for _, conditionArgs := range conditions.args {
- if conditionArgs == nil {
- continue
- }
- if len(conditionArgs) == 1 {
- args = append(args, conditionArgs[0])
- } else {
- args = append(args, conditionArgs)
- }
- }
- return args
- }
- type And struct {
- conditions *Conditions
- }
- func (and *And) Clause() (string, error) {
- return and.conditions.formClause("AND")
- }
- func (and *And) Args() []any {
- return and.conditions.formArgs()
- }
- type Or struct {
- conditions *Conditions
- }
- func (or *Or) Clause() (string, error) {
- return or.conditions.formClause("OR")
- }
- func (or *Or) Args() []any {
- return or.conditions.formArgs()
- }
|