def _get_zset(self, name, operation, create=False): """ Get (and maybe create) a sorted set by name. """ return self._get_by_type(name, operation, create, b'zset', SortedSet(), return_default=False)
def zunionstore(self, dest, keys, aggregate=None): union = SortedSet() aggregate_func = self._aggregate_func(aggregate) for key in keys: zset = self._get_zset(key, "ZUNIONSTORE") if not zset: continue for score, member in zset: if member in union: union[member] = aggregate_func(union[member], score) else: union[member] = score # always override existing keys self.redis[self._encode(dest)] = union return len(union)
def zinterstore(self, dest, keys, aggregate=None): aggregate_func = self._aggregate_func(aggregate) members = {} for key in keys: zset = self._get_zset(key, "ZINTERSTORE") if not zset: return 0 for score, member in zset: members.setdefault(member, []).append(score) intersection = SortedSet() for member, scores in members.items(): if len(scores) != len(keys): continue intersection[member] = reduce(aggregate_func, scores) # always override existing keys self.redis[self._encode(dest)] = intersection return len(intersection)
def setUp(self): self.zset = SortedSet()