94 lines
1.9 KiB
Go
94 lines
1.9 KiB
Go
package stardb
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// QueryBuilder helps build SQL queries
|
|
type QueryBuilder struct {
|
|
table string
|
|
columns []string
|
|
where []string
|
|
whereArgs []interface{}
|
|
orderBy string
|
|
limit int
|
|
offset int
|
|
}
|
|
|
|
// NewQueryBuilder creates a new query builder
|
|
func NewQueryBuilder(table string) *QueryBuilder {
|
|
return &QueryBuilder{
|
|
table: table,
|
|
columns: []string{"*"},
|
|
}
|
|
}
|
|
|
|
// Select sets the columns to select
|
|
func (qb *QueryBuilder) Select(columns ...string) *QueryBuilder {
|
|
qb.columns = columns
|
|
return qb
|
|
}
|
|
|
|
// Where adds a WHERE condition
|
|
func (qb *QueryBuilder) Where(condition string, args ...interface{}) *QueryBuilder {
|
|
qb.where = append(qb.where, condition)
|
|
qb.whereArgs = append(qb.whereArgs, args...)
|
|
return qb
|
|
}
|
|
|
|
// OrderBy sets the ORDER BY clause
|
|
func (qb *QueryBuilder) OrderBy(orderBy string) *QueryBuilder {
|
|
qb.orderBy = orderBy
|
|
return qb
|
|
}
|
|
|
|
// Limit sets the LIMIT
|
|
func (qb *QueryBuilder) Limit(limit int) *QueryBuilder {
|
|
qb.limit = limit
|
|
return qb
|
|
}
|
|
|
|
// Offset sets the OFFSET
|
|
func (qb *QueryBuilder) Offset(offset int) *QueryBuilder {
|
|
qb.offset = offset
|
|
return qb
|
|
}
|
|
|
|
// Build builds the SQL query and returns query string and args
|
|
func (qb *QueryBuilder) Build() (string, []interface{}) {
|
|
var parts []string
|
|
|
|
// SELECT
|
|
parts = append(parts, fmt.Sprintf("SELECT %s FROM %s",
|
|
strings.Join(qb.columns, ", "), qb.table))
|
|
|
|
// WHERE
|
|
if len(qb.where) > 0 {
|
|
parts = append(parts, "WHERE "+strings.Join(qb.where, " AND "))
|
|
}
|
|
|
|
// ORDER BY
|
|
if qb.orderBy != "" {
|
|
parts = append(parts, "ORDER BY "+qb.orderBy)
|
|
}
|
|
|
|
// LIMIT
|
|
if qb.limit > 0 {
|
|
parts = append(parts, fmt.Sprintf("LIMIT %d", qb.limit))
|
|
}
|
|
|
|
// OFFSET
|
|
if qb.offset > 0 {
|
|
parts = append(parts, fmt.Sprintf("OFFSET %d", qb.offset))
|
|
}
|
|
|
|
return strings.Join(parts, " "), qb.whereArgs
|
|
}
|
|
|
|
// Query executes the query
|
|
func (qb *QueryBuilder) Query(db *StarDB) (*StarRows, error) {
|
|
query, args := qb.Build()
|
|
return db.Query(query, args...)
|
|
}
|