package org.nextprot.api.isoform.mapper.service;
import org.nextprot.api.isoform.mapper.domain.FeatureQueryResult;
import org.nextprot.api.isoform.mapper.domain.MultipleFeatureQuery;
import org.nextprot.api.isoform.mapper.domain.SingleFeatureQuery;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
public interface IsoformMappingService extends FeatureValidator, FeaturePropagator {
/**
* Execute the given single feature query function to each feature query
* @param multipleFeatureQuery multiple feature query
* @param function the function that process a FeatureQuery and produces FeatureQueryResult
* @return a map of results
*/
default Map<String, FeatureQueryResult> handleMultipleQueries(MultipleFeatureQuery multipleFeatureQuery,
Function<SingleFeatureQuery, FeatureQueryResult> function) {
Map<String, FeatureQueryResult> results = new HashMap<>(multipleFeatureQuery.getFeatureList().size()+multipleFeatureQuery.getFeatureMaps().size());
multipleFeatureQuery.getFeatureList().stream()
.filter(feature -> !results.containsKey(feature))
.forEach(feature -> results.put(feature, function.apply(new SingleFeatureQuery(feature, multipleFeatureQuery.getFeatureType(), multipleFeatureQuery.getAccession()))));
multipleFeatureQuery.getFeatureMaps().stream()
.filter(featureQuery -> !results.containsKey(featureQuery.get("feature")))
.forEach(featureQuery -> results.put(featureQuery.get("feature"), function.apply(new SingleFeatureQuery(featureQuery.get("feature"), multipleFeatureQuery.getFeatureType(), featureQuery.get("accession")))));
return results;
}
}