add offset step to query builder (#1049)

Summary:
Pull Request resolved: https://github.com/facebookexternal/fbc/pull/1049

Useful for real paging

Reviewed By: noamsch

Differential Revision: D16003607

fbshipit-source-id: 6a85d0e3d71a2582bc3cd8f1d66748dda4f2a10e
This commit is contained in:
Ariel Mashraki
2019-06-26 01:15:58 -07:00
committed by Facebook Github Bot
parent 6c2813b7b5
commit 37ae2b744e
14 changed files with 235 additions and 59 deletions

View File

@@ -10,10 +10,11 @@
// {{ $builder }} is the builder for querying {{ pascal $.Name }} entities.
type {{ $builder }} struct {
config
limit *int
order []Order
unique []string
predicates []ent.Predicate
limit *int
offset *int
order []Order
unique []string
predicates []ent.Predicate
// intermediate queries.
sql *sql.Selector
gremlin *dsl.Traversal
@@ -31,6 +32,12 @@ func ({{ $receiver }} *{{ $builder }}) Limit(limit int) *{{ $builder }} {
return {{ $receiver }}
}
// Offset adds an offset step to the query.
func ({{ $receiver }} *{{ $builder }}) Offset(offset int) *{{ $builder }} {
{{ $receiver }}.offset = &offset
return {{ $receiver }}
}
// Order adds an order step to the query.
func ({{ $receiver }} *{{ $builder }}) Order(o ...Order) *{{ $builder }} {
{{ $receiver }}.order = append({{ $receiver }}.order, o...)

View File

@@ -65,7 +65,12 @@ func ({{ $receiver }} *{{ $builder }}) gremlinQuery() *dsl.Traversal {
p.Gremlin(v)
}
}
if limit := {{ $receiver }}.limit; limit != nil {
switch limit, offset := {{ $receiver }}.limit, {{ $receiver }}.offset; {
case limit != nil && offset != nil:
v.Range(*offset, *offset + *limit)
case offset != nil:
v.Range(*offset, math.MaxInt64)
case limit != nil:
v.Limit(*limit)
}
if unique := {{ $receiver }}.unique; len(unique) == 0 {

View File

@@ -80,6 +80,11 @@ func ({{ $receiver }} *{{ $builder }}) sqlQuery() *sql.Selector {
for _, p := range {{ $receiver }}.order {
p.SQL(selector)
}
if offset := {{ $receiver }}.offset; offset != nil {
// limit is mandatory for offset clause. We start
// with default value, and override it below if needed.
selector.Offset(*offset).Limit(math.MaxInt64)
}
if limit := {{ $receiver }}.limit; limit != nil {
selector.Limit(*limit)
}

View File

@@ -3,6 +3,7 @@ import (
"fmt"
"context"
"errors"
"math"
"strconv"
"strings"
"time"