searcher

package module
v1.6.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 10, 2022 License: Apache-2.0 Imports: 5 Imported by: 0

README

searcher

ORM search wrapper.

Installation

go get -u github.com/coolstina/searcher

Feature

Statement
  • Expression: Build condition statement.
  • Pagination: SQL paging query substatement.
Operator
  • LogicalOperator: Logical Operator.
  • RelationalOperator: Relational Operator.

Example

simple conditional expression

The following example will construct a conditional expression, name = 'helloshaohua':

where := &Expression{Query: "name = ?", Args: []interface{}{"helloshaohua"}}
complex conditional expressions
Example1
	condition := searcher.StringCondition{
		Field:    "name",
		Operator: searcher.OperatorEqual,
		Value:    "helloshaohua"}
	name := searcher.NewSingleStringCondition().
		StringCondition(condition)

	condition = searcher.StringCondition{
		Field:    "age",
		Operator: searcher.OperatorGreater,
		Value:    18,
	}
	age := searcher.NewSingleStringCondition().
		StringCondition(condition).
		PreviousLogical(searcher.LogicalOperatorAND)

	condition = searcher.StringCondition{
		Field:    "sex",
		Operator: searcher.OperatorEqual,
		Value:    "male",
	}
	sex := searcher.NewSingleStringCondition().
		StringCondition(condition).
		PreviousLogical(searcher.LogicalOperatorOR).
		LogicalWrapStart(true)

	condition = searcher.StringCondition{
		Field:    "email",
		Operator: searcher.OperatorLIKE,
		Value:    "@foxmail.com",
	}
	email := searcher.NewSingleStringCondition().
		StringCondition(condition).
		PreviousLogical(searcher.LogicalOperatorAND).
		LogicalWrapFinish(true)

	expression := searcher.NewMultiStringCondition().
		AddCondition(name).
		AddCondition(age).
		AddCondition(sex).
		AddCondition(email).
		Expression()

Build the following conditional expression:

{
    "query":"name = ? AND age > ? OR ( sex = ? AND email LIKE ? )",
    "args":[
        "helloshaohua",
        18,
        "male",
        "%@foxmail.com%"
    ]
}
Example2
	condition := searcher.StringCondition{
		Field:    "name",
		Operator: searcher.OperatorEqual,
		Value:    "helloshaohua",
	}
	name := searcher.NewSingleStringCondition().
		StringCondition(condition).
		LogicalWrapStart(true)

	condition = searcher.StringCondition{
		Field:    "age",
		Operator: searcher.OperatorGreater,
		Value:    18,
	}
	age := searcher.NewSingleStringCondition().
		StringCondition(condition).
		LogicalWrapFinish(true).
		PreviousLogical(searcher.LogicalOperatorAND)

	condition = searcher.StringCondition{
		Field:    "sex",
		Operator: searcher.OperatorEqual,
		Value:    "male",
	}
	sex := searcher.NewSingleStringCondition().
		StringCondition(condition).
		PreviousLogical(searcher.LogicalOperatorOR).
		LogicalWrapStart(true)

	condition = searcher.StringCondition{
		Field:    "email",
		Operator: searcher.OperatorLIKE,
		Value:    "@foxmail.com",
	}
	email := searcher.NewSingleStringCondition().
		StringCondition(condition).
		PreviousLogical(searcher.LogicalOperatorAND).
		LogicalWrapFinish(true)

	expression := searcher.NewMultiStringCondition().
		AddCondition(name).
		AddCondition(age).
		AddCondition(sex).
		AddCondition(email).
		Expression()

Build the following conditional expression:

{
    "query":"( name = ? AND age > ? ) OR ( sex = ? AND email LIKE ? )",
    "args":[
        "helloshaohua",
        18,
        "male",
        "%@foxmail.com%"
    ]
}
Example3
	condition := searcher.StringCondition{
		Field:    "name",
		Operator: searcher.OperatorEqual,
		Value:    "helloshaohua",
	}
	name := searcher.NewSingleStringCondition().
		StringCondition(condition)

	expression := searcher.NewMultiStringCondition().
		AddCondition(name).
		Expression()

Build the following conditional expression:

{
    "query":"name = ?",
    "args":[
        "helloshaohua"
    ]
}
Example4
	condition := searcher.StringCondition{
		Field:    "name",
		Operator: searcher.OperatorEqual,
		Value:    "helloshaohua",
	}
	name := searcher.NewSingleStringCondition().
		StringCondition(condition)

	condition = searcher.StringCondition{
		Field:    "age",
		Operator: searcher.OperatorGreater,
		Value:    18,
	}
	age := searcher.NewSingleStringCondition().
		StringCondition(condition).
		PreviousLogical(searcher.LogicalOperatorAND)

	expression := searcher.NewMultiStringCondition().
		AddCondition(name).
		AddCondition(age).
		Expression()

Build the following conditional expression:

