/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package uk.ac.ebi.ep.data.repositories; import com.mysema.query.BooleanBuilder; import com.mysema.query.jpa.impl.JPAQuery; import com.mysema.query.types.Projections; import com.mysema.query.types.expr.StringExpression; import java.util.List; import java.util.stream.Collectors; import javax.persistence.EntityGraph; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.springframework.transaction.annotation.Transactional; import uk.ac.ebi.ep.data.domain.EnzymePortalDisease; import uk.ac.ebi.ep.data.domain.QEnzymePortalDisease; import uk.ac.ebi.ep.data.search.model.Disease; /** * * @author joseph */ public class DiseaseRepositoryImpl implements DiseaseRepositoryCustom { @PersistenceContext private EntityManager entityManager; private static final QEnzymePortalDisease $ = QEnzymePortalDisease.enzymePortalDisease; public void setEntityManager(EntityManager entityManager) { this.entityManager = entityManager; } @Transactional(readOnly = true) @Override public List<EnzymePortalDisease> findDiseasesByNamePrefixes(List<String> namePrefixes) { JPAQuery query = new JPAQuery(entityManager); StringExpression idPrefix = $.uniprotAccession.name.substring(0, $.uniprotAccession.name.indexOf("_")); BooleanBuilder builder = new BooleanBuilder(); namePrefixes.stream().forEach(prefix -> { builder.or(idPrefix.equalsIgnoreCase(prefix)); }); query.from($).where(builder); return query.distinct().list($); } @Transactional(readOnly = true) @Override public List<EnzymePortalDisease> findDiseasesByAccessions(List<String> accessions) { JPAQuery query = new JPAQuery(entityManager); BooleanBuilder builder = new BooleanBuilder(); accessions.stream().forEach(accession -> { builder.or($.uniprotAccession.accession.equalsIgnoreCase(accession)); }); query.from($).where(builder); return query.distinct().list($); } /** * Note: meshId is used as default disease id for now as some omim entries * are null and we don't have efo yet * * @param omimId * * @return list of accessions */ @Transactional(readOnly = true) @Override public List<String> findAccessionsByOmimId(String omimId) { JPAQuery query = new JPAQuery(entityManager); List<String> entries = query.from($).where($.omimNumber.equalsIgnoreCase(omimId)).list($.uniprotAccession.accession) .stream().distinct().collect(Collectors.toList()); return entries; } @Override @Transactional(readOnly = true) public List<EnzymePortalDisease> findDiseases() { EntityGraph eGraph = entityManager.getEntityGraph("DiseaseEntityGraph"); eGraph.addAttributeNodes("uniprotAccession"); JPAQuery query = new JPAQuery(entityManager); query.setHint("javax.persistence.fetchgraph", eGraph); return query.from($).list($); } /** * * @param name * @return * @deprecated(To be removed in version 1.0.14) */ @Deprecated public List<String> findDiseasesByName(String name) { JPAQuery query = new JPAQuery(entityManager); return query.from($) .where($.diseaseName.like(name)).distinct() .list($.diseaseName); } @Override @Transactional(readOnly = true) public List<Disease> findDiseasesByTaxId(Long taxId) { // EntityGraph eGraph = entityManager.getEntityGraph("DiseaseEntityGraph"); // eGraph.addAttributeNodes("uniprotAccession"); JPAQuery query = new JPAQuery(entityManager); // query.setHint("javax.persistence.fetchgraph", eGraph); List<Disease> result = query.from($).where($.uniprotAccession.taxId.eq(taxId)) .list(Projections.constructor(Disease.class, $.omimNumber, $.diseaseName, $.url)).stream().distinct().collect(Collectors.toList()); return result; } @Override public List<Disease> findDiseasesNameLike(String name) { JPAQuery query = new JPAQuery(entityManager); String diseaseName = String.format("%%%s%%", name).toLowerCase(); List<Disease> result = query.from($).where($.diseaseName.toLowerCase().like(diseaseName)) .list(Projections.constructor(Disease.class, $.omimNumber, $.diseaseName)).stream().distinct().collect(Collectors.toList()); return result; } @Override public List<Disease> findDiseasesByAccession(String accession) { JPAQuery query = new JPAQuery(entityManager); List<Disease> result = query.from($).where($.uniprotAccession.accession.equalsIgnoreCase(accession)) .list(Projections.constructor(Disease.class, $.omimNumber, $.diseaseName, $.definition, $.url, $.evidence)); return result.stream().distinct().collect(Collectors.toList()); } @Override public List<Disease> findDiseasesByEcNumber(String ecNumber) { JPAQuery query = new JPAQuery(entityManager); List<Disease> result = query.from($).where($.uniprotAccession.enzymePortalEcNumbersSet.any().ecNumber.eq(ecNumber)) .list(Projections.constructor(Disease.class, $.omimNumber, $.diseaseName, $.url)).stream().distinct().collect(Collectors.toList()); return result; //TODO benchmark QueryDSL vs Native Query to evaluate which has faster response time and delete one later // String nativeQuery = "SELECT d.OMIM_NUMBER,d.DISEASE_NAME,d.URL FROM ENZYME_PORTAL_DISEASE d,ENZYME_PORTAL_EC_NUMBERS e \n" // + "WHERE d.UNIPROT_ACCESSION=e.UNIPROT_ACCESSION AND e.EC_NUMBER= :EC_NUMBER GROUP BY d.OMIM_NUMBER,d.DISEASE_NAME,d.URL"; // Query query = entityManager.createNativeQuery(nativeQuery, "diseaseMapping"); // List<Disease> result = query.setParameter("EC_NUMBER", ecNumber).getResultList(); // // return result.stream().distinct().collect(Collectors.toList()); } }