155 lines
3.5 KiB
Go
155 lines
3.5 KiB
Go
package ydb
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func isFloatEq(i, j float64, precision int) bool {
|
|
return fmt.Sprintf("%."+strconv.Itoa(precision)+"f", i) == fmt.Sprintf("%."+strconv.Itoa(precision)+"f", j)
|
|
}
|
|
|
|
func TestSum(t *testing.T) {
|
|
type SumStruct struct {
|
|
Int int64 `xorm:"pk"`
|
|
Float float32
|
|
}
|
|
|
|
assert.NoError(t, PrepareScheme(&SumStruct{}))
|
|
engine, err := enginePool.GetDataQueryEngine()
|
|
assert.NoError(t, err)
|
|
|
|
var (
|
|
cases = []SumStruct{
|
|
{int64(1), 6.2},
|
|
{int64(2), 5.3},
|
|
{int64(92), -0.2},
|
|
}
|
|
)
|
|
|
|
var i int64
|
|
var f float32
|
|
for _, v := range cases {
|
|
i += int64(v.Int)
|
|
f += v.Float
|
|
}
|
|
|
|
_, err = engine.Insert(cases)
|
|
assert.NoError(t, err)
|
|
|
|
colInt := engine.GetColumnMapper().Obj2Table("Int")
|
|
colFloat := engine.GetColumnMapper().Obj2Table("Float")
|
|
|
|
sumInt, err := engine.Sum(new(SumStruct), colInt)
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, int64(sumInt), i)
|
|
|
|
sumFloat, err := engine.Sum(new(SumStruct), colFloat)
|
|
assert.NoError(t, err)
|
|
assert.Condition(t, func() bool {
|
|
return isFloatEq(sumFloat, float64(f), 2)
|
|
})
|
|
|
|
sums, err := engine.Sums(new(SumStruct), colInt, colFloat)
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 2, len(sums))
|
|
assert.EqualValues(t, i, int64(sums[0]))
|
|
assert.Condition(t, func() bool {
|
|
return isFloatEq(sums[1], float64(f), 2)
|
|
})
|
|
|
|
sumsInt, err := engine.SumsInt(new(SumStruct), colInt)
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 1, len(sumsInt))
|
|
assert.EqualValues(t, i, int64(sumsInt[0]))
|
|
}
|
|
|
|
type SumStructWithTableName struct {
|
|
Int int64 `xorm:"pk"`
|
|
Float float32
|
|
}
|
|
|
|
func (s SumStructWithTableName) TableName() string {
|
|
return "sum_struct_with_table_name_1"
|
|
}
|
|
|
|
func TestSumWithTableName(t *testing.T) {
|
|
assert.NoError(t, PrepareScheme(&SumStructWithTableName{}))
|
|
engine, err := enginePool.GetDataQueryEngine()
|
|
assert.NoError(t, err)
|
|
|
|
var (
|
|
cases = []SumStructWithTableName{
|
|
{int64(1), 6.2},
|
|
{int64(2), 5.3},
|
|
{int64(92), -0.2},
|
|
}
|
|
)
|
|
|
|
var i int64
|
|
var f float32
|
|
for _, v := range cases {
|
|
i += int64(v.Int)
|
|
f += v.Float
|
|
}
|
|
|
|
_, err = engine.Insert(cases)
|
|
assert.NoError(t, err)
|
|
|
|
colInt := engine.GetColumnMapper().Obj2Table("Int")
|
|
colFloat := engine.GetColumnMapper().Obj2Table("Float")
|
|
|
|
sumInt, err := engine.Sum(new(SumStructWithTableName), colInt)
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, int64(sumInt), i)
|
|
|
|
sumFloat, err := engine.Sum(new(SumStructWithTableName), colFloat)
|
|
assert.NoError(t, err)
|
|
assert.Condition(t, func() bool {
|
|
return isFloatEq(sumFloat, float64(f), 2)
|
|
})
|
|
|
|
sums, err := engine.Sums(new(SumStructWithTableName), colInt, colFloat)
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 2, len(sums))
|
|
assert.EqualValues(t, i, int64(sums[0]))
|
|
assert.Condition(t, func() bool {
|
|
return isFloatEq(sums[1], float64(f), 2)
|
|
})
|
|
|
|
sumsInt, err := engine.SumsInt(new(SumStructWithTableName), colInt)
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 1, len(sumsInt))
|
|
assert.EqualValues(t, i, int64(sumsInt[0]))
|
|
}
|
|
|
|
func TestSumCustomColumn(t *testing.T) {
|
|
type SumStruct2 struct {
|
|
Int int64 `xorm:"pk"`
|
|
Float float32
|
|
}
|
|
|
|
assert.NoError(t, PrepareScheme(&SumStruct2{}))
|
|
engine, err := enginePool.GetDataQueryEngine()
|
|
assert.NoError(t, err)
|
|
|
|
var (
|
|
cases = []SumStruct2{
|
|
{int64(1), 6.2},
|
|
{int64(2), 5.3},
|
|
{int64(92), -0.2},
|
|
}
|
|
)
|
|
|
|
_, err = engine.Insert(cases)
|
|
assert.NoError(t, err)
|
|
|
|
sumInt, err := engine.Sum(new(SumStruct2),
|
|
"CASE WHEN `int` <= 2 THEN `int` ELSE 0 END")
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 3, int64(sumInt))
|
|
}
|