Skip to content

Commit 877f4f2

Browse files
Support inorder query param (#190)
1 parent 92e285c commit 877f4f2

File tree

2 files changed

+43
-4
lines changed

2 files changed

+43
-4
lines changed

redisvl/query/query.py

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,17 @@ def __init__(
1313
return_fields: Optional[List[str]] = None,
1414
num_results: int = 10,
1515
dialect: int = 2,
16+
sort_by: Optional[str] = None,
17+
in_order: bool = False,
1618
):
1719
"""Base query class used to subclass many query types."""
1820
self._return_fields = return_fields if return_fields is not None else []
1921
self._num_results = num_results
2022
self._dialect = dialect
2123
self._first = 0
2224
self._limit = num_results
25+
self._sort_by = sort_by
26+
self._in_order = in_order
2327

2428
def __str__(self) -> str:
2529
return " ".join([str(x) for x in self.query.get_args()])
@@ -137,6 +141,7 @@ def __init__(
137141
num_results: int = 10,
138142
dialect: int = 2,
139143
sort_by: Optional[str] = None,
144+
in_order: bool = False,
140145
params: Optional[Dict[str, Any]] = None,
141146
):
142147
"""A query for a running a filtered search with a filter expression.
@@ -149,6 +154,9 @@ def __init__(
149154
return. Defaults to 10.
150155
sort_by (Optional[str]): The field to order the results by. Defaults
151156
to None. Results will be ordered by vector distance.
157+
in_order (bool): Requires the terms in the field to have
158+
the same order as the terms in the query filter, regardless of
159+
the offsets between them. Defaults to False.
152160
params (Optional[Dict[str, Any]], optional): The parameters for the
153161
query. Defaults to None.
154162
@@ -165,9 +173,8 @@ def __init__(
165173
q = FilterQuery(return_fields=["brand", "price"], filter_expression=t)
166174
167175
"""
168-
super().__init__(return_fields, num_results, dialect)
176+
super().__init__(return_fields, num_results, dialect, sort_by, in_order)
169177
self.set_filter(filter_expression)
170-
self._sort_by = sort_by
171178
self._params = params or {}
172179

173180
@property
@@ -186,6 +193,10 @@ def query(self) -> Query:
186193
)
187194
if self._sort_by:
188195
query = query.sort_by(self._sort_by)
196+
197+
if self._in_order:
198+
query = query.in_order()
199+
189200
return query
190201

191202

@@ -208,13 +219,13 @@ def __init__(
208219
return_score: bool = True,
209220
dialect: int = 2,
210221
sort_by: Optional[str] = None,
222+
in_order: bool = False,
211223
):
212-
super().__init__(return_fields, num_results, dialect)
224+
super().__init__(return_fields, num_results, dialect, sort_by, in_order)
213225
self.set_filter(filter_expression)
214226
self._vector = vector
215227
self._field = vector_field_name
216228
self._dtype = dtype.lower()
217-
self._sort_by = sort_by
218229

219230
if return_score:
220231
self._return_fields.append(self.DISTANCE_ID)
@@ -232,6 +243,7 @@ def __init__(
232243
return_score: bool = True,
233244
dialect: int = 2,
234245
sort_by: Optional[str] = None,
246+
in_order: bool = False,
235247
):
236248
"""A query for running a vector search along with an optional filter
237249
expression.
@@ -254,6 +266,9 @@ def __init__(
254266
Defaults to 2.
255267
sort_by (Optional[str]): The field to order the results by. Defaults
256268
to None. Results will be ordered by vector distance.
269+
in_order (bool): Requires the terms in the field to have
270+
the same order as the terms in the query filter, regardless of
271+
the offsets between them. Defaults to False.
257272
258273
Raises:
259274
TypeError: If filter_expression is not of type redisvl.query.FilterExpression
@@ -271,6 +286,7 @@ def __init__(
271286
return_score,
272287
dialect,
273288
sort_by,
289+
in_order,
274290
)
275291

276292
@property
@@ -291,6 +307,10 @@ def query(self) -> Query:
291307
query = query.sort_by(self._sort_by)
292308
else:
293309
query = query.sort_by(self.DISTANCE_ID)
310+
311+
if self._in_order:
312+
query = query.in_order()
313+
294314
return query
295315

296316
@property
@@ -323,6 +343,7 @@ def __init__(
323343
return_score: bool = True,
324344
dialect: int = 2,
325345
sort_by: Optional[str] = None,
346+
in_order: bool = False,
326347
):
327348
"""A query for running a filtered vector search based on semantic
328349
distance threshold.
@@ -348,6 +369,10 @@ def __init__(
348369
Defaults to 2.
349370
sort_by (Optional[str]): The field to order the results by. Defaults
350371
to None. Results will be ordered by vector distance.
372+
in_order (bool): Requires the terms in the field to have
373+
the same order as the terms in the query filter, regardless of
374+
the offsets between them. Defaults to False.
375+
351376
Raises:
352377
TypeError: If filter_expression is not of type redisvl.query.FilterExpression
353378
@@ -365,6 +390,7 @@ def __init__(
365390
return_score,
366391
dialect,
367392
sort_by,
393+
in_order,
368394
)
369395
self.set_distance_threshold(distance_threshold)
370396

@@ -415,6 +441,10 @@ def query(self) -> Query:
415441
query = query.sort_by(self._sort_by)
416442
else:
417443
query = query.sort_by(self.DISTANCE_ID)
444+
445+
if self._in_order:
446+
query = query.in_order()
447+
418448
return query
419449

420450
@property

tests/unit/test_query_types.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ def test_filter_query():
4646
assert filter_query.params == {}
4747
assert filter_query._dialect == 2
4848
assert filter_query._sort_by == None
49+
assert filter_query._in_order == False
4950

5051
# Test set_filter functionality
5152
new_filter_expression = Tag("category") == "Sportswear"
@@ -64,6 +65,12 @@ def test_filter_query():
6465
)
6566
assert filter_query._sort_by == "price"
6667

68+
# Test in_order functionality
69+
filter_query = FilterQuery(
70+
filter_expression, return_fields, num_results=10, in_order=True
71+
)
72+
assert filter_query._in_order
73+
6774

6875
def test_vector_query():
6976
# Create a vector query
@@ -81,6 +88,7 @@ def test_vector_query():
8188
assert vector_query.params != {}
8289
assert vector_query._dialect == 3
8390
assert vector_query._sort_by == None
91+
assert vector_query._in_order == False
8492

8593
# Test set_filter functionality
8694
new_filter_expression = Tag("category") == "Sportswear"
@@ -124,6 +132,7 @@ def test_range_query():
124132
assert isinstance(range_query.params, dict)
125133
assert range_query.params != {}
126134
assert range_query._sort_by == None
135+
assert range_query._sort_by == None
127136

128137
# Test set_filter functionality
129138
new_filter_expression = Tag("category") == "Outdoor"

0 commit comments

Comments
 (0)