Add offset and limit generation

This commit is contained in:
Aaron L 2016-07-31 19:21:06 -07:00
parent 40df1b7c86
commit b8c28c7cf8
5 changed files with 37 additions and 3 deletions

View file

@ -1 +1 @@
SELECT * FROM "t"; SELECT * FROM "t";

1
boil/_fixtures/01.sql Normal file
View file

@ -0,0 +1 @@
SELECT * FROM "q" LIMIT 5 OFFSET 6;

View file

@ -40,6 +40,13 @@ func Limit(limit int) QueryMod {
} }
} }
// Offset into the results
func Offset(offset int) QueryMod {
return func(q *boil.Query) {
boil.SetOffset(q, offset)
}
}
// InnerJoin on another table // InnerJoin on another table
func InnerJoin(stmt string, args ...interface{}) QueryMod { func InnerJoin(stmt string, args ...interface{}) QueryMod {
return func(q *boil.Query) { return func(q *boil.Query) {

View file

@ -41,6 +41,7 @@ type Query struct {
orderBy []string orderBy []string
having []string having []string
limit int limit int
offset int
} }
func buildQuery(q *Query) (string, []interface{}) { func buildQuery(q *Query) (string, []interface{}) {
@ -85,6 +86,13 @@ func buildSelectQuery(q *Query) (*bytes.Buffer, []interface{}) {
where, args := whereClause(q) where, args := whereClause(q)
buf.WriteString(where) buf.WriteString(where)
if q.limit != 0 {
fmt.Fprintf(buf, " LIMIT %d", q.limit)
}
if q.offset != 0 {
fmt.Fprintf(buf, " OFFSET %d", q.offset)
}
buf.WriteByte(';') buf.WriteByte(';')
return buf, args return buf, args
} }
@ -229,6 +237,11 @@ func SetLimit(q *Query, limit int) {
q.limit = limit q.limit = limit
} }
// SetOffset on the query.
func SetOffset(q *Query, offset int) {
q.offset = offset
}
func whereClause(q *Query) (string, []interface{}) { func whereClause(q *Query) (string, []interface{}) {
if len(q.where) == 0 { if len(q.where) == 0 {
return "", nil return "", nil

View file

@ -14,7 +14,7 @@ import (
) )
var writeGoldenFiles = flag.Bool( var writeGoldenFiles = flag.Bool(
"golden", "test.golden",
false, false,
"Write golden files.", "Write golden files.",
) )
@ -26,7 +26,8 @@ func TestBuildQuery(t *testing.T) {
q *Query q *Query
args []interface{} args []interface{}
}{ }{
{&Query{from: "t"}, []interface{}{}}, {&Query{from: "t"}, nil},
{&Query{from: "q", limit: 5, offset: 6}, nil},
} }
for i, test := range tests { for i, test := range tests {
@ -102,6 +103,18 @@ func TestSetLimit(t *testing.T) {
} }
} }
func TestSetOffset(t *testing.T) {
t.Parallel()
q := &Query{}
SetOffset(q, 10)
expect := 10
if q.offset != expect {
t.Errorf("Expected %d, got %d", expect, q.offset)
}
}
func TestSetSQL(t *testing.T) { func TestSetSQL(t *testing.T) {
t.Parallel() t.Parallel()