Skip to content

Commit 2d4b3d4

Browse files
Added Ignore Case keyword for queries
1 parent 53b3423 commit 2d4b3d4

5 files changed

Lines changed: 58 additions & 26 deletions

File tree

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/query/EclipseStoreQueryCreator.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ private AbstractCriteriaNode<T> from(
126126
{
127127
Objects.requireNonNull(criteria);
128128
final Part.Type type = Objects.requireNonNull(part).getType();
129+
final Part.IgnoreCaseType ignoreCaseType = part.shouldIgnoreCase();
130+
final boolean doIgnoreCase =
131+
ignoreCaseType == Part.IgnoreCaseType.ALWAYS || ignoreCaseType == Part.IgnoreCaseType.WHEN_POSSIBLE;
129132

130133
switch(type)
131134
{
@@ -169,27 +172,27 @@ private AbstractCriteriaNode<T> from(
169172
}
170173
case LIKE ->
171174
{
172-
return criteria.like((String)Objects.requireNonNull(parameters).next());
175+
return criteria.like((String)Objects.requireNonNull(parameters).next(), doIgnoreCase);
173176
}
174177
case STARTING_WITH ->
175178
{
176-
return criteria.startWith((String)Objects.requireNonNull(parameters).next());
179+
return criteria.startWith((String)Objects.requireNonNull(parameters).next(), doIgnoreCase);
177180
}
178181
case ENDING_WITH ->
179182
{
180-
return criteria.endWith((String)Objects.requireNonNull(parameters).next());
183+
return criteria.endWith((String)Objects.requireNonNull(parameters).next(), doIgnoreCase);
181184
}
182185
case CONTAINING ->
183186
{
184-
return criteria.containing((String)Objects.requireNonNull(parameters).next());
187+
return criteria.containing((String)Objects.requireNonNull(parameters).next(), doIgnoreCase);
185188
}
186189
case NOT_LIKE ->
187190
{
188-
return criteria.notLike((String)Objects.requireNonNull(parameters).next());
191+
return criteria.notLike((String)Objects.requireNonNull(parameters).next(), doIgnoreCase);
189192
}
190193
case NOT_CONTAINING ->
191194
{
192-
return criteria.notContaining((String)Objects.requireNonNull(parameters).next());
195+
return criteria.notContaining((String)Objects.requireNonNull(parameters).next(), doIgnoreCase);
193196
}
194197
case EXISTS ->
195198
{

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/query/criteria/AbstractCriteriaNode.java

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -147,51 +147,59 @@ public AbstractCriteriaNode<T> exists(final boolean value)
147147
return this;
148148
}
149149

150-
public AbstractCriteriaNode<T> like(final String like)
150+
public AbstractCriteriaNode<T> like(final String like, final boolean doIgnoreCase)
151151
{
152-
final String completeRegex = sqlLikeStringToRegex(like);
152+
final String completeRegex = sqlLikeStringToRegex(like, doIgnoreCase);
153153
this.predicates.add(entity -> {
154154
final String fieldValue = (String)Objects.requireNonNull(this.field).readValue(entity);
155-
return fieldValue != null && fieldValue.matches(completeRegex);
155+
if(fieldValue == null)
156+
{
157+
return false;
158+
}
159+
return (doIgnoreCase ? fieldValue.toUpperCase() : fieldValue).matches(completeRegex);
156160
});
157161
return this;
158162
}
159163

160-
private static String sqlLikeStringToRegex(final String like)
164+
private static String sqlLikeStringToRegex(final String like, final boolean doIgnoreCase)
161165
{
162-
String regex = like;
166+
String regex = doIgnoreCase ? like.toUpperCase() : like;
163167
regex = regex.replace(".", "\\.");
164168
regex = regex.replace("_", ".");
165169
return regex.replace("%", ".*");
166170
}
167171

168-
public AbstractCriteriaNode<T> startWith(final String startString)
172+
public AbstractCriteriaNode<T> startWith(final String startString, final boolean doIgnoreCase)
169173
{
170-
return this.like(startString + "%");
174+
return this.like(startString + "%", doIgnoreCase);
171175
}
172176

173-
public AbstractCriteriaNode<T> endWith(final String endString)
177+
public AbstractCriteriaNode<T> endWith(final String endString, final boolean doIgnoreCase)
174178
{
175-
return this.like("%" + endString);
179+
return this.like("%" + endString, doIgnoreCase);
176180
}
177181

178-
public AbstractCriteriaNode<T> containing(final String containedString)
182+
public AbstractCriteriaNode<T> containing(final String containedString, final boolean doIgnoreCase)
179183
{
180-
return this.like("%" + containedString + "%");
184+
return this.like("%" + containedString + "%", doIgnoreCase);
181185
}
182186

183-
public AbstractCriteriaNode<T> notLike(final String notLikeString)
187+
public AbstractCriteriaNode<T> notLike(final String notLikeString, final boolean doIgnoreCase)
184188
{
185-
final String completeRegex = sqlLikeStringToRegex(notLikeString);
189+
final String completeRegex = sqlLikeStringToRegex(notLikeString, doIgnoreCase);
186190
this.predicates.add(entity -> {
187191
final String fieldValue = (String)Objects.requireNonNull(this.field).readValue(entity);
188-
return fieldValue != null && !fieldValue.matches(completeRegex);
192+
if(fieldValue == null)
193+
{
194+
return false;
195+
}
196+
return !(doIgnoreCase ? fieldValue.toUpperCase() : fieldValue).matches(completeRegex);
189197
});
190198
return this;
191199
}
192200

193-
public AbstractCriteriaNode<T> notContaining(final String containedString)
201+
public AbstractCriteriaNode<T> notContaining(final String containedString, final boolean doIgnoreCase)
194202
{
195-
return this.notLike("%" + containedString + "%");
203+
return this.notLike("%" + containedString + "%", doIgnoreCase);
196204
}
197205
}

spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/query/by/string/UserRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ public interface UserRepository extends EclipseStoreRepository<User, Long>
6363
// Test keyword: Like
6464
List<User> findByFirstNameLike(String pattern);
6565

66+
List<User> findByFirstNameLikeIgnoreCase(String pattern);
67+
6668
// Test keyword: NotLike
6769
List<User> findByFirstNameNotLike(String pattern);
6870

spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/integration/isolated/tests/query/by/string/UserRepositoryTests.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,25 @@ static Stream<Arguments> provideArgumentsForFindByFirstNameLike()
279279
);
280280
}
281281

