Skip to content

Commit 4b7fc47

Browse files
author
Roman Janusz
committed
redis: ZADD GT & LT
1 parent 4a263c2 commit 4b7fc47

File tree

2 files changed

+52
-15
lines changed

2 files changed

+52
-15
lines changed

commons-redis/src/main/scala/com/avsystem/commons/redis/commands/sortedSets.scala

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,37 @@ trait SortedSetsApi extends ApiSubset {
1717

1818
/** Executes [[http://redis.io/commands/zadd ZADD]] */
1919
def zadd(key: Key, member: Value, score: Double): Result[Boolean] =
20-
execute(new Zadd(key, (member, score).single, emptyData = false, Opt.Empty, changed = false).map(_ > 0))
20+
execute(new Zadd(key, (member, score).single, emptyData = false, Opt.Empty, Opt.Empty, changed = false).map(_ > 0))
2121

2222
/** Executes [[http://redis.io/commands/zadd ZADD]] */
2323
def zadd(key: Key, score: Double, member: Value, members: Value*): Result[Int] =
24-
execute(new Zadd(key, (member, score) +:: members.iterator.map((_, score)), emptyData = false, Opt.Empty, changed = false))
24+
execute(new Zadd(key, (member, score) +:: members.iterator.map((_, score)), emptyData = false, Opt.Empty, Opt.Empty, changed = false))
2525

2626
/** Executes [[http://redis.io/commands/zadd ZADD]]
2727
* or simply returns 0 when `members` is empty */
2828
def zadd(key: Key, score: Double, members: Iterable[Value]): Result[Int] =
29-
execute(new Zadd(key, members.iterator.map((_, score)), members.isEmpty, Opt.Empty, changed = false))
29+
execute(new Zadd(key, members.iterator.map((_, score)), members.isEmpty, Opt.Empty, Opt.Empty, changed = false))
3030

3131
/** Executes [[http://redis.io/commands/zadd ZADD]]
3232
* or simply returns 0 when `memberScores` is empty */
33-
def zadd(key: Key, memberScores: Iterable[(Value, Double)], existence: OptArg[Existence] = OptArg.Empty, changed: Boolean = false): Result[Int] =
34-
execute(new Zadd(key, memberScores, memberScores.isEmpty, existence.toOpt, changed))
33+
def zadd(
34+
key: Key,
35+
memberScores: Iterable[(Value, Double)],
36+
existence: OptArg[Existence] = OptArg.Empty,
37+
comparison: OptArg[Comparison] = OptArg.Empty,
38+
changed: Boolean = false
39+
): Result[Int] =
40+
execute(new Zadd(key, memberScores, memberScores.isEmpty, existence.toOpt, comparison.toOpt, changed))
3541

3642
/** Executes [[http://redis.io/commands/zadd ZADD]] */
37-
def zaddIncr(key: Key, member: Value, score: Double, existence: OptArg[Existence] = OptArg.Empty): Result[Opt[Double]] =
38-
execute(new ZaddIncr(key, member, score, existence.toOpt))
43+
def zaddIncr(
44+
key: Key,
45+
member: Value,
46+
score: Double,
47+
existence: OptArg[Existence] = OptArg.Empty,
48+
comparison: OptArg[Comparison] = OptArg.Empty,
49+
): Result[Opt[Double]] =
50+
execute(new ZaddIncr(key, member, score, existence.toOpt, comparison.toOpt))
3951

4052
/** Executes [[http://redis.io/commands/zcard ZCARD]] */
4153
def zcard(key: Key): Result[Long] =
@@ -312,21 +324,37 @@ trait SortedSetsApi extends ApiSubset {
312324
private abstract class AbstractValuesWithScoresCommand
313325
extends AbstractRedisCommand[Seq[(Value, Double)]](flatMultiBulkAsPairSeq(bulkAs[Value], bulkAsDouble))
314326

315-
private abstract class AbstractZadd[T](decoder: ReplyDecoder[T])
316-
(key: Key, memberScores: IterableOnce[(Value, Double)], existence: Opt[Existence], changed: Boolean, incr: Boolean)
317-
extends AbstractRedisCommand[T](decoder) with NodeCommand {
327+
private abstract class AbstractZadd[T](decoder: ReplyDecoder[T])(
328+
key: Key,
329+
memberScores: IterableOnce[(Value, Double)],
330+
existence: Opt[Existence],
331+
comparison: Opt[Comparison],
332+
changed: Boolean,
333+
incr: Boolean
334+
) extends AbstractRedisCommand[T](decoder) with NodeCommand {
318335

319-
val encoded: Encoded = encoder("ZADD").key(key).optAdd(existence)
336+
val encoded: Encoded = encoder("ZADD").key(key).optAdd(existence).optAdd(comparison)
320337
.addFlag("CH", changed).addFlag("INCR", incr).argDataPairs(memberScores.iterator.map(_.swap)).result
321338
}
322339

323-
private final class Zadd(key: Key, memberScores: IterableOnce[(Value, Double)], emptyData: Boolean, existence: Opt[Existence], changed: Boolean)
324-
extends AbstractZadd[Int](integerAsInt)(key, memberScores, existence, changed, incr = false) {
340+
private final class Zadd(
341+
key: Key,
342+
memberScores: IterableOnce[(Value, Double)],
343+
emptyData: Boolean,
344+
existence: Opt[Existence],
345+
comparison: Opt[Comparison],
346+
changed: Boolean
347+
) extends AbstractZadd[Int](integerAsInt)(key, memberScores, existence, comparison, changed, incr = false) {
325348
override def immediateResult: Opt[Int] = if (emptyData) Opt(0) else Opt.Empty
326349
}
327350

328-
private final class ZaddIncr(key: Key, member: Value, score: Double, existence: Opt[Existence])
329-
extends AbstractZadd[Opt[Double]](nullBulkOr(bulkAsDouble))(key, (member, score).single, existence, changed = false, incr = true)
351+
private final class ZaddIncr(
352+
key: Key,
353+
member: Value,
354+
score: Double,
355+
existence: Opt[Existence],
356+
comparison: Opt[Comparison]
357+
) extends AbstractZadd[Opt[Double]](nullBulkOr(bulkAsDouble))(key, (member, score).single, existence, comparison, changed = false, incr = true)
330358

331359
private final class Zcard(key: Key) extends RedisLongCommand with NodeCommand {
332360
val encoded: Encoded = encoder("ZCARD").key(key).result

commons-redis/src/main/scala/com/avsystem/commons/redis/commands/strings.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,15 @@ object Existence {
388388
CommandArg((ce, ex) => ce.add(ex.productPrefix))
389389
}
390390

391+
sealed trait Comparison extends Product with Serializable
392+
object Comparison {
393+
case object GT extends Comparison
394+
case object LT extends Comparison
395+
396+
implicit val ComparisonArg: CommandArg[Comparison] =
397+
CommandArg((ce, ex) => ce.add(ex.productPrefix))
398+
}
399+
391400
sealed trait Expiration extends Product with Serializable
392401
sealed trait SetExpiration extends Expiration
393402
sealed trait GetExpiration extends Expiration

0 commit comments

Comments
 (0)