condition_join.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package clause
  2. type ConditionJoin struct {
  3. left Clause
  4. right Clause
  5. }
  6. func NewConditionJoin(left Clause, right Clause) *ConditionJoin {
  7. return &ConditionJoin{
  8. left: left,
  9. right: right,
  10. }
  11. }
  12. func (clause *ConditionJoin) And() *AndJoin {
  13. return &AndJoin{
  14. conditionJoin: clause,
  15. }
  16. }
  17. func (clause *ConditionJoin) Or() *OrJoin {
  18. return &OrJoin{
  19. conditionJoin: clause,
  20. }
  21. }
  22. func (clause *ConditionJoin) formClause(conditionOperator string) (string, error) {
  23. if clause.left == nil || clause.right == nil {
  24. if clause.left != nil {
  25. return clause.left.Clause()
  26. }
  27. if clause.right != nil {
  28. return clause.right.Clause()
  29. }
  30. return "", nil
  31. }
  32. leftClause, err := clause.left.Clause()
  33. if err != nil {
  34. return "", err
  35. }
  36. rightClause, err := clause.right.Clause()
  37. if err != nil {
  38. return "", err
  39. }
  40. return "(" + leftClause + ") " + conditionOperator + " (" + rightClause + ")", nil
  41. }
  42. func (clause *ConditionJoin) formArgs() []any {
  43. args := make([]any, 0)
  44. if clause.left != nil {
  45. args = append(args, clause.left.Args()...)
  46. }
  47. if clause.right != nil {
  48. args = append(args, clause.right.Args()...)
  49. }
  50. return args
  51. }
  52. type AndJoin struct {
  53. conditionJoin *ConditionJoin
  54. }
  55. func (clause *AndJoin) Clause() (string, error) {
  56. return clause.conditionJoin.formClause("AND")
  57. }
  58. func (clause *AndJoin) Args() []any {
  59. return clause.conditionJoin.formArgs()
  60. }
  61. type OrJoin struct {
  62. conditionJoin *ConditionJoin
  63. }
  64. func (clause *OrJoin) Clause() (string, error) {
  65. return clause.conditionJoin.formClause("OR")
  66. }
  67. func (clause *OrJoin) Args() []any {
  68. return clause.conditionJoin.formArgs()
  69. }