Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 13 additions & 13 deletions content/develop/data-types/strings/bitmaps.md
Original file line number Diff line number Diff line change
Expand Up @@ -379,38 +379,38 @@ The key, start, and end are required. Ranges follow `BITCOUNT`: byte offsets by
default, bit offsets with `BIT`, and negative indexes count from the end.
Returned offsets are always bit offsets.

```redis
redis> CONFIG SET bitmap-default-roaring yes
{{< clients-example set="bitmap_tutorial" step="bitrangeintarray" lang_filter="Python, Go" description="Offset retrieval: Use BITRANGEINTARRAY to list set-bit or clear-bit offsets in a range and to page through them with LIMIT when you need the positions of bits, not just a count" difficulty="intermediate" buildsUpon="ping" runnable="false" try_it="false" >}}
> CONFIG SET bitmap-default-roaring yes
OK
redis> SETBIT members 1 1
> SETBIT members 1 1
(integer) 0
redis> SETBIT members 7 1
> SETBIT members 7 1
(integer) 0
redis> SETBIT members 9 1
> SETBIT members 9 1
(integer) 0
redis> SETBIT members 30 1
> SETBIT members 30 1
(integer) 0
redis> BITRANGEINTARRAY members 0 -1
> BITRANGEINTARRAY members 0 -1
1) (integer) 1
2) (integer) 7
3) (integer) 9
4) (integer) 30
redis> BITRANGEINTARRAY members 28 31 BIT ZEROS
> BITRANGEINTARRAY members 28 31 BIT ZEROS
1) (integer) 28
2) (integer) 29
3) (integer) 31
redis> BITRANGEINTARRAY members 0 -1 BIT LIMIT 2
> BITRANGEINTARRAY members 0 -1 BIT LIMIT 2
1) (integer) 1
2) (integer) 7
redis> BITRANGEINTARRAY members 8 -1 BIT LIMIT 2
> BITRANGEINTARRAY members 8 -1 BIT LIMIT 2
1) (integer) 9
2) (integer) 30
redis> BITRANGEINTARRAY members 0 -1 BYTE LIMIT 1
> BITRANGEINTARRAY members 0 -1 BYTE LIMIT 1
1) (integer) 1
2) (integer) 7
redis> BITRANGEINTARRAY members 1 -1 BYTE LIMIT 1
> BITRANGEINTARRAY members 1 -1 BYTE LIMIT 1
1) (integer) 9
```
{{< /clients-example >}}

Both set-bit and clear-bit enumeration stay within the value's logical length.
Missing keys, empty values, and empty ranges return empty arrays.
Expand Down
93 changes: 93 additions & 0 deletions local_examples/tmp/bitmap_tutorial_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -236,3 +236,96 @@ func ExampleClient_bitop_ops() {
// 01011000
// 10100101
}

func ExampleClient_bitrangeintarray() {
ctx := context.Background()

rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})

// REMOVE_START
rdb.Del(ctx, "members")
// REMOVE_END

// STEP_START bitrangeintarray
rdb.ConfigSet(ctx, "bitmap-default-roaring", "yes")

for _, offset := range []int64{1, 7, 9, 30} {
rdb.SetBit(ctx, "members", offset, 1)
}

res1, err := rdb.BitRangeIntArray(ctx, "members", 0, -1).Result()

if err != nil {
panic(err)
}

fmt.Println(res1) // >>> [1 7 9 30]

res2, err := rdb.BitRangeIntArrayWithArgs(ctx, "members", 28, 31,
&redis.BitRangeIntArrayArgs{Unit: redis.BitCountIndexBit, Zeros: true},
).Result()

if err != nil {
panic(err)
}

fmt.Println(res2) // >>> [28 29 31]

res3, err := rdb.BitRangeIntArrayWithArgs(ctx, "members", 0, -1,
&redis.BitRangeIntArrayArgs{Unit: redis.BitCountIndexBit, Limit: 2},
).Result()

if err != nil {
panic(err)
}

fmt.Println(res3) // >>> [1 7]

res4, err := rdb.BitRangeIntArrayWithArgs(ctx, "members", 8, -1,
&redis.BitRangeIntArrayArgs{Unit: redis.BitCountIndexBit, Limit: 2},
).Result()

if err != nil {
panic(err)
}

fmt.Println(res4) // >>> [9 30]

res5, err := rdb.BitRangeIntArrayWithArgs(ctx, "members", 0, -1,
&redis.BitRangeIntArrayArgs{Unit: redis.BitCountIndexByte, Limit: 1},
).Result()

if err != nil {
panic(err)
}

fmt.Println(res5) // >>> [1 7]

res6, err := rdb.BitRangeIntArrayWithArgs(ctx, "members", 1, -1,
&redis.BitRangeIntArrayArgs{Unit: redis.BitCountIndexByte, Limit: 1},
).Result()

if err != nil {
panic(err)
}

fmt.Println(res6) // >>> [9]
// STEP_END

// REMOVE_START
rdb.Del(ctx, "members")
rdb.ConfigSet(ctx, "bitmap-default-roaring", "no")
// REMOVE_END

// Output:
// [1 7 9 30]
// [28 29 31]
// [1 7]
// [9 30]
// [1 7]
// [9]
}
46 changes: 46 additions & 0 deletions local_examples/tmp/datatypes/strings/dt_bitmap.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# EXAMPLE: bitmap_tutorial
# HIDE_START
import redis

r = redis.Redis(decode_responses=True)
# HIDE_END

# REMOVE_START
r.delete("members")
# REMOVE_END

# STEP_START bitrangeintarray
r.config_set("bitmap-default-roaring", "yes")

for offset in (1, 7, 9, 30):
r.setbit("members", offset, 1)

res1 = r.bitrangeintarray("members", 0, -1)
print(res1) # >>> [1, 7, 9, 30]

res2 = r.bitrangeintarray("members", 28, 31, mode="BIT", zeros=True)
print(res2) # >>> [28, 29, 31]

res3 = r.bitrangeintarray("members", 0, -1, mode="BIT", limit=2)
print(res3) # >>> [1, 7]

res4 = r.bitrangeintarray("members", 8, -1, mode="BIT", limit=2)
print(res4) # >>> [9, 30]

res5 = r.bitrangeintarray("members", 0, -1, mode="BYTE", limit=1)
print(res5) # >>> [1, 7]

res6 = r.bitrangeintarray("members", 1, -1, mode="BYTE", limit=1)
print(res6) # >>> [9]
# STEP_END

# REMOVE_START
assert res1 == [1, 7, 9, 30]
assert res2 == [28, 29, 31]
assert res3 == [1, 7]
assert res4 == [9, 30]
assert res5 == [1, 7]
assert res6 == [9]
r.delete("members")
r.config_set("bitmap-default-roaring", "no")
# REMOVE_END
Loading