{
    "query":"name = ? AND age > ?",
    "args":[
        "helloshaohua",
        18
    ]
}
Example5
	condition := searcher.StringCondition{
		Field:    "name",
		Operator: searcher.OperatorEqual,
		Value:    "helloshaohua",
	}
	name := searcher.NewSingleStringCondition().
		StringCondition(condition)

	condition = searcher.StringCondition{
		Field:    "age",
		Operator: searcher.OperatorGreater,
		Value:    18,
	}
	age := searcher.NewSingleStringCondition().
		StringCondition(condition).
		PreviousLogical(searcher.LogicalOperatorOR)

	expression := searcher.NewMultiStringCondition().AddCondition(name).AddCondition(age).Expression()

Build the following conditional expression:

{
  "query":"name = ? OR age > ?",
  "args":[
    "helloshaohua",
    18
  ]
}
Example6
	condition := searcher.StringCondition{
		Field: "name", 
		Operator: searcher.OperatorEqual, 
		Value: "helloshaohua",
	}
	name := searcher.NewSingleStringCondition().
		StringCondition(condition)

	condition = searcher.StringCondition{
		Field: "age", 
		Operator: searcher.OperatorGreater,
		Value: 18,
	}
	age := searcher.NewSingleStringCondition().
		StringCondition(condition).
		PreviousLogical(searcher.LogicalOperatorAND)

	condition = searcher.StringCondition{
		Field: "email",
		Operator: searcher.OperatorLIKE,
		Value: "@foxmail.com",
	}
	email := searcher.NewSingleStringCondition().
		StringCondition(condition).
		PreviousLogical(searcher.LogicalOperatorOR).
		LogicalWrapStart(true).
		LogicalWrapFinish(true)

	// Build the following conditional expression {"query":"name = ? AND age > ? OR ( email LIKE ? )","args":["helloshaohua",18,"%@foxmail.com%"]}
	expression := searcher.NewMultiStringCondition().
		AddCondition(name).
		AddCondition(age).
		AddCondition(email).
		Expression()

Build the following conditional expression:

{
    "query":"name = ? AND age > ? OR ( email LIKE ? )",
    "args":[
        "helloshaohua",
        18,
        "%@foxmail.com%"
    ]
}

How to use?

It's very simple to use, just out of the box, and you can view the documentation through GoDoc.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrExpressionCannotEmpty       = fmt.Errorf("expression parameter cannot empty")
	ErrQueryListCannotEmpty        = fmt.Errorf("querylist parameter cannot empty")
	ErrSameNameRecordAlreadyExists = fmt.Errorf("same name record already exists")
)

Global error variables definition

View Source
var (
	// DefaultNotExistsId default unit test not exists record id.
	DefaultNotExistsId = 1000000000
	// DefaultCreateBatchSize default batch size.
	DefaultCreateBatchSize = 1000
)

Global default variables definition.

Functions

func Deleted

func Deleted(gorm *gorm.DB, deleted bool) *gorm.DB

func Force

func Force(gorm *gorm.DB, force bool) *gorm.DB

func JSONMarshal

func JSONMarshal(v interface{}, escape bool) ([]byte, error)

JSONMarshal custom JSON marshal impl.

Types

type Expression

type Expression struct {
	Query interface{}   `json:"query"`
	Args  []interface{} `json:"args"`
}

Expression where condition expression.

func NewExpression

func NewExpression(query interface{}, args ...interface{}) *Expression

func (*Expression) String

func (expression *Expression) String() string

type ExpressionInter

type ExpressionInter interface {
	Expression() *Expression
}

type LogicalOperator

type LogicalOperator string
const (
	LogicalOperatorAND        LogicalOperator = "AND"
	LogicalOperatorOR         LogicalOperator = "OR"
	LogicalOperatorBETWEENAND LogicalOperator = "{{.BETWEEN}}|{{AND}}"
)

func (LogicalOperator) String

func (s LogicalOperator) String() string

type MultiStringCondition

type MultiStringCondition []*SingleStringCondition

func NewMultiStringCondition

func NewMultiStringCondition() MultiStringCondition

func (MultiStringCondition) AddCondition

func (multi MultiStringCondition) AddCondition(condition *SingleStringCondition) MultiStringCondition

func (MultiStringCondition) Expression

func (multi MultiStringCondition) Expression() *Expression

type NoSQLCallback added in v1.6.2

type NoSQLCallback func(tx *gorm.DB) *gorm.DB

type Pagination

type Pagination struct {
	Data   interface{} `json:"data"`
	Number int         `json:"number"` // Pagination offset alias
	Size   int         `json:"size"`   // Pagination limit alias
	Total  int64       `json:"total"`
}

Pagination http request pagination structure.

func NewPaginationWithQueryList added in v1.5.0

func NewPaginationWithQueryList(list QueryLister) *Pagination

func (*Pagination) SetData added in v1.5.0

func (p *Pagination) SetData(data interface{}) *Pagination

SetData set response data.

func (*Pagination) SetTotal added in v1.5.0

