session_find_test.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. // Copyright 2017 The Xorm Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package xorm
  5. import (
  6. "errors"
  7. "fmt"
  8. "testing"
  9. "github.com/stretchr/testify/assert"
  10. "github.com/xormplus/core"
  11. )
  12. func TestJoinLimit(t *testing.T) {
  13. assert.NoError(t, prepareEngine())
  14. type Salary struct {
  15. Id int64
  16. Lid int64
  17. }
  18. type CheckList struct {
  19. Id int64
  20. Eid int64
  21. }
  22. type Empsetting struct {
  23. Id int64
  24. Name string
  25. }
  26. assert.NoError(t, testEngine.Sync2(new(Salary), new(CheckList), new(Empsetting)))
  27. var emp Empsetting
  28. cnt, err := testEngine.Insert(&emp)
  29. assert.NoError(t, err)
  30. assert.EqualValues(t, 1, cnt)
  31. var checklist = CheckList{
  32. Eid: emp.Id,
  33. }
  34. cnt, err = testEngine.Insert(&checklist)
  35. assert.NoError(t, err)
  36. assert.EqualValues(t, 1, cnt)
  37. var salary = Salary{
  38. Lid: checklist.Id,
  39. }
  40. cnt, err = testEngine.Insert(&salary)
  41. assert.NoError(t, err)
  42. assert.EqualValues(t, 1, cnt)
  43. var salaries []Salary
  44. err = testEngine.Table("salary").
  45. Join("INNER", "check_list", "check_list.id = salary.lid").
  46. Join("LEFT", "empsetting", "empsetting.id = check_list.eid").
  47. Limit(10, 0).
  48. Find(&salaries)
  49. assert.NoError(t, err)
  50. }
  51. func assertSync(t *testing.T, beans ...interface{}) {
  52. for _, bean := range beans {
  53. assert.NoError(t, testEngine.DropTables(bean))
  54. assert.NoError(t, testEngine.Sync2(bean))
  55. }
  56. }
  57. func TestWhere(t *testing.T) {
  58. assert.NoError(t, prepareEngine())
  59. assertSync(t, new(Userinfo))
  60. users := make([]Userinfo, 0)
  61. err := testEngine.Where("(id) > ?", 2).Find(&users)
  62. if err != nil {
  63. t.Error(err)
  64. panic(err)
  65. }
  66. fmt.Println(users)
  67. err = testEngine.Where("(id) > ?", 2).And("(id) < ?", 10).Find(&users)
  68. if err != nil {
  69. t.Error(err)
  70. panic(err)
  71. }
  72. fmt.Println(users)
  73. }
  74. func TestFind(t *testing.T) {
  75. assert.NoError(t, prepareEngine())
  76. assertSync(t, new(Userinfo))
  77. users := make([]Userinfo, 0)
  78. err := testEngine.Find(&users)
  79. assert.NoError(t, err)
  80. for _, user := range users {
  81. fmt.Println(user)
  82. }
  83. users2 := make([]Userinfo, 0)
  84. var tbName = testEngine.Quote(testEngine.TableName(new(Userinfo), true))
  85. err = testEngine.SQL("select * from " + tbName).Find(&users2)
  86. assert.NoError(t, err)
  87. }
  88. func TestFind2(t *testing.T) {
  89. assert.NoError(t, prepareEngine())
  90. users := make([]*Userinfo, 0)
  91. assertSync(t, new(Userinfo))
  92. err := testEngine.Find(&users)
  93. assert.NoError(t, err)
  94. for _, user := range users {
  95. fmt.Println(user)
  96. }
  97. }
  98. type Team struct {
  99. Id int64
  100. }
  101. type TeamUser struct {
  102. OrgId int64
  103. Uid int64
  104. TeamId int64
  105. }
  106. func (TeamUser) TableName() string {
  107. return "team_user"
  108. }
  109. func TestFind3(t *testing.T) {
  110. var teamUser = new(TeamUser)
  111. assert.NoError(t, prepareEngine())
  112. err := testEngine.Sync2(new(Team), teamUser)
  113. assert.NoError(t, err)
  114. var teams []Team
  115. err = testEngine.Cols("`team`.id").
  116. Where("`team_user`.org_id=?", 1).
  117. And("`team_user`.uid=?", 2).
  118. Join("INNER", "`team_user`", "`team_user`.team_id=`team`.id").
  119. Find(&teams)
  120. assert.NoError(t, err)
  121. teams = make([]Team, 0)
  122. err = testEngine.Cols("`team`.id").
  123. Where("`team_user`.org_id=?", 1).
  124. And("`team_user`.uid=?", 2).
  125. Join("INNER", teamUser, "`team_user`.team_id=`team`.id").
  126. Find(&teams)
  127. assert.NoError(t, err)
  128. teams = make([]Team, 0)
  129. err = testEngine.Cols("`team`.id").
  130. Where("`team_user`.org_id=?", 1).
  131. And("`team_user`.uid=?", 2).
  132. Join("INNER", []interface{}{teamUser}, "`team_user`.team_id=`team`.id").
  133. Find(&teams)
  134. assert.NoError(t, err)
  135. teams = make([]Team, 0)
  136. err = testEngine.Cols("`team`.id").
  137. Where("`tu`.org_id=?", 1).
  138. And("`tu`.uid=?", 2).
  139. Join("INNER", []string{"team_user", "tu"}, "`tu`.team_id=`team`.id").
  140. Find(&teams)
  141. assert.NoError(t, err)
  142. teams = make([]Team, 0)
  143. err = testEngine.Cols("`team`.id").
  144. Where("`tu`.org_id=?", 1).
  145. And("`tu`.uid=?", 2).
  146. Join("INNER", []interface{}{"team_user", "tu"}, "`tu`.team_id=`team`.id").
  147. Find(&teams)
  148. assert.NoError(t, err)
  149. teams = make([]Team, 0)
  150. err = testEngine.Cols("`team`.id").
  151. Where("`tu`.org_id=?", 1).
  152. And("`tu`.uid=?", 2).
  153. Join("INNER", []interface{}{teamUser, "tu"}, "`tu`.team_id=`team`.id").
  154. Find(&teams)
  155. assert.NoError(t, err)
  156. }
  157. func TestFindMap(t *testing.T) {
  158. assert.NoError(t, prepareEngine())
  159. assertSync(t, new(Userinfo))
  160. users := make(map[int64]Userinfo)
  161. err := testEngine.Find(&users)
  162. if err != nil {
  163. t.Error(err)
  164. panic(err)
  165. }
  166. for _, user := range users {
  167. fmt.Println(user)
  168. }
  169. }
  170. func TestFindMap2(t *testing.T) {
  171. assert.NoError(t, prepareEngine())
  172. assertSync(t, new(Userinfo))
  173. users := make(map[int64]*Userinfo)
  174. err := testEngine.Find(&users)
  175. if err != nil {
  176. t.Error(err)
  177. panic(err)
  178. }
  179. for id, user := range users {
  180. fmt.Println(id, user)
  181. }
  182. }
  183. func TestDistinct(t *testing.T) {
  184. assert.NoError(t, prepareEngine())
  185. assertSync(t, new(Userinfo))
  186. _, err := testEngine.Insert(&Userinfo{
  187. Username: "lunny",
  188. })
  189. assert.NoError(t, err)
  190. users := make([]Userinfo, 0)
  191. departname := testEngine.GetTableMapper().Obj2Table("Departname")
  192. err = testEngine.Distinct(departname).Find(&users)
  193. assert.NoError(t, err)
  194. assert.EqualValues(t, 1, len(users))
  195. fmt.Println(users)
  196. type Depart struct {
  197. Departname string
  198. }
  199. users2 := make([]Depart, 0)
  200. err = testEngine.Distinct(departname).Table(new(Userinfo)).Find(&users2)
  201. assert.NoError(t, err)
  202. if len(users2) != 1 {
  203. fmt.Println(len(users2))
  204. t.Error(err)
  205. panic(errors.New("should be one record"))
  206. }
  207. fmt.Println(users2)
  208. }
  209. func TestOrder(t *testing.T) {
  210. assert.NoError(t, prepareEngine())
  211. assertSync(t, new(Userinfo))
  212. users := make([]Userinfo, 0)
  213. err := testEngine.OrderBy("id desc").Find(&users)
  214. assert.NoError(t, err)
  215. fmt.Println(users)
  216. users2 := make([]Userinfo, 0)
  217. err = testEngine.Asc("id", "username").Desc("height").Find(&users2)
  218. assert.NoError(t, err)
  219. fmt.Println(users2)
  220. }
  221. func TestHaving(t *testing.T) {
  222. assert.NoError(t, prepareEngine())
  223. assertSync(t, new(Userinfo))
  224. users := make([]Userinfo, 0)
  225. err := testEngine.GroupBy("username").Having("username='xlw'").Find(&users)
  226. assert.NoError(t, err)
  227. fmt.Println(users)
  228. /*users = make([]Userinfo, 0)
  229. err = testEngine.Cols("id, username").GroupBy("username").Having("username='xlw'").Find(&users)
  230. if err != nil {
  231. t.Error(err)
  232. panic(err)
  233. }
  234. fmt.Println(users)*/
  235. }
  236. func TestOrderSameMapper(t *testing.T) {
  237. assert.NoError(t, prepareEngine())
  238. testEngine.UnMapType(rValue(new(Userinfo)).Type())
  239. mapper := testEngine.GetTableMapper()
  240. testEngine.SetMapper(core.SameMapper{})
  241. defer func() {
  242. testEngine.UnMapType(rValue(new(Userinfo)).Type())
  243. testEngine.SetMapper(mapper)
  244. }()
  245. assertSync(t, new(Userinfo))
  246. users := make([]Userinfo, 0)
  247. err := testEngine.OrderBy("(id) desc").Find(&users)
  248. assert.NoError(t, err)
  249. fmt.Println(users)
  250. users2 := make([]Userinfo, 0)
  251. err = testEngine.Asc("(id)", "Username").Desc("Height").Find(&users2)
  252. assert.NoError(t, err)
  253. fmt.Println(users2)
  254. }
  255. func TestHavingSameMapper(t *testing.T) {
  256. assert.NoError(t, prepareEngine())
  257. testEngine.UnMapType(rValue(new(Userinfo)).Type())
  258. mapper := testEngine.GetTableMapper()
  259. testEngine.SetMapper(core.SameMapper{})
  260. defer func() {
  261. testEngine.UnMapType(rValue(new(Userinfo)).Type())
  262. testEngine.SetMapper(mapper)
  263. }()
  264. assertSync(t, new(Userinfo))
  265. users := make([]Userinfo, 0)
  266. err := testEngine.GroupBy("`Username`").Having("`Username`='xlw'").Find(&users)
  267. if err != nil {
  268. t.Fatal(err)
  269. }
  270. fmt.Println(users)
  271. }
  272. func TestFindInts(t *testing.T) {
  273. assert.NoError(t, prepareEngine())
  274. assertSync(t, new(Userinfo))
  275. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  276. var idsInt64 []int64
  277. err := testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsInt64)
  278. if err != nil {
  279. t.Fatal(err)
  280. }
  281. fmt.Println(idsInt64)
  282. var idsInt32 []int32
  283. err = testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsInt32)
  284. if err != nil {
  285. t.Fatal(err)
  286. }
  287. fmt.Println(idsInt32)
  288. var idsInt []int
  289. err = testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsInt)
  290. if err != nil {
  291. t.Fatal(err)
  292. }
  293. fmt.Println(idsInt)
  294. var idsUint []uint
  295. err = testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsUint)
  296. if err != nil {
  297. t.Fatal(err)
  298. }
  299. fmt.Println(idsUint)
  300. type MyInt int
  301. var idsMyInt []MyInt
  302. err = testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsMyInt)
  303. if err != nil {
  304. t.Fatal(err)
  305. }
  306. fmt.Println(idsMyInt)
  307. }
  308. func TestFindStrings(t *testing.T) {
  309. assert.NoError(t, prepareEngine())
  310. assertSync(t, new(Userinfo))
  311. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  312. username := testEngine.GetColumnMapper().Obj2Table("Username")
  313. var idsString []string
  314. err := testEngine.Table(userinfo).Cols(username).Desc("id").Find(&idsString)
  315. if err != nil {
  316. t.Fatal(err)
  317. }
  318. fmt.Println(idsString)
  319. }
  320. func TestFindMyString(t *testing.T) {
  321. assert.NoError(t, prepareEngine())
  322. assertSync(t, new(Userinfo))
  323. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  324. username := testEngine.GetColumnMapper().Obj2Table("Username")
  325. var idsMyString []MyString
  326. err := testEngine.Table(userinfo).Cols(username).Desc("id").Find(&idsMyString)
  327. if err != nil {
  328. t.Fatal(err)
  329. }
  330. fmt.Println(idsMyString)
  331. }
  332. func TestFindInterface(t *testing.T) {
  333. assert.NoError(t, prepareEngine())
  334. assertSync(t, new(Userinfo))
  335. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  336. username := testEngine.GetColumnMapper().Obj2Table("Username")
  337. var idsInterface []interface{}
  338. err := testEngine.Table(userinfo).Cols(username).Desc("id").Find(&idsInterface)
  339. if err != nil {
  340. t.Fatal(err)
  341. }
  342. fmt.Println(idsInterface)
  343. }
  344. func TestFindSliceBytes(t *testing.T) {
  345. assert.NoError(t, prepareEngine())
  346. assertSync(t, new(Userinfo))
  347. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  348. var ids [][][]byte
  349. err := testEngine.Table(userinfo).Desc("id").Find(&ids)
  350. if err != nil {
  351. t.Fatal(err)
  352. }
  353. for _, record := range ids {
  354. fmt.Println(record)
  355. }
  356. }
  357. func TestFindSlicePtrString(t *testing.T) {
  358. assert.NoError(t, prepareEngine())
  359. assertSync(t, new(Userinfo))
  360. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  361. var ids [][]*string
  362. err := testEngine.Table(userinfo).Desc("id").Find(&ids)
  363. if err != nil {
  364. t.Fatal(err)
  365. }
  366. for _, record := range ids {
  367. fmt.Println(record)
  368. }
  369. }
  370. func TestFindMapBytes(t *testing.T) {
  371. assert.NoError(t, prepareEngine())
  372. assertSync(t, new(Userinfo))
  373. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  374. var ids []map[string][]byte
  375. err := testEngine.Table(userinfo).Desc("id").Find(&ids)
  376. if err != nil {
  377. t.Fatal(err)
  378. }
  379. for _, record := range ids {
  380. fmt.Println(record)
  381. }
  382. }
  383. func TestFindMapPtrString(t *testing.T) {
  384. assert.NoError(t, prepareEngine())
  385. assertSync(t, new(Userinfo))
  386. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  387. var ids []map[string]*string
  388. err := testEngine.Table(userinfo).Desc("id").Find(&ids)
  389. assert.NoError(t, err)
  390. for _, record := range ids {
  391. fmt.Println(record)
  392. }
  393. }
  394. func TestFindBit(t *testing.T) {
  395. type FindBitStruct struct {
  396. Id int64
  397. Msg bool `xorm:"bit"`
  398. }
  399. assert.NoError(t, prepareEngine())
  400. assertSync(t, new(FindBitStruct))
  401. cnt, err := testEngine.Insert([]FindBitStruct{
  402. {
  403. Msg: false,
  404. },
  405. {
  406. Msg: true,
  407. },
  408. })
  409. assert.NoError(t, err)
  410. assert.EqualValues(t, 2, cnt)
  411. var results = make([]FindBitStruct, 0, 2)
  412. err = testEngine.Find(&results)
  413. assert.NoError(t, err)
  414. assert.EqualValues(t, 2, len(results))
  415. }
  416. func TestFindMark(t *testing.T) {
  417. type Mark struct {
  418. Mark1 string `xorm:"VARCHAR(1)"`
  419. Mark2 string `xorm:"VARCHAR(1)"`
  420. MarkA string `xorm:"VARCHAR(1)"`
  421. }
  422. assert.NoError(t, prepareEngine())
  423. assertSync(t, new(Mark))
  424. cnt, err := testEngine.Insert([]Mark{
  425. {
  426. Mark1: "1",
  427. Mark2: "2",
  428. MarkA: "A",
  429. },
  430. {
  431. Mark1: "1",
  432. Mark2: "2",
  433. MarkA: "A",
  434. },
  435. })
  436. assert.NoError(t, err)
  437. assert.EqualValues(t, 2, cnt)
  438. var results = make([]Mark, 0, 2)
  439. err = testEngine.Find(&results)
  440. assert.NoError(t, err)
  441. assert.EqualValues(t, 2, len(results))
  442. }
  443. func TestFindAndCountOneFunc(t *testing.T) {
  444. type FindAndCountStruct struct {
  445. Id int64
  446. Content string
  447. Msg bool `xorm:"bit"`
  448. }
  449. assert.NoError(t, prepareEngine())
  450. assertSync(t, new(FindAndCountStruct))
  451. cnt, err := testEngine.Insert([]FindAndCountStruct{
  452. {
  453. Content: "111",
  454. Msg: false,
  455. },
  456. {
  457. Content: "222",
  458. Msg: true,
  459. },
  460. })
  461. assert.NoError(t, err)
  462. assert.EqualValues(t, 2, cnt)
  463. var results = make([]FindAndCountStruct, 0, 2)
  464. cnt, err = testEngine.FindAndCount(&results)
  465. assert.NoError(t, err)
  466. assert.EqualValues(t, 2, len(results))
  467. assert.EqualValues(t, 2, cnt)
  468. results = make([]FindAndCountStruct, 0, 1)
  469. cnt, err = testEngine.Where("msg = ?", true).FindAndCount(&results)
  470. assert.NoError(t, err)
  471. assert.EqualValues(t, 1, len(results))
  472. assert.EqualValues(t, 1, cnt)
  473. results = make([]FindAndCountStruct, 0, 1)
  474. cnt, err = testEngine.Where("msg = ?", true).Limit(1).FindAndCount(&results)
  475. assert.NoError(t, err)
  476. assert.EqualValues(t, 1, len(results))
  477. assert.EqualValues(t, 1, cnt)
  478. results = make([]FindAndCountStruct, 0, 1)
  479. cnt, err = testEngine.Where("msg = ?", true).Select("id, content, msg").
  480. Limit(1).FindAndCount(&results)
  481. assert.NoError(t, err)
  482. assert.EqualValues(t, 1, len(results))
  483. assert.EqualValues(t, 1, cnt)
  484. results = make([]FindAndCountStruct, 0, 1)
  485. cnt, err = testEngine.Where("msg = ?", true).Desc("id").
  486. Limit(1).FindAndCount(&results)
  487. assert.NoError(t, err)
  488. assert.EqualValues(t, 1, len(results))
  489. assert.EqualValues(t, 1, cnt)
  490. }