Change from quadratic scan to use more memory instead

This commit is contained in:
Ehren Kret 2021-05-18 10:50:35 -05:00
parent 1a604d8c79
commit c595d9415c
1 changed files with 22 additions and 12 deletions

View File

@ -25,6 +25,8 @@ import java.time.Duration;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Base64; import java.util.Base64;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
@ -362,26 +364,34 @@ public class MessageController {
})); }));
checkAccessKeys(accessKeys, uuidToAccountMap); checkAccessKeys(accessKeys, uuidToAccountMap);
List<AccountMismatchedDevices> accountMismatchedDevices = new ArrayList<>(); final Map<Account, HashSet<Pair<Long, Integer>>> accountToDeviceIdAndRegistrationIdMap =
List<AccountStaleDevices> accountStaleDevices = new ArrayList<>(); Arrays
for (Account account : uuidToAccountMap.values()) { .stream(multiRecipientMessage.getRecipients())
Set<Long> deviceIds = Arrays.stream(multiRecipientMessage.getRecipients()) .collect(Collectors.toMap(
.filter(recipient -> recipient.getUuid().equals(account.getUuid())) recipient -> uuidToAccountMap.get(recipient.getUuid()),
.map(Recipient::getDeviceId) recipient -> new HashSet<>(
.collect(Collectors.toSet()); Collections.singletonList(new Pair<>(recipient.getDeviceId(), recipient.getRegistrationId()))),
Stream<Pair<Long, Integer>> deviceIdAndRegistrationIdStream = Arrays.stream(multiRecipientMessage.getRecipients()) (a, b) -> {
.filter(recipient -> recipient.getUuid().equals(account.getUuid())) a.addAll(b);
.map(recipient -> new Pair<>(recipient.getDeviceId(), recipient.getRegistrationId())); return a;
}
));
Collection<AccountMismatchedDevices> accountMismatchedDevices = new ArrayList<>();
Collection<AccountStaleDevices> accountStaleDevices = new ArrayList<>();
uuidToAccountMap.values().forEach(account -> {
final Set<Pair<Long, Integer>> deviceIdAndRegistrationIdSet = accountToDeviceIdAndRegistrationIdMap.get(account);
final Set<Long> deviceIds = deviceIdAndRegistrationIdSet.stream().map(Pair::first).collect(Collectors.toSet());
try { try {
validateCompleteDeviceList(account, deviceIds, false); validateCompleteDeviceList(account, deviceIds, false);
validateRegistrationIds(account, deviceIdAndRegistrationIdStream); validateRegistrationIds(account, deviceIdAndRegistrationIdSet.stream());
} catch (MismatchedDevicesException e) { } catch (MismatchedDevicesException e) {
accountMismatchedDevices.add(new AccountMismatchedDevices(account.getUuid(), accountMismatchedDevices.add(new AccountMismatchedDevices(account.getUuid(),
new MismatchedDevices(e.getMissingDevices(), e.getExtraDevices()))); new MismatchedDevices(e.getMissingDevices(), e.getExtraDevices())));
} catch (StaleDevicesException e) { } catch (StaleDevicesException e) {
accountStaleDevices.add(new AccountStaleDevices(account.getUuid(), new StaleDevices(e.getStaleDevices()))); accountStaleDevices.add(new AccountStaleDevices(account.getUuid(), new StaleDevices(e.getStaleDevices())));
} }
} });
if (!accountMismatchedDevices.isEmpty()) { if (!accountMismatchedDevices.isEmpty()) {
return Response return Response
.status(409) .status(409)