Skip to content

Commit 10c1ab4

Browse files
authored
Merge branch 'master' into ps_handling_special_str_values_in_topk_list_result_callback
2 parents 2582cc6 + f32a1ca commit 10c1ab4

33 files changed

+2791
-187
lines changed

.github/workflows/integration.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ jobs:
7474
max-parallel: 15
7575
fail-fast: false
7676
matrix:
77-
redis-version: ['8.0-M05-pre', '${{ needs.redis_version.outputs.CURRENT }}', '7.2.7', '6.2.17']
77+
redis-version: ['8.0-RC1-pre', '${{ needs.redis_version.outputs.CURRENT }}', '7.2.7', '6.2.17']
7878
python-version: ['3.8', '3.13']
7979
parser-backend: ['plain']
8080
event-loop: ['asyncio']

docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
x-client-libs-stack-image: &client-libs-stack-image
3-
image: "redislabs/client-libs-test:${CLIENT_LIBS_TEST_STACK_IMAGE_TAG:-rs-7.4.0-v2}"
3+
image: "redislabs/client-libs-test:${CLIENT_LIBS_TEST_STACK_IMAGE_TAG:-7.4.2}"
44

55
x-client-libs-image: &client-libs-image
66
image: "redislabs/client-libs-test:${CLIENT_LIBS_TEST_IMAGE_TAG:-7.4.2}"

docs/advanced_features.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -384,13 +384,13 @@ run_in_thread.
384384
385385
A PubSub object adheres to the same encoding semantics as the client
386386
instance it was created from. Any channel or pattern that's unicode will
387-
be encoded using the charset specified on the client before being sent
387+
be encoded using the encoding specified on the client before being sent
388388
to Redis. If the client's decode_responses flag is set the False (the
389389
default), the 'channel', 'pattern' and 'data' values in message
390390
dictionaries will be byte strings (str on Python 2, bytes on Python 3).
391391
If the client's decode_responses is True, then the 'channel', 'pattern'
392392
and 'data' values will be automatically decoded to unicode strings using
393-
the client's charset.
393+
the client's encoding.
394394

395395
PubSub objects remember what channels and patterns they are subscribed
396396
to. In the event of a disconnection such as a network error or timeout,

doctests/dt_vec_set.py