282+
@ParameterizedTest
283+
@MethodSource("provideArgumentsForFindByFirstNameLikeIgnoreCase")
284+
void testFindByFirstNameLikeIgnoreCase(final String pattern, final int expectedSize)
285+
{
286+
final List<User> users = this.userRepository.findByFirstNameLikeIgnoreCase(pattern);
287+
Assertions.assertEquals(expectedSize, users.size());
288+
}
289+
290+
static Stream<Arguments> provideArgumentsForFindByFirstNameLikeIgnoreCase()
291+
{
292+
return Stream.of(
293+
Arguments.of("John", 1),
294+
Arguments.of("J%", 2),
295+
Arguments.of("j%", 2),
296+
Arguments.of("A%", 1),
297+
Arguments.of("a%", 1)
298+
);
299+
}
300+
282301
@ParameterizedTest
283302
@MethodSource("provideArgumentsForFindByFirstNameNotLike")
284303
void testFindByFirstNameNotLike(final String pattern, final int expectedSize)

spring-data-eclipse-store/src/test/java/software/xdev/spring/data/eclipse/store/repository/query/EclipseStoreQueryCreatorStringTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ static Stream<Arguments> generateDataWithCountOfFirstNameLike()
4848
return Stream.of(
4949
Arguments.of("%", 3),
5050
Arguments.of("M%", 2),
51-
Arguments.of("m%", 2),
52-
Arguments.of("m_ck", 2),
51+
Arguments.of("m%", 0),
52+
Arguments.of("m_ck", 0),
5353
Arguments.of("%ick", 2),
5454
Arguments.of("%k", 2),
5555
Arguments.of("%ck%", 2),
@@ -93,8 +93,8 @@ static Stream<Arguments> generateDataWithCountOfFirstNameNotLike()
9393
return Stream.of(
9494
Arguments.of("%", 0),
9595
Arguments.of("M%", 1),
96-
Arguments.of("m%", 1),
97-
Arguments.of("m_ck", 1),
96+
Arguments.of("m%", 3),
97+
Arguments.of("m_ck", 3),
9898
Arguments.of("%ick", 1),
9999
Arguments.of("%k", 1),
100100
Arguments.of("%ck%", 1),

0 commit comments

Comments
 (0)