select.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package clause
  2. import "strings"
  3. type Select struct {
  4. selectClauses []string
  5. fromClause *From
  6. otherClauses []Clause
  7. }
  8. func NewSelect(selectClauses []string, fromClause *From, otherClauses ...Clause) *Select {
  9. return &Select{
  10. selectClauses: selectClauses,
  11. fromClause: fromClause,
  12. otherClauses: otherClauses,
  13. }
  14. }
  15. func (clause *Select) Clause() (string, error) {
  16. selectClauseBuilder := strings.Builder{}
  17. if clause.selectClauses == nil || len(clause.selectClauses) == 0 {
  18. selectClauseBuilder.WriteString("*\n")
  19. } else {
  20. for i, selectClause := range clause.selectClauses {
  21. selectClauseBuilder.WriteString(" " + selectClause)
  22. if i < len(clause.selectClauses)-1 {
  23. selectClauseBuilder.WriteString(",\n")
  24. } else {
  25. selectClauseBuilder.WriteString("\n")
  26. }
  27. }
  28. }
  29. fromClause, err := clause.fromClause.Clause()
  30. if err != nil {
  31. return "", err
  32. }
  33. otherClauseBuilder := strings.Builder{}
  34. for _, otherClause := range clause.otherClauses {
  35. otherClauseStr, err := otherClause.Clause()
  36. if err != nil {
  37. return "", err
  38. }
  39. otherClauseBuilder.WriteString(otherClauseStr)
  40. }
  41. clauseBuilder := strings.Builder{}
  42. clauseBuilder.WriteString("SELECT\n")
  43. clauseBuilder.WriteString(selectClauseBuilder.String())
  44. clauseBuilder.WriteString(fromClause)
  45. clauseBuilder.WriteString(otherClauseBuilder.String())
  46. return clauseBuilder.String(), nil
  47. }
  48. func (clause *Select) Args() []any {
  49. args := make([]any, 0)
  50. args = append(args, clause.fromClause.Args()...)
  51. for _, otherClause := range clause.otherClauses {
  52. args = append(args, otherClause.Args()...)
  53. }
  54. return args
  55. }