use of gov.nih.nci.ctd2.dashboard.model.TissueSample in project nci-ctd2-dashboard by CBIIT.
the class DashboardDaoImpl method ontologySearch.
/*
* To get observation 'search' results, i.e. the intersection concept, the
* implmentation of ontology search will be much more complex. Ideally it would
* be better to compeltely separate the observation part, but to avoid repeating
* the actual hierarchical searching, embedding observations here is the best
* choice. Although the previous implementation is better for searching
* subjects, but to cover the observation parts, we have no choice but to
* compromise the clarity here.
*
* Other points of consideration for the purpose of observation 'search': (1)
* the ontologySearch cover the original non-ontology subject results (in
* principle) (2) the subjects other than TissueSample and ECO term are neither
* affected or covered by ontology search so it is not consistent.
*/
@Override
public SearchResults ontologySearch(String queryString) {
final String[] searchTerms = parseWords(queryString);
Set<Integer> observationsIntersection = null;
Set<SubjectResult> subject_result = null;
final int termCount = searchTerms.length;
if (termCount <= 1) {
// prevent wasting time finding observations
subject_result = new HashSet<SubjectResult>(ontologySearchOneTerm(searchTerms[0].replace("\"", ""), null));
} else {
boolean first = true;
Map<SubjectResult, Integer> subjectResultMap = new HashMap<SubjectResult, Integer>();
for (String oneTerm : searchTerms) {
oneTerm = oneTerm.replace("\"", "");
log.debug("ontology search term:" + oneTerm);
Set<Integer> observations = new HashSet<Integer>();
List<SubjectResult> oneTermList = ontologySearchOneTerm(oneTerm, observations);
for (SubjectResult s : oneTermList) {
Integer matchNumber = subjectResultMap.get(s);
if (matchNumber != null) {
s.matchNumber = matchNumber + 1;
}
subjectResultMap.put(s, s.getMatchNumber());
}
if (first) {
observationsIntersection = observations;
first = false;
} else {
observationsIntersection.retainAll(observations);
}
}
subject_result = subjectResultMap.keySet();
}
SearchResults searchResults = new SearchResults();
if (subject_result.size() > maxNumberOfSearchResults) {
searchResults.oversized = subject_result.size();
searchResults.subject_result = subject_result.stream().sorted(new SearchResultComparator()).limit(maxNumberOfSearchResults).collect(Collectors.toList());
log.debug("size after limiting: " + subject_result.size());
} else {
searchResults.subject_result = new ArrayList<SubjectResult>(subject_result);
}
if (observationsIntersection != null) {
searchResults.observation_result = observationsIntersection.stream().map(id -> this.getEntityById(Observation.class, id)).collect(Collectors.toList());
log.debug("size of observation intersection: " + observationsIntersection.size());
}
return searchResults;
}
use of gov.nih.nci.ctd2.dashboard.model.TissueSample 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.TissueSample in project nci-ctd2-dashboard by CBIIT.
the class TissueSampleSynonymsDataFieldSetMapper method mapFieldSet.
public TissueSample mapFieldSet(FieldSet fieldSet) throws BindException {
String nciThesaurusCode = fieldSet.readString(NCI_THESAURUS_CODE);
TissueSample tissueSample = tissueSampleMap.get(nciThesaurusCode);
if (tissueSample != null) {
Synonym synonym = dashboardFactory.create(Synonym.class);
synonym.setDisplayName(fieldSet.readString(SYNONYM));
tissueSample.getSynonyms().add(synonym);
}
return tissueSample;
}
use of gov.nih.nci.ctd2.dashboard.model.TissueSample in project nci-ctd2-dashboard by CBIIT.
the class TissueSampleDataWriter method execute.
public RepeatStatus execute(StepContribution arg0, ChunkContext arg1) throws Exception {
ArrayList<DashboardEntity> entities = new ArrayList<DashboardEntity>();
for (TissueSample tissueSample : tissueSampleMap.values()) {
String nciThesaurusId = getNCIThesaurusID(tissueSample);
String stableURL = new StableURL().createURLWithPrefix("tissue", nciThesaurusId);
tissueSample.setStableURL(stableURL);
entities.add(tissueSample);
}
dashboardDao.batchSave(entities, batchSize);
return RepeatStatus.FINISHED;
}
use of gov.nih.nci.ctd2.dashboard.model.TissueSample in project nci-ctd2-dashboard by CBIIT.
the class TissueSampleTermsDataFieldSetMapper method mapFieldSet.
public TissueSample mapFieldSet(FieldSet fieldSet) throws BindException {
TissueSample tissueSample = dashboardFactory.create(TissueSample.class);
tissueSample.setDisplayName(fieldSet.readString(TISSUE_SAMPLE_NAME));
// create xref to NCI thesaurus
String nciThesaurusCode = fieldSet.readString(NCI_THESAURUS_CODE);
tissueSample.setCode(Integer.parseInt(nciThesaurusCode.substring(1)));
if (!nciThesaurusCode.isEmpty()) {
addXrefToSample(tissueSample, nciThesaurusCode, NCI_THESAURUS_DATABASE);
}
// create xref to NCI thesaurus (parent)
String parents = fieldSet.readString(PARENTS);
if (!parents.isEmpty()) {
for (String parentThesaurusCode : parents.split(";")) {
addXrefToSample(tissueSample, parentThesaurusCode, NCI_PARENT_THESAURUS_DATABASE);
}
}
tissueSampleMap.put(nciThesaurusCode, tissueSample);
return tissueSample;
}
Aggregations