session_find_test.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794
  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. "time"
  10. "github.com/stretchr/testify/assert"
  11. "github.com/xormplus/core"
  12. )
  13. func TestJoinLimit(t *testing.T) {
  14. assert.NoError(t, prepareEngine())
  15. type Salary struct {
  16. Id int64
  17. Lid int64
  18. }
  19. type CheckList struct {
  20. Id int64
  21. Eid int64
  22. }
  23. type Empsetting struct {
  24. Id int64
  25. Name string
  26. }
  27. assert.NoError(t, testEngine.Sync2(new(Salary), new(CheckList), new(Empsetting)))
  28. var emp Empsetting
  29. cnt, err := testEngine.Insert(&emp)
  30. assert.NoError(t, err)
  31. assert.EqualValues(t, 1, cnt)
  32. var checklist = CheckList{
  33. Eid: emp.Id,
  34. }
  35. cnt, err = testEngine.Insert(&checklist)
  36. assert.NoError(t, err)
  37. assert.EqualValues(t, 1, cnt)
  38. var salary = Salary{
  39. Lid: checklist.Id,
  40. }
  41. cnt, err = testEngine.Insert(&salary)
  42. assert.NoError(t, err)
  43. assert.EqualValues(t, 1, cnt)
  44. var salaries []Salary
  45. err = testEngine.Table("salary").
  46. Join("INNER", "check_list", "check_list.id = salary.lid").
  47. Join("LEFT", "empsetting", "empsetting.id = check_list.eid").
  48. Limit(10, 0).
  49. Find(&salaries)
  50. assert.NoError(t, err)
  51. }
  52. func assertSync(t *testing.T, beans ...interface{}) {
  53. for _, bean := range beans {
  54. assert.NoError(t, testEngine.DropTables(bean))
  55. assert.NoError(t, testEngine.Sync2(bean))
  56. }
  57. }
  58. func TestWhere(t *testing.T) {
  59. assert.NoError(t, prepareEngine())
  60. assertSync(t, new(Userinfo))
  61. users := make([]Userinfo, 0)
  62. err := testEngine.Where("(id) > ?", 2).Find(&users)
  63. if err != nil {
  64. t.Error(err)
  65. panic(err)
  66. }
  67. fmt.Println(users)
  68. err = testEngine.Where("(id) > ?", 2).And("(id) < ?", 10).Find(&users)
  69. if err != nil {
  70. t.Error(err)
  71. panic(err)
  72. }
  73. fmt.Println(users)
  74. }
  75. func TestFind(t *testing.T) {
  76. assert.NoError(t, prepareEngine())
  77. assertSync(t, new(Userinfo))
  78. users := make([]Userinfo, 0)
  79. err := testEngine.Find(&users)
  80. assert.NoError(t, err)
  81. for _, user := range users {
  82. fmt.Println(user)
  83. }
  84. users2 := make([]Userinfo, 0)
  85. var tbName = testEngine.Quote(testEngine.TableName(new(Userinfo), true))
  86. err = testEngine.SQL("select * from " + tbName).Find(&users2)
  87. assert.NoError(t, err)
  88. }
  89. func TestFind2(t *testing.T) {
  90. assert.NoError(t, prepareEngine())
  91. users := make([]*Userinfo, 0)
  92. assertSync(t, new(Userinfo))
  93. err := testEngine.Find(&users)
  94. assert.NoError(t, err)
  95. for _, user := range users {
  96. fmt.Println(user)
  97. }
  98. }
  99. type Team struct {
  100. Id int64
  101. }
  102. type TeamUser struct {
  103. OrgId int64
  104. Uid int64
  105. TeamId int64
  106. }
  107. func (TeamUser) TableName() string {
  108. return "team_user"
  109. }
  110. func TestFind3(t *testing.T) {
  111. var teamUser = new(TeamUser)
  112. assert.NoError(t, prepareEngine())
  113. err := testEngine.Sync2(new(Team), teamUser)
  114. assert.NoError(t, err)
  115. var teams []Team
  116. err = testEngine.Cols("`team`.id").
  117. Where("`team_user`.org_id=?", 1).
  118. And("`team_user`.uid=?", 2).
  119. Join("INNER", "`team_user`", "`team_user`.team_id=`team`.id").
  120. Find(&teams)
  121. assert.NoError(t, err)
  122. teams = make([]Team, 0)
  123. err = testEngine.Cols("`team`.id").
  124. Where("`team_user`.org_id=?", 1).
  125. And("`team_user`.uid=?", 2).
  126. Join("INNER", teamUser, "`team_user`.team_id=`team`.id").
  127. Find(&teams)
  128. assert.NoError(t, err)
  129. teams = make([]Team, 0)
  130. err = testEngine.Cols("`team`.id").
  131. Where("`team_user`.org_id=?", 1).
  132. And("`team_user`.uid=?", 2).
  133. Join("INNER", []interface{}{teamUser}, "`team_user`.team_id=`team`.id").
  134. Find(&teams)
  135. assert.NoError(t, err)
  136. teams = make([]Team, 0)
  137. err = testEngine.Cols("`team`.id").
  138. Where("`tu`.org_id=?", 1).
  139. And("`tu`.uid=?", 2).
  140. Join("INNER", []string{"team_user", "tu"}, "`tu`.team_id=`team`.id").
  141. Find(&teams)
  142. assert.NoError(t, err)
  143. teams = make([]Team, 0)
  144. err = testEngine.Cols("`team`.id").
  145. Where("`tu`.org_id=?", 1).
  146. And("`tu`.uid=?", 2).
  147. Join("INNER", []interface{}{"team_user", "tu"}, "`tu`.team_id=`team`.id").
  148. Find(&teams)
  149. assert.NoError(t, err)
  150. teams = make([]Team, 0)
  151. err = testEngine.Cols("`team`.id").
  152. Where("`tu`.org_id=?", 1).
  153. And("`tu`.uid=?", 2).
  154. Join("INNER", []interface{}{teamUser, "tu"}, "`tu`.team_id=`team`.id").
  155. Find(&teams)
  156. assert.NoError(t, err)
  157. }
  158. func TestFindMap(t *testing.T) {
  159. assert.NoError(t, prepareEngine())
  160. assertSync(t, new(Userinfo))
  161. users := make(map[int64]Userinfo)
  162. err := testEngine.Find(&users)
  163. if err != nil {
  164. t.Error(err)
  165. panic(err)
  166. }
  167. for _, user := range users {
  168. fmt.Println(user)
  169. }
  170. }
  171. func TestFindMap2(t *testing.T) {
  172. assert.NoError(t, prepareEngine())
  173. assertSync(t, new(Userinfo))
  174. users := make(map[int64]*Userinfo)
  175. err := testEngine.Find(&users)
  176. if err != nil {
  177. t.Error(err)
  178. panic(err)
  179. }
  180. for id, user := range users {
  181. fmt.Println(id, user)
  182. }
  183. }
  184. func TestDistinct(t *testing.T) {
  185. assert.NoError(t, prepareEngine())
  186. assertSync(t, new(Userinfo))
  187. _, err := testEngine.Insert(&Userinfo{
  188. Username: "lunny",
  189. })
  190. assert.NoError(t, err)
  191. users := make([]Userinfo, 0)
  192. departname := testEngine.GetTableMapper().Obj2Table("Departname")
  193. err = testEngine.Distinct(departname).Find(&users)
  194. assert.NoError(t, err)
  195. assert.EqualValues(t, 1, len(users))
  196. fmt.Println(users)
  197. type Depart struct {
  198. Departname string
  199. }
  200. users2 := make([]Depart, 0)
  201. err = testEngine.Distinct(departname).Table(new(Userinfo)).Find(&users2)
  202. assert.NoError(t, err)
  203. if len(users2) != 1 {
  204. fmt.Println(len(users2))
  205. t.Error(err)
  206. panic(errors.New("should be one record"))
  207. }
  208. fmt.Println(users2)
  209. }
  210. func TestOrder(t *testing.T) {
  211. assert.NoError(t, prepareEngine())
  212. assertSync(t, new(Userinfo))
  213. users := make([]Userinfo, 0)
  214. err := testEngine.OrderBy("id desc").Find(&users)
  215. assert.NoError(t, err)
  216. fmt.Println(users)
  217. users2 := make([]Userinfo, 0)
  218. err = testEngine.Asc("id", "username").Desc("height").Find(&users2)
  219. assert.NoError(t, err)
  220. fmt.Println(users2)
  221. }
  222. func TestHaving(t *testing.T) {
  223. assert.NoError(t, prepareEngine())
  224. assertSync(t, new(Userinfo))
  225. users := make([]Userinfo, 0)
  226. err := testEngine.GroupBy("username").Having("username='xlw'").Find(&users)
  227. assert.NoError(t, err)
  228. fmt.Println(users)
  229. /*users = make([]Userinfo, 0)
  230. err = testEngine.Cols("id, username").GroupBy("username").Having("username='xlw'").Find(&users)
  231. if err != nil {
  232. t.Error(err)
  233. panic(err)
  234. }
  235. fmt.Println(users)*/
  236. }
  237. func TestOrderSameMapper(t *testing.T) {
  238. assert.NoError(t, prepareEngine())
  239. testEngine.UnMapType(rValue(new(Userinfo)).Type())
  240. mapper := testEngine.GetTableMapper()
  241. testEngine.SetMapper(core.SameMapper{})
  242. defer func() {
  243. testEngine.UnMapType(rValue(new(Userinfo)).Type())
  244. testEngine.SetMapper(mapper)
  245. }()
  246. assertSync(t, new(Userinfo))
  247. users := make([]Userinfo, 0)
  248. err := testEngine.OrderBy("(id) desc").Find(&users)
  249. assert.NoError(t, err)
  250. fmt.Println(users)
  251. users2 := make([]Userinfo, 0)
  252. err = testEngine.Asc("(id)", "Username").Desc("Height").Find(&users2)
  253. assert.NoError(t, err)
  254. fmt.Println(users2)
  255. }
  256. func TestHavingSameMapper(t *testing.T) {
  257. assert.NoError(t, prepareEngine())
  258. testEngine.UnMapType(rValue(new(Userinfo)).Type())
  259. mapper := testEngine.GetTableMapper()
  260. testEngine.SetMapper(core.SameMapper{})
  261. defer func() {
  262. testEngine.UnMapType(rValue(new(Userinfo)).Type())
  263. testEngine.SetMapper(mapper)
  264. }()
  265. assertSync(t, new(Userinfo))
  266. users := make([]Userinfo, 0)
  267. err := testEngine.GroupBy("`Username`").Having("`Username`='xlw'").Find(&users)
  268. if err != nil {
  269. t.Fatal(err)
  270. }
  271. fmt.Println(users)
  272. }
  273. func TestFindInts(t *testing.T) {
  274. assert.NoError(t, prepareEngine())
  275. assertSync(t, new(Userinfo))
  276. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  277. var idsInt64 []int64
  278. err := testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsInt64)
  279. if err != nil {
  280. t.Fatal(err)
  281. }
  282. fmt.Println(idsInt64)
  283. var idsInt32 []int32
  284. err = testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsInt32)
  285. if err != nil {
  286. t.Fatal(err)
  287. }
  288. fmt.Println(idsInt32)
  289. var idsInt []int
  290. err = testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsInt)
  291. if err != nil {
  292. t.Fatal(err)
  293. }
  294. fmt.Println(idsInt)
  295. var idsUint []uint
  296. err = testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsUint)
  297. if err != nil {
  298. t.Fatal(err)
  299. }
  300. fmt.Println(idsUint)
  301. type MyInt int
  302. var idsMyInt []MyInt
  303. err = testEngine.Table(userinfo).Cols("id").Desc("id").Find(&idsMyInt)
  304. if err != nil {
  305. t.Fatal(err)
  306. }
  307. fmt.Println(idsMyInt)
  308. }
  309. func TestFindStrings(t *testing.T) {
  310. assert.NoError(t, prepareEngine())
  311. assertSync(t, new(Userinfo))
  312. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  313. username := testEngine.GetColumnMapper().Obj2Table("Username")
  314. var idsString []string
  315. err := testEngine.Table(userinfo).Cols(username).Desc("id").Find(&idsString)
  316. if err != nil {
  317. t.Fatal(err)
  318. }
  319. fmt.Println(idsString)
  320. }
  321. func TestFindMyString(t *testing.T) {
  322. assert.NoError(t, prepareEngine())
  323. assertSync(t, new(Userinfo))
  324. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  325. username := testEngine.GetColumnMapper().Obj2Table("Username")
  326. var idsMyString []MyString
  327. err := testEngine.Table(userinfo).Cols(username).Desc("id").Find(&idsMyString)
  328. if err != nil {
  329. t.Fatal(err)
  330. }
  331. fmt.Println(idsMyString)
  332. }
  333. func TestFindInterface(t *testing.T) {
  334. assert.NoError(t, prepareEngine())
  335. assertSync(t, new(Userinfo))
  336. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  337. username := testEngine.GetColumnMapper().Obj2Table("Username")
  338. var idsInterface []interface{}
  339. err := testEngine.Table(userinfo).Cols(username).Desc("id").Find(&idsInterface)
  340. if err != nil {
  341. t.Fatal(err)
  342. }
  343. fmt.Println(idsInterface)
  344. }
  345. func TestFindSliceBytes(t *testing.T) {
  346. assert.NoError(t, prepareEngine())
  347. assertSync(t, new(Userinfo))
  348. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  349. var ids [][][]byte
  350. err := testEngine.Table(userinfo).Desc("id").Find(&ids)
  351. if err != nil {
  352. t.Fatal(err)
  353. }
  354. for _, record := range ids {
  355. fmt.Println(record)
  356. }
  357. }
  358. func TestFindSlicePtrString(t *testing.T) {
  359. assert.NoError(t, prepareEngine())
  360. assertSync(t, new(Userinfo))
  361. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  362. var ids [][]*string
  363. err := testEngine.Table(userinfo).Desc("id").Find(&ids)
  364. if err != nil {
  365. t.Fatal(err)
  366. }
  367. for _, record := range ids {
  368. fmt.Println(record)
  369. }
  370. }
  371. func TestFindMapBytes(t *testing.T) {
  372. assert.NoError(t, prepareEngine())
  373. assertSync(t, new(Userinfo))
  374. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  375. var ids []map[string][]byte
  376. err := testEngine.Table(userinfo).Desc("id").Find(&ids)
  377. if err != nil {
  378. t.Fatal(err)
  379. }
  380. for _, record := range ids {
  381. fmt.Println(record)
  382. }
  383. }
  384. func TestFindMapPtrString(t *testing.T) {
  385. assert.NoError(t, prepareEngine())
  386. assertSync(t, new(Userinfo))
  387. userinfo := testEngine.GetTableMapper().Obj2Table("Userinfo")
  388. var ids []map[string]*string
  389. err := testEngine.Table(userinfo).Desc("id").Find(&ids)
  390. assert.NoError(t, err)
  391. for _, record := range ids {
  392. fmt.Println(record)
  393. }
  394. }
  395. func TestFindBit(t *testing.T) {
  396. type FindBitStruct struct {
  397. Id int64
  398. Msg bool `xorm:"bit"`
  399. }
  400. assert.NoError(t, prepareEngine())
  401. assertSync(t, new(FindBitStruct))
  402. cnt, err := testEngine.Insert([]FindBitStruct{
  403. {
  404. Msg: false,
  405. },
  406. {
  407. Msg: true,
  408. },
  409. })
  410. assert.NoError(t, err)
  411. assert.EqualValues(t, 2, cnt)
  412. var results = make([]FindBitStruct, 0, 2)
  413. err = testEngine.Find(&results)
  414. assert.NoError(t, err)
  415. assert.EqualValues(t, 2, len(results))
  416. }
  417. func TestFindMark(t *testing.T) {
  418. type Mark struct {
  419. Mark1 string `xorm:"VARCHAR(1)"`
  420. Mark2 string `xorm:"VARCHAR(1)"`
  421. MarkA string `xorm:"VARCHAR(1)"`
  422. }
  423. assert.NoError(t, prepareEngine())
  424. assertSync(t, new(Mark))
  425. cnt, err := testEngine.Insert([]Mark{
  426. {
  427. Mark1: "1",
  428. Mark2: "2",
  429. MarkA: "A",
  430. },
  431. {
  432. Mark1: "1",
  433. Mark2: "2",
  434. MarkA: "A",
  435. },
  436. })
  437. assert.NoError(t, err)
  438. assert.EqualValues(t, 2, cnt)
  439. var results = make([]Mark, 0, 2)
  440. err = testEngine.Find(&results)
  441. assert.NoError(t, err)
  442. assert.EqualValues(t, 2, len(results))
  443. }
  444. func TestFindAndCountOneFunc(t *testing.T) {
  445. type FindAndCountStruct struct {
  446. Id int64
  447. Content string
  448. Msg bool `xorm:"bit"`
  449. }
  450. assert.NoError(t, prepareEngine())
  451. assertSync(t, new(FindAndCountStruct))
  452. cnt, err := testEngine.Insert([]FindAndCountStruct{
  453. {
  454. Content: "111",
  455. Msg: false,
  456. },
  457. {
  458. Content: "222",
  459. Msg: true,
  460. },
  461. })
  462. assert.NoError(t, err)
  463. assert.EqualValues(t, 2, cnt)
  464. var results = make([]FindAndCountStruct, 0, 2)
  465. cnt, err = testEngine.FindAndCount(&results)
  466. assert.NoError(t, err)
  467. assert.EqualValues(t, 2, len(results))
  468. assert.EqualValues(t, 2, cnt)
  469. results = make([]FindAndCountStruct, 0, 1)
  470. cnt, err = testEngine.Where("msg = ?", true).FindAndCount(&results)
  471. assert.NoError(t, err)
  472. assert.EqualValues(t, 1, len(results))
  473. assert.EqualValues(t, 1, cnt)
  474. results = make([]FindAndCountStruct, 0, 1)
  475. cnt, err = testEngine.Where("msg = ?", true).Limit(1).FindAndCount(&results)
  476. assert.NoError(t, err)
  477. assert.EqualValues(t, 1, len(results))
  478. assert.EqualValues(t, 1, cnt)
  479. results = make([]FindAndCountStruct, 0, 1)
  480. cnt, err = testEngine.Where("msg = ?", true).Select("id, content, msg").
  481. Limit(1).FindAndCount(&results)
  482. assert.NoError(t, err)
  483. assert.EqualValues(t, 1, len(results))
  484. assert.EqualValues(t, 1, cnt)
  485. results = make([]FindAndCountStruct, 0, 1)
  486. cnt, err = testEngine.Where("msg = ?", true).Desc("id").
  487. Limit(1).FindAndCount(&results)
  488. assert.NoError(t, err)
  489. assert.EqualValues(t, 1, len(results))
  490. assert.EqualValues(t, 1, cnt)
  491. }
  492. type FindMapDevice struct {
  493. Deviceid string `xorm:"pk"`
  494. Status int
  495. }
  496. func (device *FindMapDevice) TableName() string {
  497. return "devices"
  498. }
  499. func TestFindMapStringId(t *testing.T) {
  500. assert.NoError(t, prepareEngine())
  501. assertSync(t, new(FindMapDevice))
  502. cnt, err := testEngine.Insert(&FindMapDevice{
  503. Deviceid: "1",
  504. Status: 1,
  505. })
  506. assert.NoError(t, err)
  507. assert.EqualValues(t, 1, cnt)
  508. deviceIDs := []string{"1"}
  509. deviceMaps := make(map[string]*FindMapDevice, len(deviceIDs))
  510. err = testEngine.
  511. Where("status = ?", 1).
  512. In("deviceid", deviceIDs).
  513. Find(&deviceMaps)
  514. assert.NoError(t, err)
  515. deviceMaps2 := make(map[string]FindMapDevice, len(deviceIDs))
  516. err = testEngine.
  517. Where("status = ?", 1).
  518. In("deviceid", deviceIDs).
  519. Find(&deviceMaps2)
  520. assert.NoError(t, err)
  521. devices := make([]*FindMapDevice, 0, len(deviceIDs))
  522. err = testEngine.Find(&devices)
  523. assert.NoError(t, err)
  524. devices2 := make([]FindMapDevice, 0, len(deviceIDs))
  525. err = testEngine.Find(&devices2)
  526. assert.NoError(t, err)
  527. var device FindMapDevice
  528. has, err := testEngine.Get(&device)
  529. assert.NoError(t, err)
  530. assert.True(t, has)
  531. has, err = testEngine.Exist(&FindMapDevice{})
  532. assert.NoError(t, err)
  533. assert.True(t, has)
  534. cnt, err = testEngine.Count(new(FindMapDevice))
  535. assert.NoError(t, err)
  536. assert.EqualValues(t, 1, cnt)
  537. cnt, err = testEngine.ID("1").Update(&FindMapDevice{
  538. Status: 2,
  539. })
  540. assert.NoError(t, err)
  541. assert.EqualValues(t, 1, cnt)
  542. sum, err := testEngine.SumInt(new(FindMapDevice), "status")
  543. assert.NoError(t, err)
  544. assert.EqualValues(t, 2, sum)
  545. cnt, err = testEngine.ID("1").Delete(new(FindMapDevice))
  546. assert.NoError(t, err)
  547. assert.EqualValues(t, 1, cnt)
  548. }
  549. func TestFindExtends(t *testing.T) {
  550. type FindExtendsB struct {
  551. ID int64
  552. }
  553. type FindExtendsA struct {
  554. FindExtendsB `xorm:"extends"`
  555. }
  556. assert.NoError(t, prepareEngine())
  557. assertSync(t, new(FindExtendsA))
  558. cnt, err := testEngine.Insert(&FindExtendsA{
  559. FindExtendsB: FindExtendsB{},
  560. })
  561. assert.NoError(t, err)
  562. assert.EqualValues(t, 1, cnt)
  563. cnt, err = testEngine.Insert(&FindExtendsA{
  564. FindExtendsB: FindExtendsB{},
  565. })
  566. assert.NoError(t, err)
  567. assert.EqualValues(t, 1, cnt)
  568. var results []FindExtendsA
  569. err = testEngine.Find(&results)
  570. assert.NoError(t, err)
  571. assert.EqualValues(t, 2, len(results))
  572. }
  573. func TestFindExtends3(t *testing.T) {
  574. type FindExtendsCC struct {
  575. ID int64
  576. Name string
  577. }
  578. type FindExtendsBB struct {
  579. FindExtendsCC `xorm:"extends"`
  580. }
  581. type FindExtendsAA struct {
  582. FindExtendsBB `xorm:"extends"`
  583. }
  584. assert.NoError(t, prepareEngine())
  585. assertSync(t, new(FindExtendsAA))
  586. cnt, err := testEngine.Insert(&FindExtendsAA{
  587. FindExtendsBB: FindExtendsBB{
  588. FindExtendsCC: FindExtendsCC{
  589. Name: "cc1",
  590. },
  591. },
  592. })
  593. assert.NoError(t, err)
  594. assert.EqualValues(t, 1, cnt)
  595. cnt, err = testEngine.Insert(&FindExtendsAA{
  596. FindExtendsBB: FindExtendsBB{
  597. FindExtendsCC: FindExtendsCC{
  598. Name: "cc2",
  599. },
  600. },
  601. })
  602. assert.NoError(t, err)
  603. assert.EqualValues(t, 1, cnt)
  604. var results []FindExtendsAA
  605. err = testEngine.Find(&results)
  606. assert.NoError(t, err)
  607. assert.EqualValues(t, 2, len(results))
  608. }
  609. func TestFindCacheLimit(t *testing.T) {
  610. type InviteCode struct {
  611. ID int64 `xorm:"pk autoincr 'id'"`
  612. Code string `xorm:"unique"`
  613. Created time.Time `xorm:"created"`
  614. }
  615. assert.NoError(t, prepareEngine())
  616. assertSync(t, new(InviteCode))
  617. cnt, err := testEngine.Insert(&InviteCode{
  618. Code: "123456",
  619. })
  620. assert.NoError(t, err)
  621. assert.EqualValues(t, 1, cnt)
  622. cnt, err = testEngine.Insert(&InviteCode{
  623. Code: "234567",
  624. })
  625. assert.NoError(t, err)
  626. assert.EqualValues(t, 1, cnt)
  627. for i := 0; i < 8; i++ {
  628. var beans []InviteCode
  629. err = testEngine.Limit(1, 0).Find(&beans)
  630. assert.NoError(t, err)
  631. assert.EqualValues(t, 1, len(beans))
  632. }
  633. for i := 0; i < 8; i++ {
  634. var beans2 []*InviteCode
  635. err = testEngine.Limit(1, 0).Find(&beans2)
  636. assert.NoError(t, err)
  637. assert.EqualValues(t, 1, len(beans2))
  638. }
  639. }
  640. func TestFindJoin(t *testing.T) {
  641. type SceneItem struct {
  642. Type int
  643. DeviceId int64
  644. }
  645. type DeviceUserPrivrels struct {
  646. UserId int64
  647. DeviceId int64
  648. }
  649. assert.NoError(t, prepareEngine())
  650. assertSync(t, new(SceneItem), new(DeviceUserPrivrels))
  651. var scenes []SceneItem
  652. err := testEngine.Join("LEFT OUTER", "device_user_privrels", "device_user_privrels.device_id=scene_item.device_id").
  653. Where("scene_item.type=?", 3).Or("device_user_privrels.user_id=?", 339).Find(&scenes)
  654. assert.NoError(t, err)
  655. scenes = make([]SceneItem, 0)
  656. err = testEngine.Join("LEFT OUTER", new(DeviceUserPrivrels), "device_user_privrels.device_id=scene_item.device_id").
  657. Where("scene_item.type=?", 3).Or("device_user_privrels.user_id=?", 339).Find(&scenes)
  658. assert.NoError(t, err)
  659. }