adding ability to count by wildcard (source_resource_type).

internal fields like `id`, `source_id`, `source_resource_id` and `source_resource_type` are now queryable via keyword type.
This commit is contained in:
Jason Kulatunga 2023-08-23 12:24:08 -07:00
parent dbc2f49d86
commit 3fe72918fd
No known key found for this signature in database
63 changed files with 1277 additions and 853 deletions

View File

@ -27,6 +27,9 @@ const (
SearchParameterTypeQuantity SearchParameterType = "quantity"
SearchParameterTypeComposite SearchParameterType = "composite"
SearchParameterTypeSpecial SearchParameterType = "special"
SearchParameterTypeKeyword SearchParameterType = "keyword" //this is a literal/string primitive.
)
const TABLE_ALIAS = "fhir"
@ -148,6 +151,12 @@ func (sr *SqliteRepository) sqlQueryResources(ctx context.Context, query models.
//populate the group by and order by clause with the count by values
query.Aggregations.OrderBy = "count(*) DESC"
query.Aggregations.GroupBy = query.Aggregations.CountBy
if query.Aggregations.GroupBy == "*" {
//we need to get the count of all resources, so we need to remove the group by clause and replace it by
// `source_resource_type` which will be the same for all resources
query.Aggregations.GroupBy = "source_resource_type"
}
}
//process order by clause
@ -322,7 +331,7 @@ func ProcessSearchParameterValue(searchParameter SearchParameter, searchValueWit
SecondaryValues: map[string]interface{}{},
Value: searchValueWithPrefix,
}
if (searchParameter.Type == SearchParameterTypeString || searchParameter.Type == SearchParameterTypeUri) && len(searchParameterValue.Value.(string)) == 0 {
if (searchParameter.Type == SearchParameterTypeString || searchParameter.Type == SearchParameterTypeUri || searchParameter.Type == SearchParameterTypeKeyword) && len(searchParameterValue.Value.(string)) == 0 {
return searchParameterValue, fmt.Errorf("invalid search parameter value: (%s=%s)", searchParameter.Name, searchParameterValue.Value)
}
@ -533,6 +542,9 @@ func SearchCodeToWhereClause(searchParam SearchParameter, searchParamValue Searc
}
return fmt.Sprintf("(%s)", clause), searchClauseNamedParams, nil
case SearchParameterTypeKeyword:
//setup the clause
return fmt.Sprintf("(%s = @%s)", searchParam.Name, NamedParameterWithSuffix(searchParam.Name, namedParameterSuffix)), searchClauseNamedParams, nil
case SearchParameterTypeReference:
return "", nil, fmt.Errorf("search parameter type %s not supported", searchParam.Type)
}
@ -593,7 +605,7 @@ func ProcessAggregationParameter(aggregationFieldWithProperty string, searchPara
}
//primitive types should not have a modifier, we need to throw an error
if aggregationParameter.Type == SearchParameterTypeNumber || aggregationParameter.Type == SearchParameterTypeUri {
if aggregationParameter.Type == SearchParameterTypeNumber || aggregationParameter.Type == SearchParameterTypeUri || aggregationParameter.Type == SearchParameterTypeKeyword {
if len(aggregationParameter.Modifier) > 0 {
return aggregationParameter, fmt.Errorf("primitive aggregation parameter %s cannot have a property (%s)", aggregationParameter.Name, aggregationParameter.Modifier)
}

View File

@ -180,6 +180,41 @@ func (suite *RepositorySqlTestSuite) TestQueryResources_SQL_WithPrimitiveOrderBy
})
}
func (suite *RepositorySqlTestSuite) TestQueryResources_SQL_WithKeywordOrderByAggregation() {
//setup
sqliteRepo := suite.TestRepository.(*SqliteRepository)
sqliteRepo.GormClient = sqliteRepo.GormClient.Session(&gorm.Session{DryRun: true})
//test
authContext := context.WithValue(context.Background(), pkg.ContextKeyTypeAuthUsername, "test_username")
sqlQuery, err := sqliteRepo.sqlQueryResources(authContext, models.QueryResource{
Select: []string{},
Where: map[string]interface{}{},
From: "CarePlan",
Aggregations: &models.QueryResourceAggregations{OrderBy: "id"},
})
require.NoError(suite.T(), err)
var results []map[string]interface{}
statement := sqlQuery.Find(&results).Statement
sqlString := statement.SQL.String()
sqlParams := statement.Vars
//assert
require.NoError(suite.T(), err)
require.Equal(suite.T(),
strings.Join([]string{
"SELECT fhir.*",
"FROM fhir_care_plan as fhir",
"WHERE (user_id = ?)",
"GROUP BY `fhir`.`id`",
"ORDER BY fhir.id ASC",
}, " "), sqlString)
require.Equal(suite.T(), sqlParams, []interface{}{
"00000000-0000-0000-0000-000000000000",
})
}
func (suite *RepositorySqlTestSuite) TestQueryResources_SQL_WithComplexOrderByAggregation() {
//setup
sqliteRepo := suite.TestRepository.(*SqliteRepository)
@ -254,6 +289,78 @@ func (suite *RepositorySqlTestSuite) TestQueryResources_SQL_WithPrimitiveCountBy
})
}
func (suite *RepositorySqlTestSuite) TestQueryResources_SQL_WithKeywordCountByAggregation() {
//setup
sqliteRepo := suite.TestRepository.(*SqliteRepository)
sqliteRepo.GormClient = sqliteRepo.GormClient.Session(&gorm.Session{DryRun: true})
//test
authContext := context.WithValue(context.Background(), pkg.ContextKeyTypeAuthUsername, "test_username")
sqlQuery, err := sqliteRepo.sqlQueryResources(authContext, models.QueryResource{
Select: []string{},
Where: map[string]interface{}{
"activityCode": "test_code",
},
From: "CarePlan",
Aggregations: &models.QueryResourceAggregations{CountBy: "source_resource_type"},
})
require.NoError(suite.T(), err)
var results []map[string]interface{}
statement := sqlQuery.Find(&results).Statement
sqlString := statement.SQL.String()
sqlParams := statement.Vars
//assert
require.NoError(suite.T(), err)
require.Equal(suite.T(),
strings.Join([]string{
"SELECT fhir.source_resource_type as label, count(*) as value",
"FROM fhir_care_plan as fhir, json_each(fhir.activityCode) as activityCodeJson",
"WHERE ((activityCodeJson.value ->> '$.code' = ?)) AND (user_id = ?)",
"GROUP BY `fhir`.`source_resource_type`",
"ORDER BY count(*) DESC",
}, " "), sqlString)
require.Equal(suite.T(), sqlParams, []interface{}{
"test_code", "00000000-0000-0000-0000-000000000000",
})
}
func (suite *RepositorySqlTestSuite) TestQueryResources_SQL_WithWildcardCountByAggregation() {
//setup
sqliteRepo := suite.TestRepository.(*SqliteRepository)
sqliteRepo.GormClient = sqliteRepo.GormClient.Session(&gorm.Session{DryRun: true})
//test
authContext := context.WithValue(context.Background(), pkg.ContextKeyTypeAuthUsername, "test_username")
sqlQuery, err := sqliteRepo.sqlQueryResources(authContext, models.QueryResource{
Select: []string{},
Where: map[string]interface{}{},
From: "CarePlan",
Aggregations: &models.QueryResourceAggregations{CountBy: "*"},
})
require.NoError(suite.T(), err)
var results []map[string]interface{}
statement := sqlQuery.Find(&results).Statement
sqlString := statement.SQL.String()
sqlParams := statement.Vars
//assert
require.NoError(suite.T(), err)
require.Equal(suite.T(),
strings.Join([]string{
"SELECT fhir.source_resource_type as label, count(*) as value",
"FROM fhir_care_plan as fhir",
"WHERE (user_id = ?)",
"GROUP BY `fhir`.`source_resource_type`",
"ORDER BY count(*) DESC",
}, " "), sqlString)
require.Equal(suite.T(), sqlParams, []interface{}{
"00000000-0000-0000-0000-000000000000",
})
}
func (suite *RepositorySqlTestSuite) TestQueryResources_SQL_WithComplexCountByAggregation() {
//setup
sqliteRepo := suite.TestRepository.(*SqliteRepository)

View File

@ -28,6 +28,7 @@ func TestProcessSearchParameter(t *testing.T) {
{"unknown:doesntmatter", map[string]string{"test": "string"}, SearchParameter{}, true}, //unknown search parameter shoudl throw error
{"unknown", map[string]string{"test": "string"}, SearchParameter{}, true}, //unknown search parameter shoudl throw error
{"test", map[string]string{"test": "faketype"}, SearchParameter{Type: "faketype", Name: "test", Modifier: ""}, false},
{"id", map[string]string{"id": "keyword"}, SearchParameter{Type: "keyword", Name: "id", Modifier: ""}, false},
{"given", map[string]string{"given": "string"}, SearchParameter{Type: "string", Name: "given", Modifier: ""}, false},
{"given:contains", map[string]string{"given": "string"}, SearchParameter{Type: "string", Name: "given", Modifier: "contains"}, false},
@ -112,6 +113,8 @@ func TestProcessSearchParameterValue(t *testing.T) {
{SearchParameter{Type: "quantity", Name: "valueQuantity", Modifier: ""}, "ap5.4|http://unitsofmeasure.org|mg|additional", SearchParameterValue{Value: float64(5.4), Prefix: "ap", SecondaryValues: map[string]interface{}{"valueQuantitySystem": "http://unitsofmeasure.org", "valueQuantityCode": "mg|additional"}}, false},
{SearchParameter{Type: "quantity", Name: "valueQuantity", Modifier: ""}, "5.4||", SearchParameterValue{Value: float64(5.4), Prefix: "", SecondaryValues: map[string]interface{}{}}, false},
{SearchParameter{Type: "quantity", Name: "valueQuantity", Modifier: ""}, "", SearchParameterValue{}, true},
{SearchParameter{Type: "keyword", Name: "id", Modifier: ""}, "1234", SearchParameterValue{Value: "1234", SecondaryValues: map[string]interface{}{}}, false},
}
//test && assert
@ -155,6 +158,8 @@ func TestSearchCodeToWhereClause(t *testing.T) {
{SearchParameter{Type: "token", Name: "code", Modifier: ""}, SearchParameterValue{Value: "ha125", Prefix: "", SecondaryValues: map[string]interface{}{"codeSystem": "http://acme.org/conditions/codes"}}, "0_0", "(codeJson.value ->> '$.code' = @code_0_0 AND codeJson.value ->> '$.system' = @codeSystem_0_0)", map[string]interface{}{"code_0_0": "ha125", "codeSystem_0_0": "http://acme.org/conditions/codes"}, false},
{SearchParameter{Type: "token", Name: "code", Modifier: ""}, SearchParameterValue{Value: "ha125", Prefix: "", SecondaryValues: map[string]interface{}{}}, "0_0", "(codeJson.value ->> '$.code' = @code_0_0)", map[string]interface{}{"code_0_0": "ha125"}, false},
{SearchParameter{Type: "token", Name: "identifier", Modifier: "otype"}, SearchParameterValue{Value: "MR|446053", Prefix: "", SecondaryValues: map[string]interface{}{"identifierSystem": "http://terminology.hl7.org/CodeSystem/v2-0203"}}, "0_0", "(identifierJson.value ->> '$.code' = @identifier_0_0 AND identifierJson.value ->> '$.system' = @identifierSystem_0_0)", map[string]interface{}{"identifier_0_0": "MR|446053", "identifierSystem_0_0": "http://terminology.hl7.org/CodeSystem/v2-0203"}, false},
{SearchParameter{Type: "keyword", Name: "id", Modifier: ""}, SearchParameterValue{Value: "1234", Prefix: "", SecondaryValues: map[string]interface{}{}}, "0_0", "(id = @id_0_0)", map[string]interface{}{"id_0_0": "1234"}, false},
}
//test && assert
@ -181,6 +186,7 @@ func TestSearchCodeToFromClause(t *testing.T) {
}{
{SearchParameter{Type: "number", Name: "probability", Modifier: ""}, "", false},
{SearchParameter{Type: "date", Name: "issueDate", Modifier: ""}, "", false},
{SearchParameter{Type: "keyword", Name: "id", Modifier: ""}, "", false},
{SearchParameter{Type: "token", Name: "hello", Modifier: ""}, "json_each(fhir.hello) as helloJson", false},
}

View File

@ -54,6 +54,7 @@ type FhirAccount struct {
func (s *FhirAccount) GetSearchParameters() map[string]string {
searchParameters := map[string]string{
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -61,6 +62,10 @@ func (s *FhirAccount) GetSearchParameters() map[string]string {
"owner": "reference",
"period": "date",
"profile": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subject": "reference",
"tag": "token",

View File

@ -76,6 +76,7 @@ func (s *FhirAdverseEvent) GetSearchParameters() map[string]string {
"category": "token",
"date": "date",
"event": "token",
"id": "keyword",
"language": "token",
"lastUpdated": "date",
"location": "reference",
@ -84,6 +85,10 @@ func (s *FhirAdverseEvent) GetSearchParameters() map[string]string {
"resultingcondition": "reference",
"seriousness": "token",
"severity": "token",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"study": "reference",
"subject": "reference",
"substance": "reference",

View File

@ -154,6 +154,7 @@ func (s *FhirAllergyIntolerance) GetSearchParameters() map[string]string {
"code": "token",
"criticality": "token",
"date": "date",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastDate": "date",
@ -164,6 +165,10 @@ func (s *FhirAllergyIntolerance) GetSearchParameters() map[string]string {
"recorder": "reference",
"route": "token",
"severity": "token",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"tag": "token",
"text": "string",
"type": "special",

View File

@ -88,6 +88,7 @@ func (s *FhirAppointment) GetSearchParameters() map[string]string {
"appointmentType": "token",
"basedOn": "reference",
"date": "date",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -100,6 +101,10 @@ func (s *FhirAppointment) GetSearchParameters() map[string]string {
"serviceCategory": "token",
"serviceType": "token",
"slot": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"specialty": "token",
"status": "token",
"supportingInfo": "reference",

View File

@ -36,9 +36,14 @@ type FhirBinary struct {
func (s *FhirBinary) GetSearchParameters() map[string]string {
searchParameters := map[string]string{
"id": "keyword",
"language": "token",
"lastUpdated": "date",
"profile": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"tag": "token",
"text": "string",
"type": "special",

View File

@ -156,6 +156,7 @@ func (s *FhirCarePlan) GetSearchParameters() map[string]string {
"date": "date",
"encounter": "reference",
"goal": "reference",
"id": "keyword",
"identifier": "token",
"instantiatesCanonical": "reference",
"instantiatesUri": "uri",
@ -166,6 +167,10 @@ func (s *FhirCarePlan) GetSearchParameters() map[string]string {
"performer": "reference",
"profile": "reference",
"replaces": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subject": "reference",
"tag": "token",

View File

@ -113,11 +113,16 @@ func (s *FhirCareTeam) GetSearchParameters() map[string]string {
"category": "token",
"date": "date",
"encounter": "reference",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
"participant": "reference",
"profile": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subject": "reference",
"tag": "token",

View File

@ -90,6 +90,7 @@ func (s *FhirClaim) GetSearchParameters() map[string]string {
"encounter": "reference",
"enterer": "reference",
"facility": "reference",
"id": "keyword",
"identifier": "token",
"insurer": "reference",
"itemUdi": "reference",
@ -100,6 +101,10 @@ func (s *FhirClaim) GetSearchParameters() map[string]string {
"procedureUdi": "reference",
"profile": "reference",
"provider": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subdetailUdi": "reference",
"tag": "token",

View File

@ -68,6 +68,7 @@ func (s *FhirClaimResponse) GetSearchParameters() map[string]string {
searchParameters := map[string]string{
"created": "date",
"disposition": "string",
"id": "keyword",
"identifier": "token",
"insurer": "reference",
"language": "token",
@ -77,6 +78,10 @@ func (s *FhirClaimResponse) GetSearchParameters() map[string]string {
"profile": "reference",
"request": "reference",
"requestor": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"tag": "token",
"text": "string",

View File

@ -160,6 +160,7 @@ func (s *FhirComposition) GetSearchParameters() map[string]string {
"date": "date",
"encounter": "reference",
"entry": "reference",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -168,6 +169,10 @@ func (s *FhirComposition) GetSearchParameters() map[string]string {
"relatedId": "token",
"relatedRef": "reference",
"section": "token",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subject": "reference",
"tag": "token",

View File

@ -157,6 +157,7 @@ func (s *FhirCondition) GetSearchParameters() map[string]string {
"encounter": "reference",
"evidence": "token",
"evidenceDetail": "reference",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -166,6 +167,10 @@ func (s *FhirCondition) GetSearchParameters() map[string]string {
"profile": "reference",
"recordedDate": "date",
"severity": "token",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"stage": "token",
"subject": "reference",
"tag": "token",

View File

@ -137,6 +137,7 @@ func (s *FhirConsent) GetSearchParameters() map[string]string {
"consentor": "reference",
"data": "reference",
"date": "date",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -147,6 +148,10 @@ func (s *FhirConsent) GetSearchParameters() map[string]string {
"scope": "token",
"securityLabel": "token",
"sourceReference": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"tag": "token",
"text": "string",

View File

@ -67,12 +67,17 @@ func (s *FhirCoverage) GetSearchParameters() map[string]string {
"classType": "token",
"classValue": "string",
"dependent": "string",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
"payor": "reference",
"policyHolder": "reference",
"profile": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subscriber": "reference",
"tag": "token",

View File

@ -57,11 +57,16 @@ func (s *FhirCoverageEligibilityRequest) GetSearchParameters() map[string]string
"created": "date",
"enterer": "reference",
"facility": "reference",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
"profile": "reference",
"provider": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"tag": "token",
"text": "string",

View File

@ -62,6 +62,7 @@ func (s *FhirCoverageEligibilityResponse) GetSearchParameters() map[string]strin
searchParameters := map[string]string{
"created": "date",
"disposition": "string",
"id": "keyword",
"identifier": "token",
"insurer": "reference",
"language": "token",
@ -70,6 +71,10 @@ func (s *FhirCoverageEligibilityResponse) GetSearchParameters() map[string]strin
"profile": "reference",
"request": "reference",
"requestor": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"tag": "token",
"text": "string",

View File

@ -67,6 +67,7 @@ type FhirDevice struct {
func (s *FhirDevice) GetSearchParameters() map[string]string {
searchParameters := map[string]string{
"deviceName": "string",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -75,6 +76,10 @@ func (s *FhirDevice) GetSearchParameters() map[string]string {
"model": "string",
"organization": "reference",
"profile": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"tag": "token",
"text": "string",

View File

@ -159,6 +159,7 @@ func (s *FhirDeviceRequest) GetSearchParameters() map[string]string {
"encounter": "reference",
"eventDate": "date",
"groupIdentifier": "token",
"id": "keyword",
"identifier": "token",
"instantiatesCanonical": "reference",
"instantiatesUri": "uri",
@ -170,6 +171,10 @@ func (s *FhirDeviceRequest) GetSearchParameters() map[string]string {
"priorRequest": "reference",
"profile": "reference",
"requester": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subject": "reference",
"tag": "token",

View File

@ -172,6 +172,7 @@ func (s *FhirDiagnosticReport) GetSearchParameters() map[string]string {
"conclusion": "token",
"date": "date",
"encounter": "reference",
"id": "keyword",
"identifier": "token",
"issued": "date",
"language": "token",
@ -181,6 +182,10 @@ func (s *FhirDiagnosticReport) GetSearchParameters() map[string]string {
"profile": "reference",
"result": "reference",
"resultsInterpreter": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"specimen": "reference",
"status": "token",
"subject": "reference",

View File

@ -105,6 +105,7 @@ func (s *FhirDocumentManifest) GetSearchParameters() map[string]string {
"author": "reference",
"created": "date",
"description": "string",
"id": "keyword",
"identifier": "token",
"item": "reference",
"language": "token",
@ -114,6 +115,10 @@ func (s *FhirDocumentManifest) GetSearchParameters() map[string]string {
"relatedId": "token",
"relatedRef": "reference",
"source": "uri",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subject": "reference",
"tag": "token",

View File

@ -158,6 +158,7 @@ func (s *FhirDocumentReference) GetSearchParameters() map[string]string {
"event": "token",
"facility": "token",
"format": "token",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -169,6 +170,10 @@ func (s *FhirDocumentReference) GetSearchParameters() map[string]string {
"relation": "token",
"securityLabel": "token",
"setting": "token",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subject": "reference",
"tag": "token",

View File

@ -159,6 +159,7 @@ func (s *FhirEncounter) GetSearchParameters() map[string]string {
"date": "date",
"diagnosis": "reference",
"episodeOfCare": "reference",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -173,6 +174,10 @@ func (s *FhirEncounter) GetSearchParameters() map[string]string {
"reasonCode": "token",
"reasonReference": "reference",
"serviceProvider": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"specialArrangement": "token",
"status": "token",
"subject": "reference",

View File

@ -55,6 +55,7 @@ type FhirEndpoint struct {
func (s *FhirEndpoint) GetSearchParameters() map[string]string {
searchParameters := map[string]string{
"connectionType": "token",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -62,6 +63,10 @@ func (s *FhirEndpoint) GetSearchParameters() map[string]string {
"organization": "reference",
"payloadType": "token",
"profile": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"tag": "token",
"text": "string",

View File

@ -45,10 +45,15 @@ type FhirEnrollmentRequest struct {
func (s *FhirEnrollmentRequest) GetSearchParameters() map[string]string {
searchParameters := map[string]string{
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
"profile": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subject": "reference",
"tag": "token",

View File

@ -45,11 +45,16 @@ type FhirEnrollmentResponse struct {
func (s *FhirEnrollmentResponse) GetSearchParameters() map[string]string {
searchParameters := map[string]string{
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
"profile": "reference",
"request": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"tag": "token",
"text": "string",

View File

@ -93,6 +93,7 @@ func (s *FhirExplanationOfBenefit) GetSearchParameters() map[string]string {
"encounter": "reference",
"enterer": "reference",
"facility": "reference",
"id": "keyword",
"identifier": "token",
"itemUdi": "reference",
"language": "token",
@ -101,6 +102,10 @@ func (s *FhirExplanationOfBenefit) GetSearchParameters() map[string]string {
"procedureUdi": "reference",
"profile": "reference",
"provider": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subdetailUdi": "reference",
"tag": "token",

View File

@ -132,6 +132,7 @@ func (s *FhirFamilyMemberHistory) GetSearchParameters() map[string]string {
searchParameters := map[string]string{
"code": "token",
"date": "date",
"id": "keyword",
"identifier": "token",
"instantiatesCanonical": "reference",
"instantiatesUri": "uri",
@ -140,6 +141,10 @@ func (s *FhirFamilyMemberHistory) GetSearchParameters() map[string]string {
"profile": "reference",
"relationship": "token",
"sex": "token",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"tag": "token",
"text": "string",

View File

@ -92,11 +92,16 @@ func (s *FhirGoal) GetSearchParameters() map[string]string {
searchParameters := map[string]string{
"achievementStatus": "token",
"category": "token",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
"lifecycleStatus": "token",
"profile": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"startDate": "date",
"subject": "reference",
"tag": "token",

View File

@ -122,6 +122,7 @@ func (s *FhirImagingStudy) GetSearchParameters() map[string]string {
"dicomClass": "token",
"encounter": "reference",
"endpoint": "reference",
"id": "keyword",
"identifier": "token",
"instance": "token",
"interpreter": "reference",
@ -133,6 +134,10 @@ func (s *FhirImagingStudy) GetSearchParameters() map[string]string {
"reason": "token",
"referrer": "reference",
"series": "token",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"started": "date",
"status": "token",
"subject": "reference",

View File

@ -135,6 +135,7 @@ type FhirImmunization struct {
func (s *FhirImmunization) GetSearchParameters() map[string]string {
searchParameters := map[string]string{
"date": "date",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -148,6 +149,10 @@ func (s *FhirImmunization) GetSearchParameters() map[string]string {
"reasonCode": "token",
"reasonReference": "reference",
"series": "string",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"statusReason": "token",
"tag": "token",

View File

@ -83,6 +83,7 @@ func (s *FhirInsurancePlan) GetSearchParameters() map[string]string {
"addressUse": "token",
"administeredBy": "reference",
"endpoint": "reference",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -90,6 +91,10 @@ func (s *FhirInsurancePlan) GetSearchParameters() map[string]string {
"ownedBy": "reference",
"phonetic": "string",
"profile": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"tag": "token",
"text": "string",

View File

@ -82,6 +82,7 @@ func (s *FhirLocation) GetSearchParameters() map[string]string {
"addressState": "string",
"addressUse": "token",
"endpoint": "reference",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -90,6 +91,10 @@ func (s *FhirLocation) GetSearchParameters() map[string]string {
"organization": "reference",
"partof": "reference",
"profile": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"tag": "token",
"text": "string",

View File

@ -73,6 +73,7 @@ func (s *FhirMedia) GetSearchParameters() map[string]string {
"created": "date",
"device": "reference",
"encounter": "reference",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -80,6 +81,10 @@ func (s *FhirMedia) GetSearchParameters() map[string]string {
"operator": "reference",
"profile": "reference",
"site": "token",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subject": "reference",
"tag": "token",

View File

@ -83,6 +83,7 @@ func (s *FhirMedication) GetSearchParameters() map[string]string {
"code": "token",
"expirationDate": "date",
"form": "token",
"id": "keyword",
"identifier": "token",
"ingredient": "reference",
"ingredientCode": "token",
@ -91,6 +92,10 @@ func (s *FhirMedication) GetSearchParameters() map[string]string {
"lotNumber": "token",
"manufacturer": "reference",
"profile": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"tag": "token",
"text": "string",

View File

@ -140,6 +140,7 @@ func (s *FhirMedicationAdministration) GetSearchParameters() map[string]string {
"context": "reference",
"device": "reference",
"effectiveTime": "date",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -149,6 +150,10 @@ func (s *FhirMedicationAdministration) GetSearchParameters() map[string]string {
"reasonGiven": "token",
"reasonNotGiven": "token",
"request": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subject": "reference",
"tag": "token",

View File

@ -146,6 +146,7 @@ func (s *FhirMedicationDispense) GetSearchParameters() map[string]string {
"code": "token",
"context": "reference",
"destination": "reference",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -155,6 +156,10 @@ func (s *FhirMedicationDispense) GetSearchParameters() map[string]string {
"profile": "reference",
"receiver": "reference",
"responsibleparty": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subject": "reference",
"tag": "token",

View File

@ -158,6 +158,7 @@ func (s *FhirMedicationRequest) GetSearchParameters() map[string]string {
"code": "token",
"date": "date",
"encounter": "reference",
"id": "keyword",
"identifier": "token",
"intendedDispenser": "reference",
"intendedPerformer": "reference",
@ -169,6 +170,10 @@ func (s *FhirMedicationRequest) GetSearchParameters() map[string]string {
"priority": "token",
"profile": "reference",
"requester": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subject": "reference",
"tag": "token",

View File

@ -134,6 +134,7 @@ func (s *FhirMedicationStatement) GetSearchParameters() map[string]string {
"code": "token",
"context": "reference",
"effective": "date",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -141,6 +142,10 @@ func (s *FhirMedicationStatement) GetSearchParameters() map[string]string {
"partOf": "reference",
"profile": "reference",
"source": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subject": "reference",
"tag": "token",

View File

@ -121,6 +121,7 @@ func (s *FhirNutritionOrder) GetSearchParameters() map[string]string {
"datetime": "date",
"encounter": "reference",
"formula": "token",
"id": "keyword",
"identifier": "token",
"instantiatesCanonical": "reference",
"instantiatesUri": "uri",
@ -129,6 +130,10 @@ func (s *FhirNutritionOrder) GetSearchParameters() map[string]string {
"oraldiet": "token",
"profile": "reference",
"provider": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"supplement": "token",
"tag": "token",

View File

@ -226,6 +226,7 @@ func (s *FhirObservation) GetSearchParameters() map[string]string {
"encounter": "reference",
"focus": "reference",
"hasMember": "reference",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -233,6 +234,10 @@ func (s *FhirObservation) GetSearchParameters() map[string]string {
"partOf": "reference",
"performer": "reference",
"profile": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"specimen": "reference",
"status": "token",
"subject": "reference",

View File

@ -80,6 +80,7 @@ func (s *FhirOrganization) GetSearchParameters() map[string]string {
"addressState": "string",
"addressUse": "token",
"endpoint": "reference",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -87,6 +88,10 @@ func (s *FhirOrganization) GetSearchParameters() map[string]string {
"partof": "reference",
"phonetic": "string",
"profile": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"tag": "token",
"text": "string",
"type": "special",

View File

@ -82,6 +82,7 @@ func (s *FhirOrganizationAffiliation) GetSearchParameters() map[string]string {
"date": "date",
"email": "token",
"endpoint": "reference",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -93,6 +94,10 @@ func (s *FhirOrganizationAffiliation) GetSearchParameters() map[string]string {
"profile": "reference",
"role": "token",
"service": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"specialty": "token",
"tag": "token",
"telecom": "token",

View File

@ -213,6 +213,7 @@ func (s *FhirPatient) GetSearchParameters() map[string]string {
"gender": "token",
"generalPractitioner": "reference",
"given": "string",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -222,6 +223,10 @@ func (s *FhirPatient) GetSearchParameters() map[string]string {
"phone": "token",
"phonetic": "string",
"profile": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"tag": "token",
"telecom": "token",
"text": "string",

View File

@ -185,6 +185,7 @@ func (s *FhirPerson) GetSearchParameters() map[string]string {
"birthdate": "date",
"email": "token",
"gender": "token",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -196,6 +197,10 @@ func (s *FhirPerson) GetSearchParameters() map[string]string {
"practitioner": "reference",
"profile": "reference",
"relatedperson": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"tag": "token",
"telecom": "token",
"text": "string",

View File

@ -189,6 +189,7 @@ func (s *FhirPractitioner) GetSearchParameters() map[string]string {
"family": "string",
"gender": "token",
"given": "string",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -196,6 +197,10 @@ func (s *FhirPractitioner) GetSearchParameters() map[string]string {
"phone": "token",
"phonetic": "string",
"profile": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"tag": "token",
"telecom": "token",
"text": "string",

View File

@ -103,6 +103,7 @@ func (s *FhirPractitionerRole) GetSearchParameters() map[string]string {
"date": "date",
"email": "token",
"endpoint": "reference",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -113,6 +114,10 @@ func (s *FhirPractitionerRole) GetSearchParameters() map[string]string {
"profile": "reference",
"role": "token",
"service": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"specialty": "token",
"tag": "token",
"telecom": "token",

View File

@ -171,6 +171,7 @@ func (s *FhirProcedure) GetSearchParameters() map[string]string {
"code": "token",
"date": "date",
"encounter": "reference",
"id": "keyword",
"identifier": "token",
"instantiatesCanonical": "reference",
"instantiatesUri": "uri",
@ -182,6 +183,10 @@ func (s *FhirProcedure) GetSearchParameters() map[string]string {
"profile": "reference",
"reasonCode": "token",
"reasonReference": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subject": "reference",
"tag": "token",

View File

@ -67,12 +67,17 @@ func (s *FhirProvenance) GetSearchParameters() map[string]string {
"agentRole": "token",
"agentType": "token",
"entity": "reference",
"id": "keyword",
"language": "token",
"lastUpdated": "date",
"location": "reference",
"profile": "reference",
"recorded": "date",
"signatureType": "token",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"tag": "token",
"target": "reference",
"text": "string",

View File

@ -95,6 +95,7 @@ func (s *FhirQuestionnaire) GetSearchParameters() map[string]string {
"definition": "uri",
"description": "string",
"effective": "date",
"id": "keyword",
"identifier": "token",
"jurisdiction": "token",
"language": "token",
@ -102,6 +103,10 @@ func (s *FhirQuestionnaire) GetSearchParameters() map[string]string {
"name": "string",
"profile": "reference",
"publisher": "string",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subjectType": "token",
"tag": "token",

View File

@ -70,6 +70,7 @@ func (s *FhirQuestionnaireResponse) GetSearchParameters() map[string]string {
"authored": "date",
"basedOn": "reference",
"encounter": "reference",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -77,6 +78,10 @@ func (s *FhirQuestionnaireResponse) GetSearchParameters() map[string]string {
"profile": "reference",
"questionnaire": "reference",
"source": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subject": "reference",
"tag": "token",

View File

@ -180,6 +180,7 @@ func (s *FhirRelatedPerson) GetSearchParameters() map[string]string {
"birthdate": "date",
"email": "token",
"gender": "token",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -188,6 +189,10 @@ func (s *FhirRelatedPerson) GetSearchParameters() map[string]string {
"phonetic": "string",
"profile": "reference",
"relationship": "token",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"tag": "token",
"telecom": "token",
"text": "string",

View File

@ -60,12 +60,17 @@ func (s *FhirSchedule) GetSearchParameters() map[string]string {
"active": "token",
"actor": "reference",
"date": "date",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
"profile": "reference",
"serviceCategory": "token",
"serviceType": "token",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"specialty": "token",
"tag": "token",
"text": "string",

View File

@ -167,6 +167,7 @@ func (s *FhirServiceRequest) GetSearchParameters() map[string]string {
"category": "token",
"code": "token",
"encounter": "reference",
"id": "keyword",
"identifier": "token",
"instantiatesCanonical": "reference",
"instantiatesUri": "uri",
@ -181,6 +182,10 @@ func (s *FhirServiceRequest) GetSearchParameters() map[string]string {
"replaces": "reference",
"requester": "reference",
"requisition": "token",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"specimen": "reference",
"status": "token",
"subject": "reference",

View File

@ -61,6 +61,7 @@ type FhirSlot struct {
func (s *FhirSlot) GetSearchParameters() map[string]string {
searchParameters := map[string]string{
"appointmentType": "token",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
@ -68,6 +69,10 @@ func (s *FhirSlot) GetSearchParameters() map[string]string {
"schedule": "reference",
"serviceCategory": "token",
"serviceType": "token",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"specialty": "token",
"start": "date",
"status": "token",

View File

@ -72,11 +72,16 @@ func (s *FhirSpecimen) GetSearchParameters() map[string]string {
"collector": "reference",
"container": "token",
"containerId": "token",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
"parent": "reference",
"profile": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"subject": "reference",
"tag": "token",

View File

@ -101,11 +101,16 @@ func (s *FhirVisionPrescription) GetSearchParameters() map[string]string {
searchParameters := map[string]string{
"datewritten": "date",
"encounter": "reference",
"id": "keyword",
"identifier": "token",
"language": "token",
"lastUpdated": "date",
"prescriber": "reference",
"profile": "reference",
"source_id": "keyword",
"source_resource_id": "keyword",
"source_resource_type": "keyword",
"source_uri": "keyword",
"status": "token",
"tag": "token",
"text": "string",

View File

@ -203,6 +203,13 @@ func main() {
fieldNameLowerCamel := strcase.ToLowerCamel(fieldName)
d[jen.Lit(fieldNameLowerCamel)] = jen.Lit(fieldInfo.FieldType)
}
d[jen.Lit("id")] = jen.Lit("keyword")
d[jen.Lit("source_id")] = jen.Lit("keyword")
d[jen.Lit("source_uri")] = jen.Lit("keyword")
d[jen.Lit("source_resource_id")] = jen.Lit("keyword")
d[jen.Lit("source_resource_type")] = jen.Lit("keyword")
}))
g.Return(jen.Id("searchParameters"))
})

View File

@ -157,9 +157,9 @@
"select": [],
"from": "Immunization",
"where": {},
"aggregation_params":["resourceType"],
"aggregation_type":"countBy"
"aggregations":{
"count_by": "*"
}
}
},
{
@ -170,9 +170,9 @@
"select": [],
"from": "Claim",
"where": {},
"aggregation_params":["resourceType"],
"aggregation_type":"countBy"
"aggregations":{
"count_by": "*"
}
}
}],
"parsing": {

View File

@ -8,19 +8,24 @@ import * as _ from 'lodash';
export class DatasetLatestEntryPipe implements PipeTransform {
transform(dataset: ChartDataset<'line'>, round?: number, valLookupKey?: string, unitLookupKey?: string): string {
if(!round){
if(!dataset) {
return '--'
}
try{
if (!round) {
round = 0 //round to nearest whole number
}
let lastItem = dataset?.data?.[dataset?.data?.length -1] || ''
let lastItem = dataset?.data?.[dataset?.data?.length - 1] || ''
// let valueKey = this.chartOptions?.parsing?.['yAxisKey'] || dataset?.parsing?.['key']
console.log('latestEntryConfig', lastItem, valLookupKey, unitLookupKey, round)
let lastItemUnit = ""
let lastItemValue
if(Array.isArray(lastItem)){
if (Array.isArray(lastItem)) {
lastItemValue = _.flatten(lastItem?.[0]?.[valLookupKey])?.[0] as string
lastItemUnit = _.flatten(lastItem?.[0]?.[unitLookupKey])?.[0] as string
} else if(typeof lastItem === 'object'){
} else if (typeof lastItem === 'object') {
console.log('lastItem-object', lastItem?.[valLookupKey])
lastItemValue = lastItem?.[valLookupKey]
lastItemUnit = lastItem?.[unitLookupKey]
@ -29,16 +34,27 @@ export class DatasetLatestEntryPipe implements PipeTransform {
}
lastItemValue = this.roundToDecimalPlaces(lastItemValue, round)
if(lastItemUnit){
if (lastItemUnit) {
return lastItemValue + ' ' + lastItemUnit
} else {
return lastItemValue.toString()
}
}
catch (e) {
return '--'
}
}
roundToDecimalPlaces(value: string, decimalPlaces: number): string {
if(!value) {
return '--'
}
try{
return parseFloat(value).toFixed(decimalPlaces).toString()
} catch (e) {
return '--'
}
}
}

View File

@ -22,7 +22,7 @@
</div>
<div>
<label>{{chartDataset.label}}</label>
<h4>3</h4>
<h4>{{chartDataset | datasetLatestEntry: 0:'value' }}</h4>
</div>
</div>
</div><!-- col -->

View File

@ -5,10 +5,11 @@ import {DashboardWidgetComponent} from '../dashboard-widget/dashboard-widget.com
import {ChartConfiguration} from 'chart.js/dist/types';
import {LoadingWidgetComponent} from '../loading-widget/loading-widget.component';
import {EmptyWidgetComponent} from '../empty-widget/empty-widget.component';
import {PipesModule} from '../../pipes/pipes.module';
@Component({
standalone: true,
imports: [NgChartsModule,CommonModule, LoadingWidgetComponent, EmptyWidgetComponent],
imports: [NgChartsModule,CommonModule, LoadingWidgetComponent, EmptyWidgetComponent, PipesModule],
selector: 'dual-gauges-widget',
templateUrl: './dual-gauges-widget.component.html',
styleUrls: ['./dual-gauges-widget.component.scss']