package org.molgenis.mutation.service;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.molgenis.core.Publication;
import org.molgenis.framework.db.DatabaseException;
import org.molgenis.framework.db.jpa.JpaDatabase;
import org.molgenis.mutation.dto.ExonDTO;
import org.molgenis.mutation.dto.GeneDTO;
import org.molgenis.mutation.dto.MutationSearchCriteriaDTO;
import org.molgenis.mutation.dto.MutationSummaryDTO;
import org.molgenis.mutation.dto.PatientSummaryDTO;
import org.molgenis.mutation.dto.ProteinDomainDTO;
import org.molgenis.mutation.dto.VariantDTO;
import org.molgenis.pheno.ObservationElement;
import org.molgenis.pheno.ObservedValue;
import org.molgenis.variant.Exon;
import org.molgenis.variant.Gene;
import org.molgenis.variant.Patient;
import org.molgenis.variant.ProteinDomain;
import org.molgenis.variant.Variant;
import org.springframework.stereotype.Service;
@Service
public class SearchService extends MolgenisVariantService
{
/**
* Find exon by its primary key
*
* @param id
* @return ExonDTO
*/
public ExonDTO findExonById(final Integer id)
{
try
{
Exon exon = this.em.find(Exon.class, id);
if (exon == null) throw new SearchServiceException("No exon found for " + id);
return this.exonToExonDTO(exon);
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Get all mutations sorted by their position
*
* @return list of VariantDTO's
*/
public List<VariantDTO> getAllVariants()
{
try
{
List<Variant> variantList = this.db.query(Variant.class).sortASC(Variant.STARTGDNA).find();
return this.variantListToVariantDTOList(variantList);
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Get a list of all variant types
* @return list of variant types
*/
public List<String> getAllVariantTypes()
{
try
{
String sql = "SELECT DISTINCT type_ FROM Variant";
TypedQuery<String> query = this.em.createQuery(sql, String.class);
List<String> typeList = query.getResultList();
return typeList;
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Get all exons sorted by their position
*
* @return list of ExonDTOs
*/
public List<ExonDTO> getAllExons()
{
try
{
List<Exon> exonList = this.db.find(Exon.class);
List<ExonDTO> exonDTOList = this.exonListToExonDTOList(exonList);
Collections.sort(exonDTOList);
return exonDTOList;
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Get all mutations sorted by their position
*
* @return list of MutationSummaryDTOs
*/
public List<MutationSummaryDTO> findAllMutationSummaries()
{
try
{
List<Variant> variantList = this.db.query(Variant.class).sortASC(Variant.STARTCDNA).find();
return this.variantListToMutationSummaryDTOList(variantList);
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Get all patients sorted by the mutation position
*
* @return list of PatientSummaryDTOs
*/
public List<PatientSummaryDTO> findAllPatientSummaries()
{
try
{
List<Patient> patients = this.db.query(Patient.class).find();
List<PatientSummaryDTO> result = this.patientListToPatientSummaryDTOList(patients);
Collections.sort(result);
return result;
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Get all protein domains
*
* @param orientation
* @return protein domains
* @throws ParseException
* @throws DatabaseException
*/
public List<ProteinDomainDTO> findAllProteinDomains()
{
try
{
return this.proteinDomainListToProteinDomainDTOList(this.db.query(ProteinDomain.class)
.sortASC(ProteinDomain.STARTCDNA).find());
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Find the first exon in order
*
* @return ExonDTO
*/
public ExonDTO findFirstExon()
{
List<ExonDTO> exonDTOList = this.getAllExons();
return exonDTOList.get(0);
}
/**
* Find the first mutation in order
*
* @return MutationSummaryDTO
*/
public MutationSummaryDTO findFirstMutation()
{
List<MutationSummaryDTO> mutationSummaryVOList = this.findAllMutationSummaries();
return mutationSummaryVOList.get(0);
}
/**
* Find previous exon in order
*
* @param id
* of exon for which previous exon is requested
* @return ExonDTO
*/
public ExonDTO findPrevExon(final Integer id)
{
if (id == null) return null;
try
{
List<ExonDTO> exonDTOList = this.getAllExons();
for (int i = 0; i < exonDTOList.size(); i++)
{
ExonDTO exonDTO = exonDTOList.get(i);
if (exonDTO.getId().equals(id))
{
if (i == 0) return exonDTOList.get(i);
else
return exonDTOList.get(i - 1);
}
}
// If we are here we did not find anything :-(
return null;
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Find previous mutation in order
*
* @param id
* of mutation for which previous mutation is requested
* @return MutationSummaryDTO
*/
public MutationSummaryDTO findPrevMutation(final String identifier)
{
if (StringUtils.isEmpty(identifier)) return null;
try
{
List<MutationSummaryDTO> mutationSummaryVOList = this.findAllMutationSummaries();
for (int i = 0; i < mutationSummaryVOList.size(); i++)
{
MutationSummaryDTO mutationSummaryVO = mutationSummaryVOList.get(i);
if (mutationSummaryVO.getIdentifier().equals(identifier))
{
if (i == 0) return mutationSummaryVOList.get(i);
else
return mutationSummaryVOList.get(i - 1);
}
}
// If we are here we did not find anything :-(
return null;
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Find next exon in order
*
* @param id
* of exon for which next exon is requested
* @return ExonDTO
*/
public ExonDTO findNextExon(final Integer id)
{
if (id == null) return null;
try
{
List<ExonDTO> exonDTOList = this.getAllExons();
for (int i = 0; i < exonDTOList.size(); i++)
{
ExonDTO exonDTO = exonDTOList.get(i);
if (exonDTO.getId().equals(id))
{
if (i == exonDTOList.size() - 1) return exonDTOList.get(i);
else
return exonDTOList.get(i + 1);
}
}
// If we are here we did not find anything :-(
return null;
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Find next mutation in order
*
* @param id
* of mutation for which next mutation is requested
* @return MutationSummaryDTO
*/
public MutationSummaryDTO findNextMutation(final String identifier)
{
if (StringUtils.isEmpty(identifier)) return null;
try
{
List<MutationSummaryDTO> mutationSummaryVOList = this.findAllMutationSummaries();
for (int i = 0; i < mutationSummaryVOList.size(); i++)
{
MutationSummaryDTO mutationSummaryVO = mutationSummaryVOList.get(i);
if (mutationSummaryVO.getIdentifier().equals(identifier))
{
if (i == mutationSummaryVOList.size() - 1) return mutationSummaryVOList.get(i);
else
return mutationSummaryVOList.get(i + 1);
}
}
// If we are here we did not find anything :-(
return null;
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Find the last exon in order
*
* @return ExonDTO
*/
public ExonDTO findLastExon()
{
List<ExonDTO> exonDTOList = this.getAllExons();
return exonDTOList.get(exonDTOList.size() - 1);
}
/**
* Find the last mutation in order
*
* @return MutationSummaryDTO
*/
public MutationSummaryDTO findLastMutation()
{
List<MutationSummaryDTO> mutationSummaryVOList = this.findAllMutationSummaries();
return mutationSummaryVOList.get(mutationSummaryVOList.size() - 1);
}
/**
* Find variants in a specific exon/intron
*
* @param exonId
* @return list of VariantSummaryDTO's
*/
public List<MutationSummaryDTO> findMutationsByExonId(final Integer exonId)
{
try
{
Exon exon = this.db.findById(Exon.class, exonId);
org.molgenis.framework.db.Query<Variant> query = this.db.query(Variant.class);
if ("-1".equals(exon.getStrand()))
{
query = query.lessOrEqual(Variant.STARTGDNA, exon.getStartGdna());
query = query.greaterOrEqual(Variant.ENDGDNA, exon.getEndGdna());
}
else if ("1".equals(exon.getStrand()))
{
query = query.greaterOrEqual(Variant.STARTGDNA, exon.getStartGdna());
query = query.lessOrEqual(Variant.ENDGDNA, exon.getEndGdna());
}
List<Variant> result = query.find();
return this.variantListToMutationSummaryDTOList(result);
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Find a variant by its identifier
*
* @param mutationIdentifier
* @return VariantSummaryDTO
*/
public MutationSummaryDTO findMutationByIdentifier(final String mutationIdentifier)
{
try
{
String sql = "SELECT s FROM Variant s JOIN s.alternateId a WHERE a.definition = 'molgenis_variant_id' AND a.name = :name";
TypedQuery<Variant> query = this.em.createQuery(sql, Variant.class);
query.setParameter("name", mutationIdentifier);
List<Variant> variantList = query.getResultList();
if (variantList.size() > 1) throw new SearchServiceException("Not exactly one variant matching "
+ mutationIdentifier);
if (variantList.size() == 1) return this.variantToMutationSummaryDTO(variantList.get(0));
else
return null;
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Find variants according to given criteria
* @param criteria
* @return
*/
public List<MutationSummaryDTO> findMutations(final MutationSearchCriteriaDTO criteria)
{
try
{
Set<MutationSummaryDTO> mutations = new HashSet<MutationSummaryDTO>();
if (StringUtils.isNotEmpty(criteria.getVariation())) mutations.addAll(this
.findMutationsByCdnaNotation(criteria.getVariation()));
if (StringUtils.isNotEmpty(criteria.getConsequence())) mutations.addAll(this.findMutationsByObservedValue(
"Consequence", criteria.getConsequence()));
if (StringUtils.isNotEmpty(criteria.getMid()))
{
MutationSummaryDTO tmp = this.findMutationByIdentifier(criteria.getMid());
if (tmp != null) mutations.add(tmp);
}
if (criteria.getCdnaPosition() != null) mutations.addAll(this.findMutationsByPosition(criteria
.getCdnaPosition()));
if (criteria.getCodonChangeNumber() != null) mutations.addAll(this
.findMutationsByCodonChangeNumber(criteria.getCodonChangeNumber()));
if (criteria.getExonId() != null) mutations.addAll(this.findMutationsByExonId(criteria.getExonId()));
if (StringUtils.isNotEmpty(criteria.getType())) mutations.addAll(this.findMutationsByType(criteria.getType()));
if (criteria.getProteinDomainId() != null) mutations.addAll(this.findMutationsByDomainId(criteria
.getProteinDomainId()));
if (StringUtils.isNotEmpty(criteria.getPhenotypeName())) mutations.addAll(this
.findMutationsByObservedValue("Phenotype", criteria.getPhenotypeName()));
if (StringUtils.isNotEmpty(criteria.getInheritance())) mutations.addAll(this.findMutationsByObservedValue(
"Inheritance", criteria.getInheritance()));
// if (criteria.getReportedAsSNP() != null)
// TODO: implement
return Arrays.asList(mutations.toArray(new MutationSummaryDTO[0]));
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Find mutations by mutation type
* @param type
* @return list of mutations
*/
public List<MutationSummaryDTO> findMutationsByType(String type)
{
try
{
List<Variant> variantList = this.db.query(Variant.class).equals(Variant.TYPE_, type).find();
return this.variantListToMutationSummaryDTOList(variantList);
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Find patients by related mutation identifiers
*
* @param mutationIdentifier
* @return list of PatientSummaryDTO's
*/
public List<PatientSummaryDTO> findPatientsByMutationIdentifier(final String mutationIdentifier)
{
try
{
String sql = "SELECT p FROM Patient p JOIN p.mutations m JOIN m.alternateId a WHERE a.name = :name";
TypedQuery<Patient> query = this.em.createQuery(sql, Patient.class);
query.setParameter("name", mutationIdentifier);
List<Patient> patientList = query.getResultList();
return this.patientListToPatientSummaryDTOList(patientList);
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Find patient by its identifier
*
* @param patientIdentifier
* @return PatientSummaryDTO
*/
public PatientSummaryDTO findPatientByPatientIdentifier(final String patientIdentifier)
{
try
{
String sql = "SELECT p FROM Patient p JOIN p.alternateId a WHERE a.name = :name";
TypedQuery<Patient> query = this.em.createQuery(sql, Patient.class);
query.setParameter("name", patientIdentifier);
List<Patient> patientList = query.getResultList();
if (patientList.size() > 1) throw new SearchServiceException("Not exactly one patient matches "
+ patientIdentifier);
if (patientList.size() == 1) return this.patientToPatientSummaryDTO(patientList.get(0));
else
return null;
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Find mutations matching a free text term
* @param term
* @return Hash of mutations per category
*/
public HashMap<String, List<MutationSummaryDTO>> findMutationsByTerm(final String term)
{
HashMap<String, List<MutationSummaryDTO>> result = new HashMap<String, List<MutationSummaryDTO>>();
result.put("variation", this.findMutationsByCdnaNotation(term));
result.put("PID", this.findMutationsByPatientIdentifier(StringUtils.upperCase(term)));
MutationSummaryDTO tmp = this.findMutationByIdentifier(StringUtils.upperCase(term));
if (tmp != null)
{
result.put("MID", new ArrayList<MutationSummaryDTO>());
result.get("MID").add(tmp);
}
result.put("publication", this.findMutationsByPublication(term));
result.put("measurement", this.findMutationsByMeasurement(term));
result.put("observed value", this.findMutationsByObservedValue(term));
if (NumberUtils.isNumber(term))
{
result.put("position", this.findMutationsByPosition(Integer.parseInt(term)));
}
return result;
}
public List<MutationSummaryDTO> findMutationsByCodonChangeNumber(final int aaPosition)
{
try
{
List<Variant> variantList = this.db.query(Variant.class).equals(Variant.STARTAA, aaPosition).find();
return this.variantListToMutationSummaryDTOList(variantList);
}
catch (DatabaseException e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
public List<MutationSummaryDTO> findMutationsByPosition(final int position)
{
try
{
List<Variant> variantList = this.db.query(Variant.class).equals(Variant.STARTCDNA, position).or()
.equals(Variant.STARTGDNA, position).or().equals(Variant.STARTAA, position).find();
return this.variantListToMutationSummaryDTOList(variantList);
}
catch (DatabaseException e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
public List<MutationSummaryDTO> findMutationsByObservedValue(final String value)
{
List<ObservationElement> observationElementList = new ArrayList<ObservationElement>();
List<ObservedValue> valueList = ((JpaDatabase) this.db).search(ObservedValue.class, "value", value);
for (ObservedValue observedValue : valueList)
{
observationElementList.add(observedValue.getTarget());
}
return this.observationElementListToMutationSummaryDTOList(observationElementList);
}
public List<MutationSummaryDTO> findMutationsByObservedValue(final String featureName, final String value)
{
String sql = "SELECT DISTINCT s FROM ObservedValue ov JOIN ov.feature f JOIN ov.target s WHERE (f.name = :featureName OR f.description = :featureName) AND ov.value = :value";
TypedQuery<ObservationElement> query = this.em.createQuery(sql, ObservationElement.class);
query.setParameter("featureName", featureName);
query.setParameter("value", value);
return this.observationElementListToMutationSummaryDTOList(query.getResultList());
}
public List<MutationSummaryDTO> findMutationsByMeasurement(final String feature)
{
String sql = "SELECT DISTINCT s FROM ObservedValue ov JOIN ov.feature f JOIN ov.target s WHERE f.name = :name AND ov.value IN ('yes', 'true')";
TypedQuery<ObservationElement> query = this.em.createQuery(sql, ObservationElement.class);
query.setParameter("name", feature);
return this.observationElementListToMutationSummaryDTOList(query.getResultList());
}
/**
* Find mutations given a publication title
*
* @param title
* term
* @return list of variants
*/
public List<MutationSummaryDTO> findMutationsByPublication(final String term)
{
try
{
List<Variant> variantList = new ArrayList<Variant>();
List<Publication> publicationList = ((JpaDatabase) this.db).search(Publication.class, "title", term);
for (Publication publication : publicationList)
{
String sql = "SELECT s FROM Patient p JOIN p.mutations s JOIN p.patientreferences r WHERE r.id = :id";
TypedQuery<Variant> query = this.em.createQuery(sql, Variant.class);
query.setParameter("id", publication.getId());
variantList.addAll(query.getResultList());
}
return this.variantListToMutationSummaryDTOList(variantList);
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
public List<MutationSummaryDTO> findMutationsByPatientIdentifier(final String term)
{
String sql = "SELECT DISTINCT s FROM Patient p JOIN p.mutations s JOIN p.alternateId a WHERE a.name = :name";
TypedQuery<Variant> query = this.em.createQuery(sql, Variant.class);
query.setParameter("name", term);
return this.variantListToMutationSummaryDTOList(query.getResultList());
}
public List<MutationSummaryDTO> findMutationsByCdnaNotation(final String cdnaNotation)
{
try
{
List<Variant> variantList = this.db.query(Variant.class).equals(Variant.NAME, cdnaNotation).find();
return this.variantListToMutationSummaryDTOList(variantList);
}
catch (DatabaseException e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
public HashMap<String, List<PatientSummaryDTO>> findPatientsByTerm(final String term)
{
HashMap<String, List<PatientSummaryDTO>> result = new HashMap<String, List<PatientSummaryDTO>>();
result.put("variation", this.findPatientsByMutationNotation(term));
result.put("MID", this.findPatientsByMutationIdentifier(term));
PatientSummaryDTO tmp = this.findPatientByPatientIdentifier(term);
if (tmp != null)
{
result.put("PID", new ArrayList<PatientSummaryDTO>());
result.get("PID").add(tmp);
}
result.put("publication", this.findPatientsByPublication(term));
result.put("measurement", this.findPatientsByMeasurement(term));
result.put("observed value", this.findPatientsByObservedValue(term));
if (NumberUtils.isNumber(term))
{
result.put("mutation position", this.findPatientsByPosition(Integer.parseInt(term)));
}
return result;
}
public List<PatientSummaryDTO> findPatientsByPosition(final int position)
{
String sql = "SELECT DISTINCT p FROM Patient p JOIN p.mutations m WHERE m.startCdna = :position OR m.startGdna = :position OR m.startAa = :position";
TypedQuery<Patient> query = this.em.createQuery(sql, Patient.class);
query.setParameter("position", position);
return this.patientListToPatientSummaryDTOList(query.getResultList());
}
// public List<PatientSummaryDTO> findPatientsByExonNumber(final int
// exonNumber)
// {
// // TODO Auto-generated method stub
// return new ArrayList<PatientSummaryDTO>();
// }
public List<PatientSummaryDTO> findPatientsByObservedValue(final String value)
{
List<Patient> patientList = new ArrayList<Patient>();
// Search for "normal" observed values
List<ObservedValue> valueList = ((JpaDatabase) this.db).search(ObservedValue.class, "value", value);
for (ObservedValue observedValue : valueList)
{
if (observedValue.getTarget() instanceof Variant)
{
Variant variant = (Variant) observedValue.getTarget();
patientList.addAll(variant.getMutationsPatientCollection());
}
else if (observedValue.getTarget() instanceof Patient)
{
patientList.add((Patient) observedValue.getTarget());
}
}
// Search for the phenotype
patientList.addAll(((JpaDatabase) this.db).search(Patient.class, "phenotype", value));
return this.patientListToPatientSummaryDTOList(patientList);
}
@SuppressWarnings("unchecked")
public List<PatientSummaryDTO> findPatientsByMeasurement(final String featureName)
{
String sql = "SELECT DISTINCT p FROM ObservedValue ov JOIN ov.feature f JOIN ov.target p WHERE p.__Type = 'Patient' AND f.name = :name AND ov.value IN ('yes', 'true')";
Query query = this.em.createQuery(sql);
query.setParameter("name", featureName);
return this.patientListToPatientSummaryDTOList(query.getResultList());
}
public List<PatientSummaryDTO> findPatientsByPublication(final String term)
{
try
{
List<Patient> patientList = new ArrayList<Patient>();
List<Publication> publicationList = ((JpaDatabase) this.db).search(Publication.class, "title", term);
for (Publication publication : publicationList)
{
patientList.addAll(publication.getPatientreferencesPatientCollection());
}
return this.patientListToPatientSummaryDTOList(patientList);
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
public List<PatientSummaryDTO> findPatientsByMutationNotation(final String notation)
{
String sql = "SELECT DISTINCT p FROM Patient p JOIN p.mutations m WHERE m.nameCdna = :notation OR m.nameGdna = :notation OR m.nameAa = :notation";
TypedQuery<Patient> query = this.em.createQuery(sql, Patient.class);
query.setParameter("notation", notation);
return this.patientListToPatientSummaryDTOList(query.getResultList());
}
/**
* Find mutations on the same position as the given one
*
* @param mutationSummaryVO
* @return list of VariantDTO
* @throws DatabaseException
*/
public List<VariantDTO> findPositionMutations(final MutationSummaryDTO mutationSummaryVO)
{
try
{
List<Variant> variantList = this.db.query(Variant.class)
.equals(Variant.STARTCDNA, mutationSummaryVO.getCdnaStart()).find();
return this.variantListToVariantDTOList(variantList);
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Find mutations in the same codon as the given one
*
* @param mutationSummaryVO
* @return list of VariantDTO
*/
public List<VariantDTO> findCodonMutations(final MutationSummaryDTO mutationSummaryVO)
{
// List<MutationSummaryVO> result = new ArrayList<MutationSummaryVO>();
// if (mutationSummaryVO.getAaPosition() != null)
// {
// List<Mutation> codonMutations =
// this.db.query(Mutation.class).equals(Mutation.AA_POSITION,
// mutationSummaryVO.getAaPosition()).find();
// for (Mutation codonMutation : codonMutations)
// {
// if (!codonMutation.getId().equals(mutationSummaryVO.getId()))
// {
// MutationSummaryVO tmp = new MutationSummaryVO();
// tmp.setIdentifier(codonMutation.getIdentifier());
// tmp.setCdnaNotation(codonMutation.getCdna_Notation());
// result.add(tmp);
// }
// }
// }
// return result;
return new ArrayList<VariantDTO>();
}
/**
* Find a gene by its id
* @param id
* @return GeneDTO
*/
public GeneDTO findGene(final Integer id)
{
try
{
Gene gene = this.em.find(Gene.class, id);
if (gene == null)
throw new SearchServiceException("No gene found for " + id);
return this.geneToGeneDTO(gene);
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
/**
* Find a protein domain by its id
*
* @param id
* @param noIntrons
* @return ProteinDomainDTO
*/
public ProteinDomainDTO findProteinDomain(final Integer id, final Boolean noIntrons)
{
try
{
ProteinDomain domain = this.em.find(ProteinDomain.class, id);
if (domain == null) throw new SearchServiceException("No domain found for " + id);
return this.proteinDomainToProteinDomainDTO(domain, noIntrons);
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
public List<PatientSummaryDTO> findPatientsByUserId(Integer userId)
{
String sql = "SELECT DISTINCT p FROM Patient p JOIN p.submission s JOIN s.submitters ps WHERE ps.id = :userId";
TypedQuery<Patient> query = this.em.createQuery(sql, Patient.class);
query.setParameter("userId", userId);
return this.patientListToPatientSummaryDTOList(query.getResultList());
}
public List<MutationSummaryDTO> findMutationsByDomainId(Integer domainId)
{
try
{
ProteinDomain proteinDomain = this.db.findById(ProteinDomain.class, domainId);
org.molgenis.framework.db.Query<Variant> query = this.db.query(Variant.class);
if ("-1".equals(proteinDomain.getStrand()))
{
query = query.lessOrEqual(Variant.STARTGDNA, proteinDomain.getStartGdna());
query = query.greaterOrEqual(Variant.ENDGDNA, proteinDomain.getEndGdna());
}
else if ("1".equals(proteinDomain.getStrand()))
{
query = query.greaterOrEqual(Variant.STARTGDNA, proteinDomain.getStartGdna());
query = query.lessOrEqual(Variant.ENDGDNA, proteinDomain.getEndGdna());
}
List<Variant> result = query.find();
return this.variantListToMutationSummaryDTOList(result);
}
catch (Exception e)
{
e.printStackTrace();
throw new SearchServiceException(e.getMessage());
}
}
}