package service import ( "fmt" "strings" ) type QueryBuilder struct { conditions []string args []interface{} idx int } func NewQueryBuilder(startIdx int) *QueryBuilder { return &QueryBuilder{idx: startIdx} } func (qb *QueryBuilder) Add(condition string, arg interface{}) { qb.conditions = append(qb.conditions, fmt.Sprintf(condition, qb.idx)) qb.args = append(qb.args, arg) qb.idx++ } func (qb *QueryBuilder) AddLiteral(condition string) { qb.conditions = append(qb.conditions, condition) } func (qb *QueryBuilder) Where() string { if len(qb.conditions) == 0 { return "" } return " WHERE " + strings.Join(qb.conditions, " AND ") } func (qb *QueryBuilder) Args() []interface{} { return qb.args } func (qb *QueryBuilder) Idx() int { return qb.idx }