session_find_test.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615
  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. if err != nil {
  80. t.Error(err)
  81. panic(err)
  82. }
  83. for _, user := range users {
  84. fmt.Println(user)
  85. }
  86. users2 := make([]Userinfo, 0)
  87. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  88. err = testEngine.SQL("select * from " + testEngine.Quote(userinfo)).Find(&users2)
  89. if err != nil {
  90. t.Error(err)
  91. panic(err)
  92. }
  93. }
  94. func TestFind2(t *testing.T) {
  95. assert.NoError(t, prepareEngine())
  96. users := make([]*Userinfo, 0)
  97. assertSync(t, new(Userinfo))
  98. err := testEngine.Find(&users)
  99. assert.NoError(t, err)
  100. for _, user := range users {
  101. fmt.Println(user)
  102. }
  103. }
  104. type Team struct {
  105. Id int64
  106. }
  107. type TeamUser struct {
  108. OrgId int64
  109. Uid int64
  110. TeamId int64
  111. }
  112. func (TeamUser) TableName() string {
  113. return "team_user"
  114. }
  115. func TestFind3(t *testing.T) {
  116. var teamUser = new(TeamUser)
  117. assert.NoError(t, prepareEngine())
  118. err := testEngine.Sync2(new(Team), teamUser)
  119. assert.NoError(t, err)
  120. var teams []Team
  121. err = testEngine.Cols("`team`.id").
  122. Where("`team_user`.org_id=?", 1).
  123. And("`team_user`.uid=?", 2).
  124. Join("INNER", "`team_user`", "`team_user`.team_id=`team`.id").
  125. Find(&teams)
  126. assert.NoError(t, err)
  127. teams = make([]Team, 0)
  128. err = testEngine.Cols("`team`.id").
  129. Where("`team_user`.org_id=?", 1).
  130. And("`team_user`.uid=?", 2).
  131. Join("INNER", teamUser, "`team_user`.team_id=`team`.id").
  132. Find(&teams)
  133. assert.NoError(t, err)
  134. teams = make([]Team, 0)
  135. err = testEngine.Cols("`team`.id").
  136. Where("`team_user`.org_id=?", 1).
  137. And("`team_user`.uid=?", 2).
  138. Join("INNER", []interface{}{teamUser}, "`team_user`.team_id=`team`.id").
  139. Find(&teams)
  140. assert.NoError(t, err)
  141. teams = make([]Team, 0)
  142. err = testEngine.Cols("`team`.id").
  143. Where("`tu`.org_id=?", 1).
  144. And("`tu`.uid=?", 2).
  145. Join("INNER", []string{"team_user", "tu"}, "`tu`.team_id=`team`.id").
  146. Find(&teams)
  147. assert.NoError(t, err)
  148. teams = make([]Team, 0)
  149. err = testEngine.Cols("`team`.id").
  150. Where("`tu`.org_id=?", 1).
  151. And("`tu`.uid=?", 2).
  152. Join("INNER", []interface{}{"team_user", "tu"}, "`tu`.team_id=`team`.id").
  153. Find(&teams)
  154. assert.NoError(t, err)
  155. teams = make([]Team, 0)
  156. err = testEngine.Cols("`team`.id").
  157. Where("`tu`.org_id=?", 1).
  158. And("`tu`.uid=?", 2).
  159. Join("INNER", []interface{}{teamUser, "tu"}, "`tu`.team_id=`team`.id").
  160. Find(&teams)
  161. assert.NoError(t, err)
  162. }
  163. func TestFindMap(t *testing.T) {
  164. assert.NoError(t, prepareEngine())
  165. assertSync(t, new(Userinfo))
  166. users := make(map[int64]Userinfo)
  167. err := testEngine.Find(&users)
  168. if err != nil {
  169. t.Error(err)
  170. panic(err)
  171. }
  172. for _, user := range users {
  173. fmt.Println(user)
  174. }
  175. }
  176. func TestFindMap2(t *testing.T) {
  177. assert.NoError(t, prepareEngine())
  178. assertSync(t, new(Userinfo))
  179. users := make(map[int64]*Userinfo)
  180. err := testEngine.Find(&users)
  181. if err != nil {
  182. t.Error(err)
  183. panic(err)
  184. }
  185. for id, user := range users {
  186. fmt.Println(id, user)
  187. }
  188. }
  189. func TestDistinct(t *testing.T) {
  190. assert.NoError(t, prepareEngine())
  191. assertSync(t, new(Userinfo))
  192. _, err := testEngine.Insert(&Userinfo{
  193. Username: "lunny",
  194. })
  195. assert.NoError(t, err)
  196. users := make([]Userinfo, 0)
  197. departname := testEngine.GetTableMapper().Obj2Table("Departname")
  198. err = testEngine.Distinct(departname).Find(&users)
  199. if err != nil {
  200. t.Error(err)
  201. panic(err)
  202. }
  203. if len(users) != 1 {
  204. t.Error(err)
  205. panic(errors.New("should be one record"))
  206. }
  207. fmt.Println(users)
  208. type Depart struct {
  209. Departname string
  210. }
  211. users2 := make([]Depart, 0)
  212. err = testEngine.Distinct(departname).Table(new(Userinfo)).Find(&users2)
  213. if err != nil {
  214. t.Error(err)
  215. panic(err)
  216. }
  217. if len(users2) != 1 {
  218. t.Error(err)
  219. panic(errors.New("should be one record"))
  220. }
  221. fmt.Println(users2)
  222. }
  223. func TestOrder(t *testing.T) {
  224. assert.NoError(t, prepareEngine())
  225. assertSync(t, new(Userinfo))
  226. users := make([]Userinfo, 0)
  227. err := testEngine.OrderBy("id desc").Find(&users)
  228. if err != nil {
  229. t.Error(err)
  230. panic(err)
  231. }
  232. fmt.Println(users)
  233. users2 := make([]Userinfo, 0)
  234. err = testEngine.Asc("id", "username").Desc("height").Find(&users2)
  235. if err != nil {
  236. t.Error(err)
  237. panic(err)
  238. }
  239. fmt.Println(users2)
  240. }
  241. func TestHaving(t *testing.T) {
  242. assert.NoError(t, prepareEngine())
  243. assertSync(t, new(Userinfo))
  244. users := make([]Userinfo, 0)
  245. err := testEngine.GroupBy("username").Having("username='xlw'").Find(&users)
  246. if err != nil {
  247. t.Error(err)
  248. panic(err)
  249. }
  250. fmt.Println(users)
  251. /*users = make([]Userinfo, 0)
  252. err = testEngine.Cols("id, username").GroupBy("username").Having("username='xlw'").Find(&users)
  253. if err != nil {
  254. t.Error(err)
  255. panic(err)
  256. }
  257. fmt.Println(users)*/
  258. }
  259. func TestOrderSameMapper(t *testing.T) {
  260. assert.NoError(t, prepareEngine())
  261. testEngine.UnMapType(rValue(new(Userinfo)).Type())
  262. mapper := testEngine.GetTableMapper()
  263. testEngine.SetMapper(core.SameMapper{})
  264. defer func() {
  265. testEngine.UnMapType(rValue(new(Userinfo)).Type())
  266. testEngine.SetMapper(mapper)
  267. }()
  268. assertSync(t, new(Userinfo))
  269. users := make([]Userinfo, 0)
  270. err := testEngine.OrderBy("(id) desc").Find(&users)
  271. if err != nil {
  272. t.Error(err)
  273. panic(err)
  274. }
  275. fmt.Println(users)
  276. users2 := make([]Userinfo, 0)
  277. err = testEngine.Asc("(id)", "Username").Desc("Height").Find(&users2)
  278. if err != nil {
  279. t.Error(err)
  280. panic(err)
  281. }
  282. fmt.Println(users2)
  283. }
  284. func TestHavingSameMapper(t *testing.T) {
  285. assert.NoError(t, prepareEngine())
  286. testEngine.UnMapType(rValue(new(Userinfo)).Type())
  287. mapper := testEngine.GetTableMapper()
  288. testEngine.SetMapper(core.SameMapper{})
  289. defer func() {
  290. testEngine.UnMapType(rValue(new(Userinfo)).Type())
  291. testEngine.SetMapper(mapper)
  292. }()
  293. assertSync(t, new(Userinfo))
  294. users := make([]Userinfo, 0)
  295. err := testEngine.GroupBy("`Username`").Having("`Username`='xlw'").Find(&users)
  296. if err != nil {
  297. t.Fatal(err)
  298. }
  299. fmt.Println(users)
  300. }
  301. func TestFindInts(t *testing.T) {
  302. assert.NoError(t, prepareEngine())
  303. assertSync(t, new(Userinfo))
  304. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  305. var idsInt64 []int64
  306. err := testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsInt64)
  307. if err != nil {
  308. t.Fatal(err)
  309. }
  310. fmt.Println(idsInt64)
  311. var idsInt32 []int32
  312. err = testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsInt32)
  313. if err != nil {
  314. t.Fatal(err)
  315. }
  316. fmt.Println(idsInt32)
  317. var idsInt []int
  318. err = testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsInt)
  319. if err != nil {
  320. t.Fatal(err)
  321. }
  322. fmt.Println(idsInt)
  323. var idsUint []uint
  324. err = testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsUint)
  325. if err != nil {
  326. t.Fatal(err)
  327. }
  328. fmt.Println(idsUint)
  329. type MyInt int
  330. var idsMyInt []MyInt
  331. err = testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsMyInt)
  332. if err != nil {
  333. t.Fatal(err)
  334. }
  335. fmt.Println(idsMyInt)
  336. }
  337. func TestFindStrings(t *testing.T) {
  338. assert.NoError(t, prepareEngine())
  339. assertSync(t, new(Userinfo))
  340. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  341. username := testEngine.GetColumnMapper().Obj2Table("Username")
  342. var idsString []string
  343. err := testEngine.Table(userinfo).Cols(username).Desc("id").Find(&idsString)
  344. if err != nil {
  345. t.Fatal(err)
  346. }
  347. fmt.Println(idsString)
  348. }
  349. func TestFindMyString(t *testing.T) {
  350. assert.NoError(t, prepareEngine())
  351. assertSync(t, new(Userinfo))
  352. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  353. username := testEngine.GetColumnMapper().Obj2Table("Username")
  354. var idsMyString []MyString
  355. err := testEngine.Table(userinfo).Cols(username).Desc("id").Find(&idsMyString)
  356. if err != nil {
  357. t.Fatal(err)
  358. }
  359. fmt.Println(idsMyString)
  360. }
  361. func TestFindInterface(t *testing.T) {
  362. assert.NoError(t, prepareEngine())
  363. assertSync(t, new(Userinfo))
  364. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  365. username := testEngine.GetColumnMapper().Obj2Table("Username")
  366. var idsInterface []interface{}
  367. err := testEngine.Table(userinfo).Cols(username).Desc("id").Find(&idsInterface)
  368. if err != nil {
  369. t.Fatal(err)
  370. }
  371. fmt.Println(idsInterface)
  372. }
  373. func TestFindSliceBytes(t *testing.T) {
  374. assert.NoError(t, prepareEngine())
  375. assertSync(t, new(Userinfo))
  376. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  377. var ids [][][]byte
  378. err := testEngine.Table(userinfo).Desc("id").Find(&ids)
  379. if err != nil {
  380. t.Fatal(err)
  381. }
  382. for _, record := range ids {
  383. fmt.Println(record)
  384. }
  385. }
  386. func TestFindSlicePtrString(t *testing.T) {
  387. assert.NoError(t, prepareEngine())
  388. assertSync(t, new(Userinfo))
  389. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  390. var ids [][]*string
  391. err := testEngine.Table(userinfo).Desc("id").Find(&ids)
  392. if err != nil {
  393. t.Fatal(err)
  394. }
  395. for _, record := range ids {
  396. fmt.Println(record)
  397. }
  398. }
  399. func TestFindMapBytes(t *testing.T) {
  400. assert.NoError(t, prepareEngine())
  401. assertSync(t, new(Userinfo))
  402. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  403. var ids []map[string][]byte
  404. err := testEngine.Table(userinfo).Desc("id").Find(&ids)
  405. if err != nil {
  406. t.Fatal(err)
  407. }
  408. for _, record := range ids {
  409. fmt.Println(record)
  410. }
  411. }
  412. func TestFindMapPtrString(t *testing.T) {
  413. assert.NoError(t, prepareEngine())
  414. assertSync(t, new(Userinfo))
  415. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  416. var ids []map[string]*string
  417. err := testEngine.Table(userinfo).Desc("id").Find(&ids)
  418. assert.NoError(t, err)
  419. for _, record := range ids {
  420. fmt.Println(record)
  421. }
  422. }
  423. func TestFindBit(t *testing.T) {
  424. type FindBitStruct struct {
  425. Id int64
  426. Msg bool `xorm:"bit"`
  427. }
  428. assert.NoError(t, prepareEngine())
  429. assertSync(t, new(FindBitStruct))
  430. cnt, err := testEngine.Insert([]FindBitStruct{
  431. {
  432. Msg: false,
  433. },
  434. {
  435. Msg: true,
  436. },
  437. })
  438. assert.NoError(t, err)
  439. assert.EqualValues(t, 2, cnt)
  440. var results = make([]FindBitStruct, 0, 2)
  441. err = testEngine.Find(&results)
  442. assert.NoError(t, err)
  443. assert.EqualValues(t, 2, len(results))
  444. }
  445. func TestFindMark(t *testing.T) {
  446. type Mark struct {
  447. Mark1 string `xorm:"VARCHAR(1)"`
  448. Mark2 string `xorm:"VARCHAR(1)"`
  449. MarkA string `xorm:"VARCHAR(1)"`
  450. }
  451. assert.NoError(t, prepareEngine())
  452. assertSync(t, new(Mark))
  453. cnt, err := testEngine.Insert([]Mark{
  454. {
  455. Mark1: "1",
  456. Mark2: "2",
  457. MarkA: "A",
  458. },
  459. {
  460. Mark1: "1",
  461. Mark2: "2",
  462. MarkA: "A",
  463. },
  464. })
  465. assert.NoError(t, err)
  466. assert.EqualValues(t, 2, cnt)
  467. var results = make([]Mark, 0, 2)
  468. err = testEngine.Find(&results)
  469. assert.NoError(t, err)
  470. assert.EqualValues(t, 2, len(results))
  471. }
  472. func TestFindAndCountOneFunc(t *testing.T) {
  473. type FindAndCountStruct struct {
  474. Id int64
  475. Content string
  476. Msg bool `xorm:"bit"`
  477. }
  478. assert.NoError(t, prepareEngine())
  479. assertSync(t, new(FindAndCountStruct))
  480. cnt, err := testEngine.Insert([]FindAndCountStruct{
  481. {
  482. Content: "111",
  483. Msg: false,
  484. },
  485. {
  486. Content: "222",
  487. Msg: true,
  488. },
  489. })
  490. assert.NoError(t, err)
  491. assert.EqualValues(t, 2, cnt)
  492. var results = make([]FindAndCountStruct, 0, 2)
  493. cnt, err = testEngine.FindAndCount(&results)
  494. assert.NoError(t, err)
  495. assert.EqualValues(t, 2, len(results))
  496. assert.EqualValues(t, 2, cnt)
  497. results = make([]FindAndCountStruct, 0, 1)
  498. cnt, err = testEngine.Where("msg = ?", true).FindAndCount(&results)
  499. assert.NoError(t, err)
  500. assert.EqualValues(t, 1, len(results))
  501. assert.EqualValues(t, 1, cnt)
  502. results = make([]FindAndCountStruct, 0, 1)
  503. cnt, err = testEngine.Where("msg = ?", true).Limit(1).FindAndCount(&results)
  504. assert.NoError(t, err)
  505. assert.EqualValues(t, 1, len(results))
  506. assert.EqualValues(t, 1, cnt)
  507. results = make([]FindAndCountStruct, 0, 1)
  508. cnt, err = testEngine.Where("msg = ?", true).Select("id, content, msg").
  509. Limit(1).FindAndCount(&results)
  510. assert.NoError(t, err)
  511. assert.EqualValues(t, 1, len(results))
  512. assert.EqualValues(t, 1, cnt)
  513. results = make([]FindAndCountStruct, 0, 1)
  514. cnt, err = testEngine.Where("msg = ?", true).Desc("id").
  515. Limit(1).FindAndCount(&results)
  516. assert.NoError(t, err)
  517. assert.EqualValues(t, 1, len(results))
  518. assert.EqualValues(t, 1, cnt)
  519. }