Skip to content

Commit 0b4f404

Browse files
authored
Insert-Update (#336)
1 parent 992c3ca commit 0b4f404

File tree

4 files changed

+126
-0
lines changed

4 files changed

+126
-0
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public abstract class InternalArangoCollection<A extends InternalArangoDB<E>, D
5656
private static final String NEW = "new";
5757
private static final String RETURN_OLD = "returnOld";
5858
private static final String OVERWRITE = "overwrite";
59+
private static final String OVERWRITE_MODE = "overwriteMode";
5960
private static final String OLD = "old";
6061
private static final String SILENT = "silent";
6162

@@ -86,6 +87,7 @@ protected <T> Request insertDocumentRequest(final T value, final DocumentCreateO
8687
request.putQueryParam(RETURN_OLD, params.getReturnOld());
8788
request.putQueryParam(SILENT, params.getSilent());
8889
request.putQueryParam(OVERWRITE, params.getOverwrite());
90+
request.putQueryParam(OVERWRITE_MODE, params.getOverwriteMode() != null ? params.getOverwriteMode().getValue() : null);
8991
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
9092
request.setBody(util(Serializer.CUSTOM).serialize(value));
9193
return request;
@@ -122,6 +124,7 @@ protected <T> Request insertDocumentsRequest(final Collection<T> values, final D
122124
request.putQueryParam(RETURN_OLD, params.getReturnOld());
123125
request.putQueryParam(SILENT, params.getSilent());
124126
request.putQueryParam(OVERWRITE, params.getOverwrite());
127+
request.putQueryParam(OVERWRITE_MODE, params.getOverwriteMode() != null ? params.getOverwriteMode().getValue() : null);
125128
request.putHeaderParam(TRANSACTION_ID, params.getStreamTransactionId());
126129
request.setBody(util(Serializer.CUSTOM)
127130
.serialize(values, new ArangoSerializer.Options().serializeNullValues(false).stringAsJson(true)));

src/main/java/com/arangodb/model/DocumentCreateOptions.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public class DocumentCreateOptions {
3232
private Boolean returnNew;
3333
private Boolean returnOld;
3434
private Boolean overwrite;
35+
private OverwriteMode overwriteMode;
3536
private Boolean silent;
3637
private String streamTransactionId;
3738

@@ -96,6 +97,22 @@ public DocumentCreateOptions overwrite(final Boolean overwrite) {
9697
return this;
9798
}
9899

100+
public OverwriteMode getOverwriteMode() {
101+
return overwriteMode;
102+
}
103+
104+
/**
105+
* @param overwriteMode This parameter can be set to replace or update. If given it sets implicitly the overwrite
106+
* flag. In case it is set to update, the replace-insert becomes an update-insert. Otherwise
107+
* this option follows the rules of the overwrite parameter.
108+
* @return options
109+
* @since ArangoDB 3.7
110+
*/
111+
public DocumentCreateOptions overwriteMode(final OverwriteMode overwriteMode) {
112+
this.overwriteMode = overwriteMode;
113+
return this;
114+
}
115+
99116
public Boolean getSilent() {
100117
return silent;
101118
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* DISCLAIMER
3+
*
4+
* Copyright 2016 ArangoDB GmbH, Cologne, Germany
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*
18+
* Copyright holder is ArangoDB GmbH, Cologne, Germany
19+
*/
20+
21+
package com.arangodb.model;
22+
23+
24+
/**
25+
* @author Michele Rastelli
26+
*/
27+
public enum OverwriteMode {
28+
replace("replace"), update("update");
29+
30+
private final String value;
31+
32+
OverwriteMode(String value) {
33+
this.value = value;
34+
}
35+
36+
public String getValue() {
37+
return value;
38+
}
39+
}

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

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,44 @@ public void insertDocumentOverwriteReturnOld() {
158158
assertThat(collection.count().getCount(), is(initialCount + 1L));
159159
}
160160

161+
@Test
162+
public void insertDocumentOverwriteModeReplace() {
163+
assumeTrue(isAtLeastVersion(3, 7));
164+
165+
String key = "key-" + UUID.randomUUID().toString();
166+
final BaseDocument doc = new BaseDocument(key);
167+
doc.addAttribute("foo", "a");
168+
final DocumentCreateEntity<BaseDocument> meta = collection.insertDocument(doc);
169+
170+
final BaseDocument doc2 = new BaseDocument(key);
171+
doc2.addAttribute("bar", "b");
172+
final DocumentCreateEntity<BaseDocument> repsert = collection
173+
.insertDocument(doc2, new DocumentCreateOptions().overwriteMode(OverwriteMode.replace).returnNew(true));
174+
175+
assertThat(repsert, is(notNullValue()));
176+
assertThat(repsert.getRev(), is(not(meta.getRev())));
177+
assertThat(repsert.getNew().getProperties().containsKey("foo"), is(false));
178+
assertThat(repsert.getNew().getAttribute("bar").toString(), is("b"));
179+
}
180+
181+
@Test
182+
public void insertDocumentOverwriteModeUpdate() {
183+
assumeTrue(isAtLeastVersion(3, 7));
184+
185+
final BaseDocument doc = new BaseDocument();
186+
doc.addAttribute("foo", "a");
187+
final DocumentCreateEntity<BaseDocument> meta = collection.insertDocument(doc);
188+
189+
doc.addAttribute("bar", "b");
190+
final DocumentCreateEntity<BaseDocument> upsert = collection
191+
.insertDocument(doc, new DocumentCreateOptions().overwriteMode(OverwriteMode.update).returnNew(true));
192+
193+
assertThat(upsert, is(notNullValue()));
194+
assertThat(upsert.getRev(), is(not(meta.getRev())));
195+
assertThat(upsert.getNew().getAttribute("foo").toString(), is("a"));
196+
assertThat(upsert.getNew().getAttribute("bar").toString(), is("b"));
197+
}
198+
161199
@Test
162200
public void insertDocumentWaitForSync() {
163201
final DocumentCreateOptions options = new DocumentCreateOptions().waitForSync(true);
@@ -1506,6 +1544,35 @@ public void insertDocumentsOverwrite() {
15061544
}
15071545
}
15081546

1547+
@Test
1548+
public void insertDocumentsOverwriteModeUpdate() {
1549+
assumeTrue(isAtLeastVersion(3, 7));
1550+
1551+
final BaseDocument doc1 = new BaseDocument();
1552+
doc1.addAttribute("foo", "a");
1553+
final DocumentCreateEntity<BaseDocument> meta1 = collection.insertDocument(doc1);
1554+
1555+
final BaseDocument doc2 = new BaseDocument();
1556+
doc2.addAttribute("foo", "a");
1557+
final DocumentCreateEntity<BaseDocument> meta2 = collection.insertDocument(doc2);
1558+
1559+
doc1.addAttribute("bar", "b");
1560+
doc2.addAttribute("bar", "b");
1561+
1562+
final MultiDocumentEntity<DocumentCreateEntity<BaseDocument>> repsert = collection
1563+
.insertDocuments(Arrays.asList(doc1, doc2),
1564+
new DocumentCreateOptions().overwriteMode(OverwriteMode.update).returnNew(true));
1565+
assertThat(repsert, is(notNullValue()));
1566+
assertThat(repsert.getDocuments().size(), is(2));
1567+
assertThat(repsert.getErrors().size(), is(0));
1568+
for (final DocumentCreateEntity<BaseDocument> documentCreateEntity : repsert.getDocuments()) {
1569+
assertThat(documentCreateEntity.getRev(), is(not(meta1.getRev())));
1570+
assertThat(documentCreateEntity.getRev(), is(not(meta2.getRev())));
1571+
assertThat(documentCreateEntity.getNew().getAttribute("foo").toString(), is("a"));
1572+
assertThat(documentCreateEntity.getNew().getAttribute("bar").toString(), is("b"));
1573+
}
1574+
}
1575+
15091576
@Test
15101577
public void insertDocumentsJson() {
15111578
final Collection<String> values = new ArrayList<>();

0 commit comments

Comments
 (0)