Fix OR expression with KNN producing syntax error #787
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Fixes #557 - Using an OR expression with a KNN expression was raising
ResponseError: Syntax error at offset.Problem
When combining an OR expression like
(Album.tags == "x") | (Album.tags == "y")with a KNN expression, the generated query was invalid:The issue is that the KNN suffix
=>[KNN ...]was only being applied to the second term of the OR expression, not the entire filter. RediSearch requires the filter to be a single expression before the KNN syntax.Solution
Always wrap the filter expression in parentheses when appending KNN syntax (unless it's the wildcard
*):The previous logic checked
startswith("(")to determine if wrapping was needed, but this was insufficient for OR expressions that happen to start with(but aren't fully wrapped.Changes
FindQuery.queryproperty to always wrap filter expressions in parentheses when combining with KNNtest_or_expression_with_knntest that reproduces the exact scenario from the issueTesting
The test creates albums with different tags, then queries using: