Skip to content

Commit

Permalink
working aggregation code
Browse files Browse the repository at this point in the history
  • Loading branch information
AnalogJ committed Aug 14, 2023
1 parent 6f56fa9 commit b3a173d
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 32 deletions.
2 changes: 1 addition & 1 deletion backend/pkg/database/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ type DatabaseRepository interface {

GetResourceByResourceTypeAndId(context.Context, string, string) (*models.ResourceBase, error)
GetResourceBySourceId(context.Context, string, string) (*models.ResourceBase, error)
QueryResources(ctx context.Context, query models.QueryResource) ([]models.ResourceBase, error)
QueryResources(ctx context.Context, query models.QueryResource) (interface{}, error)
ListResources(context.Context, models.ListResourceQueryOptions) ([]models.ResourceBase, error)
GetPatientForSources(ctx context.Context) ([]models.ResourceBase, error)
AddResourceAssociation(ctx context.Context, source *models.SourceCredential, resourceType string, resourceId string, relatedSource *models.SourceCredential, relatedResourceType string, relatedResourceId string) error
Expand Down
20 changes: 14 additions & 6 deletions backend/pkg/database/sqlite_repository_query.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,24 @@ const TABLE_ALIAS = "fhir"
// )
// AND (user_id = "6efcd7c5-3f29-4f0d-926d-a66ff68bbfc2")
// GROUP BY `fhir`.`id`
func (sr *SqliteRepository) QueryResources(ctx context.Context, query models.QueryResource) ([]models.ResourceBase, error) {
results := []models.ResourceBase{}
func (sr *SqliteRepository) QueryResources(ctx context.Context, query models.QueryResource) (interface{}, error) {

sqlQuery, err := sr.sqlQueryResources(ctx, query)
if err != nil {
return nil, err
}
clientResp := sqlQuery.Find(&results)

return results, clientResp.Error
if query.Aggregations != nil && (len(query.Aggregations.GroupBy) > 0 || len(query.Aggregations.CountBy) > 0) {
results := []map[string]interface{}{}
clientResp := sqlQuery.Find(&results)
return results, clientResp.Error

} else {
results := []models.ResourceBase{}
clientResp := sqlQuery.Find(&results)
return results, clientResp.Error
}

}

// see QueryResources
Expand Down Expand Up @@ -181,8 +189,8 @@ func (sr *SqliteRepository) sqlQueryResources(ctx context.Context, query models.

groupClause = AggregationParameterToClause(groupAggregationParam)
selectClauses = []string{
fmt.Sprintf("%s as %s", groupClause, "group_by"),
"count(*) as count",
fmt.Sprintf("%s as %s", groupClause, "label"),
"count(*) as value",
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions backend/pkg/database/sqlite_repository_query_sql_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ func (suite *RepositorySqlTestSuite) TestQueryResources_SQL_WithPrimitiveCountBy
require.NoError(suite.T(), err)
require.Equal(suite.T(),
strings.Join([]string{
"SELECT fhir.sourceUri as group_by, count(*) as count",
"SELECT fhir.sourceUri as label, count(*) as value",
"FROM fhir_observation as fhir, json_each(fhir.code) as codeJson",
"WHERE ((codeJson.value ->> '$.code' = ?)) AND (user_id = ?)",
"GROUP BY `fhir`.`sourceUri`",
Expand Down Expand Up @@ -280,7 +280,7 @@ func (suite *RepositorySqlTestSuite) TestQueryResources_SQL_WithComplexCountByAg
require.NoError(suite.T(), err)
require.Equal(suite.T(),
strings.Join([]string{
"SELECT (codeJson.value ->> '$.code') as group_by, count(*) as count",
"SELECT (codeJson.value ->> '$.code') as label, count(*) as value",
"FROM fhir_observation as fhir, json_each(fhir.code) as codeJson",
"WHERE ((codeJson.value ->> '$.code' = ?)) AND (user_id = ?)",
"GROUP BY (codeJson.value ->> '$.code')",
Expand Down
12 changes: 6 additions & 6 deletions backend/pkg/web/handler/dashboard/default.json
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@
"item_type": "patient-vitals-widget"
},
{
"title_text": "Records by Type",
"title_text": "Observations by Type",
"description_text": "",
"x": 4,
"y": 5,
Expand All @@ -129,15 +129,15 @@
"queries": [{
"q": {
"select": [],
"from": "",
"from": "Observation",
"where": {},

"aggregation_params":["resourceType"],
"aggregation_type":"countBy"
"aggregations":{
"count_by": "code:code"
}
}
}],
"parsing": {
"label": "key",
"label": "label",
"key": "value"
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,28 +133,19 @@ export class DashboardWidgetComponent implements OnInit, DashboardWidgetComponen
return []
}
let results = response.data
.map((resource: ResourceFhir) => {

if(query.aggregations?.count_by || query.aggregations?.group_by){
//list of aggregated results [{"label": "xxx", "value":"xxx"}]
return results
}
else {
//list of FHIR resources
return results.map((resource: ResourceFhir) => {
if (!resource.resource_raw) {
return null
}
return this.fhirPathMapQueryFn(query)(resource.resource_raw)
})

if(query.aggregation_type){
switch (query.aggregation_type) {
case "countBy":

return Object.entries(_[query.aggregation_type](results, ...(query.aggregation_params || []))).map(pair => {
return {key: pair[0], value: pair[1]}
})

break;
default:
throw new Error("unsupported aggregation type")
}
}
else {
return results
}
}

Expand Down

0 comments on commit b3a173d

Please sign in to comment.