> For the complete documentation index, see [llms.txt](https://goooqo.docs.doyto.win/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://goooqo.docs.doyto.win/query-mapping/page-query.md).

# Page Query

## Definition

`PageQuery` is a ​**​generic pagination query parameter structure​**​ designed to standardize common list query requirements such as pagination and sorting. `PageQuery` has three fields, `PageNumber` and `PageSize` is used to build the paging clause, and `Sort` is used to build the sorting clause. `PageQuery` implements the `Query` interface.

```go
package core

type PageQuery struct {
	Page int    `json:"page,omitempty"`
	Size int    `json:"size,omitempty"`
	Sort string `json:"sort,omitempty"`
}
```

## Usage

When defining query objects, embed the `PageQuery` struct through composition to reuse standardized pagination and sorting functionality.

```go
type UserQuery struct {
    PageQuery
    ScoreLt  *int
    MemoNull *bool
    Deleted  *bool
}
```

## Paging

```go
userQuery := UserQuery{PageQuery: PageQuery{}}
users, err := userDataAccess.Query(ctx, userQuery)
//SELECT id, score, memo FROM User

userQuery := UserQuery{PageQuery: PageQuery{Size: 20}}
users, err := userDataAccess.Query(ctx, userQuery)
//SELECT id, score, memo FROM User LIMIT 20 OFFSET 0

// When only PageNumber is set, PageSize will be set to 10
userQuery := UserQuery{PageQuery: PageQuery{Page: 5}}
users, err := userDataAccess.Query(ctx, userQuery)
//SELECT id, score, memo FROM User LIMIT 10 OFFSET 40

userQuery := UserQuery{PageQuery: PageQuery{Page: 3, Size: 50}}
users, err := userDataAccess.Query(ctx, userQuery)
//SELECT id, score, memo FROM User LIMIT 50 OFFSET 100	
```

## Sorting

The `Sort` string should follow `regexp.MustCompile("(?i)(\w+)(,(asC|dEsc))?;?")`

```go
userQuery := UserQuery{PageQuery: PageQuery{Sort: "id,desc;score,asc;memo"}}
users, err := userDataAccess.Query(ctx, userQuery)
//SELECT id, score, memo FROM User ORDER BY id DESC, score ASC, memo
```
