package org.nextprot.api.core.service.impl;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.nextprot.api.core.dao.ExperimentalContextDao;
import org.nextprot.api.core.domain.CvTerm;
import org.nextprot.api.core.domain.ExperimentalContext;
import org.nextprot.api.core.service.ExperimentalContextDictionaryService;
import org.nextprot.api.core.service.TerminologyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
@Lazy
@Service
class ExperimentalContextDictionaryServiceImpl implements ExperimentalContextDictionaryService {
@Autowired private ExperimentalContextDao ecDao;
@Autowired private TerminologyService terminologyService;
@Override
@Cacheable("experimental-context-dictionary")
public Map<Long, ExperimentalContext> getAllExperimentalContexts() {
//long t0 = System.currentTimeMillis(); System.out.println("Building experimental context dictionary...");
List<ExperimentalContext> ecs = ecDao.findAllExperimentalContexts();
updateTerminologies(ecs);
Map<Long,ExperimentalContext> dictionary = new TreeMap<>();
for (ExperimentalContext ec : ecs) dictionary.put(ec.getContextId(), ec);
ecs=null;
//System.out.println("Building experimental context dictionary DONE in " + (System.currentTimeMillis() - t0) + "ms");
return dictionary;
}
private void updateTerminologies(List<ExperimentalContext> ecs) {
Set<String> terminologyAccessions = new HashSet<String>();
for (ExperimentalContext ec : ecs) {
terminologyAccessions.add(ec.getCellLineAC());
terminologyAccessions.add(ec.getTissueAC());
terminologyAccessions.add(ec.getOrganelleAC());
terminologyAccessions.add(ec.getDetectionMethodAC());
terminologyAccessions.add(ec.getDiseaseAC());
terminologyAccessions.add(ec.getDevelopmentalStageAC());
}
if (terminologyAccessions.size()>0) {
List<CvTerm> terms = terminologyService.findCvTermsByAccessions(terminologyAccessions);
Map<String, CvTerm> map = new HashMap<>();
for(CvTerm term : terms){
map.put(term.getAccession(), term);
}
for (ExperimentalContext ec : ecs) {
updateTerminologies(ec, map);
}
}
}
private void updateTerminologies(ExperimentalContext ec, Map<String, CvTerm> map) {
if (ec.getCellLine() != null) ec.setCellLine(map.get(ec.getCellLineAC()));
if (ec.getTissue() != null) ec.setTissue(map.get(ec.getTissueAC()));
if (ec.getOrganelle() != null) ec.setOrganelle(map.get(ec.getOrganelleAC()));
if (ec.getDetectionMethod() != null) ec.setDetectionMethod(map.get(ec.getDetectionMethodAC()));
if (ec.getDisease() != null) ec.setDisease(map.get(ec.getDiseaseAC()));
if (ec.getDevelopmentalStage() != null) ec.setDevelopmentalStage(map.get(ec.getDevelopmentalStageAC()));
}
}