Skip to content

Commit eac40d0

Browse files
Merge branch 'string-array-support' into release-3.0.0-alpha2
2 parents 78b4244 + 994f91b commit eac40d0

File tree

8 files changed

+107
-11
lines changed

8 files changed

+107
-11
lines changed

objectbox-java/src/main/java/io/objectbox/Cursor.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,10 @@ protected static native long collect004000(long cursor, long keyIfComplete, int
106106
int idLong3, long valueLong3, int idLong4, long valueLong4
107107
);
108108

109+
protected static native long collectStringArray(long cursor, long keyIfComplete, int flags,
110+
int idStringArray, String[] stringArray
111+
);
112+
109113
native int nativePropertyId(long cursor, String propertyValue);
110114

111115
native List nativeGetBacklinkEntities(long cursor, int entityId, int propertyId, long key);

tests/objectbox-java-test/src/main/java/io/objectbox/TestEntity.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ public class TestEntity {
3232
private String simpleString;
3333
/** Not-null value. */
3434
private byte[] simpleByteArray;
35+
/** Not-null value. */
36+
private String[] simpleStringArray;
3537
/** In "real" entity would be annotated with @Unsigned. */
3638
private short simpleShortU;
3739
/** In "real" entity would be annotated with @Unsigned. */
@@ -49,7 +51,7 @@ public TestEntity(long id) {
4951
this.id = id;
5052
}
5153

52-
public TestEntity(long id, boolean simpleBoolean, byte simpleByte, short simpleShort, int simpleInt, long simpleLong, float simpleFloat, double simpleDouble, String simpleString, byte[] simpleByteArray, short simpleShortU, int simpleIntU, long simpleLongU) {
54+
public TestEntity(long id, boolean simpleBoolean, byte simpleByte, short simpleShort, int simpleInt, long simpleLong, float simpleFloat, double simpleDouble, String simpleString, byte[] simpleByteArray, String[] simpleStringArray, short simpleShortU, int simpleIntU, long simpleLongU) {
5355
this.id = id;
5456
this.simpleBoolean = simpleBoolean;
5557
this.simpleByte = simpleByte;
@@ -60,6 +62,7 @@ public TestEntity(long id, boolean simpleBoolean, byte simpleByte, short simpleS
6062
this.simpleDouble = simpleDouble;
6163
this.simpleString = simpleString;
6264
this.simpleByteArray = simpleByteArray;
65+
this.simpleStringArray = simpleStringArray;
6366
this.simpleShortU = simpleShortU;
6467
this.simpleIntU = simpleIntU;
6568
this.simpleLongU = simpleLongU;
@@ -149,6 +152,15 @@ public void setSimpleByteArray(byte[] simpleByteArray) {
149152
this.simpleByteArray = simpleByteArray;
150153
}
151154

155+
/** Not-null value. */
156+
public String[] getSimpleStringArray() {
157+
return simpleStringArray;
158+
}
159+
160+
/** Not-null value; ensure this value is available before it is saved to the database. */
161+
public void setSimpleStringArray(String[] simpleStringArray) {
162+
this.simpleStringArray = simpleStringArray;
163+
}
152164
public short getSimpleShortU() {
153165
return simpleShortU;
154166
}

tests/objectbox-java-test/src/main/java/io/objectbox/TestEntityCursor.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public Cursor<TestEntity> createCursor(io.objectbox.Transaction tx, long cursorH
5151
private final static int __ID_simpleDouble = TestEntity_.simpleDouble.id;
5252
private final static int __ID_simpleString = TestEntity_.simpleString.id;
5353
private final static int __ID_simpleByteArray = TestEntity_.simpleByteArray.id;
54+
private final static int __ID_simpleStringArray = TestEntity_.simpleStringArray.id;
5455
private final static int __ID_simpleShortU = TestEntity_.simpleShortU.id;
5556
private final static int __ID_simpleIntU = TestEntity_.simpleIntU.id;
5657
private final static int __ID_simpleLongU = TestEntity_.simpleLongU.id;
@@ -71,12 +72,18 @@ public final long getId(TestEntity entity) {
7172
*/
7273
@Override
7374
public final long put(TestEntity entity) {
75+
String[] simpleStringArray = entity.getSimpleStringArray();
76+
int __id10 = simpleStringArray != null ? __ID_simpleStringArray : 0;
77+
78+
collectStringArray(cursor, 0, PUT_FLAG_FIRST,
79+
__id10, simpleStringArray);
80+
7481
String simpleString = entity.getSimpleString();
7582
int __id8 = simpleString != null ? __ID_simpleString : 0;
7683
byte[] simpleByteArray = entity.getSimpleByteArray();
7784
int __id9 = simpleByteArray != null ? __ID_simpleByteArray : 0;
7885

79-
collect313311(cursor, 0, PUT_FLAG_FIRST,
86+
collect313311(cursor, 0, 0,
8087
__id8, simpleString, 0, null,
8188
0, null, __id9, simpleByteArray,
8289
__ID_simpleLong, entity.getSimpleLong(), __ID_simpleLongU, entity.getSimpleLongU(),

tests/objectbox-java-test/src/main/java/io/objectbox/TestEntity_.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,17 @@ public final class TestEntity_ implements EntityInfo<TestEntity> {
7777
public final static io.objectbox.Property<TestEntity> simpleByteArray =
7878
new io.objectbox.Property<>(__INSTANCE, 9, 10, byte[].class, "simpleByteArray");
7979

80+
public final static io.objectbox.Property<TestEntity> simpleStringArray =
81+
new io.objectbox.Property<>(__INSTANCE, 10, 11, String[].class, "simpleStringArray", false, "simpleStringArray");
82+
8083
public final static io.objectbox.Property<TestEntity> simpleShortU =
81-
new io.objectbox.Property<>(__INSTANCE, 10, 11, short.class, "simpleShortU");
84+
new io.objectbox.Property<>(__INSTANCE, 11, 12, short.class, "simpleShortU");
8285

8386
public final static io.objectbox.Property<TestEntity> simpleIntU =
84-
new io.objectbox.Property<>(__INSTANCE, 11, 12, int.class, "simpleIntU");
87+
new io.objectbox.Property<>(__INSTANCE, 12, 13, int.class, "simpleIntU");
8588

8689
public final static io.objectbox.Property<TestEntity> simpleLongU =
87-
new io.objectbox.Property<>(__INSTANCE, 12, 13, long.class, "simpleLongU");
90+
new io.objectbox.Property<>(__INSTANCE, 13, 14, long.class, "simpleLongU");
8891

8992
@SuppressWarnings("unchecked")
9093
public final static io.objectbox.Property<TestEntity>[] __ALL_PROPERTIES = new io.objectbox.Property[]{
@@ -98,6 +101,7 @@ public final class TestEntity_ implements EntityInfo<TestEntity> {
98101
simpleDouble,
99102
simpleString,
100103
simpleByteArray,
104+
simpleStringArray,
101105
simpleShortU,
102106
simpleIntU,
103107
simpleLongU

tests/objectbox-java-test/src/test/java/io/objectbox/AbstractObjectBoxTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import io.objectbox.model.PropertyFlags;
3535
import io.objectbox.model.PropertyType;
3636

37+
38+
import static org.junit.Assert.assertArrayEquals;
3739
import static org.junit.Assert.assertEquals;
3840
import static org.junit.Assert.assertTrue;
3941

@@ -197,6 +199,7 @@ private void addTestEntity(ModelBuilder modelBuilder, boolean withIndex) {
197199
pb.flags(PropertyFlags.INDEXED).indexId(++lastIndexId, lastIndexUid);
198200
}
199201
entityBuilder.property("simpleByteArray", PropertyType.ByteVector).id(TestEntity_.simpleByteArray.id, ++lastUid);
202+
entityBuilder.property("simpleStringArray", PropertyType.StringVector).id(TestEntity_.simpleStringArray.id, ++lastUid);
200203

201204
// Unsigned integers.
202205
entityBuilder.property("simpleShortU", PropertyType.Short).id(TestEntity_.simpleShortU.id, ++lastUid)
@@ -241,12 +244,34 @@ protected TestEntity createTestEntity(@Nullable String simpleString, int nr) {
241244
entity.setSimpleFloat(200 + nr / 10f);
242245
entity.setSimpleDouble(2000 + nr / 100f);
243246
entity.setSimpleByteArray(new byte[]{1, 2, (byte) nr});
247+
entity.setSimpleStringArray(new String[]{simpleString});
244248
entity.setSimpleShortU((short) (100 + nr));
245249
entity.setSimpleIntU(nr);
246250
entity.setSimpleLongU(1000 + nr);
247251
return entity;
248252
}
249253

254+
/**
255+
* Asserts all properties, excluding id. Assumes entity was created with {@link #createTestEntity(String, int)}.
256+
*/
257+
protected void assertTestEntity(TestEntity actual, @Nullable String simpleString, int nr) {
258+
assertEquals(simpleString, actual.getSimpleString());
259+
assertEquals(nr, actual.getSimpleInt());
260+
assertEquals((byte) (10 + nr), actual.getSimpleByte());
261+
assertEquals(nr % 2 == 0, actual.getSimpleBoolean());
262+
assertEquals((short) (100 + nr), actual.getSimpleShort());
263+
assertEquals(1000 + nr, actual.getSimpleLong());
264+
assertEquals(200 + nr / 10f, actual.getSimpleFloat(), 0);
265+
assertEquals(2000 + nr / 100f, actual.getSimpleDouble(), 0);
266+
assertArrayEquals(new byte[]{1, 2, (byte) nr}, actual.getSimpleByteArray());
267+
// null array items are ignored, so array will be empty
268+
String[] expectedStringArray = simpleString == null ? new String[]{} : new String[]{simpleString};
269+
assertArrayEquals(expectedStringArray, actual.getSimpleStringArray());
270+
assertEquals((short) (100 + nr), actual.getSimpleShortU());
271+
assertEquals(nr, actual.getSimpleIntU());
272+
assertEquals(1000 + nr, actual.getSimpleLongU());
273+
}
274+
250275
protected TestEntity putTestEntity(@Nullable String simpleString, int nr) {
251276
TestEntity entity = createTestEntity(simpleString, nr);
252277
long key = getTestEntityBox().put(entity);

tests/objectbox-java-test/src/test/java/io/objectbox/BoxTest.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,46 @@ public void setUpBox() {
3737

3838
@Test
3939
public void testPutAndGet() {
40-
TestEntity entity = new TestEntity();
41-
entity.setSimpleInt(1977);
40+
final String simpleString = "sunrise";
41+
final int simpleInt = 1977;
42+
43+
TestEntity entity = createTestEntity(simpleString, simpleInt);
4244
long key = box.put(entity);
4345
assertTrue(key != 0);
4446
assertEquals(key, entity.getId());
4547

4648
TestEntity entityRead = box.get(key);
4749
assertNotNull(entityRead);
48-
assertEquals(1977, entityRead.getSimpleInt());
50+
assertEquals(key, entityRead.getId());
51+
assertTestEntity(entityRead, simpleString, simpleInt);
52+
}
53+
54+
@Test
55+
public void testPutStringArray_withNull_ignoresNull() {
56+
final String[] stringArray = new String[]{"sunrise", null, "sunset"};
57+
final String[] expectedStringArray = new String[]{"sunrise", "sunset"};
58+
59+
TestEntity entity = new TestEntity();
60+
entity.setSimpleStringArray(stringArray);
61+
box.put(entity);
62+
63+
TestEntity entityRead = box.get(entity.getId());
64+
assertNotNull(entityRead);
65+
assertArrayEquals(expectedStringArray, entityRead.getSimpleStringArray());
66+
}
67+
68+
@Test
69+
public void testPutStringArray_onlyNull_isEmpty() {
70+
final String[] stringArray = new String[]{null};
71+
final String[] expectedStringArray = new String[]{};
72+
73+
TestEntity entity = new TestEntity();
74+
entity.setSimpleStringArray(stringArray);
75+
box.put(entity);
76+
77+
TestEntity entityRead = box.get(entity.getId());
78+
assertNotNull(entityRead);
79+
assertArrayEquals(expectedStringArray, entityRead.getSimpleStringArray());
4980
}
5081

5182
@Test

tests/objectbox-java-test/src/test/java/io/objectbox/NonArgConstructorTest.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,11 @@
1919
import org.junit.Before;
2020
import org.junit.Test;
2121

22-
import java.util.Arrays;
23-
2422
import io.objectbox.ModelBuilder.EntityBuilder;
2523
import io.objectbox.model.EntityFlags;
2624

2725

26+
import static org.junit.Assert.assertArrayEquals;
2827
import static org.junit.Assert.assertEquals;
2928
import static org.junit.Assert.assertNotNull;
3029
import static org.junit.Assert.assertTrue;
@@ -56,6 +55,8 @@ public void testPutAndGet() {
5655
entity.setSimpleLong(789437444354L);
5756
entity.setSimpleShort((short) 233);
5857
entity.setSimpleString("foo");
58+
String[] strings = {"foo", "bar"};
59+
entity.setSimpleStringArray(strings);
5960
long key = box.put(entity);
6061

6162
TestEntity entityRead = box.get(key);
@@ -68,8 +69,9 @@ public void testPutAndGet() {
6869
assertEquals(789437444354L, entityRead.getSimpleLong());
6970
assertEquals(3.14f, entityRead.getSimpleFloat(), 0.000001f);
7071
assertEquals(3.141f, entityRead.getSimpleDouble(), 0.000001);
71-
assertTrue(Arrays.equals(bytes, entityRead.getSimpleByteArray()));
72+
assertArrayEquals(bytes, entityRead.getSimpleByteArray());
7273
assertEquals("foo", entityRead.getSimpleString());
74+
assertArrayEquals(strings, entityRead.getSimpleStringArray());
7375
}
7476

7577
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import static io.objectbox.TestEntity_.simpleLong;
4848
import static io.objectbox.TestEntity_.simpleShort;
4949
import static io.objectbox.TestEntity_.simpleString;
50+
import static io.objectbox.TestEntity_.simpleStringArray;
5051
import static org.junit.Assert.assertEquals;
5152
import static org.junit.Assert.assertFalse;
5253
import static org.junit.Assert.assertNotNull;
@@ -243,6 +244,16 @@ public void testString() {
243244
assertEquals(2, box.query().contains(simpleString, "nana").build().count());
244245
}
245246

247+
@Test
248+
public void testStringArray() {
249+
putTestEntitiesStrings();
250+
// contains(prop, value) matches if value is equal to one of the array items.
251+
// Verify by not matching entity where 'banana' is only a substring of an array item ('banana milk shake').
252+
List<TestEntity> results = box.query().contains(simpleStringArray, "banana").build().find();
253+
assertEquals(1, results.size());
254+
assertEquals("banana", results.get(0).getSimpleStringArray()[0]);
255+
}
256+
246257
@Test
247258
public void testStringLess() {
248259
putTestEntitiesStrings();

0 commit comments

Comments
 (0)