Skip to content

Commit be2e10c

Browse files
committed
fix: handles parameters that share a prefix in queries (resolves gh-187)
1 parent 0dd94e2 commit be2e10c

File tree

5 files changed

+90
-3
lines changed

5 files changed

+90
-3
lines changed

redis-om-spring/src/main/java/com/redis/om/spring/repository/query/RediSearchQuery.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ public class RediSearchQuery implements RepositoryQuery {
4949
private final QueryMethod queryMethod;
5050
private final String searchIndex;
5151

52-
5352
private RediSearchQueryType type;
5453
private String value;
5554

@@ -594,7 +593,8 @@ private String prepareQuery(final Object[] parameters) {
594593
v = parameters[index].toString();
595594
}
596595

597-
preparedQuery = new StringBuilder(preparedQuery.toString().replace("$" + key, v));
596+
var regex = "(\\$" + key + ")(\\W+|\\*|\\+)(.*)";
597+
preparedQuery = new StringBuilder(preparedQuery.toString().replaceAll(regex, v + "$2$3"));
598598
}
599599
index++;
600600
}

redis-om-spring/src/main/java/com/redis/om/spring/repository/query/RedisEnhancedQuery.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,8 @@ private String prepareQuery(final Object[] parameters) {
594594
v = ObjectUtils.asString(parameters[index], mappingConverter);
595595
}
596596

597-
preparedQuery = new StringBuilder(preparedQuery.toString().replace("$" + key, v));
597+
var regex = "(\\$" + key + ")(\\W+|\\*|\\+)(.*)";
598+
preparedQuery = new StringBuilder(preparedQuery.toString().replaceAll(regex, v+"$2$3"));
598599
}
599600
index++;
600601
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.redis.om.spring.annotations.document;
2+
3+
import com.google.common.collect.Sets;
4+
import com.redis.om.spring.AbstractBaseDocumentTest;
5+
import com.redis.om.spring.annotations.document.fixtures.*;
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.data.geo.Distance;
10+
import org.springframework.data.geo.Point;
11+
import org.springframework.data.redis.connection.RedisGeoCommands;
12+
import redis.clients.jedis.json.Path;
13+
14+
import java.time.LocalDate;
15+
import java.util.ArrayList;
16+
import java.util.List;
17+
import java.util.Optional;
18+
import java.util.Set;
19+
import java.util.stream.IntStream;
20+
21+
import static org.assertj.core.api.Assertions.assertThat;
22+
import static org.junit.jupiter.api.Assertions.*;
23+
24+
@SuppressWarnings("SpellCheckingInspection")
25+
class RepositoryIssuesTest extends AbstractBaseDocumentTest {
26+
@Autowired
27+
User2Repository repository;
28+
29+
@BeforeEach
30+
void cleanUp() {
31+
repository.deleteAll();
32+
repository.save(User2.of("Doe", "Paris", "12 rue Rivoli"));
33+
}
34+
35+
// RediSearchQuery wrong preparedQuery #187
36+
@Test
37+
void testIncorrectParameterInjection() {
38+
Iterable<User2> results = repository.findUser("Doe", "Paris", "12 rue Rivoli");
39+
40+
assertThat(results).extracting("name").containsExactly("Doe");
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.redis.om.spring.annotations.document.fixtures;
2+
3+
import com.redis.om.spring.annotations.Document;
4+
import com.redis.om.spring.annotations.Indexed;
5+
import lombok.*;
6+
import org.springframework.data.annotation.Id;
7+
8+
@Data
9+
@RequiredArgsConstructor(staticName = "of")
10+
@AllArgsConstructor(access = AccessLevel.PROTECTED)
11+
@NoArgsConstructor
12+
@Document
13+
public class User2{
14+
@Id
15+
@Indexed
16+
private String id;
17+
18+
@NonNull
19+
@Indexed
20+
private String name;
21+
22+
@NonNull
23+
@Indexed
24+
private String address;
25+
26+
@NonNull
27+
@Indexed
28+
private String addressComplement;
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.redis.om.spring.annotations.document.fixtures;
2+
3+
import com.redis.om.spring.annotations.Query;
4+
import com.redis.om.spring.repository.RedisDocumentRepository;
5+
import org.springframework.data.repository.query.Param;
6+
7+
@SuppressWarnings("unused") public interface User2Repository extends RedisDocumentRepository<User2, String> {
8+
9+
@Query("(@name:{$name}) (@address:{$address}) (@addressComplement:{$addressComp})")
10+
Iterable<User2> findUser( //
11+
@Param("name") String name, //
12+
@Param("address") String strAdd, //
13+
@Param("addressComp") String strAddComp //
14+
);
15+
}

0 commit comments

Comments
 (0)