Skip to content

Commit 112f974

Browse files
committed
add string ops "<, >, in" to QueryBuilder
1 parent e06f761 commit 112f974

File tree

3 files changed

+129
-0
lines changed

3 files changed

+129
-0
lines changed

objectbox-java/src/main/java/io/objectbox/query/QueryBuilder.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,12 @@ private native long nativeLink(long handle, long storeHandle, int relationOwnerE
154154

155155
private native long nativeEndsWith(long handle, int propertyId, String value, boolean caseSensitive);
156156

157+
private native long nativeLess(long handle, int propertyId, String value, boolean caseSensitive);
158+
159+
private native long nativeGreater(long handle, int propertyId, String value, boolean caseSensitive);
160+
161+
private native long nativeIn(long handle, int propertyId, String[] value, boolean caseSensitive);
162+
157163
// ------------------------------ FPs ------------------------------
158164
private native long nativeLess(long handle, int propertyId, double value);
159165

@@ -622,6 +628,36 @@ public QueryBuilder<T> endsWith(Property<T> property, String value, StringOrder
622628
return this;
623629
}
624630

631+
public QueryBuilder<T> less(Property<T> property, String value) {
632+
return less(property, value, StringOrder.CASE_INSENSITIVE);
633+
}
634+
635+
public QueryBuilder<T> less(Property<T> property, String value, StringOrder order) {
636+
verifyHandle();
637+
checkCombineCondition(nativeLess(handle, property.getId(), value, order == StringOrder.CASE_SENSITIVE));
638+
return this;
639+
}
640+
641+
public QueryBuilder<T> greater(Property<T> property, String value) {
642+
return greater(property, value, StringOrder.CASE_INSENSITIVE);
643+
}
644+
645+
public QueryBuilder<T> greater(Property<T> property, String value, StringOrder order) {
646+
verifyHandle();
647+
checkCombineCondition(nativeGreater(handle, property.getId(), value, order == StringOrder.CASE_SENSITIVE));
648+
return this;
649+
}
650+
651+
public QueryBuilder<T> in(Property<T> property, String[] values) {
652+
return in(property, values, StringOrder.CASE_INSENSITIVE);
653+
}
654+
655+
public QueryBuilder<T> in(Property<T> property, String[] values, StringOrder order) {
656+
verifyHandle();
657+
checkCombineCondition(nativeIn(handle, property.getId(), values, order == StringOrder.CASE_SENSITIVE));
658+
return this;
659+
}
660+
625661
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
626662
// Floating point
627663
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

objectbox-kotlin/src/main/kotlin/io/objectbox/kotlin/Extensions.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ inline fun <reified T> QueryBuilder<T>.inValues(property: Property<T>, values: L
3939
inline fun <reified T> QueryBuilder<T>.inValues(property: Property<T>, values: IntArray): QueryBuilder<T>
4040
= `in`(property, values)
4141

42+
/** An alias for the "in" method, which is a reserved keyword in Kotlin. */
43+
inline fun <reified T> QueryBuilder<T>.inValues(property: Property<T>, values: Array<String>): QueryBuilder<T>
44+
= `in`(property, values)
45+
46+
/** An alias for the "in" method, which is a reserved keyword in Kotlin. */
47+
inline fun <reified T> QueryBuilder<T>.inValues(property: Property<T>, values: Array<String>,
48+
stringOrder: QueryBuilder.StringOrder): QueryBuilder<T>
49+
= `in`(property, values, stringOrder)
50+
4251
/**
4352
* Allows building a query for this Box instance with a call to [build][QueryBuilder.build] to return a [Query] instance.
4453
* ```

tests/objectbox-java-test/src/test/java/io/objectbox/query/PropertyQueryTest.java

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,90 @@ public void testCount() {
440440
assertEquals(6, stringQuery.distinct().count());
441441
}
442442

443+
@Test
444+
public void testStringLess() {
445+
putTestEntitiesStrings();
446+
putTestEntity("BaNaNa Split", 100);
447+
Query<TestEntity> query = box.query().less(simpleString, "banana juice").order(simpleString).build();
448+
List<TestEntity> entities = query.find();
449+
assertEquals(2, entities.size());
450+
assertEquals("apple", entities.get(0).getSimpleString());
451+
assertEquals("banana", entities.get(1).getSimpleString());
452+
453+
query.setParameter(simpleString, "BANANA MZ");
454+
entities = query.find();
455+
assertEquals(3, entities.size());
456+
assertEquals("apple", entities.get(0).getSimpleString());
457+
assertEquals("banana", entities.get(1).getSimpleString());
458+
assertEquals("banana milk shake", entities.get(2).getSimpleString());
459+
460+
// Case sensitive
461+
query = box.query().less(simpleString, "BANANA", StringOrder.CASE_SENSITIVE).order(simpleString).build();
462+
assertEquals(0, query.count());
463+
464+
query.setParameter(simpleString, "banana a");
465+
entities = query.find();
466+
assertEquals(3, entities.size());
467+
assertEquals("apple", entities.get(0).getSimpleString());
468+
assertEquals("banana", entities.get(1).getSimpleString());
469+
assertEquals("BaNaNa Split", entities.get(2).getSimpleString());
470+
}
471+
472+
@Test
473+
public void testStringGreater() {
474+
putTestEntitiesStrings();
475+
putTestEntity("FOO", 100);
476+
Query<TestEntity> query = box.query().greater(simpleString, "banana juice").order(simpleString).build();
477+
List<TestEntity> entities = query.find();
478+
assertEquals(4, entities.size());
479+
assertEquals("banana milk shake", entities.get(0).getSimpleString());
480+
assertEquals("bar", entities.get(1).getSimpleString());
481+
assertEquals("FOO", entities.get(2).getSimpleString());
482+
assertEquals("foo bar", entities.get(3).getSimpleString());
483+
484+
query.setParameter(simpleString, "FO");
485+
entities = query.find();
486+
assertEquals(2, entities.size());
487+
assertEquals("FOO", entities.get(0).getSimpleString());
488+
assertEquals("foo bar", entities.get(1).getSimpleString());
489+
490+
// Case sensitive
491+
query = box.query().greater(simpleString, "banana", StringOrder.CASE_SENSITIVE).order(simpleString).build();
492+
entities = query.find();
493+
assertEquals(3, entities.size());
494+
assertEquals("banana milk shake", entities.get(0).getSimpleString());
495+
assertEquals("bar", entities.get(1).getSimpleString());
496+
assertEquals("foo bar", entities.get(2).getSimpleString());
497+
}
498+
499+
@Test
500+
public void testStringIn() {
501+
putTestEntitiesStrings();
502+
putTestEntity("BAR", 100);
503+
String[] values = {"bar", "foo bar"};
504+
Query<TestEntity> query = box.query().in(simpleString, values).order(simpleString, OrderFlags.CASE_SENSITIVE)
505+
.build();
506+
List<TestEntity> entities = query.find();
507+
assertEquals(3, entities.size());
508+
assertEquals("BAR", entities.get(0).getSimpleString());
509+
assertEquals("bar", entities.get(1).getSimpleString());
510+
assertEquals("foo bar", entities.get(2).getSimpleString());
511+
512+
String[] values2 = {"bar"};
513+
query.setParameters(simpleString, values2);
514+
entities = query.find();
515+
assertEquals(2, entities.size());
516+
assertEquals("BAR", entities.get(0).getSimpleString());
517+
assertEquals("bar", entities.get(1).getSimpleString());
518+
519+
// Case sensitive
520+
query = box.query().in(simpleString, values, StringOrder.CASE_SENSITIVE).order(simpleString).build();
521+
entities = query.find();
522+
assertEquals(2, entities.size());
523+
assertEquals("bar", entities.get(0).getSimpleString());
524+
assertEquals("foo bar", entities.get(1).getSimpleString());
525+
}
526+
443527
private List<TestEntity> putTestEntitiesScalars() {
444528
return putTestEntities(10, null, 2000);
445529
}

0 commit comments

Comments
 (0)