Skip to content

Commit 20eb216

Browse files
authored
return entity from ArangoOperations.repsert() (#285)
1 parent 55749af commit 20eb216

File tree

5 files changed

+92
-26
lines changed

5 files changed

+92
-26
lines changed

src/main/java/com/arangodb/springframework/core/ArangoOperations.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ <T> MultiDocumentEntity<DocumentCreateEntity<?>> insertAll(Iterable<? extends T>
418418
* @throws DataAccessException
419419
* @since ArangoDB 3.4
420420
*/
421-
<T> void repsert(T value) throws DataAccessException;
421+
<T> T repsert(T value) throws DataAccessException;
422422

423423
/**
424424
* Creates new documents from the given documents, unless there already exists. In that case it replaces the
@@ -431,7 +431,7 @@ <T> MultiDocumentEntity<DocumentCreateEntity<?>> insertAll(Iterable<? extends T>
431431
* @throws DataAccessException
432432
* @since ArangoDB 3.4
433433
*/
434-
<T> void repsert(Iterable<? extends T> values, Class<T> entityClass) throws DataAccessException;
434+
<T> Iterable<T> repsertAll(Iterable<T> values, Class<? super T> entityClass) throws DataAccessException;
435435

436436
/**
437437
* Checks whether the document exists by reading a single document head

src/main/java/com/arangodb/springframework/core/template/ArangoTemplate.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,7 @@ public DocumentCreateEntity<?> insert(final Object value) throws DataAccessExcep
539539
}
540540

541541
@Override
542-
public <T> void repsert(final T value) throws DataAccessException {
542+
public <T> T repsert(final T value) throws DataAccessException {
543543
@SuppressWarnings("unchecked") final Class<T> clazz = (Class<T>) value.getClass();
544544
final String collectionName = _collection(clazz).name();
545545

@@ -563,12 +563,14 @@ public <T> void repsert(final T value) throws DataAccessException {
563563

564564
updateDBFieldsFromObject(value, result);
565565
potentiallyEmitEvent(new AfterSaveEvent<>(result));
566+
return value;
566567
}
567568

569+
@SuppressWarnings({"rawtypes", "unchecked"})
568570
@Override
569-
public <T> void repsert(final Iterable<? extends T> values, final Class<T> entityClass) throws DataAccessException {
571+
public <T> Iterable<T> repsertAll(final Iterable<T> values, final Class<? super T> entityClass) throws DataAccessException {
570572
if (!values.iterator().hasNext()) {
571-
return;
573+
return Collections.emptyList();
572574
}
573575

574576
final String collectionName = _collection(entityClass).name();
@@ -578,7 +580,7 @@ public <T> void repsert(final Iterable<? extends T> values, final Class<T> entit
578580
bindVars.put("@col", collectionName);
579581
bindVars.put("docs", values);
580582

581-
final Iterable<? extends T> result;
583+
List result;
582584
try {
583585
result = query(
584586
REPSERT_MANY_QUERY,
@@ -591,6 +593,7 @@ public <T> void repsert(final Iterable<? extends T> values, final Class<T> entit
591593

592594
updateDBFieldsFromObjects(values, result);
593595
result.forEach(it -> potentiallyEmitEvent(new AfterSaveEvent<>(it)));
596+
return values;
594597
}
595598

596599
private void updateDBFieldsFromObjects(final Iterable<?> values, final Iterable<?> res) {

src/main/java/com/arangodb/springframework/repository/SimpleArangoRepository.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,7 @@ public SimpleArangoRepository(final ArangoOperations arangoOperations, final Cla
7474
*/
7575
@Override
7676
public <S extends T> S save(final S entity) {
77-
arangoOperations.repsert(entity);
78-
return entity;
77+
return arangoOperations.repsert(entity);
7978
}
8079

8180
/**
@@ -87,8 +86,7 @@ public <S extends T> S save(final S entity) {
8786
*/
8887
@Override
8988
public <S extends T> Iterable<S> saveAll(final Iterable<S> entities) {
90-
arangoOperations.repsert(entities, domainClass);
91-
return entities;
89+
return arangoOperations.repsertAll(entities, domainClass);
9290
}
9391

9492
/**

src/test/java/com/arangodb/springframework/core/template/ArangoTemplateTest.java

+51-14
Original file line numberDiff line numberDiff line change
@@ -127,27 +127,64 @@ public void insertDocumentsReturnNew() {
127127

128128
@Test
129129
public void repsertDocument() {
130-
String id = "id-" + UUID.randomUUID();
131130
Customer customer = new Customer("John", "Doe", 30);
132-
customer.setId(id);
133-
template.repsert(customer);
134-
template.repsert(customer);
135-
Customer read = template.find(id, Customer.class).orElseThrow();
131+
Customer repsert1 = template.repsert(customer);
132+
Customer repsert2 = template.repsert(customer);
133+
134+
// in place updates
135+
assertThat(repsert1, sameInstance(customer));
136+
assertThat(repsert2, sameInstance(customer));
137+
138+
Customer read = template.find(repsert1.getId(), Customer.class).orElseThrow();
136139
assertThat(read.getId(), is(customer.getId()));
137140
assertThat(read.getName(), is(customer.getName()));
138141
assertThat(read.getSurname(), is(customer.getSurname()));
139142
assertThat(read.getAge(), is(customer.getAge()));
140143
}
141144

142-
@Test
143-
public void repsertDocumentRevConflict() {
144-
String id = "id-" + UUID.randomUUID();
145-
Customer customer = new Customer("John", "Doe", 30);
146-
customer.setId(id);
147-
template.repsert(customer);
148-
customer.setRev("foo");
149-
assertThrows(OptimisticLockingFailureException.class, () -> template.repsert(customer));
150-
}
145+
@Test
146+
public void repsertDocuments() {
147+
Customer c1 = new Customer("John", "Doe", 11);
148+
Customer c2 = new Customer("John2", "Doe2", 22);
149+
Iterable<Customer> repsert1 = template.repsertAll(List.of(c1, c2), Customer.class);
150+
Iterable<Customer> repsert2 = template.repsertAll(List.of(c1, c2), Customer.class);
151+
152+
Iterator<Customer> rit1 = repsert1.iterator();
153+
Iterator<Customer> rit2 = repsert2.iterator();
154+
155+
// in place updates
156+
assertThat(rit1.next(), sameInstance(c1));
157+
assertThat(rit2.next(), sameInstance(c1));
158+
assertThat(rit1.next(), sameInstance(c2));
159+
assertThat(rit2.next(), sameInstance(c2));
160+
161+
List<String> ids = StreamSupport.stream(repsert1.spliterator(), false).map(Customer::getId).toList();
162+
163+
Iterable<Customer> read = template.findAll(ids, Customer.class);
164+
Iterator<Customer> rit = read.iterator();
165+
166+
Customer read1 = rit.next();
167+
assertThat(read1.getId(), is(c1.getId()));
168+
assertThat(read1.getName(), is(c1.getName()));
169+
assertThat(read1.getSurname(), is(c1.getSurname()));
170+
assertThat(read1.getAge(), is(c1.getAge()));
171+
172+
Customer read2 = rit.next();
173+
assertThat(read2.getId(), is(c2.getId()));
174+
assertThat(read2.getName(), is(c2.getName()));
175+
assertThat(read2.getSurname(), is(c2.getSurname()));
176+
assertThat(read2.getAge(), is(c2.getAge()));
177+
}
178+
179+
@Test
180+
public void repsertDocumentRevConflict() {
181+
String id = "id-" + UUID.randomUUID();
182+
Customer customer = new Customer("John", "Doe", 30);
183+
customer.setId(id);
184+
template.repsert(customer);
185+
customer.setRev("foo");
186+
assertThrows(OptimisticLockingFailureException.class, () -> template.repsert(customer));
187+
}
151188

152189
@Test
153190
public void getDocument() {

src/test/java/com/arangodb/springframework/example/polymorphic/template/PolymorphicTemplate.java

+30-2
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@
4141
import java.util.List;
4242

4343
import static org.hamcrest.MatcherAssert.assertThat;
44-
import static org.hamcrest.Matchers.is;
45-
import static org.hamcrest.Matchers.notNullValue;
44+
import static org.hamcrest.Matchers.*;
4645

4746
/**
4847
* @author Michele Rastelli
@@ -206,4 +205,33 @@ public void replaceAllVariance() {
206205
assertThat(res.getDocuments().stream().map(DocumentUpdateEntity::getOld).toList().containsAll(dogs), is(true));
207206
}
208207

208+
@Test
209+
public void repsertVariance() {
210+
Dog dog = new Dog();
211+
dog.setId("1");
212+
dog.setName("dog");
213+
dog.setTeeths(11);
214+
215+
Dog res = template.repsert(dog);
216+
assertThat(res, sameInstance(dog));
217+
assertThat(col().documentExists(dog.getId()), is(true));
218+
}
219+
220+
@Test
221+
public void repsertAllVariance() {
222+
Dog dog1 = new Dog();
223+
dog1.setId("1");
224+
dog1.setName("dog1");
225+
dog1.setTeeths(11);
226+
227+
Dog dog2 = new Dog();
228+
dog1.setId("2");
229+
dog1.setName("dog2");
230+
dog1.setTeeths(22);
231+
232+
List<Dog> dogs = List.of(dog1, dog2);
233+
Iterable<Dog> res = template.repsertAll(dogs, Animal.class);
234+
assertThat(res, containsInRelativeOrder(dog1, dog2));
235+
}
236+
209237
}

0 commit comments

Comments
 (0)