func (p *Pagination) SetTotal(total int64) *Pagination

SetTotal set total field value.

type QueryList

type QueryList struct {
	Deleted   bool        `json:"all" form:"all,default=false"` // Whether to query soft deleted records.
	Offset    int         `json:"number" form:"number,default=1"`
	Limit     int         `json:"size" form:"size,default=15"`
	Condition *Expression `json:"-"` // conditional expression.
}

QueryList query list parameter.

func NewQueryListWithMap added in v1.5.4

func NewQueryListWithMap(v map[string]interface{}) *QueryList

NewQueryListWithMap returns a new QueryList instance with map[string]interface{}

func (QueryList) ConditionOrExpr added in v1.5.4

func (q QueryList) ConditionOrExpr() *Expression

func (QueryList) DeletedOrAll added in v1.5.4

func (q QueryList) DeletedOrAll() bool

func (QueryList) LimitOrSize added in v1.5.4

func (q QueryList) LimitOrSize() int

func (QueryList) OffsetOrNumber added in v1.5.4

func (q QueryList) OffsetOrNumber() int

func (*QueryList) SetConditionOrExpr added in v1.5.4

func (q *QueryList) SetConditionOrExpr(expr *Expression) *QueryList

func (*QueryList) SetDeleted added in v1.5.4

func (q *QueryList) SetDeleted(deleted bool) *QueryList

func (*QueryList) SetLimitOrSize added in v1.5.4

func (q *QueryList) SetLimitOrSize(size int) *QueryList

func (*QueryList) SetOffsetOrNumber added in v1.5.4

func (q *QueryList) SetOffsetOrNumber(number int) *QueryList

func (QueryList) String added in v1.5.4

func (q QueryList) String() string

String implement Stringer interface.

type QueryLister added in v1.5.4

type QueryLister interface {
	DeletedOrAll() bool
	OffsetOrNumber() int
	LimitOrSize() int
	ConditionOrExpr() *Expression
}

QueryLister common query list interface definition.

type RelationalOperator

type RelationalOperator string
const (
	OperatorEqual        RelationalOperator = "="
	OperatorNotEqual     RelationalOperator = "<>"
	OperatorGreater      RelationalOperator = ">"
	OperatorGreaterEqual RelationalOperator = ">="
	OperatorLess         RelationalOperator = "<"
	OperatorLessEqual    RelationalOperator = "<="
	OperatorIn           RelationalOperator = "IN"
	OperatorLIKE         RelationalOperator = "LIKE"
)

func (RelationalOperator) String

func (r RelationalOperator) String() string

type SingleStringCondition

type SingleStringCondition struct {
	// contains filtered or unexported fields
}

SingleStringCondition multi string condition structure.

func NewSingleStringCondition

func NewSingleStringCondition() *SingleStringCondition

func (*SingleStringCondition) LogicalWrapFinish

func (condition *SingleStringCondition) LogicalWrapFinish(finish bool) *SingleStringCondition

func (*SingleStringCondition) LogicalWrapStart

func (condition *SingleStringCondition) LogicalWrapStart(start bool) *SingleStringCondition

func (*SingleStringCondition) PreviousLogical

func (condition *SingleStringCondition) PreviousLogical(operator LogicalOperator) *SingleStringCondition

func (*SingleStringCondition) String

func (condition *SingleStringCondition) String() string

func (*SingleStringCondition) StringCondition

func (condition *SingleStringCondition) StringCondition(stringCondition StringCondition) *SingleStringCondition

type Statement

type Statement struct {
	// contains filtered or unexported fields
}

func NewStatement

func NewStatement(db *gorm.DB) *Statement

func (*Statement) DB

func (s *Statement) DB() *gorm.DB

func (*Statement) Deleted added in v1.5.8

func (s *Statement) Deleted(deleted bool) *Statement

Deleted Query whether the deleted records are included. If deleted is true, they are included. Otherwise, they are not included.

func (*Statement) Pagination

func (s *Statement) Pagination(offset, limit int) *Statement

func (*Statement) Soft

func (s *Statement) Soft(soft bool) *Statement

Soft whether delete is soft, if true use soft delete, otherwise hard delete.

func (*Statement) ToSQL added in v1.6.2

func (s *Statement) ToSQL(model interface{}, callback NoSQLCallback) string

func (*Statement) Where

func (s *Statement) Where(condition *Expression) *Statement

type StringCondition

type StringCondition struct {
	Field    string             `json:"field"`
	Operator RelationalOperator `json:"operator"`
	Value    interface{}        `json:"value"`
}

func NewStringCondition

func NewStringCondition(field string, operator RelationalOperator, value interface{}) *StringCondition

func (*StringCondition) Expression

func (condition *StringCondition) Expression() *Expression

func (*StringCondition) String

func (condition *StringCondition) String() string

type UpdateFields added in v1.5.5

type UpdateFields = map[string]interface{}

UpdateFields updates structure.

Directories

Path Synopsis
test

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL