Skip to content

Commit aafb593

Browse files
array search (#202)
Co-authored-by: Paulo Ferreira <paulo.ferreira25@gmail.com>
1 parent 09f419e commit aafb593

File tree

2 files changed

+44
-6
lines changed

2 files changed

+44
-6
lines changed

src/main/java/com/arangodb/springframework/repository/ArangoExampleConverter.java

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,17 @@
2323
import java.lang.annotation.Annotation;
2424
import java.util.HashSet;
2525
import java.util.Map;
26+
import java.util.Objects;
2627
import java.util.Optional;
2728
import java.util.Set;
2829

2930
import org.springframework.data.domain.Example;
3031
import org.springframework.data.domain.ExampleMatcher;
3132
import org.springframework.data.mapping.AssociationHandler;
3233
import org.springframework.data.mapping.PersistentPropertyAccessor;
34+
3335
import org.springframework.util.Assert;
36+
import org.springframework.util.ClassUtils;
3437

3538
import com.arangodb.springframework.core.convert.resolver.ReferenceResolver;
3639
import com.arangodb.springframework.core.convert.resolver.ResolverFactory;
@@ -78,10 +81,15 @@ private void traversePropertyTree(final Example<T> example, final StringBuilder
7881
final ArangoPersistentEntity<?> persistentEntity = context
7982
.getPersistentEntity(property.getActualType());
8083
final StringBuilder predicateBuilderArray = new StringBuilder();
81-
for (Object item : (Iterable) value) {
84+
for (Object item : (Iterable<?>) value) {
8285
final StringBuilder predicateBuilderArrayItem = new StringBuilder();
83-
traversePropertyTree(example, predicateBuilderArrayItem, bindVars, "", fullJavaPath,
84-
persistentEntity, item, "CURRENT");
86+
if (ClassUtils.isPrimitiveOrWrapper(item.getClass()) || item.getClass() == String.class) {
87+
addPredicate(example, predicateBuilderArrayItem, bindVars, null, fullJavaPath, item, "CURRENT");
88+
} else {
89+
traversePropertyTree(example, predicateBuilderArrayItem, bindVars, "", fullJavaPath,
90+
persistentEntity, item, "CURRENT");
91+
}
92+
8593
if (predicateBuilderArray.length() > 0) {
8694
predicateBuilderArray.append(" OR ");
8795
}
@@ -154,9 +162,18 @@ private void addPredicate(final Example<T> example, final StringBuilder predicat
154162
: specifier.getStringMatcher();
155163
final String string = (String) value;
156164
if (stringMatcher == ExampleMatcher.StringMatcher.REGEX) {
157-
clause = String.format("REGEX_TEST(%s.%s, @%s, %b)", bindEntintyName, fullPath, binding, ignoreCase);
165+
if (Objects.isNull(fullPath)) {
166+
clause = String.format("REGEX_TEST(%s, @%s, %b)", bindEntintyName, binding, ignoreCase);
167+
} else {
168+
clause = String.format("REGEX_TEST(%s.%s, @%s, %b)", bindEntintyName, fullPath, binding,
169+
ignoreCase);
170+
}
158171
} else {
159-
clause = String.format("LIKE(%s.%s, @%s, %b)", bindEntintyName, fullPath, binding, ignoreCase);
172+
if (Objects.isNull(fullPath)) {
173+
clause = String.format("LIKE(%s, @%s, %b)", bindEntintyName, binding, ignoreCase);
174+
} else {
175+
clause = String.format("LIKE(%s.%s, @%s, %b)", bindEntintyName, fullPath, binding, ignoreCase);
176+
}
160177
}
161178
switch (stringMatcher) {
162179
case STARTING:
@@ -178,7 +195,12 @@ private void addPredicate(final Example<T> example, final StringBuilder predicat
178195
break;
179196
}
180197
} else {
181-
clause = String.format("%s.%s == @%s", bindEntintyName, fullPath, binding);
198+
if (Objects.isNull(fullPath)) {
199+
clause = String.format("%s == @%s", bindEntintyName, binding);
200+
} else {
201+
clause = String.format("%s.%s == @%s", bindEntintyName, fullPath, binding);
202+
}
203+
182204
}
183205
predicateBuilder.append(clause);
184206
if (value != null) {

src/test/java/com/arangodb/springframework/repository/ArangoRepositoryTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,22 @@ public void findAllByExampleWithArrayORTest() {
373373
assertEquals(check, retrieved);
374374
}
375375

376+
@Test
377+
public void findAllByExampleWhitArrayStringTest() {
378+
final List<Customer> toBeRetrieved = new LinkedList<>();
379+
final Customer customer1 = new Customer("AbbaXP", "BbaaaaXZ", 1001);
380+
final Customer customer2 = new Customer("Bwa?[a.b]baAaGH", "", 67);
381+
customer1.setStringList(Arrays.asList("testA", "testB", "testC"));
382+
customer2.setStringList(Arrays.asList("test1", "test2", "test3"));
383+
toBeRetrieved.add(customer1);
384+
toBeRetrieved.add(customer2);
385+
repository.saveAll(toBeRetrieved);
386+
final Customer exampleCustomer = new Customer("AbbaXP", "BbaaaaXZ", 1001);
387+
exampleCustomer.setStringList(Arrays.asList("testB"));
388+
final Example<Customer> example = Example.of(exampleCustomer);
389+
final Customer retrieved = repository.findOne(example).get();
390+
assertEquals(customer1, retrieved);
391+
}
376392

377393

378394
@Test

0 commit comments

Comments
 (0)