Lines changed: 286 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,286 @@
1+
# EXAMPLE: vecset_tutorial
2+
# HIDE_START
3+
"""
4+
Code samples for Vector set doc pages:
5+
https://redis.io/docs/latest/develop/data-types/vector-sets/
6+
"""
7+
8+
import redis
9+
10+
from redis.commands.vectorset.commands import (
11+
QuantizationOptions
12+
)
13+
14+
r = redis.Redis(decode_responses=True)
15+
# HIDE_END
16+
17+
# REMOVE_START
18+
r.delete(
19+
"points", "quantSetQ8", "quantSetNoQ",
20+
"quantSetBin", "setNotReduced", "setReduced"
21+
)
22+
# REMOVE_END
23+
24+
# STEP_START vadd
25+
res1 = r.vset().vadd("points", [1.0, 1.0], "pt:A")
26+
print(res1) # >>> 1
27+
28+
res2 = r.vset().vadd("points", [-1.0, -1.0], "pt:B")
29+
print(res2) # >>> 1
30+
31+
res3 = r.vset().vadd("points", [-1.0, 1.0], "pt:C")
32+
print(res3) # >>> 1
33+
34+
res4 = r.vset().vadd("points", [1.0, -1.0], "pt:D")
35+
print(res4) # >>> 1
36+
37+
res5 = r.vset().vadd("points", [1.0, 0], "pt:E")
38+
print(res5) # >>> 1
39+
40+
res6 = r.type("points")
41+
print(res6) # >>> vectorset
42+
# STEP_END
43+
# REMOVE_START
44+
assert res1 == 1
45+
assert res2 == 1
46+
assert res3 == 1
47+
assert res4 == 1
48+
assert res5 == 1
49+
50+
assert res6 == "vectorset"
51+
# REMOVE_END
52+
53+
# STEP_START vcardvdim
54+
res7 = r.vset().vcard("points")
55+
print(res7) # >>> 5
56+
57+
res8 = r.vset().vdim("points")
58+
print(res8) # >>> 2
59+
# STEP_END
60+
# REMOVE_START
61+
assert res7 == 5
62+
assert res8 == 2
63+
# REMOVE_END
64+
65+
# STEP_START vemb
66+
res9 = r.vset().vemb("points", "pt:A")
67+
print(res9) # >>> [0.9999999403953552, 0.9999999403953552]
68+
69+
res10 = r.vset().vemb("points", "pt:B")
70+
print(res10) # >>> [-0.9999999403953552, -0.9999999403953552]
71+
72+
res11 = r.vset().vemb("points", "pt:C")
73+
print(res11) # >>> [-0.9999999403953552, 0.9999999403953552]
74+
75+
res12 = r.vset().vemb("points", "pt:D")
76+
print(res12) # >>> [0.9999999403953552, -0.9999999403953552]
77+
78+
res13 = r.vset().vemb("points", "pt:E")
79+
print(res13) # >>> [1, 0]
80+
# STEP_END
81+
# REMOVE_START
82+
assert 1 - res9[0] < 0.001
83+
assert 1 - res9[1] < 0.001
84+
assert 1 + res10[0] < 0.001
85+
assert 1 + res10[1] < 0.001
86+
assert 1 + res11[0] < 0.001
87+
assert 1 - res11[1] < 0.001
88+
assert 1 - res12[0] < 0.001
89+
assert 1 + res12[1] < 0.001
90+
assert res13 == [1, 0]
91+
# REMOVE_END
92+
93+
# STEP_START attr
94+
res14 = r.vset().vsetattr("points", "pt:A", {
95+
"name": "Point A",
96+
"description": "First point added"
97+
})
98+
print(res14) # >>> 1
99+
100+
res15 = r.vset().vgetattr("points", "pt:A")
101+
print(res15)
102+
# >>> {'name': 'Point A', 'description': 'First point added'}
103+
104+
res16 = r.vset().vsetattr("points", "pt:A", "")
105+
print(res16) # >>> 1
106+
107+
res17 = r.vset().vgetattr("points", "pt:A")
108+
print(res17) # >>> None
109+
# STEP_END
110+
# REMOVE_START
111+
assert res14 == 1
112+
assert res15 == {"name": "Point A", "description": "First point added"}
113+
assert res16 == 1
114+
assert res17 is None
115+
# REMOVE_END
116+
117+
# STEP_START vrem
118+
res18 = r.vset().vadd("points", [0, 0], "pt:F")
119+
print(res18) # >>> 1
120+
121+
res19 = r.vset().vcard("points")
122+
print(res19) # >>> 6
123+
124+
res20 = r.vset().vrem("points", "pt:F")
125+
print(res20) # >>> 1
126+
127+
res21 = r.vset().vcard("points")
128+
print(res21) # >>> 5
129+
# STEP_END
130+
# REMOVE_START
131+
assert res18 == 1
132+
assert res19 == 6
133+
assert res20 == 1
134+
assert res21 == 5
135+
# REMOVE_END
136+
137+
# STEP_START vsim_basic
138+
res22 = r.vset().vsim("points", [0.9, 0.1])
139+
print(res22)
140+
# >>> ['pt:E', 'pt:A', 'pt:D', 'pt:C', 'pt:B']
141+
# STEP_END
142+
# REMOVE_START
143+
assert res22 == ["pt:E", "pt:A", "pt:D", "pt:C", "pt:B"]
144+
# REMOVE_END
145+
146+
# STEP_START vsim_options
147+
res23 = r.vset().vsim(
148+
"points", "pt:A",
149+
with_scores=True,
150+
count=4
151+
)
152+
print(res23)
153+
# >>> {'pt:A': 1.0, 'pt:E': 0.8535534143447876, 'pt:D': 0.5, 'pt:C': 0.5}
154+
# STEP_END
155+
# REMOVE_START
156+
assert res23["pt:A"] == 1.0
157+
assert res23["pt:C"] == 0.5
158+
assert res23["pt:D"] == 0.5
159+
assert res23["pt:E"] - 0.85 < 0.005
160+
# REMOVE_END
161+
162+
# STEP_START vsim_filter
163+
res24 = r.vset().vsetattr("points", "pt:A", {
164+
"size": "large",
165+
"price": 18.99
166+
})
167+
print(res24) # >>> 1
168+
169+
res25 = r.vset().vsetattr("points", "pt:B", {
170+
"size": "large",
171+
"price": 35.99
172+
})
173+
print(res25) # >>> 1
174+
175+
res26 = r.vset().vsetattr("points", "pt:C", {
176+
"size": "large",
177+
"price": 25.99
178+
})
179+
print(res26) # >>> 1
180+
181+
res27 = r.vset().vsetattr("points", "pt:D", {
182+
"size": "small",
183+
"price": 21.00
184+
})
185+
print(res27) # >>> 1
186+
187+
res28 = r.vset().vsetattr("points", "pt:E", {
188+
"size": "small",
189+
"price": 17.75
190+
})
191+
print(res28) # >>> 1
192+
193+
# Return elements in order of distance from point A whose
194+
# `size` attribute is `large`.
195+
res29 = r.vset().vsim(
196+
"points", "pt:A",
197+
filter='.size == "large"'
198+
)
199+
print(res29) # >>> ['pt:A', 'pt:C', 'pt:B']
200+
201+
# Return elements in order of distance from point A whose size is
202+
# `large` and whose price is greater than 20.00.
203+
res30 = r.vset().vsim(
204+
"points", "pt:A",
205+
filter='.size == "large" && .price > 20.00'
206+
)
207+
print(res30) # >>> ['pt:C', 'pt:B']
208+
# STEP_END
209+
# REMOVE_START
210+
assert res24 == 1
211+
assert res25 == 1
212+
assert res26 == 1
213+
assert res27 == 1
214+
assert res28 == 1
215+
216+
assert res30 == ['pt:C', 'pt:B']
217+
# REMOVE_END
218+
219+
# STEP_START add_quant
220+
# Import `QuantizationOptions` enum using:
221+
#
222+
# from redis.commands.vectorset.commands import (
223+
# QuantizationOptions
224+
# )
225+
res31 = r.vset().vadd(
226+
"quantSetQ8", [1.262185, 1.958231],
227+
"quantElement",
228+
quantization=QuantizationOptions.Q8
229+
)
230+
print(res31) # >>> 1
231+
232+
res32 = r.vset().vemb("quantSetQ8", "quantElement")
233+
print(f"Q8: {res32}")
234+
# >>> Q8: [1.2643694877624512, 1.958230972290039]
235+
236+
res33 = r.vset().vadd(
237+
"quantSetNoQ", [1.262185, 1.958231],
238+
"quantElement",
239+
quantization=QuantizationOptions.NOQUANT
240+
)
241+
print(res33) # >>> 1
242+
243+
res34 = r.vset().vemb("quantSetNoQ", "quantElement")
244+
print(f"NOQUANT: {res34}")
245+
# >>> NOQUANT: [1.262184977531433, 1.958230972290039]
246+
247+
res35 = r.vset().vadd(
248+
"quantSetBin", [1.262185, 1.958231],
249+
"quantElement",
250+
quantization=QuantizationOptions.BIN
251+
)
252+
print(res35) # >>> 1
253+
254+
res36 = r.vset().vemb("quantSetBin", "quantElement")
255+
print(f"BIN: {res36}")
256+
# >>> BIN: [1, 1]
257+
# STEP_END
258+
# REMOVE_START
259+
assert res31 == 1
260+
# REMOVE_END
261+
262+
# STEP_START add_reduce
263+
# Create a list of 300 arbitrary values.
264+
values = [x / 299 for x in range(300)]
265+
266+
res37 = r.vset().vadd(
267+
"setNotReduced",
268+
values,
269+
"element"
270+
)
271+
print(res37) # >>> 1
272+
273+
res38 = r.vset().vdim("setNotReduced")
274+
print(res38) # >>> 300
275+
276+
res39 = r.vset().vadd(
277+
"setReduced",
278+
values,
279+
"element",
280+
reduce_dim=100
281+
)
282+
print(res39) # >>> 1
283+
284+
res40 = r.vset().vdim("setReduced") # >>> 100
285+
print(res40)
286+
# STEP_END

