377 lines
9.8 KiB
Go
377 lines
9.8 KiB
Go
package ydb
|
|
|
|
import (
|
|
"strconv"
|
|
"testing"
|
|
"time"
|
|
|
|
"xorm.io/builder"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestQueryString(t *testing.T) {
|
|
type GetVar2 struct {
|
|
Uuid int64 `xorm:"pk"`
|
|
Msg string `xorm:"varchar(255)"`
|
|
Age int32
|
|
Money float64
|
|
Created time.Time `xorm:"created"`
|
|
}
|
|
|
|
assert.NoError(t, PrepareScheme(&GetVar2{}))
|
|
engine, err := enginePool.GetDataQueryEngine()
|
|
assert.NoError(t, err)
|
|
|
|
var data = GetVar2{
|
|
Uuid: int64(1),
|
|
Msg: "hi",
|
|
Age: 28,
|
|
Money: 1.5,
|
|
}
|
|
_, err = engine.InsertOne(data)
|
|
assert.NoError(t, err)
|
|
|
|
records, err := engine.QueryString("select * from " + engine.Quote(engine.TableName("get_var2", true)))
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, 1, len(records))
|
|
assert.Equal(t, 5, len(records[0]))
|
|
assert.Equal(t, "1", records[0]["uuid"])
|
|
assert.Equal(t, "hi", records[0]["msg"])
|
|
assert.Equal(t, "28", records[0]["age"])
|
|
assert.Equal(t, "1.5", records[0]["money"])
|
|
}
|
|
|
|
func TestQueryString2(t *testing.T) {
|
|
type GetVar3 struct {
|
|
Uuid int64 `xorm:"pk"`
|
|
Msg bool
|
|
}
|
|
|
|
assert.NoError(t, PrepareScheme(&GetVar3{}))
|
|
engine, err := enginePool.GetDataQueryEngine()
|
|
assert.NoError(t, err)
|
|
|
|
var data = GetVar3{
|
|
Uuid: int64(1),
|
|
Msg: false,
|
|
}
|
|
_, err = engine.Insert(data)
|
|
assert.NoError(t, err)
|
|
|
|
records, err := engine.QueryString("select * from " + engine.Quote(engine.TableName("get_var3", true)))
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, 1, len(records))
|
|
assert.Equal(t, 2, len(records[0]))
|
|
assert.Equal(t, "1", records[0]["uuid"])
|
|
assert.True(t, "false" == records[0]["msg"])
|
|
}
|
|
|
|
func toBool(i interface{}) bool {
|
|
switch t := i.(type) {
|
|
case int32:
|
|
return t > 0
|
|
case bool:
|
|
return t
|
|
}
|
|
return false
|
|
}
|
|
|
|
func TestQueryInterface(t *testing.T) {
|
|
type GetVarInterface struct {
|
|
Uuid int64 `xorm:"pk"`
|
|
Msg string `xorm:"varchar(255)"`
|
|
Age int32
|
|
Money float64
|
|
Created time.Time `xorm:"created"`
|
|
}
|
|
|
|
assert.NoError(t, PrepareScheme(&GetVarInterface{}))
|
|
engine, err := enginePool.GetDataQueryEngine()
|
|
assert.NoError(t, err)
|
|
|
|
var data = GetVarInterface{
|
|
Uuid: int64(1),
|
|
Msg: "hi",
|
|
Age: int32(28),
|
|
Money: 1.5,
|
|
}
|
|
_, err = engine.InsertOne(data)
|
|
assert.NoError(t, err)
|
|
|
|
records, err := engine.QueryInterface("select * from " + engine.Quote(engine.TableName("get_var_interface", true)))
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, 1, len(records))
|
|
assert.Equal(t, 5, len(records[0]))
|
|
assert.EqualValues(t, 1, records[0]["uuid"].(int64))
|
|
assert.Equal(t, "hi", string(records[0]["msg"].(string)))
|
|
assert.EqualValues(t, 28, records[0]["age"].(int32))
|
|
assert.EqualValues(t, 1.5, records[0]["money"].(float64))
|
|
}
|
|
|
|
func TestQueryNoParams(t *testing.T) {
|
|
type QueryNoParams struct {
|
|
Uuid int64 `xorm:"pk"`
|
|
Msg string `xorm:"varchar(255)"`
|
|
Age int32
|
|
Money float64
|
|
Created time.Time `xorm:"created"`
|
|
}
|
|
|
|
assert.NoError(t, PrepareScheme(&QueryNoParams{}))
|
|
engine, err := enginePool.GetDataQueryEngine()
|
|
assert.NoError(t, err)
|
|
|
|
engine.ShowSQL(true)
|
|
|
|
var q = QueryNoParams{
|
|
Uuid: int64(1),
|
|
Msg: "message",
|
|
Age: 20,
|
|
Money: 3000,
|
|
}
|
|
_, err = engine.Insert(&q)
|
|
assert.NoError(t, err)
|
|
|
|
assertResult := func(t *testing.T, results []map[string][]byte) {
|
|
assert.EqualValues(t, 1, len(results))
|
|
id, err := strconv.ParseInt(string(results[0]["uuid"]), 10, 64)
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 1, id)
|
|
assert.Equal(t, "message", string(results[0]["msg"]))
|
|
|
|
age, err := strconv.Atoi(string(results[0]["age"]))
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 20, age)
|
|
|
|
money, err := strconv.ParseFloat(string(results[0]["money"]), 32)
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 3000, money)
|
|
}
|
|
|
|
results, err := engine.Table("query_no_params").Limit(10).Query()
|
|
assert.NoError(t, err)
|
|
assertResult(t, results)
|
|
|
|
results, err = engine.SQL("select * from " + engine.Quote(engine.TableName("query_no_params", true))).Query()
|
|
assert.NoError(t, err)
|
|
assertResult(t, results)
|
|
}
|
|
|
|
func TestQueryStringNoParam(t *testing.T) {
|
|
type GetVar4 struct {
|
|
Uuid int64 `xorm:"pk"`
|
|
Msg bool
|
|
}
|
|
|
|
assert.NoError(t, PrepareScheme(&GetVar4{}))
|
|
engine, err := enginePool.GetDataQueryEngine()
|
|
assert.NoError(t, err)
|
|
|
|
var data = GetVar4{
|
|
Uuid: int64(1),
|
|
Msg: false,
|
|
}
|
|
_, err = engine.Insert(data)
|
|
assert.NoError(t, err)
|
|
|
|
records, err := engine.Table("get_var4").Limit(1).QueryString()
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 1, len(records))
|
|
assert.EqualValues(t, "1", records[0]["uuid"])
|
|
assert.EqualValues(t, "false", records[0]["msg"])
|
|
|
|
records, err = engine.Table("get_var4").Where(builder.Eq{"`uuid`": int64(1)}).QueryString()
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 1, len(records))
|
|
assert.EqualValues(t, "1", records[0]["uuid"])
|
|
assert.EqualValues(t, "false", records[0]["msg"])
|
|
}
|
|
|
|
func TestQuerySliceStringNoParam(t *testing.T) {
|
|
type GetVar6 struct {
|
|
Uuid int64 `xorm:"pk"`
|
|
Msg bool
|
|
}
|
|
|
|
assert.NoError(t, PrepareScheme(&GetVar6{}))
|
|
engine, err := enginePool.GetDataQueryEngine()
|
|
assert.NoError(t, err)
|
|
|
|
var data = GetVar6{
|
|
Uuid: int64(1),
|
|
Msg: false,
|
|
}
|
|
_, err = engine.Insert(data)
|
|
assert.NoError(t, err)
|
|
|
|
records, err := engine.Table("get_var6").Cols("uuid", "msg").Limit(1).QuerySliceString()
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 1, len(records))
|
|
assert.EqualValues(t, "1", records[0][0])
|
|
assert.EqualValues(t, "false", records[0][1])
|
|
|
|
records, err = engine.
|
|
Table("get_var6").
|
|
Cols("uuid", "msg").
|
|
Where(builder.Eq{"`uuid`": int64(1)}).
|
|
QuerySliceString()
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 1, len(records))
|
|
assert.EqualValues(t, "1", records[0][0])
|
|
assert.EqualValues(t, "false", records[0][1])
|
|
}
|
|
|
|
func TestQueryInterfaceNoParam(t *testing.T) {
|
|
type GetVar5 struct {
|
|
Uuid int64 `xorm:"pk"`
|
|
Msg bool
|
|
}
|
|
|
|
assert.NoError(t, PrepareScheme(&GetVar5{}))
|
|
engine, err := enginePool.GetDataQueryEngine()
|
|
assert.NoError(t, err)
|
|
|
|
var data = GetVar5{
|
|
Uuid: int64(1),
|
|
Msg: false,
|
|
}
|
|
_, err = engine.Insert(data)
|
|
assert.NoError(t, err)
|
|
|
|
records, err := engine.Table("get_var5").Cols("uuid", "msg").Limit(1).QueryInterface()
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 1, len(records))
|
|
assert.EqualValues(t, 1, records[0]["uuid"].(int64))
|
|
assert.EqualValues(t, false, records[0]["msg"].(bool))
|
|
|
|
records, err = engine.Table("get_var5").Cols("uuid", "msg").Where(builder.Eq{"`uuid`": int64(1)}).QueryInterface()
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 1, len(records))
|
|
assert.EqualValues(t, 1, records[0]["uuid"].(int64))
|
|
assert.EqualValues(t, false, records[0]["msg"].(bool))
|
|
}
|
|
|
|
func TestQueryWithBuilder(t *testing.T) {
|
|
type QueryWithBuilder struct {
|
|
Uuid int64 `xorm:"pk"`
|
|
Msg string `xorm:"varchar(255)"`
|
|
Age int32
|
|
Money float64
|
|
Created time.Time `xorm:"created"`
|
|
}
|
|
|
|
assert.NoError(t, PrepareScheme(&QueryWithBuilder{}))
|
|
engine, err := enginePool.GetDataQueryEngine()
|
|
assert.NoError(t, err)
|
|
|
|
var q = QueryWithBuilder{
|
|
Uuid: int64(1),
|
|
Msg: "message",
|
|
Age: 20,
|
|
Money: 3000,
|
|
}
|
|
_, err = engine.Insert(&q)
|
|
assert.NoError(t, err)
|
|
|
|
assertResult := func(t *testing.T, results []map[string][]byte) {
|
|
assert.EqualValues(t, 1, len(results))
|
|
id, err := strconv.ParseInt(string(results[0]["uuid"]), 10, 64)
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 1, id)
|
|
assert.Equal(t, "message", string(results[0]["msg"]))
|
|
|
|
age, err := strconv.Atoi(string(results[0]["age"]))
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 20, age)
|
|
|
|
money, err := strconv.ParseFloat(string(results[0]["money"]), 32)
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 3000, money)
|
|
}
|
|
|
|
results, err := engine.Query(builder.Select("*").From(engine.Quote(engine.TableName("query_with_builder", true))))
|
|
assert.NoError(t, err)
|
|
assertResult(t, results)
|
|
}
|
|
|
|
func TestJoinWithSubQuery(t *testing.T) {
|
|
type JoinWithSubQuery1 struct {
|
|
Uuid int64 `xorm:"pk"`
|
|
Msg string `xorm:"varchar(255)"`
|
|
DepartId int64
|
|
Money float64
|
|
}
|
|
|
|
type JoinWithSubQueryDepart struct {
|
|
Uuid int64 `xorm:"pk"`
|
|
Name string
|
|
}
|
|
|
|
engine, err := enginePool.GetScriptQueryEngine()
|
|
assert.NoError(t, err)
|
|
|
|
assert.NoError(t, engine.NewSession().DropTable(new(JoinWithSubQuery1)))
|
|
assert.NoError(t, engine.NewSession().DropTable(new(JoinWithSubQueryDepart)))
|
|
assert.NoError(t, engine.Sync(new(JoinWithSubQuery1), new(JoinWithSubQueryDepart)))
|
|
|
|
var depart = JoinWithSubQueryDepart{
|
|
Uuid: int64(1),
|
|
Name: "depart1",
|
|
}
|
|
_, err = engine.Insert(&depart)
|
|
assert.NoError(t, err)
|
|
|
|
var q = JoinWithSubQuery1{
|
|
Uuid: int64(1),
|
|
Msg: "message",
|
|
DepartId: depart.Uuid,
|
|
Money: 3000,
|
|
}
|
|
|
|
_, err = engine.Insert(&q)
|
|
assert.NoError(t, err)
|
|
|
|
tbName := engine.Quote(engine.TableName("join_with_sub_query_depart", true))
|
|
var querys []JoinWithSubQuery1
|
|
err = engine.
|
|
Table("join_with_sub_query1").
|
|
Alias("jq1").
|
|
Cols("jq1.uuid as uuid", "jq1.msg as msg", "jq1.depart_id as depart_id", "jq1.money as money").
|
|
Join("INNER",
|
|
builder.Select("`uuid`").From(tbName),
|
|
"`join_with_sub_query_depart`.`uuid` = `jq1`.`depart_id`").
|
|
Find(&querys)
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 1, len(querys))
|
|
assert.EqualValues(t, q, querys[0])
|
|
|
|
querys = make([]JoinWithSubQuery1, 0, 1)
|
|
err = engine.
|
|
Table("join_with_sub_query1").
|
|
Alias("jq1").
|
|
Cols("jq1.uuid as uuid", "jq1.msg as msg", "jq1.depart_id as depart_id", "jq1.money as money").
|
|
Join("INNER", "(SELECT `uuid` FROM "+tbName+") `a`", "`a`.`uuid` = `jq1`.`depart_id`").
|
|
Find(&querys)
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 1, len(querys))
|
|
assert.EqualValues(t, q, querys[0])
|
|
}
|
|
|
|
func TestQueryStringWithLimit(t *testing.T) {
|
|
type QueryWithLimit struct {
|
|
Uuid int64 `xorm:"pk"`
|
|
Msg string `xorm:"varchar(255)"`
|
|
DepartId int64
|
|
Money float64
|
|
}
|
|
|
|
assert.NoError(t, PrepareScheme(&QueryWithLimit{}))
|
|
engine, err := enginePool.GetDataQueryEngine()
|
|
assert.NoError(t, err)
|
|
|
|
data, err := engine.Table("query_with_limit").Limit(20, 20).QueryString()
|
|
assert.NoError(t, err)
|
|
assert.EqualValues(t, 0, len(data))
|
|
}
|