use of gov.nih.nci.ctd2.dashboard.model.ECOTerm in project nci-ctd2-dashboard by CBIIT.
the class DashboardDaoImpl method getEcoTerm.
@Override
public ECOTerm getEcoTerm(String ecoTermCode) {
Session session = getSession();
@SuppressWarnings("unchecked") org.hibernate.query.Query<ECOTerm> query = session.createQuery("from ECOTermImpl where code = :ecocode");
query.setParameter("ecocode", ecoTermCode);
ECOTerm result = null;
try {
result = query.getSingleResult();
} catch (NoResultException e) {
log.info("ECO term not available for ECO code " + ecoTermCode);
}
session.close();
return result;
}
use of gov.nih.nci.ctd2.dashboard.model.ECOTerm in project nci-ctd2-dashboard by CBIIT.
the class DashboardDaoImpl method search.
@Override
@Cacheable(value = "searchCache")
public SearchResults search(String queryString) {
queryString = queryString.trim();
final String[] searchTerms = parseWords(queryString);
log.debug("search terms: " + String.join(",", searchTerms));
Map<Subject, Integer> subjects = new HashMap<Subject, Integer>();
Map<Submission, Integer> submissions = new HashMap<Submission, Integer>();
for (String singleTerm : searchTerms) {
searchSingleTerm(singleTerm, subjects, submissions);
}
SearchResults searchResults = new SearchResults();
searchResults.submission_result = submissions.keySet().stream().map(submission -> {
ObservationTemplate template = submission.getObservationTemplate();
return new SearchResults.SubmissionResult(submission.getStableURL(), submission.getSubmissionDate(), template.getDescription(), template.getTier(), template.getSubmissionCenter().getDisplayName(), submission.getId(), findObservationsBySubmission(submission).size(), template.getIsSubmissionStory());
}).collect(Collectors.toList());
Map<String, Set<Observation>> observationMap = new HashMap<String, Set<Observation>>();
List<SubjectResult> subject_result = new ArrayList<SubjectResult>();
for (Subject subject : subjects.keySet()) {
Set<Observation> observations = new HashSet<Observation>();
Set<SubmissionCenter> submissionCenters = new HashSet<SubmissionCenter>();
Set<String> roles = new HashSet<String>();
for (ObservedSubject observedSubject : findObservedSubjectBySubject(subject)) {
Observation observation = observedSubject.getObservation();
observations.add(observation);
ObservationTemplate observationTemplate = observation.getSubmission().getObservationTemplate();
submissionCenters.add(observationTemplate.getSubmissionCenter());
roles.add(observedSubject.getObservedSubjectRole().getSubjectRole().getDisplayName());
}
SubjectResult x = new SubjectResult(subject, observations.size(), submissionCenters.size(), subjects.get(subject), roles);
Arrays.stream(searchTerms).filter(term -> matchSubject(term, subject)).forEach(term -> {
Set<Observation> obset = observationMap.get(term);
if (obset == null) {
obset = new HashSet<Observation>();
}
obset.addAll(observations);
observationMap.put(term, obset);
});
subject_result.add(x);
}
/* search ECO terms */
List<ECOTerm> ecoterms = findECOTerms(queryString);
for (ECOTerm ecoterm : ecoterms) {
List<Integer> observationIds = observationIdsForEcoCode(ecoterm.getCode());
int observationNumber = observationIds.size();
if (observationNumber == 0)
continue;
SubjectResult entity = new SubjectResult(ecoterm, observationNumber, centerCount(ecoterm.getCode()), null, // no matchNumber, no roles
null);
subject_result.add(entity);
Set<Observation> observations = new HashSet<Observation>();
observationIds.forEach(obid -> observations.add(getEntityById(Observation.class, obid)));
Arrays.stream(searchTerms).filter(term -> ecoterm.containsTerm(term)).forEach(term -> {
Set<Observation> obset = observationMap.get(term);
if (obset == null) {
obset = new HashSet<Observation>();
}
obset.addAll(observations);
observationMap.put(term, obset);
});
}
/*
* Limit the size. This should be done more efficiently during the process of
* builing up of the list.
* Because the limit needs to be based on 'match number' ranking, which depends
* on all terms, an efficient algorithm is not obvious.
* Unfortunately, we also have to do this after processing all results because
* we need (in fact more often) observation numbers as well in ranking. TODO
*/
if (subject_result.size() > maxNumberOfSearchResults) {
searchResults.oversized = subject_result.size();
subject_result = subject_result.stream().sorted(new SearchResultComparator()).limit(maxNumberOfSearchResults).collect(Collectors.toList());
log.debug("size after limiting: " + subject_result.size());
}
searchResults.subject_result = subject_result;
if (searchTerms.length <= 1) {
return searchResults;
}
// add intersection of observations
Set<Observation> set0 = observationMap.get(searchTerms[0]);
if (set0 == null) {
log.debug("no observation for " + searchTerms[0]);
return searchResults;
}
log.debug("set0 size=" + set0.size());
for (int i = 1; i < searchTerms.length; i++) {
Set<Observation> obset = observationMap.get(searchTerms[i]);
if (obset == null) {
log.debug("... no observation for " + searchTerms[i]);
return searchResults;
}
log.debug("set " + i + " size=" + obset.size());
set0.retainAll(obset);
}
// set0 is now the intersection
if (set0.size() == 0) {
log.debug("no intersection of observations");
}
if (set0.size() > maxNumberOfSearchResults) {
searchResults.oversized_observations = set0.size();
// no particular ranking is enforced when limiting
set0 = set0.stream().limit(maxNumberOfSearchResults).collect(Collectors.toSet());
log.debug("observation results count after limiting: " + set0.size());
}
searchResults.observation_result = new ArrayList<Observation>(set0);
return searchResults;
}
use of gov.nih.nci.ctd2.dashboard.model.ECOTerm in project nci-ctd2-dashboard by CBIIT.
the class DashboardDaoImpl method ontologySearchOneTerm.
private List<SubjectResult> ontologySearchOneTerm(String oneTerm, final Set<Integer> observations) {
long t1 = System.currentTimeMillis();
List<Integer> list = ontologySearchDiseaseContext(oneTerm);
List<SubjectResult> entities = new ArrayList<SubjectResult>();
Session session = getSession();
@SuppressWarnings("unchecked") org.hibernate.query.Query<TissueSample> query = session.createQuery("from TissueSampleImpl where code = :code");
List<Integer> subjectIds = new ArrayList<Integer>();
for (Integer i : list) {
query.setParameter("code", i);
TissueSample result = null;
try {
result = query.getSingleResult();
} catch (NoResultException e) {
log.info("Tissue sample not available for code " + i);
continue;
}
int observationNumber = observationCountForTissueSample(i);
int centerCount = centerCountForTissueSample(i);
Set<String> roles = getRolesForSubjectId(result.getId());
SubjectResult x = new SubjectResult(result, observationNumber, centerCount, 1, roles);
entities.add(x);
subjectIds.add(result.getId());
}
long t2 = System.currentTimeMillis();
log.debug("disease context ontology search for '" + oneTerm + "' took " + (t2 - t1) + " milliseconds");
log.debug("tissue sample results count: " + entities.size());
if (observations != null) {
List<Integer> observationIds = observationIdsForSubjectIds(subjectIds);
observations.addAll(observationIds);
log.debug("observations count: " + observations.size());
}
List<ECOTerm> ecoterms = findECOTerms(oneTerm);
List<Integer> eco_list = ontologySearchExperimentalEvidence(ecoterms);
int eco_list_size = eco_list.size();
log.debug("eco list size:" + eco_list_size);
if (eco_list_size > 0) {
@SuppressWarnings("unchecked") org.hibernate.query.Query<ECOTerm> query2 = session.createQuery("FROM ECOTermImpl WHERE code in (:codes)");
List<String> codes = eco_list.stream().map(x -> String.format("ECO:%07d", x)).collect(Collectors.toList());
query2.setParameterList("codes", codes);
List<ECOTerm> list2 = query2.list();
for (ECOTerm x : list2) {
int observationNumber = observationCountForEcoCode(x.getCode());
int centerCount = centerCountForEcoCode(x.getCode());
// no matchNumber, no roles
SubjectResult subjectResult = new SubjectResult(x, observationNumber, centerCount, null, null);
entities.add(subjectResult);
if (observations != null) {
List<Integer> observationIdsForOneECOTerm = observationIdsForEcoCode(x.getCode());
observations.addAll(observationIdsForOneECOTerm);
}
}
}
log.debug("tissue sample results count after getting ECO term: " + entities.size());
if (observations != null) {
log.debug("observations count after getting ECO term: " + observations.size());
}
if (observations != null) {
searchSubjectsToUpdateObservations(oneTerm, observations);
log.debug("observationIds count after getting other subjects: " + observations.size());
}
session.close();
return entities;
}
use of gov.nih.nci.ctd2.dashboard.model.ECOTerm in project nci-ctd2-dashboard by CBIIT.
the class ECOTermDataFieldSetMapper method mapFieldSet.
public ECOTerm mapFieldSet(FieldSet fieldSet) throws BindException {
String name = fieldSet.readString("name");
String code = fieldSet.readString("code");
String definition = fieldSet.readString("definition");
String synonyms = fieldSet.readString("synonyms");
log.debug("synonyms: " + synonyms);
ECOTerm ecoterm = dashboardFactory.create(ECOTerm.class);
ecoterm.setDisplayName(name);
ecoterm.setCode(code);
ecoterm.setDefinition(definition);
ecoterm.setSynonyms(synonyms);
return ecoterm;
}
use of gov.nih.nci.ctd2.dashboard.model.ECOTerm in project nci-ctd2-dashboard by CBIIT.
the class ECOTermDataWriter method write.
public void write(List<? extends ECOTerm> items) throws Exception {
StableURL stableURL = new StableURL();
for (ECOTerm ecoterm : items) {
ecoterm.setStableURL(stableURL.createURLWithPrefix("eco", ecoterm.getCode()));
}
dashboardDao.batchSave(items, batchSize);
log.debug("ECO term written");
}
Aggregations