194 lines
6.0 KiB
Go
194 lines
6.0 KiB
Go
|
package mydb
|
||
|
|
||
|
import (
|
||
|
"database/sql/driver"
|
||
|
)
|
||
|
|
||
|
// Result is an interface that defines methods for result sets.
|
||
|
type Result interface {
|
||
|
|
||
|
// String returns the SQL statement to be used in the query.
|
||
|
String() string
|
||
|
|
||
|
// Limit defines the maximum number of results for this set. It only has
|
||
|
// effect on `One()`, `All()` and `Next()`. A negative limit cancels any
|
||
|
// previous limit settings.
|
||
|
Limit(int) Result
|
||
|
|
||
|
// Offset ignores the first n results. It only has effect on `One()`, `All()`
|
||
|
// and `Next()`. A negative offset cancels any previous offset settings.
|
||
|
Offset(int) Result
|
||
|
|
||
|
// OrderBy receives one or more field names that define the order in which
|
||
|
// elements will be returned in a query, field names may be prefixed with a
|
||
|
// minus sign (-) indicating descending order, ascending order will be used
|
||
|
// otherwise.
|
||
|
OrderBy(...interface{}) Result
|
||
|
|
||
|
// Select defines specific columns to be fetched on every column in the
|
||
|
// result set.
|
||
|
Select(...interface{}) Result
|
||
|
|
||
|
// And adds more filtering conditions on top of the existing constraints.
|
||
|
//
|
||
|
// res := col.Find(...).And(...)
|
||
|
And(...interface{}) Result
|
||
|
|
||
|
// GroupBy is used to group results that have the same value in the same column
|
||
|
// or columns.
|
||
|
GroupBy(...interface{}) Result
|
||
|
|
||
|
// Delete deletes all items within the result set. `Offset()` and `Limit()`
|
||
|
// are not honoured by `Delete()`.
|
||
|
Delete() error
|
||
|
|
||
|
// Update modifies all items within the result set. `Offset()` and `Limit()`
|
||
|
// are not honoured by `Update()`.
|
||
|
Update(interface{}) error
|
||
|
|
||
|
// Count returns the number of items that match the set conditions.
|
||
|
// `Offset()` and `Limit()` are not honoured by `Count()`
|
||
|
Count() (uint64, error)
|
||
|
|
||
|
// Exists returns true if at least one item on the collection exists. False
|
||
|
// otherwise.
|
||
|
Exists() (bool, error)
|
||
|
|
||
|
// Next fetches the next result within the result set and dumps it into the
|
||
|
// given pointer to struct or pointer to map. You must call
|
||
|
// `Close()` after finishing using `Next()`.
|
||
|
Next(ptrToStruct interface{}) bool
|
||
|
|
||
|
// Err returns the last error that has happened with the result set, nil
|
||
|
// otherwise.
|
||
|
Err() error
|
||
|
|
||
|
// One fetches the first result within the result set and dumps it into the
|
||
|
// given pointer to struct or pointer to map. The result set is automatically
|
||
|
// closed after picking the element, so there is no need to call Close()
|
||
|
// after using One().
|
||
|
One(ptrToStruct interface{}) error
|
||
|
|
||
|
// All fetches all results within the result set and dumps them into the
|
||
|
// given pointer to slice of maps or structs. The result set is
|
||
|
// automatically closed, so there is no need to call Close() after
|
||
|
// using All().
|
||
|
All(sliceOfStructs interface{}) error
|
||
|
|
||
|
// Paginate splits the results of the query into pages containing pageSize
|
||
|
// items. When using pagination previous settings for `Limit()` and
|
||
|
// `Offset()` are ignored. Page numbering starts at 1.
|
||
|
//
|
||
|
// Use `Page()` to define the specific page to get results from.
|
||
|
//
|
||
|
// Example:
|
||
|
//
|
||
|
// r = q.Paginate(12)
|
||
|
//
|
||
|
// You can provide constraints an order settings when using pagination:
|
||
|
//
|
||
|
// Example:
|
||
|
//
|
||
|
// res := q.Where(conds).OrderBy("-id").Paginate(12)
|
||
|
// err := res.Page(4).All(&items)
|
||
|
Paginate(pageSize uint) Result
|
||
|
|
||
|
// Page makes the result set return results only from the page identified by
|
||
|
// pageNumber. Page numbering starts from 1.
|
||
|
//
|
||
|
// Example:
|
||
|
//
|
||
|
// r = q.Paginate(12).Page(4)
|
||
|
Page(pageNumber uint) Result
|
||
|
|
||
|
// Cursor defines the column that is going to be taken as basis for
|
||
|
// cursor-based pagination.
|
||
|
//
|
||
|
// Example:
|
||
|
//
|
||
|
// a = q.Paginate(10).Cursor("id")
|
||
|
// b = q.Paginate(12).Cursor("-id")
|
||
|
//
|
||
|
// You can set "" as cursorColumn to disable cursors.
|
||
|
Cursor(cursorColumn string) Result
|
||
|
|
||
|
// NextPage returns the next results page according to the cursor. It expects
|
||
|
// a cursorValue, which is the value the cursor column had on the last item
|
||
|
// of the current result set (lower bound).
|
||
|
//
|
||
|
// Example:
|
||
|
//
|
||
|
// cursor = q.Paginate(12).Cursor("id")
|
||
|
// res = cursor.NextPage(items[len(items)-1].ID)
|
||
|
//
|
||
|
// Note that `NextPage()` requires a cursor, any column with an absolute
|
||
|
// order (given two values one always precedes the other) can be a cursor.
|
||
|
//
|
||
|
// You can define the pagination order and add constraints to your result:
|
||
|
//
|
||
|
// cursor = q.Where(...).OrderBy("id").Paginate(10).Cursor("id")
|
||
|
// res = cursor.NextPage(lowerBound)
|
||
|
NextPage(cursorValue interface{}) Result
|
||
|
|
||
|
// PrevPage returns the previous results page according to the cursor. It
|
||
|
// expects a cursorValue, which is the value the cursor column had on the
|
||
|
// fist item of the current result set.
|
||
|
//
|
||
|
// Example:
|
||
|
//
|
||
|
// current = current.PrevPage(items[0].ID)
|
||
|
//
|
||
|
// Note that PrevPage requires a cursor, any column with an absolute order
|
||
|
// (given two values one always precedes the other) can be a cursor.
|
||
|
//
|
||
|
// You can define the pagination order and add constraints to your result:
|
||
|
//
|
||
|
// cursor = q.Where(...).OrderBy("id").Paginate(10).Cursor("id")
|
||
|
// res = cursor.PrevPage(upperBound)
|
||
|
PrevPage(cursorValue interface{}) Result
|
||
|
|
||
|
// TotalPages returns the total number of pages the result set could produce.
|
||
|
// If no pagination parameters have been set this value equals 1.
|
||
|
TotalPages() (uint, error)
|
||
|
|
||
|
// TotalEntries returns the total number of matching items in the result set.
|
||
|
TotalEntries() (uint64, error)
|
||
|
|
||
|
// Close closes the result set and frees all locked resources.
|
||
|
Close() error
|
||
|
}
|
||
|
|
||
|
// InsertResult provides infomation about an insert operation.
|
||
|
type InsertResult interface {
|
||
|
// ID returns the ID of the newly inserted record.
|
||
|
ID() ID
|
||
|
}
|
||
|
|
||
|
type insertResult struct {
|
||
|
id interface{}
|
||
|
}
|
||
|
|
||
|
func (r *insertResult) ID() ID {
|
||
|
return r.id
|
||
|
}
|
||
|
|
||
|
// ConstraintValue satisfies adapter.ConstraintValuer
|
||
|
func (r *insertResult) ConstraintValue() interface{} {
|
||
|
return r.id
|
||
|
}
|
||
|
|
||
|
// Value satisfies driver.Valuer
|
||
|
func (r *insertResult) Value() (driver.Value, error) {
|
||
|
return r.id, nil
|
||
|
}
|
||
|
|
||
|
// NewInsertResult creates an InsertResult
|
||
|
func NewInsertResult(id interface{}) InsertResult {
|
||
|
return &insertResult{id: id}
|
||
|
}
|
||
|
|
||
|
// ID represents a record ID
|
||
|
type ID interface{}
|
||
|
|
||
|
var _ = driver.Valuer(&insertResult{})
|