128 lines
4.6 KiB
Go
128 lines
4.6 KiB
Go
|
package exql
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
)
|
||
|
|
||
|
func TestWhereAnd(t *testing.T) {
|
||
|
and := JoinWithAnd(
|
||
|
&ColumnValue{Column: &Column{Name: "id"}, Operator: ">", Value: NewValue(&Raw{Value: "8"})},
|
||
|
&ColumnValue{Column: &Column{Name: "id"}, Operator: "<", Value: NewValue(&Raw{Value: "99"})},
|
||
|
&ColumnValue{Column: &Column{Name: "name"}, Operator: "=", Value: NewValue("John")},
|
||
|
)
|
||
|
|
||
|
s, err := and.Compile(defaultTemplate)
|
||
|
assert.NoError(t, err)
|
||
|
assert.Equal(t, `("id" > 8 AND "id" < 99 AND "name" = 'John')`, s)
|
||
|
}
|
||
|
|
||
|
func TestWhereOr(t *testing.T) {
|
||
|
or := JoinWithOr(
|
||
|
&ColumnValue{Column: &Column{Name: "id"}, Operator: "=", Value: NewValue(&Raw{Value: "8"})},
|
||
|
&ColumnValue{Column: &Column{Name: "id"}, Operator: "=", Value: NewValue(&Raw{Value: "99"})},
|
||
|
)
|
||
|
|
||
|
s, err := or.Compile(defaultTemplate)
|
||
|
assert.NoError(t, err)
|
||
|
assert.Equal(t, `("id" = 8 OR "id" = 99)`, s)
|
||
|
}
|
||
|
|
||
|
func TestWhereAndOr(t *testing.T) {
|
||
|
and := JoinWithAnd(
|
||
|
&ColumnValue{Column: &Column{Name: "id"}, Operator: ">", Value: NewValue(&Raw{Value: "8"})},
|
||
|
&ColumnValue{Column: &Column{Name: "id"}, Operator: "<", Value: NewValue(&Raw{Value: "99"})},
|
||
|
&ColumnValue{Column: &Column{Name: "name"}, Operator: "=", Value: NewValue("John")},
|
||
|
JoinWithOr(
|
||
|
&ColumnValue{Column: &Column{Name: "last_name"}, Operator: "=", Value: NewValue("Smith")},
|
||
|
&ColumnValue{Column: &Column{Name: "last_name"}, Operator: "=", Value: NewValue("Reyes")},
|
||
|
),
|
||
|
)
|
||
|
|
||
|
s, err := and.Compile(defaultTemplate)
|
||
|
assert.NoError(t, err)
|
||
|
|
||
|
assert.Equal(t, `("id" > 8 AND "id" < 99 AND "name" = 'John' AND ("last_name" = 'Smith' OR "last_name" = 'Reyes'))`, s)
|
||
|
}
|
||
|
|
||
|
func TestWhereAndRawOrAnd(t *testing.T) {
|
||
|
{
|
||
|
where := WhereConditions(
|
||
|
JoinWithAnd(
|
||
|
&ColumnValue{Column: &Column{Name: "id"}, Operator: ">", Value: NewValue(2)},
|
||
|
&ColumnValue{Column: &Column{Name: "id"}, Operator: "<", Value: NewValue(&Raw{Value: "77"})},
|
||
|
&ColumnValue{Column: &Column{Name: "id"}, Operator: "<", Value: NewValue(1)},
|
||
|
),
|
||
|
&ColumnValue{Column: &Column{Name: "name"}, Operator: "=", Value: NewValue("John")},
|
||
|
&Raw{Value: "city_id = 728"},
|
||
|
JoinWithOr(
|
||
|
&ColumnValue{Column: &Column{Name: "last_name"}, Operator: "=", Value: NewValue("Smith")},
|
||
|
&ColumnValue{Column: &Column{Name: "last_name"}, Operator: "=", Value: NewValue("Reyes")},
|
||
|
),
|
||
|
JoinWithAnd(
|
||
|
&ColumnValue{Column: &Column{Name: "age"}, Operator: ">", Value: NewValue(&Raw{Value: "18"})},
|
||
|
&ColumnValue{Column: &Column{Name: "age"}, Operator: "<", Value: NewValue(&Raw{Value: "41"})},
|
||
|
),
|
||
|
)
|
||
|
|
||
|
assert.Equal(t,
|
||
|
`WHERE (("id" > '2' AND "id" < 77 AND "id" < '1') AND "name" = 'John' AND city_id = 728 AND ("last_name" = 'Smith' OR "last_name" = 'Reyes') AND ("age" > 18 AND "age" < 41))`,
|
||
|
mustTrim(where.Compile(defaultTemplate)),
|
||
|
)
|
||
|
}
|
||
|
|
||
|
{
|
||
|
where := WhereConditions(
|
||
|
JoinWithAnd(
|
||
|
&ColumnValue{Column: &Column{Name: "id"}, Operator: ">", Value: NewValue(&Raw{Value: "8"})},
|
||
|
&ColumnValue{Column: &Column{Name: "id"}, Operator: ">", Value: NewValue(&Raw{Value: "8"})},
|
||
|
&ColumnValue{Column: &Column{Name: "id"}, Operator: "<", Value: NewValue(&Raw{Value: "99"})},
|
||
|
&ColumnValue{Column: &Column{Name: "id"}, Operator: "<", Value: NewValue(1)},
|
||
|
),
|
||
|
&ColumnValue{Column: &Column{Name: "name"}, Operator: "=", Value: NewValue("John")},
|
||
|
&Raw{Value: "city_id = 728"},
|
||
|
JoinWithOr(
|
||
|
&ColumnValue{Column: &Column{Name: "last_name"}, Operator: "=", Value: NewValue("Smith")},
|
||
|
&ColumnValue{Column: &Column{Name: "last_name"}, Operator: "=", Value: NewValue("Reyes")},
|
||
|
),
|
||
|
JoinWithAnd(
|
||
|
&ColumnValue{Column: &Column{Name: "age"}, Operator: ">", Value: NewValue(&Raw{Value: "18"})},
|
||
|
&ColumnValue{Column: &Column{Name: "age"}, Operator: "<", Value: NewValue(&Raw{Value: "41"})},
|
||
|
),
|
||
|
)
|
||
|
|
||
|
assert.Equal(t,
|
||
|
`WHERE (("id" > 8 AND "id" > 8 AND "id" < 99 AND "id" < '1') AND "name" = 'John' AND city_id = 728 AND ("last_name" = 'Smith' OR "last_name" = 'Reyes') AND ("age" > 18 AND "age" < 41))`,
|
||
|
mustTrim(where.Compile(defaultTemplate)),
|
||
|
)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkWhere(b *testing.B) {
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
_ = WhereConditions(
|
||
|
&ColumnValue{Column: &Column{Name: "baz"}, Operator: "=", Value: NewValue(99)},
|
||
|
)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkCompileWhere(b *testing.B) {
|
||
|
w := WhereConditions(
|
||
|
&ColumnValue{Column: &Column{Name: "baz"}, Operator: "=", Value: NewValue(99)},
|
||
|
)
|
||
|
b.ResetTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
_, _ = w.Compile(defaultTemplate)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkCompileWhereNoCache(b *testing.B) {
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
w := WhereConditions(
|
||
|
&ColumnValue{Column: &Column{Name: "baz"}, Operator: "=", Value: NewValue(99)},
|
||
|
)
|
||
|
_, _ = w.Compile(defaultTemplate)
|
||
|
}
|
||
|
}
|