Skip to content

Commit

Permalink
Merge pull request #10 from uc-cdis/fix_performance_issue_cohort_data
Browse files Browse the repository at this point in the history
Fix performance issue in cohort-data
  • Loading branch information
m0nhawk authored Apr 8, 2022
2 parents fe12bb5 + 53e2fe9 commit 5902e36
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 1 deletion.
2 changes: 1 addition & 1 deletion controllers/cohortdata.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ func (u CohortDataController) RetrieveDataBySourceIdAndCohortIdAndConceptIds(c *
conceptIds := getConceptIdsFromPrefixedConceptIds(prefixedConceptIds.PrefixedConceptIds)

// call model method:
cohortData, err := cohortDataModel.RetrieveDataBySourceIdAndCohortIdAndConceptIdsOrderedByPersonId(sourceId, cohortId, conceptIds)
cohortData, err := cohortDataModel.RetrieveDataLargeBySourceIdAndCohortIdAndConceptIdsOrderedByPersonId(sourceId, cohortId, conceptIds)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"message": "Error retrieving concept details", "error": err})
c.Abort()
Expand Down
25 changes: 25 additions & 0 deletions models/cohortdata.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ type PersonConceptAndValue struct {
ConceptValueAsNumber float32
}

// DEPRECATED - too slow for larger cohorts
func (h CohortData) RetrieveDataBySourceIdAndCohortIdAndConceptIdsOrderedByPersonId(sourceId int, cohortDefinitionId int, conceptIds []int) ([]*PersonConceptAndValue, error) {
var dataSourceModel = new(Source)
omopDataSource := dataSourceModel.GetDataSource(sourceId, Omop)
Expand All @@ -38,3 +39,27 @@ func (h CohortData) RetrieveDataBySourceIdAndCohortIdAndConceptIdsOrderedByPerso

return cohortData, nil
}

// Same as above, but for LARGE cohorts/dbs
// Assumption is that both OMOP and RESULTS schemas
// are on same DB
func (h CohortData) RetrieveDataLargeBySourceIdAndCohortIdAndConceptIdsOrderedByPersonId(sourceId int, cohortDefinitionId int, conceptIds []int) ([]*PersonConceptAndValue, error) {
log.Printf(">> Using inner join impl. for large cohorts")
var dataSourceModel = new(Source)
omopDataSource := dataSourceModel.GetDataSource(sourceId, Omop)

resultsDataSource := dataSourceModel.GetDataSource(sourceId, Results)

// get the observations for the subjects and the concepts, to build up the data rows to return:
var cohortData []*PersonConceptAndValue
omopDataSource.Db.Model(&Observation{}).
Select("observation.person_id, concept.concept_id, concept.concept_name, observation.value_as_string as concept_value_as_string, observation.value_as_number as concept_value_as_number").
Joins("INNER JOIN "+omopDataSource.Schema+".concept as concept ON observation.observation_concept_id = concept.concept_id").
Joins("INNER JOIN "+resultsDataSource.Schema+".cohort as cohort ON cohort.subject_id = observation.person_id").
Where("cohort.cohort_definition_id = ?", cohortDefinitionId).
Where("concept.concept_id in (?)", conceptIds).
Order("observation.person_id asc"). // this order is important!
Scan(&cohortData)

return cohortData, nil
}

0 comments on commit 5902e36

Please sign in to comment.