private Optional<CeTask> submit(CeTaskSubmit submission, EnumSet<SubmitOption> submitOptions) { try (DbSession dbSession = dbClient.openSession(false)) { if (submitOptions.contains(UNIQUE_QUEUE_PER_MAIN_COMPONENT) && submission.getComponent() .map(component -> dbClient.ceQueueDao().countByStatusAndMainComponentUuid(dbSession, PENDING, component.getMainComponentUuid()) > 0) .orElse(false)) { return Optional.empty(); } CeQueueDto taskDto = addToQueueInDb(dbSession, submission); dbSession.commit(); Map<String, ComponentDto> componentsByUuid = loadComponentDtos(dbSession, taskDto); if (componentsByUuid.isEmpty()) { return of(convertToTask(dbSession, taskDto, submission.getCharacteristics(), null, null)); } return of(convertToTask(dbSession, taskDto, submission.getCharacteristics(), ofNullable(taskDto.getComponentUuid()).map(componentsByUuid::get).orElse(null), ofNullable(taskDto.getMainComponentUuid()).map(componentsByUuid::get).orElse(null))); } }
private List<CeTask> loadTasks(DbSession dbSession, List<CeQueueDto> dtos) { // load components, if defined Set<String> componentUuids = dtos.stream() .flatMap(dto -> Stream.of(dto.getComponentUuid(), dto.getMainComponentUuid())) .filter(Objects::nonNull) .collect(Collectors.toSet()); Map<String, ComponentDto> componentsByUuid = dbClient.componentDao() .selectByUuids(dbSession, componentUuids).stream() .collect(uniqueIndex(ComponentDto::uuid)); // load characteristics // TODO could be avoided, characteristics are already present in submissions Set<String> taskUuids = dtos.stream().map(CeQueueDto::getUuid).collect(MoreCollectors.toSet(dtos.size())); Multimap<String, CeTaskCharacteristicDto> characteristicsByTaskUuid = dbClient.ceTaskCharacteristicsDao() .selectByTaskUuids(dbSession, taskUuids).stream() .collect(MoreCollectors.index(CeTaskCharacteristicDto::getTaskUuid)); List<CeTask> result = new ArrayList<>(); for (CeQueueDto dto : dtos) { ComponentDto component = ofNullable(dto.getComponentUuid()) .map(componentsByUuid::get) .orElse(null); ComponentDto mainComponent = ofNullable(dto.getMainComponentUuid()) .map(componentsByUuid::get) .orElse(null); Map<String, String> characteristics = characteristicsByTaskUuid.get(dto.getUuid()).stream() .collect(uniqueIndex(CeTaskCharacteristicDto::getKey, CeTaskCharacteristicDto::getValue)); result.add(convertToTask(dbSession, dto, characteristics, component, mainComponent)); } return result; }