/** * @return the number of items that have been successfully indexed */ @Override public IndexingResult index(DbSession dbSession, Collection<EsQueueDto> items) { if (items.isEmpty()) { return new IndexingResult(); } Set<String> uuids = items .stream() .map(EsQueueDto::getDocId) .collect(toHashSet(items.size())); ListMultimap<String, String> organizationUuidsByUserUuid = ArrayListMultimap.create(); dbClient.organizationMemberDao().selectForUserIndexing(dbSession, uuids, organizationUuidsByUserUuid::put); BulkIndexer bulkIndexer = newBulkIndexer(Size.REGULAR, new OneToOneResilientIndexingListener(dbClient, dbSession, items)); bulkIndexer.start(); dbClient.userDao().scrollByUuids(dbSession, uuids, // only index requests, no deletion requests. // Deactivated users are not deleted but updated. u -> { uuids.remove(u.getUuid()); bulkIndexer.add(newIndexRequest(u, organizationUuidsByUserUuid)); }); // the remaining uuids reference rows that don't exist in db. They must // be deleted from index. uuids.forEach(uuid -> bulkIndexer.addDeletion(INDEX_TYPE_USER, uuid)); return bulkIndexer.stop(); }
@Test public void scrollByUuids_scrolls_by_pages_of_1000_uuids() { List<String> uuids = new ArrayList<>(); for (int i = 0; i < DatabaseUtils.PARTITION_SIZE_FOR_ORACLE + 10; i++) { uuids.add(insertUser(true).getUuid()); } List<UserDto> result = new ArrayList<>(); underTest.scrollByUuids(db.getSession(), uuids, result::add); assertThat(result) .extracting(UserDto::getUuid) .containsExactlyInAnyOrder(uuids.toArray(new String[0])); }
@Test public void scrollByLUuids() { UserDto u1 = insertUser(true); UserDto u2 = insertUser(false); UserDto u3 = insertUser(false); List<UserDto> result = new ArrayList<>(); underTest.scrollByUuids(db.getSession(), asList(u2.getUuid(), u3.getUuid(), "does not exist"), result::add); assertThat(result).extracting(UserDto::getUuid, UserDto::getName) .containsExactlyInAnyOrder(tuple(u2.getUuid(), u2.getName()), tuple(u3.getUuid(), u3.getName())); }
/** * @return the number of items that have been successfully indexed */ @Override public IndexingResult index(DbSession dbSession, Collection<EsQueueDto> items) { if (items.isEmpty()) { return new IndexingResult(); } Set<String> uuids = items .stream() .map(EsQueueDto::getDocId) .collect(toHashSet(items.size())); ListMultimap<String, String> organizationUuidsByUserUuid = ArrayListMultimap.create(); dbClient.organizationMemberDao().selectForUserIndexing(dbSession, uuids, organizationUuidsByUserUuid::put); BulkIndexer bulkIndexer = newBulkIndexer(Size.REGULAR, new OneToOneResilientIndexingListener(dbClient, dbSession, items)); bulkIndexer.start(); dbClient.userDao().scrollByUuids(dbSession, uuids, // only index requests, no deletion requests. // Deactivated users are not deleted but updated. u -> { uuids.remove(u.getUuid()); bulkIndexer.add(newIndexRequest(u, organizationUuidsByUserUuid)); }); // the remaining uuids reference rows that don't exist in db. They must // be deleted from index. uuids.forEach(uuid -> bulkIndexer.addDeletion(INDEX_TYPE_USER, uuid)); return bulkIndexer.stop(); }