MultiIndexDao implements IndexDao { @Override public Document update(final Document update, Optional<String> index) throws IOException { List<String> exceptions = indices.parallelStream().map(dao -> { try { dao.update(update, index); return null; } catch (Throwable e) { return dao.getClass() + ": " + e.getMessage() + "\n" + ExceptionUtils.getStackTrace(e); } }).filter(e -> e != null).collect(Collectors.toList()); if(exceptions.size() > 0) { throw new IOException(Joiner.on("\n").join(exceptions)); } return update; } MultiIndexDao(IndexDao... composedDao);  MultiIndexDao(Iterable<IndexDao> composedDao);  MultiIndexDao(Iterable<IndexDao> composedDao, Function<IndexDao, IndexDao> decoratorTransformation); @Override Document update(final Document update, Optional<String> index); @Override Map<Document, Optional<String>> batchUpdate(Map<Document, Optional<String>> updates); @Override Map<String, FieldType> getColumnMetadata(List<String> in); @Override Document addCommentToAlert(CommentAddRemoveRequest request); @Override Document addCommentToAlert(CommentAddRemoveRequest request, Document latest); @Override Document removeCommentFromAlert(CommentAddRemoveRequest request); @Override Document removeCommentFromAlert(CommentAddRemoveRequest request, Document latest); @Override SearchResponse search(SearchRequest searchRequest); @Override GroupResponse group(GroupRequest groupRequest); @Override void init(AccessConfig config); @Override Document getLatest(final String guid, String sensorType); @Override Iterable<Document> getAllLatest(List<GetRequest> getRequests); List<IndexDao> getIndices();  }
@Test public void shouldUpdateAll() throws IOException { Document actual = multiIndexDao.update(document1, Optional.of("bro")); assertEquals(document1, actual); verify(dao1).update(eq(document1), eq(Optional.of("bro"))); verify(dao2).update(eq(document1), eq(Optional.of("bro"))); }
@Test public void shouldThrowExceptionWithPartialFailureOnUpdate() throws IOException { when(dao2.update(any(), any())).thenThrow(new IllegalStateException()); assertThrows(IOException.class, () -> multiIndexDao.update(document1, Optional.of("bro"))); }