doctests/home_json.py

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import redis.commands.search.aggregation as aggregations
1111
import redis.commands.search.reducers as reducers
1212
from redis.commands.search.field import TextField, NumericField, TagField
13-
from redis.commands.search.indexDefinition import IndexDefinition, IndexType
13+
from redis.commands.search.index_definition import IndexDefinition, IndexType
1414
from redis.commands.search.query import Query
1515
import redis.exceptions
1616
# STEP_END
@@ -25,7 +25,12 @@
2525
except redis.exceptions.ResponseError:
2626
pass
2727

28-
r.delete("user:1", "user:2", "user:3")
28+
try:
29+
r.ft("hash-idx:users").dropindex(True)
30+
except redis.exceptions.ResponseError:
31+
pass
32+
33+
r.delete("user:1", "user:2", "user:3", "huser:1", "huser:2", "huser:3")
2934
# REMOVE_END
3035
# STEP_START create_data
3136
user1 = {
@@ -134,4 +139,50 @@
134139
)
135140
# REMOVE_END
136141

142+
# STEP_START make_hash_index
143+
hashSchema = (
144+
TextField("name"),
145+
TagField("city"),
146+
NumericField("age")
147+
)
148+
149+
hashIndexCreated = r.ft("hash-idx:users").create_index(
150+
hashSchema,
151+
definition=IndexDefinition(
152+
prefix=["huser:"], index_type=IndexType.HASH
153+
)
154+
)
155+
# STEP_END
156+
# REMOVE_START
157+
assert hashIndexCreated
158+
# REMOVE_END
159+
160+
# STEP_START add_hash_data
161+
huser1Set = r.hset("huser:1", mapping=user1)
162+
huser2Set = r.hset("huser:2", mapping=user2)
163+
huser3Set = r.hset("huser:3", mapping=user3)
164+
# STEP_END
165+
# REMOVE_START
166+
assert huser1Set
167+
assert huser2Set
168+
assert huser3Set
169+
# REMOVE_END
170+
171+
# STEP_START query1_hash
172+
findPaulHashResult = r.ft("hash-idx:users").search(
173+
Query("Paul @age:[30 40]")
174+
)
175+
176+
print(findPaulHashResult)
177+
# >>> Result{1 total, docs: [Document {'id': 'huser:3',
178+
# >>> 'payload': None, 'name': 'Paul Zamir', ...
179+
# STEP_END
180+
# REMOVE_START
181+
assert str(findPaulHashResult) == (
182+
"Result{1 total, docs: [Document " +
183+
"{'id': 'huser:3', 'payload': None, 'name': 'Paul Zamir', " +
184+
"'email': '[email protected]', 'age': '35', 'city': 'Tel Aviv'}]}"
185+
)
186+
# REMOVE_END
187+
137188
r.close()

0 commit comments

Comments
 (0)