|
|
@@ -0,0 +1,178 @@
|
|
|
+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.queries = append(conditions.queries, "\""+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.queries = append(conditions.queries, "\""+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.queries = append(conditions.queries, "\""+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.queries = append(conditions.queries, "\""+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.queries = append(conditions.queries, "\""+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.queries = append(conditions.queries, "\""+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.queries = append(conditions.queries, "\""+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.queries = append(conditions.queries, "\""+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.queries = append(conditions.queries, "\""+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) 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()
|
|
|
+}
|