Skip to content

Commit 3ed18bd

Browse files
mpv1989hkernbach
authored andcommitted
Bugfix multi document operations when using parameter silent (#242)
* Change `ArangoDB#timeout` to also set the request timeout when using VelocyStream (issue #230) * Fix multi doc operations when using param silent (issue #241)
1 parent fbf8205 commit 3ed18bd

File tree

4 files changed

+145
-74
lines changed

4 files changed

+145
-74
lines changed

ChangeLog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
66

77
## [Unreleased]
88

9+
### Fixed
10+
11+
- fixed bug with multi document operations when using parameter `silent` (issue #241)
12+
913
## [5.0.3] - 2018-11-12
1014

1115
### Fixed

docs/Drivers/Java/Reference/Setup.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@ ArangoDB arangoDB = new ArangoDB.Builder().build();
1010

1111
The driver is configured with some default values:
1212

13-
property-key | description | default value
14-
-------------------------|-----------------------------------------|----------------
15-
arangodb.hosts | ArangoDB hosts | 127.0.0.1:8529
16-
arangodb.timeout | connect & request timeout (millisecond) | 0
17-
arangodb.user | Basic Authentication User |
18-
arangodb.password | Basic Authentication Password |
19-
arangodb.useSsl | use SSL connection | false
20-
arangodb.chunksize | VelocyStream Chunk content-size (bytes) | 30000
21-
arangodb.connections.max | max number of connections | 1 VST, 20 HTTP
22-
arangodb.protocol | used network protocol | VST
13+
| property-key | description | default value |
14+
| ------------------------ | --------------------------------------- | -------------- |
15+
| arangodb.hosts | ArangoDB hosts | 127.0.0.1:8529 |
16+
| arangodb.timeout | connect & request timeout (millisecond) | 0 |
17+
| arangodb.user | Basic Authentication User |
18+
| arangodb.password | Basic Authentication Password |
19+
| arangodb.useSsl | use SSL connection | false |
20+
| arangodb.chunksize | VelocyStream Chunk content-size (bytes) | 30000 |
21+
| arangodb.connections.max | max number of connections | 1 VST, 20 HTTP |
22+
| arangodb.protocol | used network protocol | VST |
2323

2424
To customize the configuration the parameters can be changed in the code...
2525

src/main/java/com/arangodb/internal/InternalArangoCollection.java

Lines changed: 72 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -177,24 +177,26 @@ public MultiDocumentEntity<DocumentCreateEntity<T>> deserialize(final Response r
177177
final Collection<ErrorEntity> errors = new ArrayList<ErrorEntity>();
178178
final Collection<Object> documentsAndErrors = new ArrayList<Object>();
179179
final VPackSlice body = response.getBody();
180-
for (final Iterator<VPackSlice> iterator = body.arrayIterator(); iterator.hasNext();) {
181-
final VPackSlice next = iterator.next();
182-
if (next.get(ArangoResponseField.ERROR).isTrue()) {
183-
final ErrorEntity error = (ErrorEntity) util().deserialize(next, ErrorEntity.class);
184-
errors.add(error);
185-
documentsAndErrors.add(error);
186-
} else {
187-
final DocumentCreateEntity<T> doc = util().deserialize(next, DocumentCreateEntity.class);
188-
final VPackSlice newDoc = next.get(NEW);
189-
if (newDoc.isObject()) {
190-
doc.setNew((T) util(Serializer.CUSTOM).deserialize(newDoc, type));
191-
}
192-
final VPackSlice oldDoc = next.get(OLD);
193-
if (oldDoc.isObject()) {
194-
doc.setOld((T) util(Serializer.CUSTOM).deserialize(oldDoc, type));
180+
if (body.isArray()) {
181+
for (final Iterator<VPackSlice> iterator = body.arrayIterator(); iterator.hasNext();) {
182+
final VPackSlice next = iterator.next();
183+
if (next.get(ArangoResponseField.ERROR).isTrue()) {
184+
final ErrorEntity error = (ErrorEntity) util().deserialize(next, ErrorEntity.class);
185+
errors.add(error);
186+
documentsAndErrors.add(error);
187+
} else {
188+
final DocumentCreateEntity<T> doc = util().deserialize(next, DocumentCreateEntity.class);
189+
final VPackSlice newDoc = next.get(NEW);
190+
if (newDoc.isObject()) {
191+
doc.setNew((T) util(Serializer.CUSTOM).deserialize(newDoc, type));
192+
}
193+
final VPackSlice oldDoc = next.get(OLD);
194+
if (oldDoc.isObject()) {
195+
doc.setOld((T) util(Serializer.CUSTOM).deserialize(oldDoc, type));
196+
}
197+
docs.add(doc);
198+
documentsAndErrors.add(doc);
195199
}
196-
docs.add(doc);
197-
documentsAndErrors.add(doc);
198200
}
199201
}
200202
multiDocument.setDocuments(docs);
@@ -355,24 +357,26 @@ public MultiDocumentEntity<DocumentUpdateEntity<T>> deserialize(final Response r
355357
final Collection<ErrorEntity> errors = new ArrayList<ErrorEntity>();
356358
final Collection<Object> documentsAndErrors = new ArrayList<Object>();
357359
final VPackSlice body = response.getBody();
358-
for (final Iterator<VPackSlice> iterator = body.arrayIterator(); iterator.hasNext();) {
359-
final VPackSlice next = iterator.next();
360-
if (next.get(ArangoResponseField.ERROR).isTrue()) {
361-
final ErrorEntity error = (ErrorEntity) util().deserialize(next, ErrorEntity.class);
362-
errors.add(error);
363-
documentsAndErrors.add(error);
364-
} else {
365-
final DocumentUpdateEntity<T> doc = util().deserialize(next, DocumentUpdateEntity.class);
366-
final VPackSlice newDoc = next.get(NEW);
367-
if (newDoc.isObject()) {
368-
doc.setNew((T) util(Serializer.CUSTOM).deserialize(newDoc, type));
369-
}
370-
final VPackSlice oldDoc = next.get(OLD);
371-
if (oldDoc.isObject()) {
372-
doc.setOld((T) util(Serializer.CUSTOM).deserialize(oldDoc, type));
360+
if (body.isArray()) {
361+
for (final Iterator<VPackSlice> iterator = body.arrayIterator(); iterator.hasNext();) {
362+
final VPackSlice next = iterator.next();
363+
if (next.get(ArangoResponseField.ERROR).isTrue()) {
364+
final ErrorEntity error = (ErrorEntity) util().deserialize(next, ErrorEntity.class);
365+
errors.add(error);
366+
documentsAndErrors.add(error);
367+
} else {
368+
final DocumentUpdateEntity<T> doc = util().deserialize(next, DocumentUpdateEntity.class);
369+
final VPackSlice newDoc = next.get(NEW);
370+
if (newDoc.isObject()) {
371+
doc.setNew((T) util(Serializer.CUSTOM).deserialize(newDoc, type));
372+
}
373+
final VPackSlice oldDoc = next.get(OLD);
374+
if (oldDoc.isObject()) {
375+
doc.setOld((T) util(Serializer.CUSTOM).deserialize(oldDoc, type));
376+
}
377+
docs.add(doc);
378+
documentsAndErrors.add(doc);
373379
}
374-
docs.add(doc);
375-
documentsAndErrors.add(doc);
376380
}
377381
}
378382
multiDocument.setDocuments(docs);
@@ -464,24 +468,26 @@ public MultiDocumentEntity<DocumentUpdateEntity<T>> deserialize(final Response r
464468
final Collection<ErrorEntity> errors = new ArrayList<ErrorEntity>();
465469
final Collection<Object> documentsAndErrors = new ArrayList<Object>();
466470
final VPackSlice body = response.getBody();
467-
for (final Iterator<VPackSlice> iterator = body.arrayIterator(); iterator.hasNext();) {
468-
final VPackSlice next = iterator.next();
469-
if (next.get(ArangoResponseField.ERROR).isTrue()) {
470-
final ErrorEntity error = (ErrorEntity) util().deserialize(next, ErrorEntity.class);
471-
errors.add(error);
472-
documentsAndErrors.add(error);
473-
} else {
474-
final DocumentUpdateEntity<T> doc = util().deserialize(next, DocumentUpdateEntity.class);
475-
final VPackSlice newDoc = next.get(NEW);
476-
if (newDoc.isObject()) {
477-
doc.setNew((T) util(Serializer.CUSTOM).deserialize(newDoc, type));
478-
}
479-
final VPackSlice oldDoc = next.get(OLD);
480-
if (oldDoc.isObject()) {
481-
doc.setOld((T) util(Serializer.CUSTOM).deserialize(oldDoc, type));
471+
if (body.isArray()) {
472+
for (final Iterator<VPackSlice> iterator = body.arrayIterator(); iterator.hasNext();) {
473+
final VPackSlice next = iterator.next();
474+
if (next.get(ArangoResponseField.ERROR).isTrue()) {
475+
final ErrorEntity error = (ErrorEntity) util().deserialize(next, ErrorEntity.class);
476+
errors.add(error);
477+
documentsAndErrors.add(error);
478+
} else {
479+
final DocumentUpdateEntity<T> doc = util().deserialize(next, DocumentUpdateEntity.class);
480+
final VPackSlice newDoc = next.get(NEW);
481+
if (newDoc.isObject()) {
482+
doc.setNew((T) util(Serializer.CUSTOM).deserialize(newDoc, type));
483+
}
484+
final VPackSlice oldDoc = next.get(OLD);
485+
if (oldDoc.isObject()) {
486+
doc.setOld((T) util(Serializer.CUSTOM).deserialize(oldDoc, type));
487+
}
488+
docs.add(doc);
489+
documentsAndErrors.add(doc);
482490
}
483-
docs.add(doc);
484-
documentsAndErrors.add(doc);
485491
}
486492
}
487493
multiDocument.setDocuments(docs);
@@ -542,20 +548,22 @@ public MultiDocumentEntity<DocumentDeleteEntity<T>> deserialize(final Response r
542548
final Collection<ErrorEntity> errors = new ArrayList<ErrorEntity>();
543549
final Collection<Object> documentsAndErrors = new ArrayList<Object>();
544550
final VPackSlice body = response.getBody();
545-
for (final Iterator<VPackSlice> iterator = body.arrayIterator(); iterator.hasNext();) {
546-
final VPackSlice next = iterator.next();
547-
if (next.get(ArangoResponseField.ERROR).isTrue()) {
548-
final ErrorEntity error = (ErrorEntity) util().deserialize(next, ErrorEntity.class);
549-
errors.add(error);
550-
documentsAndErrors.add(error);
551-
} else {
552-
final DocumentDeleteEntity<T> doc = util().deserialize(next, DocumentDeleteEntity.class);
553-
final VPackSlice oldDoc = next.get(OLD);
554-
if (oldDoc.isObject()) {
555-
doc.setOld((T) util(Serializer.CUSTOM).deserialize(oldDoc, type));
551+
if (body.isArray()) {
552+
for (final Iterator<VPackSlice> iterator = body.arrayIterator(); iterator.hasNext();) {
553+
final VPackSlice next = iterator.next();
554+
if (next.get(ArangoResponseField.ERROR).isTrue()) {
555+
final ErrorEntity error = (ErrorEntity) util().deserialize(next, ErrorEntity.class);
556+
errors.add(error);
557+
documentsAndErrors.add(error);
558+
} else {
559+
final DocumentDeleteEntity<T> doc = util().deserialize(next, DocumentDeleteEntity.class);
560+
final VPackSlice oldDoc = next.get(OLD);
561+
if (oldDoc.isObject()) {
562+
doc.setOld((T) util(Serializer.CUSTOM).deserialize(oldDoc, type));
563+
}
564+
docs.add(doc);
565+
documentsAndErrors.add(doc);
556566
}
557-
docs.add(doc);
558-
documentsAndErrors.add(doc);
559567
}
560568
}
561569
multiDocument.setDocuments(docs);

src/test/java/com/arangodb/ArangoCollectionTest.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,19 @@ public void insertDocumentSilentDontTouchInstance() {
206206
assertThat(doc.getKey(), is(key));
207207
}
208208

209+
@Test
210+
public void insertDocumentsSilent() {
211+
if (arangoDB.getRole() != ServerRole.SINGLE) {
212+
return;
213+
}
214+
final MultiDocumentEntity<DocumentCreateEntity<BaseDocument>> info = db.collection(COLLECTION_NAME).insertDocuments(
215+
Arrays.asList(new BaseDocument(), new BaseDocument()), new DocumentCreateOptions().silent(true));
216+
assertThat(info, is(notNullValue()));
217+
assertThat(info.getDocuments().isEmpty(), is(true));
218+
assertThat(info.getDocumentsAndErrors().isEmpty(), is(true));
219+
assertThat(info.getErrors().isEmpty(), is(true));
220+
}
221+
209222
@Test
210223
public void getDocument() {
211224
final DocumentCreateEntity<BaseDocument> createResult = db.collection(COLLECTION_NAME)
@@ -675,6 +688,21 @@ public void updateDocumentSilent() {
675688
assertThat(meta.getRev(), is(nullValue()));
676689
}
677690

691+
@Test
692+
public void updateDocumentsSilent() {
693+
if (arangoDB.getRole() != ServerRole.SINGLE) {
694+
return;
695+
}
696+
final DocumentCreateEntity<BaseDocument> createResult = db.collection(COLLECTION_NAME)
697+
.insertDocument(new BaseDocument());
698+
final MultiDocumentEntity<DocumentUpdateEntity<BaseDocument>> info = db.collection(COLLECTION_NAME).updateDocuments(
699+
Arrays.asList(new BaseDocument(createResult.getKey())), new DocumentUpdateOptions().silent(true));
700+
assertThat(info, is(notNullValue()));
701+
assertThat(info.getDocuments().isEmpty(), is(true));
702+
assertThat(info.getDocumentsAndErrors().isEmpty(), is(true));
703+
assertThat(info.getErrors().isEmpty(), is(true));
704+
}
705+
678706
@Test
679707
public void replaceDocument() {
680708
final BaseDocument doc = new BaseDocument();
@@ -844,6 +872,22 @@ public void replaceDocumentSilentDontTouchInstance() {
844872
assertThat(doc.getRevision(), is(revision));
845873
}
846874

875+
@Test
876+
public void replaceDocumentsSilent() {
877+
if (arangoDB.getRole() != ServerRole.SINGLE) {
878+
return;
879+
}
880+
final DocumentCreateEntity<BaseDocument> createResult = db.collection(COLLECTION_NAME)
881+
.insertDocument(new BaseDocument());
882+
final MultiDocumentEntity<DocumentUpdateEntity<BaseDocument>> info = db.collection(COLLECTION_NAME)
883+
.replaceDocuments(Arrays.asList(new BaseDocument(createResult.getKey())),
884+
new DocumentReplaceOptions().silent(true));
885+
assertThat(info, is(notNullValue()));
886+
assertThat(info.getDocuments().isEmpty(), is(true));
887+
assertThat(info.getDocumentsAndErrors().isEmpty(), is(true));
888+
assertThat(info.getErrors().isEmpty(), is(true));
889+
}
890+
847891
@Test
848892
public void deleteDocument() {
849893
final BaseDocument doc = new BaseDocument();
@@ -910,6 +954,21 @@ public void deleteDocumentSilent() {
910954
assertThat(meta.getRev(), is(nullValue()));
911955
}
912956

957+
@Test
958+
public void deleteDocumentsSilent() {
959+
if (arangoDB.getRole() != ServerRole.SINGLE) {
960+
return;
961+
}
962+
final DocumentCreateEntity<BaseDocument> createResult = db.collection(COLLECTION_NAME)
963+
.insertDocument(new BaseDocument());
964+
final MultiDocumentEntity<DocumentDeleteEntity<BaseDocument>> info = db.collection(COLLECTION_NAME).deleteDocuments(
965+
Arrays.asList(createResult.getKey()), BaseDocument.class, new DocumentDeleteOptions().silent(true));
966+
assertThat(info, is(notNullValue()));
967+
assertThat(info.getDocuments().isEmpty(), is(true));
968+
assertThat(info.getDocumentsAndErrors().isEmpty(), is(true));
969+
assertThat(info.getErrors().isEmpty(), is(true));
970+
}
971+
913972
@Test
914973
public void getIndex() {
915974
final Collection<String> fields = new ArrayList<String>();

0 commit comments

Comments
 (0)