You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1454 lines
30 KiB

  1. package bptree
  2. import (
  3. "encoding/hex"
  4. "runtime/debug"
  5. "sort"
  6. "sync"
  7. "testing"
  8. crand "crypto/rand"
  9. "encoding/binary"
  10. mrand "math/rand"
  11. )
  12. var rand *mrand.Rand
  13. func init() {
  14. seed := make([]byte, 8)
  15. if _, err := crand.Read(seed); err == nil {
  16. rand = ThreadSafeRand(int64(binary.BigEndian.Uint64(seed)))
  17. } else {
  18. panic(err)
  19. }
  20. }
  21. func randslice(length int) []byte {
  22. return RandSlice(length)
  23. }
  24. func randstr(length int) String {
  25. return String(RandStr(length))
  26. }
  27. type Strings []String
  28. func (self Strings) Len() int {
  29. return len(self)
  30. }
  31. func (self Strings) Less(i, j int) bool {
  32. return self[i].Less(self[j])
  33. }
  34. func (self Strings) Swap(i, j int) {
  35. self[i], self[j] = self[j], self[i]
  36. }
  37. type record struct {
  38. key String
  39. value ItemValue
  40. }
  41. type records []*record
  42. func (self records) Len() int {
  43. return len(self)
  44. }
  45. func (self records) Less(i, j int) bool {
  46. return self[i].key.Less(self[j].key)
  47. }
  48. func (self records) Swap(i, j int) {
  49. self[i], self[j] = self[j], self[i]
  50. }
  51. func BenchmarkBpTree(b *testing.B) {
  52. b.StopTimer()
  53. recs := make(records, 100)
  54. ranrec := func() *record {
  55. return &record{randstr(20), randstr(20)}
  56. }
  57. for i := range recs {
  58. recs[i] = ranrec()
  59. }
  60. b.StartTimer()
  61. for i := 0; i < b.N; i++ {
  62. t := NewBpTree(23)
  63. for _, r := range recs {
  64. t.Add(r.key, r.value)
  65. }
  66. for _, r := range recs {
  67. t.RemoveWhere(r.key, func(value ItemValue) bool { return true })
  68. }
  69. }
  70. }
  71. func TestAddHasCountFindIterateRemove(t *testing.T) {
  72. ranrec := func() *record {
  73. return &record{
  74. randstr(12),
  75. randstr(12),
  76. }
  77. }
  78. test := func(bpt *BpTree) {
  79. var err error
  80. recs := make(records, 128)
  81. new_recs := make(records, 128)
  82. for i := range recs {
  83. r := ranrec()
  84. recs[i] = r
  85. new_recs[i] = &record{r.key, randstr(12)}
  86. err = bpt.Add(r.key, r.value)
  87. if err != nil {
  88. t.Error(err)
  89. }
  90. }
  91. for i, r := range recs {
  92. if has := bpt.Has(r.key); !has {
  93. t.Error(bpt, "Missing key")
  94. }
  95. if has := bpt.Has(randstr(10)); has {
  96. t.Error("Table has extra key")
  97. }
  98. if count := bpt.Count(r.key); count != 1 {
  99. t.Error(bpt, "Missing key")
  100. }
  101. if count := bpt.Count(randstr(10)); count != 0 {
  102. t.Error("Table has extra key")
  103. }
  104. for k, v, next := bpt.Find(r.key)(); next != nil; k, v, next = next() {
  105. if !k.Equals(r.key) {
  106. t.Error(bpt, "Find Failed Key Error")
  107. }
  108. if !v.(String).Equals(r.value) {
  109. t.Error(bpt, "Find Failed Value Error")
  110. }
  111. }
  112. err = bpt.Replace(r.key, func(value ItemValue) bool { return true }, new_recs[i].value)
  113. if err != nil {
  114. t.Error(err)
  115. }
  116. }
  117. sort.Sort(recs)
  118. sort.Sort(new_recs)
  119. i := 0
  120. for k, v, next := bpt.Iterate()(); next != nil; k, v, next = next() {
  121. if !recs[i].key.Equals(k) {
  122. t.Error("iterate error wrong key")
  123. }
  124. if !new_recs[i].value.Equals(v.(String)) {
  125. t.Error("iterate error wrong value")
  126. }
  127. i++
  128. }
  129. i = len(recs) - 1
  130. for k, v, next := bpt.Backward()(); next != nil; k, v, next = next() {
  131. if !recs[i].key.Equals(k) {
  132. t.Error("iterate error wrong key")
  133. }
  134. if !new_recs[i].value.Equals(v.(String)) {
  135. t.Error("iterate error wrong value")
  136. }
  137. i--
  138. }
  139. i = 0
  140. for k, next := bpt.Keys()(); next != nil; k, next = next() {
  141. if !recs[i].key.Equals(k) {
  142. t.Error("iterate error wrong key")
  143. }
  144. i++
  145. }
  146. i = 7
  147. for k, v, next := bpt.Range(recs[i].key, recs[i+(len(recs)/2)].key)(); next != nil; k, v, next = next() {
  148. if !recs[i].key.Equals(k) {
  149. t.Error("iterate error wrong key")
  150. }
  151. if !new_recs[i].value.Equals(v.(String)) {
  152. t.Error("iterate error wrong value")
  153. }
  154. i++
  155. }
  156. for k, v, next := bpt.Range(recs[i].key, recs[7].key)(); next != nil; k, v, next = next() {
  157. if !recs[i].key.Equals(k) {
  158. t.Error("iterate error wrong key")
  159. }
  160. if !new_recs[i].value.Equals(v.(String)) {
  161. t.Error("iterate error wrong value", k, v, recs[i].value, new_recs[i].value)
  162. }
  163. i--
  164. }
  165. for i, r := range recs {
  166. if has := bpt.Has(r.key); !has {
  167. t.Error(bpt, "Missing key")
  168. }
  169. if count := bpt.Count(r.key); count != 1 {
  170. t.Error(bpt, "Missing key")
  171. }
  172. if err := bpt.RemoveWhere(r.key, func(value ItemValue) bool { return true }); err != nil {
  173. t.Fatal(bpt, err)
  174. }
  175. if has := bpt.Has(r.key); has {
  176. t.Error("Table has extra key")
  177. }
  178. for _, x := range recs[i+1:] {
  179. if has := bpt.Has(x.key); !has {
  180. t.Error(bpt, "Missing key", x.key)
  181. }
  182. }
  183. }
  184. }
  185. for i := 2; i < 64; i++ {
  186. test(NewBpTree(i))
  187. }
  188. }
  189. func TestBpMap(t *testing.T) {
  190. ranrec := func() *record {
  191. return &record{
  192. randstr(12),
  193. randstr(12),
  194. }
  195. }
  196. test := func(table MapOperable) {
  197. recs := make(records, 400)
  198. for i := range recs {
  199. r := ranrec()
  200. recs[i] = r
  201. err := table.Put(r.key, String(""))
  202. if err != nil {
  203. t.Error(err)
  204. }
  205. err = table.Put(r.key, r.value)
  206. if err != nil {
  207. t.Error(err)
  208. }
  209. }
  210. for _, r := range recs {
  211. if has := table.Has(r.key); !has {
  212. t.Error(table, "Missing key")
  213. }
  214. if has := table.Has(randstr(12)); has {
  215. t.Error("Table has extra key")
  216. }
  217. if val, err := table.Get(r.key); err != nil {
  218. t.Error(err)
  219. } else if !(val.(String)).Equals(r.value) {
  220. t.Error("wrong value")
  221. }
  222. }
  223. for i, x := range recs {
  224. if val, err := table.Remove(x.key); err != nil {
  225. t.Error(err)
  226. } else if !(val.(String)).Equals(x.value) {
  227. t.Error("wrong value")
  228. }
  229. for _, r := range recs[i+1:] {
  230. if has := table.Has(r.key); !has {
  231. t.Error("Missing key")
  232. }
  233. if has := table.Has(randstr(12)); has {
  234. t.Error("Table has extra key")
  235. }
  236. if val, err := table.Get(r.key); err != nil {
  237. t.Error(err)
  238. } else if !(val.(String)).Equals(r.value) {
  239. t.Error("wrong value")
  240. }
  241. }
  242. }
  243. }
  244. test(NewBpMap(23))
  245. }
  246. func Test_get_start(t *testing.T) {
  247. root := NewLeaf(2, false)
  248. root, err := root.put(Int(1), Int(1))
  249. if err != nil {
  250. t.Error(err)
  251. }
  252. root, err = root.put(Int(5), Int(3))
  253. if err != nil {
  254. t.Error(err)
  255. }
  256. root, err = root.put(Int(3), Int(2))
  257. if err != nil {
  258. t.Error(err)
  259. }
  260. t.Log(root)
  261. t.Log(root.pointers[0])
  262. t.Log(root.pointers[1])
  263. i, n := root.get_start(Int(1))
  264. if n != root.pointers[0] {
  265. t.Error("wrong node from get_start")
  266. }
  267. if i != 0 {
  268. t.Error("wrong index from get_start")
  269. }
  270. i, n = root.get_start(Int(3))
  271. if n != root.pointers[0] {
  272. t.Error("wrong node from get_start")
  273. }
  274. if i != 1 {
  275. t.Error("wrong index from get_start")
  276. }
  277. i, n = root.get_start(Int(5))
  278. if n != root.pointers[1] {
  279. t.Error("wrong node from get_start")
  280. }
  281. if i != 0 {
  282. t.Error("wrong index from get_start")
  283. }
  284. i, n = root.get_start(Int(2))
  285. if n != root.pointers[0] {
  286. t.Error("wrong node from get_start")
  287. }
  288. if i != 1 {
  289. t.Error("wrong index from get_start")
  290. }
  291. i, n = root.get_start(Int(4))
  292. t.Log(n)
  293. if n != root.pointers[1] {
  294. t.Error("wrong node from get_start")
  295. }
  296. if i != 0 {
  297. t.Error("wrong index from get_start")
  298. }
  299. i, n = root.get_start(Int(0))
  300. if n != root.pointers[0] {
  301. t.Error("wrong node from get_start")
  302. }
  303. if i != 0 {
  304. t.Error("wrong index from get_start")
  305. }
  306. i, n = root.get_start(Int(5))
  307. if n != root.pointers[1] {
  308. t.Error("wrong node from get_start")
  309. }
  310. if i != 0 {
  311. t.Error("wrong index from get_start")
  312. }
  313. }
  314. func Test_get_end(t *testing.T) {
  315. root := NewLeaf(3, false)
  316. root, err := root.put(Int(1), Int(-1))
  317. if err != nil {
  318. t.Fatal(err)
  319. }
  320. root, err = root.put(Int(4), Int(-1))
  321. if err != nil {
  322. t.Fatal(err)
  323. }
  324. root, err = root.put(Int(3), Int(1))
  325. if err != nil {
  326. t.Fatal(err)
  327. }
  328. root, err = root.put(Int(3), Int(2))
  329. if err != nil {
  330. t.Fatal(err)
  331. }
  332. root, err = root.put(Int(3), Int(3))
  333. if err != nil {
  334. t.Fatal(err)
  335. }
  336. root, err = root.put(Int(3), Int(4))
  337. if err != nil {
  338. t.Fatal(err)
  339. }
  340. root, err = root.put(Int(3), Int(5))
  341. if err != nil {
  342. t.Fatal(err)
  343. }
  344. t.Log(root)
  345. t.Log(root.pointers[0])
  346. t.Log(root.pointers[1])
  347. t.Log(root.pointers[2])
  348. i, n := root.get_start(Int(3))
  349. t.Log(n)
  350. if n != root.pointers[1] {
  351. t.Error("wrong node from get_start")
  352. }
  353. if i != 0 {
  354. t.Error("wrong index from get_start")
  355. }
  356. i, n = root.get_end(Int(3))
  357. t.Log(n)
  358. if n != root.pointers[1].getNext() {
  359. t.Error("wrong node from get_end")
  360. }
  361. if i != 1 {
  362. t.Error("wrong index from get_end")
  363. }
  364. i, n = root.get_end(Int(1))
  365. t.Log(n)
  366. if n != root.pointers[0] {
  367. t.Error("wrong node from get_end")
  368. }
  369. if i != 0 {
  370. t.Error("wrong index from get_end")
  371. }
  372. i, n = root.get_end(Int(4))
  373. t.Log(n)
  374. if n != root.pointers[2] {
  375. t.Error("wrong node from get_end")
  376. }
  377. if i != 0 {
  378. t.Error("wrong index from get_end")
  379. }
  380. i, n = root.get_end(Int(0))
  381. t.Log(n)
  382. if n != root.pointers[0] {
  383. t.Error("wrong node from get_end")
  384. }
  385. if i != 0 {
  386. t.Error("wrong index from get_end")
  387. }
  388. i, n = root.get_end(Int(5))
  389. t.Log(n)
  390. if n != root.pointers[2] {
  391. t.Error("wrong node from get_end")
  392. }
  393. if i != 0 {
  394. t.Error("wrong index from get_end")
  395. }
  396. i, n = root.get_end(Int(2))
  397. t.Log(n)
  398. if n != root.pointers[1] {
  399. t.Error("wrong node from get_end")
  400. }
  401. if i != 0 {
  402. t.Error("wrong index from get_end")
  403. }
  404. }
  405. func Test_put_no_root_split(t *testing.T) {
  406. a := NewLeaf(2, false)
  407. if err := a.put_kv(Int(1), Int(1)); err != nil {
  408. t.Error(err)
  409. }
  410. p, err := a.put(Int(1), Int(2))
  411. if err != nil {
  412. t.Error(err)
  413. } else {
  414. if p != a {
  415. t.Errorf("p != a")
  416. }
  417. if !p.has(Int(1)) {
  418. t.Error("p didn't have the right keys", p)
  419. }
  420. }
  421. p, err = a.put(Int(1), Int(3))
  422. if err != nil {
  423. t.Error(err)
  424. } else {
  425. if p != a {
  426. t.Errorf("p != a")
  427. }
  428. if !p.has(Int(1)) {
  429. t.Error("p didn't have the right keys", p)
  430. }
  431. if p.getNext() == nil {
  432. t.Error("p.next should not be nil")
  433. }
  434. t.Log(p)
  435. t.Log(p.getNext())
  436. }
  437. }
  438. func Test_put_root_split(t *testing.T) {
  439. a := NewLeaf(2, false)
  440. p, err := a.put(Int(1), Int(1))
  441. if err != nil {
  442. t.Error(err)
  443. } else {
  444. if p != a {
  445. t.Errorf("p != a")
  446. }
  447. if !p.has(Int(1)) {
  448. t.Error("p didn't have the right keys", p)
  449. }
  450. }
  451. p, err = a.put(Int(3), Int(3))
  452. if err != nil {
  453. t.Error(err)
  454. } else {
  455. if p != a {
  456. t.Errorf("p != a")
  457. }
  458. if !p.has(Int(1)) || !p.has(Int(3)) {
  459. t.Error("p didn't have the right keys", p)
  460. }
  461. }
  462. p, err = a.put(Int(2), Int(2))
  463. if err != nil {
  464. t.Error(err)
  465. } else {
  466. if p == a {
  467. t.Errorf("p == a")
  468. }
  469. if !p.has(Int(1)) || !p.has(Int(3)) {
  470. t.Error("p didn't have the right keys", p)
  471. }
  472. if len(p.pointers) != 2 {
  473. t.Error("p didn't have right number of pointers", p)
  474. }
  475. if !p.pointers[0].has(Int(1)) || !p.pointers[0].has(Int(2)) {
  476. t.Error("p.pointers[0] didn't have the right keys", p.pointers[0])
  477. }
  478. if !p.pointers[1].has(Int(3)) {
  479. t.Error("p.pointers[1] didn't have the right keys", p.pointers[1])
  480. }
  481. t.Log(p)
  482. t.Log(p.pointers[0])
  483. t.Log(p.pointers[1])
  484. }
  485. }
  486. func Test_internal_insert_no_split(t *testing.T) {
  487. a := NewInternal(3)
  488. leaf := NewLeaf(1, false)
  489. if err := leaf.put_kv(Int(1), Int(1)); err != nil {
  490. t.Error(err)
  491. }
  492. if err := a.put_kp(Int(1), leaf); err != nil {
  493. t.Error(err)
  494. }
  495. if err := a.put_kp(Int(5), nil); err != nil {
  496. t.Error(err)
  497. }
  498. p, q, err := a.internal_insert(Int(2), nil)
  499. if err != nil {
  500. t.Error(err)
  501. } else {
  502. if p != a {
  503. t.Errorf("p != a")
  504. }
  505. if q != nil {
  506. t.Errorf("q != nil")
  507. }
  508. if !p.has(Int(1)) || !p.has(Int(2)) || !p.has(Int(5)) {
  509. t.Error("p didn't have the right keys", p)
  510. }
  511. }
  512. }
  513. func Test_internal_insert_split_less(t *testing.T) {
  514. a := NewInternal(3)
  515. leaf := NewLeaf(1, false)
  516. if err := leaf.put_kv(Int(1), Int(1)); err != nil {
  517. t.Error(err)
  518. }
  519. if err := a.put_kp(Int(1), leaf); err != nil {
  520. t.Error(err)
  521. }
  522. if err := a.put_kp(Int(3), nil); err != nil {
  523. t.Error(err)
  524. }
  525. if err := a.put_kp(Int(5), nil); err != nil {
  526. t.Error(err)
  527. }
  528. p, q, err := a.internal_insert(Int(2), nil)
  529. if err != nil {
  530. t.Error(err)
  531. } else {
  532. if p != a {
  533. t.Errorf("p != a")
  534. }
  535. if q == nil {
  536. t.Errorf("q == nil")
  537. }
  538. if !p.has(Int(1)) || !p.has(Int(2)) {
  539. t.Error("p didn't have the right keys", p)
  540. }
  541. if !q.has(Int(3)) || !q.has(Int(5)) {
  542. t.Error("q didn't have the right keys", q)
  543. }
  544. }
  545. }
  546. func Test_internal_split_less(t *testing.T) {
  547. a := NewInternal(3)
  548. if err := a.put_kp(Int(1), nil); err != nil {
  549. t.Error(err)
  550. }
  551. if err := a.put_kp(Int(3), nil); err != nil {
  552. t.Error(err)
  553. }
  554. if err := a.put_kp(Int(5), nil); err != nil {
  555. t.Error(err)
  556. }
  557. p, q, err := a.internal_split(Int(2), nil)
  558. if err != nil {
  559. t.Error(err)
  560. } else {
  561. if p != a {
  562. t.Errorf("p != a")
  563. }
  564. if q == nil {
  565. t.Errorf("q == nil")
  566. }
  567. if !p.has(Int(1)) || !p.has(Int(2)) {
  568. t.Error("p didn't have the right keys", p)
  569. }
  570. if !q.has(Int(3)) || !q.has(Int(5)) {
  571. t.Error("q didn't have the right keys", q)
  572. }
  573. }
  574. }
  575. func Test_internal_split_equal(t *testing.T) {
  576. a := NewInternal(3)
  577. if err := a.put_kp(Int(1), nil); err != nil {
  578. t.Error(err)
  579. }
  580. if err := a.put_kp(Int(3), nil); err != nil {
  581. t.Error(err)
  582. }
  583. if err := a.put_kp(Int(5), nil); err != nil {
  584. t.Error(err)
  585. }
  586. p, q, err := a.internal_split(Int(3), nil)
  587. if err == nil {
  588. t.Error("split succeeded should have failed", p, q)
  589. }
  590. }
  591. func Test_internal_split_greater(t *testing.T) {
  592. a := NewInternal(3)
  593. if err := a.put_kp(Int(1), nil); err != nil {
  594. t.Error(err)
  595. }
  596. if err := a.put_kp(Int(3), nil); err != nil {
  597. t.Error(err)
  598. }
  599. if err := a.put_kp(Int(5), nil); err != nil {
  600. t.Error(err)
  601. }
  602. p, q, err := a.internal_split(Int(4), nil)
  603. if err != nil {
  604. t.Error(err)
  605. } else {
  606. if p != a {
  607. t.Errorf("p != a")
  608. }
  609. if q == nil {
  610. t.Errorf("q == nil")
  611. }
  612. if !p.has(Int(1)) {
  613. t.Error("p didn't have the right keys", p)
  614. }
  615. if !q.has(Int(3)) || !q.has(Int(4)) || !q.has(Int(5)) {
  616. t.Error("q didn't have the right keys", q)
  617. }
  618. }
  619. }
  620. func Test_leaf_insert_no_split(t *testing.T) {
  621. a := NewLeaf(3, false)
  622. insert_linked_list_node(a, nil, nil)
  623. if err := a.put_kv(Int(1), Int(1)); err != nil {
  624. t.Error(err)
  625. }
  626. if err := a.put_kv(Int(3), Int(3)); err != nil {
  627. t.Error(err)
  628. }
  629. p, q, err := a.leaf_insert(Int(2), Int(2))
  630. if err != nil {
  631. t.Error(err)
  632. } else {
  633. if p != a {
  634. t.Errorf("p != a")
  635. }
  636. if q != nil {
  637. t.Errorf("q != nil")
  638. }
  639. if !p.has(Int(1)) || !p.has(Int(2)) || !p.has(Int(3)) {
  640. t.Error("p didn't have the right keys", p)
  641. }
  642. }
  643. }
  644. // tests the defer to split logic
  645. func Test_leaf_insert_split_less(t *testing.T) {
  646. a := NewLeaf(3, false)
  647. insert_linked_list_node(a, nil, nil)
  648. if err := a.put_kv(Int(1), Int(1)); err != nil {
  649. t.Error(err)
  650. }
  651. if err := a.put_kv(Int(3), Int(3)); err != nil {
  652. t.Error(err)
  653. }
  654. if err := a.put_kv(Int(5), Int(5)); err != nil {
  655. t.Error(err)
  656. }
  657. p, q, err := a.leaf_insert(Int(2), Int(2))
  658. if err != nil {
  659. t.Error(err)
  660. } else {
  661. if p != a {
  662. t.Errorf("p != a")
  663. }
  664. if q == nil {
  665. t.Errorf("q == nil")
  666. }
  667. if !p.has(Int(1)) || !p.has(Int(2)) {
  668. t.Error("p didn't have the right keys", p)
  669. }
  670. if !q.has(Int(3)) || !q.has(Int(5)) {
  671. t.Error("q didn't have the right keys", q)
  672. }
  673. }
  674. }
  675. func Test_leaf_split_less(t *testing.T) {
  676. a := NewLeaf(3, false)
  677. insert_linked_list_node(a, nil, nil)
  678. if err := a.put_kv(Int(1), Int(1)); err != nil {
  679. t.Error(err)
  680. }
  681. if err := a.put_kv(Int(3), Int(3)); err != nil {
  682. t.Error(err)
  683. }
  684. if err := a.put_kv(Int(5), Int(5)); err != nil {
  685. t.Error(err)
  686. }
  687. p, q, err := a.leaf_split(Int(2), Int(2))
  688. if err != nil {
  689. t.Error(err)
  690. } else {
  691. if p != a {
  692. t.Errorf("p != a")
  693. }
  694. if q == nil {
  695. t.Errorf("q == nil")
  696. }
  697. if !p.has(Int(1)) || !p.has(Int(2)) {
  698. t.Error("p didn't have the right keys", p)
  699. }
  700. if !q.has(Int(3)) || !q.has(Int(5)) {
  701. t.Error("q didn't have the right keys", q)
  702. }
  703. }
  704. }
  705. func Test_leaf_split_equal(t *testing.T) {
  706. a := NewLeaf(3, false)
  707. insert_linked_list_node(a, nil, nil)
  708. if err := a.put_kv(Int(1), Int(1)); err != nil {
  709. t.Error(err)
  710. }
  711. if err := a.put_kv(Int(3), Int(3)); err != nil {
  712. t.Error(err)
  713. }
  714. if err := a.put_kv(Int(5), Int(5)); err != nil {
  715. t.Error(err)
  716. }
  717. p, q, err := a.leaf_split(Int(3), Int(2))
  718. if err != nil {
  719. t.Error(err)
  720. } else {
  721. if p != a {
  722. t.Errorf("p != a")
  723. }
  724. if q == nil {
  725. t.Errorf("q == nil")
  726. }
  727. if !p.has(Int(1)) {
  728. t.Error("p didn't have the right keys", p)
  729. }
  730. if !q.has(Int(3)) || q.count(Int(3)) != 2 || !q.has(Int(5)) {
  731. t.Error("q didn't have the right keys", q, q.count(Int(3)))
  732. }
  733. }
  734. }
  735. func Test_leaf_split_greater(t *testing.T) {
  736. a := NewLeaf(3, false)
  737. insert_linked_list_node(a, nil, nil)
  738. if err := a.put_kv(Int(1), Int(1)); err != nil {
  739. t.Error(err)
  740. }
  741. if err := a.put_kv(Int(3), Int(3)); err != nil {
  742. t.Error(err)
  743. }
  744. if err := a.put_kv(Int(5), Int(5)); err != nil {
  745. t.Error(err)
  746. }
  747. p, q, err := a.leaf_split(Int(4), Int(2))
  748. if err != nil {
  749. t.Error(err)
  750. } else {
  751. if p != a {
  752. t.Errorf("p != a")
  753. }
  754. if q == nil {
  755. t.Errorf("q == nil")
  756. }
  757. if !p.has(Int(1)) {
  758. t.Error("p didn't have the right keys", p)
  759. }
  760. if !q.has(Int(3)) || !q.has(Int(4)) || !q.has(Int(5)) {
  761. t.Error("q didn't have the right keys", q)
  762. }
  763. }
  764. }
  765. // tests the defer logic
  766. func Test_pure_leaf_insert_split_less(t *testing.T) {
  767. a := NewLeaf(2, false)
  768. insert_linked_list_node(a, nil, nil)
  769. b := NewLeaf(2, false)
  770. insert_linked_list_node(b, a, nil)
  771. c := NewLeaf(2, false)
  772. insert_linked_list_node(c, b, nil)
  773. d := NewLeaf(2, false)
  774. insert_linked_list_node(d, c, nil)
  775. if err := a.put_kv(Int(3), Int(1)); err != nil {
  776. t.Error(err)
  777. }
  778. if err := a.put_kv(Int(3), Int(2)); err != nil {
  779. t.Error(err)
  780. }
  781. if err := b.put_kv(Int(3), Int(3)); err != nil {
  782. t.Error(err)
  783. }
  784. if err := b.put_kv(Int(3), Int(4)); err != nil {
  785. t.Error(err)
  786. }
  787. if err := c.put_kv(Int(3), Int(5)); err != nil {
  788. t.Error(err)
  789. }
  790. if err := c.put_kv(Int(3), Int(6)); err != nil {
  791. t.Error(err)
  792. }
  793. if err := d.put_kv(Int(4), Int(6)); err != nil {
  794. t.Error(err)
  795. }
  796. p, q, err := a.leaf_insert(Int(2), Int(1))
  797. if err != nil {
  798. t.Error(err)
  799. } else {
  800. if q != a {
  801. t.Errorf("q != a")
  802. }
  803. if p == nil || len(p.keys) != 1 || !p.keys[0].Equals(Int(2)) {
  804. t.Errorf("p did not contain the right key")
  805. }
  806. if p.getPrev() != nil {
  807. t.Errorf("expected p.prev == nil")
  808. }
  809. if p.getNext() != a {
  810. t.Errorf("expected p.next == a")
  811. }
  812. if a.getPrev() != p {
  813. t.Errorf("expected a.prev == p")
  814. }
  815. if a.getNext() != b {
  816. t.Errorf("expected a.next == b")
  817. }
  818. if b.getPrev() != a {
  819. t.Errorf("expected b.prev == a")
  820. }
  821. if b.getNext() != c {
  822. t.Errorf("expected b.next == c")
  823. }
  824. if c.getPrev() != b {
  825. t.Errorf("expected c.prev == b")
  826. }
  827. if c.getNext() != d {
  828. t.Errorf("expected c.next == d")
  829. }
  830. if d.getPrev() != c {
  831. t.Errorf("expected d.prev == c")
  832. }
  833. if d.getNext() != nil {
  834. t.Errorf("expected d.next == nil")
  835. }
  836. }
  837. }
  838. func Test_pure_leaf_split_less(t *testing.T) {
  839. a := NewLeaf(2, false)
  840. insert_linked_list_node(a, nil, nil)
  841. b := NewLeaf(2, false)
  842. insert_linked_list_node(b, a, nil)
  843. c := NewLeaf(2, false)
  844. insert_linked_list_node(c, b, nil)
  845. d := NewLeaf(2, false)
  846. insert_linked_list_node(d, c, nil)
  847. if err := a.put_kv(Int(3), Int(1)); err != nil {
  848. t.Error(err)
  849. }
  850. if err := a.put_kv(Int(3), Int(2)); err != nil {
  851. t.Error(err)
  852. }
  853. if err := b.put_kv(Int(3), Int(3)); err != nil {
  854. t.Error(err)
  855. }
  856. if err := b.put_kv(Int(3), Int(4)); err != nil {
  857. t.Error(err)
  858. }
  859. if err := c.put_kv(Int(3), Int(5)); err != nil {
  860. t.Error(err)
  861. }
  862. if err := c.put_kv(Int(3), Int(6)); err != nil {
  863. t.Error(err)
  864. }
  865. if err := d.put_kv(Int(4), Int(6)); err != nil {
  866. t.Error(err)
  867. }
  868. p, q, err := a.pure_leaf_split(Int(2), Int(1))
  869. if err != nil {
  870. t.Error(err)
  871. } else {
  872. if q != a {
  873. t.Errorf("q != a")
  874. }
  875. if p == nil || len(p.keys) != 1 || !p.keys[0].Equals(Int(2)) {
  876. t.Errorf("p did not contain the right key")
  877. }
  878. if p.getPrev() != nil {
  879. t.Errorf("expected p.prev == nil")
  880. }
  881. if p.getNext() != a {
  882. t.Errorf("expected p.next == a")
  883. }
  884. if a.getPrev() != p {
  885. t.Errorf("expected a.prev == p")
  886. }
  887. if a.getNext() != b {
  888. t.Errorf("expected a.next == b")
  889. }
  890. if b.getPrev() != a {
  891. t.Errorf("expected b.prev == a")
  892. }
  893. if b.getNext() != c {
  894. t.Errorf("expected b.next == c")
  895. }
  896. if c.getPrev() != b {
  897. t.Errorf("expected c.prev == b")
  898. }
  899. if c.getNext() != d {
  900. t.Errorf("expected c.next == d")
  901. }
  902. if d.getPrev() != c {
  903. t.Errorf("expected d.prev == c")
  904. }
  905. if d.getNext() != nil {
  906. t.Errorf("expected d.next == nil")
  907. }
  908. }
  909. }
  910. func Test_pure_leaf_split_equal(t *testing.T) {
  911. a := NewLeaf(2, false)
  912. insert_linked_list_node(a, nil, nil)
  913. b := NewLeaf(2, false)
  914. insert_linked_list_node(b, a, nil)
  915. c := NewLeaf(2, false)
  916. insert_linked_list_node(c, b, nil)
  917. d := NewLeaf(2, false)
  918. insert_linked_list_node(d, c, nil)
  919. if err := a.put_kv(Int(3), Int(1)); err != nil {
  920. t.Error(err)
  921. }
  922. if err := a.put_kv(Int(3), Int(2)); err != nil {
  923. t.Error(err)
  924. }
  925. if err := b.put_kv(Int(3), Int(3)); err != nil {
  926. t.Error(err)
  927. }
  928. if err := b.put_kv(Int(3), Int(4)); err != nil {
  929. t.Error(err)
  930. }
  931. if err := c.put_kv(Int(3), Int(5)); err != nil {
  932. t.Error(err)
  933. }
  934. if err := d.put_kv(Int(4), Int(6)); err != nil {
  935. t.Error(err)
  936. }
  937. p, q, err := a.pure_leaf_split(Int(3), Int(1))
  938. if err != nil {
  939. t.Error(err)
  940. } else {
  941. if p != a {
  942. t.Errorf("p != a")
  943. }
  944. if q != nil {
  945. t.Errorf("q != nil")
  946. }
  947. if a.getPrev() != nil {
  948. t.Errorf("expected a.prev == nil")
  949. }
  950. if a.getNext() != b {
  951. t.Errorf("expected a.next == b")
  952. }
  953. if b.getPrev() != a {
  954. t.Errorf("expected b.prev == a")
  955. }
  956. if b.getNext() != c {
  957. t.Errorf("expected b.next == c")
  958. }
  959. if c.getPrev() != b {
  960. t.Errorf("expected c.prev == b")
  961. }
  962. if c.getNext() != d {
  963. t.Errorf("expected c.next == d")
  964. }
  965. if d.getPrev() != c {
  966. t.Errorf("expected d.prev == c")
  967. }
  968. if d.getNext() != nil {
  969. t.Errorf("expected d.next == nil")
  970. }
  971. }
  972. }
  973. func Test_pure_leaf_split_greater(t *testing.T) {
  974. a := NewLeaf(2, false)
  975. insert_linked_list_node(a, nil, nil)
  976. b := NewLeaf(2, false)
  977. insert_linked_list_node(b, a, nil)
  978. c := NewLeaf(2, false)
  979. insert_linked_list_node(c, b, nil)
  980. d := NewLeaf(2, false)
  981. insert_linked_list_node(d, c, nil)
  982. if err := a.put_kv(Int(3), Int(1)); err != nil {
  983. t.Error(err)
  984. }
  985. if err := a.put_kv(Int(3), Int(2)); err != nil {
  986. t.Error(err)
  987. }
  988. if err := b.put_kv(Int(3), Int(3)); err != nil {
  989. t.Error(err)
  990. }
  991. if err := b.put_kv(Int(3), Int(4)); err != nil {
  992. t.Error(err)
  993. }
  994. if err := c.put_kv(Int(3), Int(5)); err != nil {
  995. t.Error(err)
  996. }
  997. if err := d.put_kv(Int(5), Int(6)); err != nil {
  998. t.Error(err)
  999. }
  1000. p, q, err := a.pure_leaf_split(Int(4), Int(1))
  1001. if err != nil {
  1002. t.Error(err)
  1003. } else {
  1004. if p != a {
  1005. t.Errorf("p != a")
  1006. }
  1007. if q == nil || len(q.keys) != 1 || !q.keys[0].Equals(Int(4)) {
  1008. t.Errorf("q != nil")
  1009. }
  1010. if a.getPrev() != nil {
  1011. t.Errorf("expected a.prev == nil")
  1012. }
  1013. if a.getNext() != b {
  1014. t.Errorf("expected a.next == b")
  1015. }
  1016. if b.getPrev() != a {
  1017. t.Errorf("expected b.prev == a")
  1018. }
  1019. if b.getNext() != c {
  1020. t.Errorf("expected b.next == c")
  1021. }
  1022. if c.getPrev() != b {
  1023. t.Errorf("expected c.prev == b")
  1024. }
  1025. if c.getNext() != q {
  1026. t.Errorf("expected c.next == q")
  1027. }
  1028. if q.getPrev() != c {
  1029. t.Errorf("expected q.prev == c")
  1030. }
  1031. if q.getNext() != d {
  1032. t.Errorf("expected q.next == d")
  1033. }
  1034. if d.getPrev() != q {
  1035. t.Errorf("expected d.prev == q")
  1036. }
  1037. if d.getNext() != nil {
  1038. t.Errorf("expected d.next == nil")
  1039. }
  1040. }
  1041. }
  1042. func Test_find_end_of_pure_run(t *testing.T) {
  1043. a := NewLeaf(2, false)
  1044. insert_linked_list_node(a, nil, nil)
  1045. b := NewLeaf(2, false)
  1046. insert_linked_list_node(b, a, nil)
  1047. c := NewLeaf(2, false)
  1048. insert_linked_list_node(c, b, nil)
  1049. d := NewLeaf(2, false)
  1050. insert_linked_list_node(d, c, nil)
  1051. if err := a.put_kv(Int(3), Int(1)); err != nil {
  1052. t.Error(err)
  1053. }
  1054. if err := a.put_kv(Int(3), Int(2)); err != nil {
  1055. t.Error(err)
  1056. }
  1057. if err := b.put_kv(Int(3), Int(3)); err != nil {
  1058. t.Error(err)
  1059. }
  1060. if err := b.put_kv(Int(3), Int(4)); err != nil {
  1061. t.Error(err)
  1062. }
  1063. if err := c.put_kv(Int(3), Int(5)); err != nil {
  1064. t.Error(err)
  1065. }
  1066. if err := c.put_kv(Int(3), Int(6)); err != nil {
  1067. t.Error(err)
  1068. }
  1069. if err := d.put_kv(Int(4), Int(6)); err != nil {
  1070. t.Error(err)
  1071. }
  1072. e := a.find_end_of_pure_run()
  1073. if e != c {
  1074. t.Errorf("end of run should have been block c %v %v", e, c)
  1075. }
  1076. }
  1077. func Test_insert_linked_list_node(t *testing.T) {
  1078. a := NewLeaf(1, false)
  1079. insert_linked_list_node(a, nil, nil)
  1080. b := NewLeaf(2, false)
  1081. insert_linked_list_node(b, a, nil)
  1082. c := NewLeaf(3, false)
  1083. insert_linked_list_node(c, b, nil)
  1084. d := NewLeaf(4, false)
  1085. insert_linked_list_node(d, a, b)
  1086. if a.getPrev() != nil {
  1087. t.Errorf("expected a.prev == nil")
  1088. }
  1089. if a.getNext() != d {
  1090. t.Errorf("expected a.next == d")
  1091. }
  1092. if d.getPrev() != a {
  1093. t.Errorf("expected d.prev == a")
  1094. }
  1095. if d.getNext() != b {
  1096. t.Errorf("expected d.next == b")
  1097. }
  1098. if b.getPrev() != d {
  1099. t.Errorf("expected b.prev == d")
  1100. }
  1101. if b.getNext() != c {
  1102. t.Errorf("expected b.next == c")
  1103. }
  1104. if c.getPrev() != b {
  1105. t.Errorf("expected c.prev == b")
  1106. }
  1107. if c.getNext() != nil {
  1108. t.Errorf("expected c.next == nil")
  1109. }
  1110. }
  1111. func Test_remove_linked_list_node(t *testing.T) {
  1112. a := NewLeaf(1, false)
  1113. insert_linked_list_node(a, nil, nil)
  1114. b := NewLeaf(2, false)
  1115. insert_linked_list_node(b, a, nil)
  1116. c := NewLeaf(3, false)
  1117. insert_linked_list_node(c, b, nil)
  1118. d := NewLeaf(4, false)
  1119. insert_linked_list_node(d, a, b)
  1120. if a.getPrev() != nil {
  1121. t.Errorf("expected a.prev == nil")
  1122. }
  1123. if a.getNext() != d {
  1124. t.Errorf("expected a.next == d")
  1125. }
  1126. if d.getPrev() != a {
  1127. t.Errorf("expected d.prev == a")
  1128. }
  1129. if d.getNext() != b {
  1130. t.Errorf("expected d.next == b")
  1131. }
  1132. if b.getPrev() != d {
  1133. t.Errorf("expected b.prev == d")
  1134. }
  1135. if b.getNext() != c {
  1136. t.Errorf("expected b.next == c")
  1137. }
  1138. if c.getPrev() != b {
  1139. t.Errorf("expected c.prev == b")
  1140. }
  1141. if c.getNext() != nil {
  1142. t.Errorf("expected c.next == nil")
  1143. }
  1144. remove_linked_list_node(d)
  1145. if a.getPrev() != nil {
  1146. t.Errorf("expected a.prev == nil")
  1147. }
  1148. if a.getNext() != b {
  1149. t.Errorf("expected a.next == b")
  1150. }
  1151. if b.getPrev() != a {
  1152. t.Errorf("expected b.prev == a")
  1153. }
  1154. if b.getNext() != c {
  1155. t.Errorf("expected b.next == c")
  1156. }
  1157. if c.getPrev() != b {
  1158. t.Errorf("expected c.prev == b")
  1159. }
  1160. if c.getNext() != nil {
  1161. t.Errorf("expected c.next == nil")
  1162. }
  1163. remove_linked_list_node(a)
  1164. if b.getPrev() != nil {
  1165. t.Errorf("expected b.prev == nil")
  1166. }
  1167. if b.getNext() != c {
  1168. t.Errorf("expected b.next == c")
  1169. }
  1170. if c.getPrev() != b {
  1171. t.Errorf("expected c.prev == b")
  1172. }
  1173. if c.getNext() != nil {
  1174. t.Errorf("expected c.next == nil")
  1175. }
  1176. remove_linked_list_node(c)
  1177. if b.getPrev() != nil {
  1178. t.Errorf("expected b.prev == nil")
  1179. }
  1180. if b.getNext() != nil {
  1181. t.Errorf("expected b.next == nil")
  1182. }
  1183. remove_linked_list_node(b)
  1184. }
  1185. func Test_balance_leaf_nodes_with_dup(t *testing.T) {
  1186. a := NewLeaf(3, false)
  1187. b := NewLeaf(3, false)
  1188. if err := a.put_kv(Int(1), Int(1)); err != nil {
  1189. t.Error(err)
  1190. }
  1191. if err := a.put_kv(Int(1), Int(1)); err != nil {
  1192. t.Error(err)
  1193. }
  1194. if err := a.put_kv(Int(2), Int(1)); err != nil {
  1195. t.Error(err)
  1196. }
  1197. balance_nodes(a, b)
  1198. if !a.has(Int(1)) || a.count(Int(1)) != 2 || a.has(Int(2)) {
  1199. t.Error("a had wrong items", a)
  1200. }
  1201. if !b.has(Int(2)) || b.count(Int(2)) != 1 || b.has(Int(1)) {
  1202. t.Error("a had wrong items", b)
  1203. }
  1204. }
  1205. func Test_balance_leaf_nodes(t *testing.T) {
  1206. a := NewLeaf(7, false)
  1207. b := NewLeaf(7, false)
  1208. if err := a.put_kv(Int(1), Int(1)); err != nil {
  1209. t.Error(err)
  1210. }
  1211. if err := a.put_kv(Int(2), Int(2)); err != nil {
  1212. t.Error(err)
  1213. }
  1214. if err := a.put_kv(Int(3), Int(3)); err != nil {
  1215. t.Error(err)
  1216. }
  1217. if err := a.put_kv(Int(4), Int(4)); err != nil {
  1218. t.Error(err)
  1219. }
  1220. if err := a.put_kv(Int(5), Int(5)); err != nil {
  1221. t.Error(err)
  1222. }
  1223. if err := a.put_kv(Int(6), Int(6)); err != nil {
  1224. t.Error(err)
  1225. }
  1226. if err := a.put_kv(Int(7), Int(7)); err != nil {
  1227. t.Error(err)
  1228. }
  1229. balance_nodes(a, b)
  1230. for i, k := range a.keys {
  1231. if int(k.(Int)) != i+1 {
  1232. t.Errorf("k != %d", i+1)
  1233. }
  1234. }
  1235. for i, k := range b.keys {
  1236. if int(k.(Int)) != 3+i+1 {
  1237. t.Errorf("k != %d", 3+i+1)
  1238. }
  1239. }
  1240. for i, v := range a.values {
  1241. if int(v.(Int)) != i+1 {
  1242. t.Errorf("k != %d", i+1)
  1243. }
  1244. }
  1245. for i, v := range b.values {
  1246. if int(v.(Int)) != 3+i+1 {
  1247. t.Errorf("v != %d", 3+i+1)
  1248. }
  1249. }
  1250. t.Log(a)
  1251. t.Log(b)
  1252. }
  1253. func Test_balance_internal_nodes(t *testing.T) {
  1254. a := NewInternal(6)
  1255. b := NewInternal(6)
  1256. if err := a.put_kp(Int(1), nil); err != nil {
  1257. t.Error(err)
  1258. }
  1259. if err := a.put_kp(Int(2), nil); err != nil {
  1260. t.Error(err)
  1261. }
  1262. if err := a.put_kp(Int(3), nil); err != nil {
  1263. t.Error(err)
  1264. }
  1265. if err := a.put_kp(Int(4), nil); err != nil {
  1266. t.Error(err)
  1267. }
  1268. if err := a.put_kp(Int(5), nil); err != nil {
  1269. t.Error(err)
  1270. }
  1271. if err := a.put_kp(Int(6), nil); err != nil {
  1272. t.Error(err)
  1273. }
  1274. balance_nodes(a, b)
  1275. for i, k := range a.keys {
  1276. if int(k.(Int)) != i+1 {
  1277. t.Errorf("k != %d", i+1)
  1278. }
  1279. }
  1280. for i, k := range b.keys {
  1281. if int(k.(Int)) != 3+i+1 {
  1282. t.Errorf("k != %d", 3+i+1)
  1283. }
  1284. }
  1285. t.Log(a)
  1286. t.Log(b)
  1287. }
  1288. // copied from
  1289. // ThreadSafeRand provides a thread safe version of math/rand.Rand using
  1290. // the same technique used in the math/rand package to make the top level
  1291. // functions thread safe.
  1292. func ThreadSafeRand(seed int64) *mrand.Rand {
  1293. return mrand.New(&lockedSource{src: mrand.NewSource(seed).(mrand.Source64)})
  1294. }
  1295. // from: https://golang.org/src/math/rand/rand.go?s=8161:8175#L317
  1296. type lockedSource struct {
  1297. lk sync.Mutex
  1298. src mrand.Source64
  1299. }
  1300. func (r *lockedSource) Int63() (n int64) {
  1301. r.lk.Lock()
  1302. n = r.src.Int63()
  1303. r.lk.Unlock()
  1304. return
  1305. }
  1306. func (r *lockedSource) Uint64() (n uint64) {
  1307. r.lk.Lock()
  1308. n = r.src.Uint64()
  1309. r.lk.Unlock()
  1310. return
  1311. }
  1312. func (r *lockedSource) Seed(seed int64) {
  1313. r.lk.Lock()
  1314. r.src.Seed(seed)
  1315. r.lk.Unlock()
  1316. }
  1317. // seedPos implements Seed for a lockedSource without a race condiiton.
  1318. func (r *lockedSource) seedPos(seed int64, readPos *int8) {
  1319. r.lk.Lock()
  1320. r.src.Seed(seed)
  1321. *readPos = 0
  1322. r.lk.Unlock()
  1323. }
  1324. // read implements Read for a lockedSource without a race condition.
  1325. func (r *lockedSource) read(p []byte, readVal *int64, readPos *int8) (n int, err error) {
  1326. r.lk.Lock()
  1327. n, err = read(p, r.src.Int63, readVal, readPos)
  1328. r.lk.Unlock()
  1329. return
  1330. }
  1331. func read(p []byte, int63 func() int64, readVal *int64, readPos *int8) (n int, err error) {
  1332. pos := *readPos
  1333. val := *readVal
  1334. for n = 0; n < len(p); n++ {
  1335. if pos == 0 {
  1336. val = int63()
  1337. pos = 7
  1338. }
  1339. p[n] = byte(val)
  1340. val >>= 8
  1341. pos--
  1342. }
  1343. *readPos = pos
  1344. *readVal = val
  1345. return
  1346. }
  1347. // copied from https://sourcegraph.com/github.com/timtadh/data-structures@master/-/blob/test/support.go
  1348. type T testing.T
  1349. func (t *T) Assert(ok bool, msg string, vars ...ItemValue) {
  1350. if !ok {
  1351. t.Log("\n" + string(debug.Stack()))
  1352. var objects []interface{}
  1353. for _, t := range vars {
  1354. objects = append(objects, t)
  1355. }
  1356. t.Fatalf(msg, objects...)
  1357. }
  1358. }
  1359. func (t *T) AssertNil(errors ...error) {
  1360. any := false
  1361. for _, err := range errors {
  1362. if err != nil {
  1363. any = true
  1364. t.Log("\n" + string(debug.Stack()))
  1365. t.Error(err)
  1366. }
  1367. }
  1368. if any {
  1369. t.Fatal("assert failed")
  1370. }
  1371. }
  1372. func RandSlice(length int) []byte {
  1373. slice := make([]byte, length)
  1374. if _, err := crand.Read(slice); err != nil {
  1375. panic(err)
  1376. }
  1377. return slice
  1378. }
  1379. func RandHex(length int) string {
  1380. return hex.EncodeToString(RandSlice(length / 2))
  1381. }
  1382. func RandStr(length int) string {
  1383. return string(RandSlice(length))
  1384. }