Files
gocqlx/qb/cmp.go

514 lines
9.2 KiB
Go
Raw Normal View History

2017-09-21 21:43:27 +02:00
// Copyright (C) 2017 ScyllaDB
// Use of this source code is governed by a ALv2-style
// license that can be found in the LICENSE file.
2017-07-27 13:39:27 +02:00
package qb
2017-08-30 10:04:33 +02:00
import (
"bytes"
)
2017-07-27 13:39:27 +02:00
2017-07-28 10:18:38 +02:00
// op specifies Cmd operation type.
2017-07-27 13:39:27 +02:00
type op byte
const (
eq op = iota
lt
leq
gt
geq
in
cnt
cntKey
2019-01-08 04:19:57 +04:00
like
ne
2017-07-27 13:39:27 +02:00
)
2017-07-28 10:18:38 +02:00
// Cmp if a filtering comparator that is used in WHERE and IF clauses.
2017-07-27 13:39:27 +02:00
type Cmp struct {
op op
column string
value value
2017-08-30 10:04:33 +02:00
}
func (c Cmp) writeCql(cql *bytes.Buffer) (names []string) {
cql.WriteString(c.column)
switch c.op {
2017-07-27 13:39:27 +02:00
case eq:
cql.WriteByte('=')
case lt:
cql.WriteByte('<')
case leq:
cql.WriteByte('<')
cql.WriteByte('=')
case gt:
cql.WriteByte('>')
case geq:
cql.WriteByte('>')
cql.WriteByte('=')
case in:
cql.WriteString(" IN ")
case cnt:
cql.WriteString(" CONTAINS ")
case cntKey:
cql.WriteString(" CONTAINS KEY ")
2019-01-08 04:19:57 +04:00
case like:
cql.WriteString(" LIKE ")
case ne:
cql.WriteString("!=")
2017-07-27 13:39:27 +02:00
}
return c.value.writeCql(cql)
2017-07-27 13:39:27 +02:00
}
2017-07-28 10:18:38 +02:00
// Eq produces column=?.
2017-07-27 13:39:27 +02:00
func Eq(column string) Cmp {
return Cmp{
op: eq,
column: column,
value: param(column),
2017-07-27 13:39:27 +02:00
}
}
2019-05-13 11:30:19 +02:00
// EqTuple produces column=(?,?,...) with count number of placeholders.
func EqTuple(column string, count int) Cmp {
return Cmp{
op: eq,
column: column,
value: tupleParam{
param: param(column),
count: count,
},
}
}
2017-07-28 10:18:38 +02:00
// EqNamed produces column=? with a custom parameter name.
2017-07-27 13:39:27 +02:00
func EqNamed(column, name string) Cmp {
return Cmp{
op: eq,
column: column,
value: param(name),
}
}
// EqLit produces column=literal and does not add a parameter to the query.
func EqLit(column, literal string) Cmp {
return Cmp{
op: eq,
column: column,
value: lit(literal),
2017-09-22 00:07:53 +02:00
}
}
// EqFunc produces column=someFunc(?...).
func EqFunc(column string, fn *Func) Cmp {
return Cmp{
op: eq,
column: column,
value: fn,
2017-07-27 13:39:27 +02:00
}
}
// Ne produces column!=?.
func Ne(column string) Cmp {
return Cmp{
op: ne,
column: column,
value: param(column),
}
}
// NeTuple produces column!=(?,?,...) with count number of placeholders.
func NeTuple(column string, count int) Cmp {
return Cmp{
op: ne,
column: column,
value: tupleParam{
param: param(column),
count: count,
},
}
}
// NeNamed produces column!=? with a custom parameter name.
func NeNamed(column, name string) Cmp {
return Cmp{
op: ne,
column: column,
value: param(name),
}
}
// NeLit produces column!=literal and does not add a parameter to the query.
func NeLit(column, literal string) Cmp {
return Cmp{
op: ne,
column: column,
value: lit(literal),
}
}
// NeFunc produces column!=someFunc(?...).
func NeFunc(column string, fn *Func) Cmp {
return Cmp{
op: ne,
column: column,
value: fn,
}
}
2017-07-28 10:18:38 +02:00
// Lt produces column<?.
2017-07-27 13:39:27 +02:00
func Lt(column string) Cmp {
return Cmp{
op: lt,
column: column,
value: param(column),
2017-07-27 13:39:27 +02:00
}
}
2019-05-13 11:30:19 +02:00
// LtTuple produces column<(?,?,...) with count placeholders.
func LtTuple(column string, count int) Cmp {
return Cmp{
op: lt,
column: column,
value: tupleParam{
param: param(column),
count: count,
},
}
}
2017-07-28 10:18:38 +02:00
// LtNamed produces column<? with a custom parameter name.
2017-07-27 13:39:27 +02:00
func LtNamed(column, name string) Cmp {
return Cmp{
op: lt,
column: column,
value: param(name),
}
}
// LtLit produces column<literal and does not add a parameter to the query.
func LtLit(column, literal string) Cmp {
return Cmp{
op: lt,
column: column,
value: lit(literal),
2017-09-22 00:07:53 +02:00
}
}
// LtFunc produces column<someFunc(?...).
func LtFunc(column string, fn *Func) Cmp {
return Cmp{
op: lt,
column: column,
value: fn,
2017-07-27 13:39:27 +02:00
}
}
2017-07-28 10:18:38 +02:00
// LtOrEq produces column<=?.
2017-07-27 13:39:27 +02:00
func LtOrEq(column string) Cmp {
return Cmp{
op: leq,
column: column,
value: param(column),
2017-07-27 13:39:27 +02:00
}
}
2019-05-13 11:30:19 +02:00
// LtOrEqTuple produces column<=(?,?,...) with count placeholders.
func LtOrEqTuple(column string, count int) Cmp {
return Cmp{
op: leq,
column: column,
value: tupleParam{
param: param(column),
count: count,
},
}
}
2017-07-28 10:18:38 +02:00
// LtOrEqNamed produces column<=? with a custom parameter name.
2017-07-27 13:39:27 +02:00
func LtOrEqNamed(column, name string) Cmp {
return Cmp{
op: leq,
column: column,
value: param(name),
}
}
// LtOrEqLit produces column<=literal and does not add a parameter to the query.
func LtOrEqLit(column, literal string) Cmp {
return Cmp{
op: leq,
column: column,
value: lit(literal),
2017-09-22 00:07:53 +02:00
}
}
// LtOrEqFunc produces column<=someFunc(?...).
func LtOrEqFunc(column string, fn *Func) Cmp {
return Cmp{
op: leq,
column: column,
value: fn,
2017-07-27 13:39:27 +02:00
}
}
2017-07-28 10:18:38 +02:00
// Gt produces column>?.
2017-07-27 13:39:27 +02:00
func Gt(column string) Cmp {
return Cmp{
op: gt,
column: column,
value: param(column),
2017-07-27 13:39:27 +02:00
}
}
2019-05-13 11:30:19 +02:00
// GtTuple produces column>(?,?,...) with count placeholders.
func GtTuple(column string, count int) Cmp {
return Cmp{
op: gt,
column: column,
value: tupleParam{
param: param(column),
count: count,
},
}
}
2017-07-28 10:18:38 +02:00
// GtNamed produces column>? with a custom parameter name.
2017-07-27 13:39:27 +02:00
func GtNamed(column, name string) Cmp {
return Cmp{
op: gt,
column: column,
value: param(name),
}
}
// GtLit produces column>literal and does not add a parameter to the query.
func GtLit(column, literal string) Cmp {
return Cmp{
op: gt,
column: column,
value: lit(literal),
2017-09-22 00:07:53 +02:00
}
}
// GtFunc produces column>someFunc(?...).
func GtFunc(column string, fn *Func) Cmp {
return Cmp{
op: gt,
column: column,
value: fn,
2017-07-27 13:39:27 +02:00
}
}
2017-07-28 10:18:38 +02:00
// GtOrEq produces column>=?.
2017-07-27 13:39:27 +02:00
func GtOrEq(column string) Cmp {
return Cmp{
op: geq,
column: column,
value: param(column),
2017-07-27 13:39:27 +02:00
}
}
2019-05-13 11:30:19 +02:00
// GtOrEqTuple produces column>=(?,?,...) with count placeholders.
func GtOrEqTuple(column string, count int) Cmp {
return Cmp{
op: geq,
column: column,
value: tupleParam{
param: param(column),
count: count,
},
}
}
2017-07-28 10:18:38 +02:00
// GtOrEqNamed produces column>=? with a custom parameter name.
2017-07-27 13:39:27 +02:00
func GtOrEqNamed(column, name string) Cmp {
return Cmp{
op: geq,
column: column,
value: param(name),
}
}
// GtOrEqLit produces column>=literal and does not add a parameter to the query.
func GtOrEqLit(column, literal string) Cmp {
return Cmp{
op: geq,
column: column,
value: lit(literal),
2017-09-22 00:07:53 +02:00
}
}
// GtOrEqFunc produces column>=someFunc(?...).
2017-09-22 00:07:53 +02:00
func GtOrEqFunc(column string, fn *Func) Cmp {
return Cmp{
op: geq,
column: column,
value: fn,
2017-07-27 13:39:27 +02:00
}
}
2017-07-28 10:18:38 +02:00
// In produces column IN ?.
2017-07-27 13:39:27 +02:00
func In(column string) Cmp {
return Cmp{
op: in,
column: column,
value: param(column),
2017-07-27 13:39:27 +02:00
}
}
2019-05-13 11:30:19 +02:00
// InTuple produces column IN ?.
func InTuple(column string, count int) Cmp {
return Cmp{
op: in,
column: column,
value: tupleParam{
param: param(column),
count: count,
},
}
}
2017-07-28 10:18:38 +02:00
// InNamed produces column IN ? with a custom parameter name.
2017-07-27 13:39:27 +02:00
func InNamed(column, name string) Cmp {
return Cmp{
op: in,
column: column,
value: param(name),
}
}
// InLit produces column IN literal and does not add a parameter to the query.
func InLit(column, literal string) Cmp {
return Cmp{
op: in,
column: column,
value: lit(literal),
2017-07-27 13:39:27 +02:00
}
}
2017-07-28 10:18:38 +02:00
// Contains produces column CONTAINS ?.
2017-07-27 13:39:27 +02:00
func Contains(column string) Cmp {
return Cmp{
op: cnt,
column: column,
value: param(column),
2017-07-27 13:39:27 +02:00
}
}
2019-05-13 11:30:19 +02:00
// ContainsTuple produces column CONTAINS (?,?,...) with count placeholders.
func ContainsTuple(column string, count int) Cmp {
return Cmp{
op: cnt,
column: column,
value: tupleParam{
param: param(column),
count: count,
},
}
}
// ContainsKey produces column CONTAINS KEY ?.
func ContainsKey(column string) Cmp {
return Cmp{
op: cntKey,
column: column,
value: param(column),
}
}
2019-05-13 11:30:19 +02:00
// ContainsKeyTuple produces column CONTAINS KEY (?,?,...) with count placehplders.
func ContainsKeyTuple(column string, count int) Cmp {
return Cmp{
op: cntKey,
column: column,
value: tupleParam{
param: param(column),
count: count,
},
}
}
2017-07-28 10:18:38 +02:00
// ContainsNamed produces column CONTAINS ? with a custom parameter name.
2017-07-27 13:39:27 +02:00
func ContainsNamed(column, name string) Cmp {
return Cmp{
op: cnt,
column: column,
value: param(name),
}
}
// ContainsKeyNamed produces column CONTAINS KEY ? with a custom parameter name.
func ContainsKeyNamed(column, name string) Cmp {
return Cmp{
op: cntKey,
column: column,
value: param(name),
}
}
// ContainsLit produces column CONTAINS literal and does not add a parameter to the query.
func ContainsLit(column, literal string) Cmp {
return Cmp{
op: cnt,
column: column,
value: lit(literal),
2017-07-27 13:39:27 +02:00
}
}
2019-01-08 04:19:57 +04:00
// Like produces column LIKE ?.
func Like(column string) Cmp {
return Cmp{
op: like,
column: column,
value: param(column),
}
}
2019-05-13 11:30:19 +02:00
// LikeTuple produces column LIKE (?,?,...) with count placeholders.
func LikeTuple(column string, count int) Cmp {
return Cmp{
op: like,
column: column,
value: tupleParam{
param: param(column),
count: count,
},
}
}
2017-07-27 13:39:27 +02:00
type cmps []Cmp
func (cs cmps) writeCql(cql *bytes.Buffer) (names []string) {
for i, c := range cs {
2017-08-30 10:04:33 +02:00
names = append(names, c.writeCql(cql)...)
2017-07-27 13:39:27 +02:00
if i < len(cs)-1 {
cql.WriteString(" AND ")
}
}
cql.WriteByte(' ')
return
}
2018-05-25 13:06:43 +02:00
type where cmps
func (w where) writeCql(cql *bytes.Buffer) (names []string) {
if len(w) == 0 {
return
}
cql.WriteString("WHERE ")
return cmps(w).writeCql(cql)
}
type _if cmps
func (w _if) writeCql(cql *bytes.Buffer) (names []string) {
if len(w) == 0 {
return
}
cql.WriteString("IF ")
return cmps(w).writeCql(cql)
}