MCPcopy Create free account
hub / github.com/nutsdb/nutsdb / insertNode

Method insertNode

sorted_set.go:352–422  ·  view source on GitHub ↗
(score SCORE, hash uint32, record *core.Record)

Source from the content-addressed store, hash-verified

350}
351
352func (sl *SkipList) insertNode(score SCORE, hash uint32, record *core.Record) *SkipListNode {
353 var update [SkipListMaxLevel]*SkipListNode
354 var rank [SkipListMaxLevel]int64
355
356 x := sl.header
357 for i := sl.level - 1; i >= 0; i-- {
358 // store rank that is crosled to reach the insert position
359 if sl.level-1 == i {
360 rank[i] = 0
361 } else {
362 rank[i] = rank[i+1]
363 }
364
365 for x.level[i].forward != nil &&
366 (x.level[i].forward.score < score ||
367 (x.level[i].forward.score == score && // score is the same but the key is different
368 sl.cmp(x.level[i].forward.record, record) < 0)) {
369 rank[i] += x.level[i].span
370 x = x.level[i].forward
371 }
372
373 update[i] = x
374 }
375
376 /* we assume the key is not already inside, since we allow duplicated
377 * scores, and the re-insertion of score and redis object should never
378 * happen since the caller of Insert() should test in the hash table
379 * if the element is already inside or not. */
380 level := randomLevel()
381
382 if level > sl.level { // add a new level
383 for i := sl.level; i < level; i++ {
384 rank[i] = 0
385 update[i] = sl.header
386 update[i].level[i].span = sl.length
387 }
388 sl.level = level
389 }
390
391 x = createNode(level, score, hash, record)
392 for i := 0; i < level; i++ {
393 x.level[i].forward = update[i].level[i].forward
394 update[i].level[i].forward = x
395
396 /* update span covered by update[i] as x is inserted here */
397 x.level[i].span = update[i].level[i].span - (rank[0] - rank[i])
398
399 update[i].level[i].span = (rank[0] - rank[i]) + 1
400 }
401
402 // increment span for untouched levels
403 for i := level; i < sl.level; i++ {
404 update[i].level[i].span++
405 }
406
407 if update[0] == sl.header {
408 x.backward = nil
409 } else {

Callers 1

PutMethod · 0.95

Calls 3

cmpMethod · 0.95
randomLevelFunction · 0.85
createNodeFunction · 0.85

Tested by

no test coverage detected