mirror of
https://github.com/HDT3213/godis.git
synced 2025-10-06 09:17:10 +08:00
zpopmin
This commit is contained in:
@@ -281,7 +281,7 @@ func (skiplist *skiplist) getLastInScoreRange(min *ScoreBorder, max *ScoreBorder
|
||||
/*
|
||||
* return removed elements
|
||||
*/
|
||||
func (skiplist *skiplist) RemoveRangeByScore(min *ScoreBorder, max *ScoreBorder) (removed []*Element) {
|
||||
func (skiplist *skiplist) RemoveRangeByScore(min *ScoreBorder, max *ScoreBorder, limit int) (removed []*Element) {
|
||||
update := make([]*node, maxLevel)
|
||||
removed = make([]*Element, 0)
|
||||
// find backward nodes (of target range) or last node of each level
|
||||
@@ -308,6 +308,9 @@ func (skiplist *skiplist) RemoveRangeByScore(min *ScoreBorder, max *ScoreBorder)
|
||||
removedElement := node.Element
|
||||
removed = append(removed, &removedElement)
|
||||
skiplist.removeNode(node, update)
|
||||
if limit > 0 && len(removed) == limit {
|
||||
break
|
||||
}
|
||||
node = next
|
||||
}
|
||||
return removed
|
||||
|
@@ -204,13 +204,29 @@ func (sortedSet *SortedSet) RangeByScore(min *ScoreBorder, max *ScoreBorder, off
|
||||
|
||||
// RemoveByScore removes members which score within the given border
|
||||
func (sortedSet *SortedSet) RemoveByScore(min *ScoreBorder, max *ScoreBorder) int64 {
|
||||
removed := sortedSet.skiplist.RemoveRangeByScore(min, max)
|
||||
removed := sortedSet.skiplist.RemoveRangeByScore(min, max, 0)
|
||||
for _, element := range removed {
|
||||
delete(sortedSet.dict, element.Member)
|
||||
}
|
||||
return int64(len(removed))
|
||||
}
|
||||
|
||||
func (sortedSet *SortedSet) PopMin(count int) []*Element {
|
||||
first := sortedSet.skiplist.getFirstInScoreRange(negativeInfBorder, positiveInfBorder)
|
||||
if first == nil {
|
||||
return nil
|
||||
}
|
||||
border := &ScoreBorder{
|
||||
Value: first.Score,
|
||||
Exclude: false,
|
||||
}
|
||||
removed := sortedSet.skiplist.RemoveRangeByScore(border, border, count)
|
||||
for _, element := range removed {
|
||||
delete(sortedSet.dict, element.Member)
|
||||
}
|
||||
return removed
|
||||
}
|
||||
|
||||
// RemoveByRank removes member ranking within [start, stop)
|
||||
// sort by ascending order and rank starts from 0
|
||||
func (sortedSet *SortedSet) RemoveByRank(start int64, stop int64) int64 {
|
||||
|
Reference in New Issue
Block a user