Skip to content
This repository was archived by the owner on Feb 14, 2020. It is now read-only.

Commit 8d36014

Browse files
author
Jeff Boone
authored
Merge pull request #12 from mzhangsfly/query_update
Added case insensitive support for query: startWith and contains.
2 parents ed1e752 + 1718095 commit 8d36014

File tree

3 files changed

+28
-11
lines changed

3 files changed

+28
-11
lines changed

src/main/java/com/aerospike/helper/query/Qualifier.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
import java.util.Map;
3737
import java.util.Set;
3838

39+
import org.springframework.data.repository.query.parser.Part.IgnoreCaseType;
40+
3941
import com.aerospike.client.Value;
4042
import com.aerospike.client.command.ParticleType;
4143
import com.aerospike.client.query.Filter;
@@ -61,13 +63,14 @@
6163
public class Qualifier implements Map<String, Object>, Serializable {
6264
private static final long serialVersionUID = -2689196529952712849L;
6365
private static final String FIELD = "field";
66+
private static final String IGNORE_CASE = "ignoreCase";
6467
private static final String VALUE2 = "value2";
6568
private static final String VALUE1 = "value1";
6669
private static final String OPERATION = "operation";
6770
protected Map<String, Object> internalMap;
6871

6972
public enum FilterOperation {
70-
EQ, GT, GTEQ, LT, LTEQ, NOTEQ, BETWEEN, START_WITH, ENDS_WITH,CONTAINING,
73+
EQ, GT, GTEQ, LT, LTEQ, NOTEQ, BETWEEN, START_WITH, ENDS_WITH, CONTAINING,
7174
LIST_CONTAINS, MAP_KEYS_CONTAINS, MAP_VALUES_CONTAINS,
7275
LIST_BETWEEN, MAP_KEYS_BETWEEN, MAP_VALUES_BETWEEN, GEO_WITHIN
7376
}
@@ -78,14 +81,19 @@ public Qualifier() {
7881
}
7982

8083
public Qualifier(String field, FilterOperation operation, Value value1) {
84+
this(field, operation, IgnoreCaseType.NEVER, value1);
85+
}
86+
87+
public Qualifier(String field, FilterOperation operation, IgnoreCaseType ignoreCase, Value value1) {
8188
this();
8289
internalMap.put(FIELD, field);
8390
internalMap.put(OPERATION, operation);
8491
internalMap.put(VALUE1, value1);
92+
internalMap.put(IGNORE_CASE, ignoreCase);
8593
}
8694

8795
public Qualifier(String field, FilterOperation operation, Value value1, Value value2) {
88-
this(field, operation, value1);
96+
this(field, operation, IgnoreCaseType.NEVER, value1);
8997
internalMap.put(VALUE2, value2);
9098
}
9199

@@ -194,15 +202,21 @@ public String luaFilterString() {
194202
value2 = luaValueString(getValue2());
195203
return String.format("rangeValue(%s, %s, %s)", luaFieldString(getField()), value1, value2);
196204
case START_WITH:
197-
return String.format("string.sub(%s,1,string.len(%s))==%s", luaFieldString(getField()), value1, value1);
205+
if(IgnoreCaseType.ALWAYS == internalMap.get(IGNORE_CASE))
206+
return String.format("string.upper(string.sub(%s,1,string.len(%s)))==%s", luaFieldString(getField()), value1, value1.toUpperCase());
207+
else
208+
return String.format("string.sub(%s,1,string.len(%s))==%s", luaFieldString(getField()), value1, value1);
198209
case ENDS_WITH:
199210
return String.format("%s=='' or string.sub(%s,-string.len(%s))==%s",
200211
value1,
201212
luaFieldString(getField()),
202213
value1,
203214
value1);
204215
case CONTAINING:
205-
return String.format("string.find(%s, %s)", luaFieldString(getField()), value1);
216+
if(IgnoreCaseType.ALWAYS == internalMap.get(IGNORE_CASE))
217+
return String.format("string.find(string.upper(%s), %s)", luaFieldString(getField()), value1.toUpperCase());
218+
else
219+
return String.format("string.find(%s, %s)", luaFieldString(getField()), value1);
206220
case GEO_WITHIN:
207221
return String.format("%s %d %s %s)", getField(), ParticleType.GEOJSON, value1, value1);
208222
}

src/main/java/org/springframework/data/aerospike/repository/query/AerospikeQueryCreator.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.springframework.data.repository.query.ParameterAccessor;
1717
import org.springframework.data.repository.query.parser.AbstractQueryCreator;
1818
import org.springframework.data.repository.query.parser.Part;
19+
import org.springframework.data.repository.query.parser.Part.IgnoreCaseType;
1920
import org.springframework.data.repository.query.parser.Part.Type;
2021
import org.springframework.data.repository.query.parser.PartTree;
2122

@@ -73,7 +74,8 @@ protected Criteria create(Part part, Iterator<Object> iterator) {
7374
private Criteria from(Part part, AerospikePersistentProperty property, Criteria criteria, Iterator<?> parameters) {
7475
Type type = part.getType();
7576
String fieldName = ((CachingAerospikePersistentProperty) property).getFieldName();
76-
77+
IgnoreCaseType ignoreCase = part.shouldIgnoreCase();
78+
7779
switch (type) {
7880
case AFTER:
7981
case GREATER_THAN:
@@ -96,11 +98,11 @@ private Criteria from(Part part, AerospikePersistentProperty property, Criteria
9698
return criteria.in(parameters.next());
9799
case LIKE:
98100
case STARTING_WITH:
99-
return criteria.startingWith(parameters.next(), fieldName);
101+
return criteria.startingWith(parameters.next(), fieldName, ignoreCase);
100102
case ENDING_WITH:
101103
return null;
102104
case CONTAINING:
103-
return criteria.containing(parameters.next(), fieldName);
105+
return criteria.containing(parameters.next(), fieldName, ignoreCase);
104106
case NOT_CONTAINING:
105107
return null;
106108
case REGEX:

src/main/java/org/springframework/data/aerospike/repository/query/Criteria.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import org.springframework.core.convert.support.DefaultConversionService;
1111
import org.springframework.data.aerospike.InvalidAerospikeDataAccessApiUsageException;
12+
import org.springframework.data.repository.query.parser.Part.IgnoreCaseType;
1213
import org.springframework.util.CollectionUtils;
1314

1415
import com.aerospike.client.Value;
@@ -293,9 +294,9 @@ public Criteria between(Object o1, Object o2,String propertyName) {
293294
* @param criteria2
294295
* @return
295296
*/
296-
public Criteria startingWith(Object o,String propertyName) {
297+
public Criteria startingWith(Object o,String propertyName, IgnoreCaseType ignoreCase) {
297298
Qualifier qualifier = new Qualifier(propertyName,
298-
Qualifier.FilterOperation.START_WITH, Value.get(o));
299+
Qualifier.FilterOperation.START_WITH, ignoreCase, Value.get(o));
299300
this.criteria.put(Qualifier.FilterOperation.START_WITH.name(),
300301
qualifier);
301302
return this;
@@ -308,9 +309,9 @@ public Criteria startingWith(Object o,String propertyName) {
308309
* @param criteria2
309310
* @return
310311
*/
311-
public Criteria containing(Object o,String propertyName) {
312+
public Criteria containing(Object o,String propertyName, IgnoreCaseType ignoreCase) {
312313
Qualifier qualifier = new Qualifier(propertyName,
313-
Qualifier.FilterOperation.CONTAINING, Value.get(o));
314+
Qualifier.FilterOperation.CONTAINING, ignoreCase, Value.get(o));
314315
this.criteria.put(Qualifier.FilterOperation.CONTAINING.name(),
315316
qualifier);
316317
return this;

0 commit comments

Comments
 (0)