@@ -10,38 +10,49 @@ import (
1010 "xorm.io/xorm"
1111)
1212
13- // ListOptions options to paginate results
14- type ListOptions struct {
15- PageSize int
16- Page int // start from 1
13+ // Paginator is the base for different ListOptions types
14+ type Paginator interface {
15+ GetSkipTake () ( skip , take int )
16+ GetStartEnd () ( start , end int )
1717}
1818
19- func (opts * ListOptions ) getPaginatedSession () * xorm.Session {
20- opts .setDefaultValues ()
19+ // getPaginatedSession creates a paginated database session
20+ func getPaginatedSession (p Paginator ) * xorm.Session {
21+ skip , take := p .GetSkipTake ()
2122
22- return x .Limit (opts . PageSize , ( opts . Page - 1 ) * opts . PageSize )
23+ return x .Limit (take , skip )
2324}
2425
25- func (opts * ListOptions ) setSessionPagination (sess * xorm.Session ) * xorm.Session {
26- opts .setDefaultValues ()
26+ // setSessionPagination sets pagination for a database session
27+ func setSessionPagination (sess * xorm.Session , p Paginator ) * xorm.Session {
28+ skip , take := p .GetSkipTake ()
2729
28- if opts .PageSize <= 0 {
29- return sess
30- }
31- return sess .Limit (opts .PageSize , (opts .Page - 1 )* opts .PageSize )
30+ return sess .Limit (take , skip )
3231}
3332
34- func (opts * ListOptions ) setEnginePagination (e Engine ) Engine {
35- opts .setDefaultValues ()
33+ // setSessionPagination sets pagination for a database engine
34+ func setEnginePagination (e Engine , p Paginator ) Engine {
35+ skip , take := p .GetSkipTake ()
36+
37+ return e .Limit (take , skip )
38+ }
39+
40+ // ListOptions options to paginate results
41+ type ListOptions struct {
42+ PageSize int
43+ Page int // start from 1
44+ }
3645
37- return e .Limit (opts .PageSize , (opts .Page - 1 )* opts .PageSize )
46+ // GetSkipTake returns the skip and take values
47+ func (opts * ListOptions ) GetSkipTake () (skip , take int ) {
48+ opts .setDefaultValues ()
49+ return (opts .Page - 1 ) * opts .PageSize , opts .PageSize
3850}
3951
4052// GetStartEnd returns the start and end of the ListOptions
4153func (opts * ListOptions ) GetStartEnd () (start , end int ) {
42- opts .setDefaultValues ()
43- start = (opts .Page - 1 ) * opts .PageSize
44- end = start + opts .PageSize
54+ start , take := opts .GetSkipTake ()
55+ end = start + take
4556 return
4657}
4758
@@ -56,3 +67,33 @@ func (opts *ListOptions) setDefaultValues() {
5667 opts .Page = 1
5768 }
5869}
70+
71+ // AbsoluteListOptions absolute options to paginate results
72+ type AbsoluteListOptions struct {
73+ skip int
74+ take int
75+ }
76+
77+ // NewAbsoluteListOptions creates a list option with applied limits
78+ func NewAbsoluteListOptions (skip , take int ) * AbsoluteListOptions {
79+ if skip < 0 {
80+ skip = 0
81+ }
82+ if take <= 0 {
83+ take = setting .API .DefaultPagingNum
84+ }
85+ if take > setting .API .MaxResponseItems {
86+ take = setting .API .MaxResponseItems
87+ }
88+ return & AbsoluteListOptions {skip , take }
89+ }
90+
91+ // GetSkipTake returns the skip and take values
92+ func (opts * AbsoluteListOptions ) GetSkipTake () (skip , take int ) {
93+ return opts .skip , opts .take
94+ }
95+
96+ // GetStartEnd returns the start and end values
97+ func (opts * AbsoluteListOptions ) GetStartEnd () (start , end int ) {
98+ return opts .skip , opts .skip + opts .take
99+ }
0 commit comments