protected VariantMetadata makeVariantMetadata(List<StudyConfiguration> studyConfigurations, ProjectMetadata projectMetadata, Map<Integer, List<Integer>> returnedSamples, Map<Integer, List<Integer>> returnedFiles, QueryOptions queryOptions) throws StorageEngineException { VariantMetadata metadata = new VariantMetadataConverter() .toVariantMetadata(studyConfigurations, projectMetadata, returnedSamples, returnedFiles); Map<String, StudyConfiguration> studyConfigurationMap = studyConfigurations.stream() .collect(Collectors.toMap(StudyConfiguration::getStudyName, Function.identity())); for (VariantStudyMetadata studyMetadata : metadata.getStudies()) { StudyConfiguration studyConfiguration = studyConfigurationMap.get(studyMetadata.getId()); List<Integer> fileIds = studyMetadata.getFiles().stream() .map(fileMetadata -> { Integer fileId = studyConfiguration.getFileIds().get(fileMetadata.getId()); if (fileId == null) { fileId = studyConfiguration.getFileIds().get(fileMetadata.getPath()); } return fileId; }).collect(Collectors.toList()); if (fileIds != null && !fileIds.isEmpty()) { Query query = new Query() .append(VariantFileMetadataDBAdaptor.VariantFileMetadataQueryParam.STUDY_ID.key(), studyConfiguration.getStudyId()) .append(VariantFileMetadataDBAdaptor.VariantFileMetadataQueryParam.FILE_ID.key(), fileIds); scm.variantFileMetadataIterator(query, new QueryOptions()).forEachRemaining(fileMetadata -> { studyMetadata.getFiles().removeIf(file -> file.getId().equals(fileMetadata.getId())); studyMetadata.getFiles().add(fileMetadata.getImpl()); }); } } return metadata; }
protected Bson parseQuery(Query query) { LinkedList<Bson> filters = new LinkedList<>(); if (VariantQueryUtils.isValidParam(query, VariantFileMetadataQueryParam.STUDY_ID)) { List<String> studyIds = query.getAsStringList(VariantFileMetadataQueryParam.STUDY_ID.key()); if (VariantQueryUtils.isValidParam(query, VariantFileMetadataQueryParam.FILE_ID)) { List<String> fileIds = query.getAsStringList(VariantFileMetadataQueryParam.FILE_ID.key()); List<String> ids = new ArrayList<>(studyIds.size() * fileIds.size()); for (String studyId : studyIds) { for (String fileId : fileIds) { ids.add(DocumentToVariantFileMetadataConverter.buildId(studyId, fileId)); } } filters.add(Filters.in("_id", ids)); } else { for (String studyId : studyIds) { filters.add(Filters.regex("_id", '^' + DocumentToVariantFileMetadataConverter.buildId(studyId, ""))); } } } else if (query.containsKey(VariantFileMetadataQueryParam.FILE_ID.key())) { List<String> fileIds = query.getAsStringList(VariantFileMetadataQueryParam.FILE_ID.key()); filters.add(Filters.in("id", fileIds)); } if (filters.isEmpty()) { return new Document(); } else { return Filters.and(filters); } }
default QueryResult<VariantFileMetadata> get(int studyId, int fileId, QueryOptions options) throws StorageEngineException { StopWatch stopWatch = StopWatch.createStarted(); Iterator<VariantFileMetadata> iterator; try { Query query = new Query(VariantFileMetadataQueryParam.FILE_ID.key(), fileId) .append(VariantFileMetadataQueryParam.STUDY_ID.key(), studyId); iterator = iterator(query, options); } catch (IOException e) { throw new StorageEngineException("Error reading from VariantFileMetadataDBAdaptor", e); } VariantFileMetadata metadata = Iterators.getOnlyElement(iterator, null); if (metadata != null) { return new QueryResult<>("", ((int) stopWatch.getTime(TimeUnit.MILLISECONDS)), 1, 1, null, null, Collections.singletonList(metadata)); } else { return new QueryResult<>("", ((int) stopWatch.getTime(TimeUnit.MILLISECONDS)), 0, 0, null, null, Collections.emptyList()); } }
@Override public Iterator<VariantFileMetadata> iterator(Query query, QueryOptions options) throws IOException { int studyId = query.getInt(VariantFileMetadataQueryParam.STUDY_ID.key()); List<Integer> fileIds = query.getAsIntegerList(VariantFileMetadataQueryParam.FILE_ID.key()); return iterator(studyId, fileIds, options); }
@Override public QueryResult updateStats(VariantSourceStats variantSourceStats, StudyConfiguration studyConfiguration, QueryOptions queryOptions) { MongoDBCollection coll = db.getCollection(collectionName); VariantFileMetadata source = new VariantFileMetadata("", ""); source.setStats(variantSourceStats.getFileStats()); Document globalStats = variantFileMetadataConverter.convertToStorageType("", source).get("stats", Document.class); Bson query = parseQuery(new Query(VariantFileMetadataQueryParam.STUDY_ID.key(), variantSourceStats.getStudyId()) .append(VariantFileMetadataQueryParam.FILE_ID.key(), variantSourceStats.getFileId())); Bson update = Updates.set("stats", globalStats); return coll.update(query, update, null); }