Skip to content
This repository was archived by the owner on Jan 31, 2022. It is now read-only.

Commit f17dd78

Browse files
author
Clément Le Provost
committed
[offline] Use JSONArray in saveObjects() methods
There are two reasons to use that instead of `Collection<JSONObject>`: 1. The online flavor already uses a `JSONArray`, so it’s more consistent. 2. A `JSONArray` is easily constructed from a `Collection`, whereas the opposite is not true. => It should be more convenient for the developer.
1 parent 2ec8906 commit f17dd78

File tree

3 files changed

+38
-28
lines changed

3 files changed

+38
-28
lines changed

algoliasearch/src/offline/java/com/algolia/search/saas/OfflineIndex.java

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -448,13 +448,18 @@ public void finalize() {
448448
*
449449
* @param objects New versions of the objects to update. Each one must contain an `objectID` attribute.
450450
*/
451-
public void saveObjects(@NonNull Collection<JSONObject> objects) throws AlgoliaException {
452-
synchronized(this) {
453-
if (finished) throw new IllegalStateException();
454-
for (JSONObject object : objects) {
455-
tmpObjects.add(object);
451+
public void saveObjects(@NonNull JSONArray objects) throws AlgoliaException {
452+
try {
453+
synchronized(this) {
454+
if (finished) throw new IllegalStateException();
455+
for (int i = 0; i < objects.length(); ++i) {
456+
JSONObject object = objects.getJSONObject(i);
457+
tmpObjects.add(object);
458+
}
459+
flushObjectsToDisk(false);
456460
}
457-
flushObjectsToDisk(false);
461+
} catch (JSONException e) {
462+
throw new AlgoliaException("Array must contain only objects", e);
458463
}
459464
}
460465

@@ -767,7 +772,7 @@ JSONObject run() throws AlgoliaException {
767772
public String saveObjectSync(JSONObject object) throws AlgoliaException {
768773
assertNotMainThread();
769774
assertTransaction();
770-
Collection<String> objectIDs = saveObjectsSync(Collections.singletonList(object));
775+
Collection<String> objectIDs = saveObjectsSync(new JSONArray(Collections.singletonList(object)));
771776
return objectIDs.iterator().next();
772777
}
773778

@@ -780,7 +785,7 @@ public String saveObjectSync(JSONObject object) throws AlgoliaException {
780785
* @param completionHandler Completion handler to be notified of the request's outcome.
781786
* @return A cancellable operation.
782787
*/
783-
public Request saveObjectsAsync(final @NonNull Collection<JSONObject> objects, CompletionHandler completionHandler) {
788+
public Request saveObjectsAsync(final @NonNull JSONArray objects, CompletionHandler completionHandler) {
784789
assertTransaction();
785790
return getClient().new AsyncTaskRequest(completionHandler, getClient().transactionExecutorService) {
786791
@NonNull
@@ -809,19 +814,24 @@ JSONObject run() throws AlgoliaException {
809814
* @param objects New versions of the objects to update. Each one must contain an `objectID` attribute.
810815
* @return Identifiers of passed objects.
811816
*/
812-
public Collection<String> saveObjectsSync(Collection<JSONObject> objects) throws AlgoliaException {
817+
public Collection<String> saveObjectsSync(@NonNull JSONArray objects) throws AlgoliaException {
813818
assertNotMainThread();
814819
assertTransaction();
815-
List<String> objectIDs = new ArrayList<>(objects.size());
816-
for (JSONObject object : objects) {
817-
String objectID = object.optString("objectID");
818-
if (objectID == null) {
819-
throw new AlgoliaException("Object missing mandatory `objectID` attribute");
820+
try {
821+
List<String> objectIDs = new ArrayList<>(objects.length());
822+
for (int i = 0; i < objects.length(); ++i) {
823+
JSONObject object = objects.getJSONObject(i);
824+
String objectID = object.optString("objectID");
825+
if (objectID == null) {
826+
throw new AlgoliaException("Object missing mandatory `objectID` attribute");
827+
}
828+
objectIDs.add(objectID);
820829
}
821-
objectIDs.add(objectID);
830+
transaction.saveObjects(objects);
831+
return objectIDs;
832+
} catch (JSONException e) {
833+
throw new AlgoliaException("Array must contain only objects", e);
822834
}
823-
transaction.saveObjects(objects);
824-
return objectIDs;
825835
}
826836

827837
/**

algoliasearch/src/testOffline/java/com/algolia/search/saas/OfflineClientTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public void testDeleteIndex() throws Exception {
106106
final CountDownLatch signal = new CountDownLatch(1);
107107
final OfflineIndex index = client.getOfflineIndex(Helpers.getMethodName());
108108
index.beginTransaction();
109-
index.saveObjectsAsync(objects.values(), new CompletionHandler() {
109+
index.saveObjectsAsync(new JSONArray(objects.values()), new CompletionHandler() {
110110
@Override
111111
public void requestCompleted(JSONObject content, AlgoliaException error) {
112112
assertNull(error);
@@ -137,7 +137,7 @@ public void testMoveIndex() throws Exception {
137137
final OfflineIndex srcIndex = client.getOfflineIndex(Helpers.getMethodName());
138138
final OfflineIndex dstIndex = client.getOfflineIndex(Helpers.getMethodName() + "_new");
139139
srcIndex.beginTransaction();
140-
srcIndex.saveObjectsAsync(objects.values(), new CompletionHandler() {
140+
srcIndex.saveObjectsAsync(new JSONArray(objects.values()), new CompletionHandler() {
141141
@Override
142142
public void requestCompleted(JSONObject content, AlgoliaException error) {
143143
assertNull(error);

algoliasearch/src/testOffline/java/com/algolia/search/saas/OfflineIndexTest.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ public void testSaveGetDeleteObjects() throws Exception {
140140
final CountDownLatch signal = new CountDownLatch(1);
141141
final OfflineIndex index = client.getOfflineIndex(Helpers.getMethodName());
142142
index.beginTransaction();
143-
index.saveObjectsAsync(objects.values(), new CompletionHandler() {
143+
index.saveObjectsAsync(new JSONArray(objects.values()), new CompletionHandler() {
144144
@Override
145145
public void requestCompleted(JSONObject content, AlgoliaException error) {
146146
assertNotNull(content);
@@ -195,7 +195,7 @@ public void testSaveGetDeleteObjectsSync() throws Exception {
195195
final OfflineIndex index = client.getOfflineIndex(Helpers.getMethodName());
196196
try {
197197
index.beginTransaction();
198-
index.saveObjectsSync(objects.values());
198+
index.saveObjectsSync(new JSONArray(objects.values()));
199199
index.commitTransactionSync();
200200
index.getObjectsAsync(Arrays.asList("1", "2"), new CompletionHandler() {
201201
@Override
@@ -234,7 +234,7 @@ public void testSearch() throws Exception {
234234
final CountDownLatch signal = new CountDownLatch(1);
235235
final OfflineIndex index = client.getOfflineIndex(Helpers.getMethodName());
236236
index.beginTransaction();
237-
index.saveObjectsAsync(objects.values(), new CompletionHandler() {
237+
index.saveObjectsAsync(new JSONArray(objects.values()), new CompletionHandler() {
238238
@Override
239239
public void requestCompleted(JSONObject content, AlgoliaException error) {
240240
assertNull(error);
@@ -295,7 +295,7 @@ public void testClear() throws Exception {
295295
final CountDownLatch signal = new CountDownLatch(1);
296296
final OfflineIndex index = client.getOfflineIndex(Helpers.getMethodName());
297297
index.beginTransaction();
298-
index.saveObjectsAsync(objects.values(), new CompletionHandler() {
298+
index.saveObjectsAsync(new JSONArray(objects.values()), new CompletionHandler() {
299299
@Override
300300
public void requestCompleted(JSONObject content, AlgoliaException error) {
301301
assertNotNull(content);
@@ -336,7 +336,7 @@ public void testBrowse() throws Exception {
336336
final CountDownLatch signal = new CountDownLatch(1);
337337
final OfflineIndex index = client.getOfflineIndex(Helpers.getMethodName());
338338
index.beginTransaction();
339-
index.saveObjectsAsync(objects.values(), new CompletionHandler() {
339+
index.saveObjectsAsync(new JSONArray(objects.values()), new CompletionHandler() {
340340
@Override
341341
public void requestCompleted(JSONObject content, AlgoliaException error) {
342342
assertNull(error);
@@ -372,7 +372,7 @@ public void testDeleteByQuery() throws Exception {
372372
final CountDownLatch signal = new CountDownLatch(1);
373373
final OfflineIndex index = client.getOfflineIndex(Helpers.getMethodName());
374374
index.beginTransaction();
375-
index.saveObjectsAsync(objects.values(), new CompletionHandler() {
375+
index.saveObjectsAsync(new JSONArray(objects.values()), new CompletionHandler() {
376376
@Override
377377
public void requestCompleted(JSONObject content, AlgoliaException error) {
378378
assertNull(error);
@@ -413,7 +413,7 @@ public void testMultipleQueries() throws Exception {
413413
final CountDownLatch signal = new CountDownLatch(1);
414414
final OfflineIndex index = client.getOfflineIndex(Helpers.getMethodName());
415415
index.beginTransaction();
416-
index.saveObjectsAsync(objects.values(), new CompletionHandler() {
416+
index.saveObjectsAsync(new JSONArray(objects.values()), new CompletionHandler() {
417417
@Override
418418
public void requestCompleted(JSONObject content, AlgoliaException error) {
419419
assertNull(error);
@@ -459,7 +459,7 @@ public void testAddManyObjects() throws Exception {
459459
for (int j = 0; j < 13; ++j) {
460460
objects.add(new JSONObject().put("objectID", Integer.toString(++objectCount)));
461461
}
462-
index.saveObjectsSync(objects);
462+
index.saveObjectsSync(new JSONArray(objects));
463463
}
464464
index.commitTransactionSync();
465465
assertTrue(objectCount <= 100); // required for our limited license key to work
@@ -482,7 +482,7 @@ public void testRollback() throws Exception {
482482
final String indexName = Helpers.getMethodName();
483483
final OfflineIndex index = client.getOfflineIndex(indexName);
484484
index.beginTransaction();
485-
index.saveObjectsSync(objects.values());
485+
index.saveObjectsSync(new JSONArray(objects.values()));
486486
index.rollbackTransactionSync();
487487
assertFalse(client.hasOfflineData(indexName));
488488

0 commit comments

Comments
 (0)