Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new API to fetch visualizations #1145

Draft
wants to merge 6 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,23 @@ public class UnderlayConfigPath extends AnnotationPath {
SZPrepackagedCriteria.class,
SZRollupCountsSql.class,
SZVisualization.class,
SZVisualization.SZVisualizationDataConfig.class,
SZVisualization.SZVisualizationDataConfig.SZVisualizationDCSource.class,
SZVisualization.SZVisualizationDataConfig.SZVisualizationDCSource.SZVisualizationDCSJoin
.class,
SZVisualization.SZVisualizationDataConfig.SZVisualizationDCSource.SZVisualizationDCSJoin
.SZVisualizationDCSJAggregation.class,
SZVisualization.SZVisualizationDataConfig.SZVisualizationDCSource.SZVisualizationDCSJoin
.SZVisualizationDCSJAggregation.SZVisualizationDCSJAType.class,
SZVisualization.SZVisualizationDataConfig.SZVisualizationDCSource
.SZVisualizationDCSAttribute.class,
SZVisualization.SZVisualizationDataConfig.SZVisualizationDCSource
.SZVisualizationDCSAttribute.SZVisualizationDCSANumericBucketing.class,
SZVisualization.SZVisualizationDataConfig.SZVisualizationDCSource
.SZVisualizationDCSAttribute.SZVisualizationDCSANumericBucketing
.SZVisualizationDCSANBIntervals.class,
SZVisualization.SZVisualizationDataConfig.SZVisualizationDCSource
.SZVisualizationDCSAttribute.SZVisualizationDCSASortType.class,
SZCorePlugin.class);

@Override
Expand Down
206 changes: 206 additions & 0 deletions docs/generated/UNDERLAY_CONFIG.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,15 @@ This documentation is generated from annotations in the configuration classes.
* [SZTextSearch](#sztextsearch)
* [SZUnderlay](#szunderlay)
* [SZVisualization](#szvisualization)
* [SZVisualizationDCSANBIntervals](#szvisualizationdcsanbintervals)
* [SZVisualizationDCSANumericBucketing](#szvisualizationdcsanumericbucketing)
* [SZVisualizationDCSASortType](#szvisualizationdcsasorttype)
* [SZVisualizationDCSAttribute](#szvisualizationdcsattribute)
* [SZVisualizationDCSJAType](#szvisualizationdcsjatype)
* [SZVisualizationDCSJAggregation](#szvisualizationdcsjaggregation)
* [SZVisualizationDCSJoin](#szvisualizationdcsjoin)
* [SZVisualizationDCSource](#szvisualizationdcsource)
* [SZVisualizationDataConfig](#szvisualizationdataconfig)

## SZAttribute
Attribute or property of an entity.
Expand Down Expand Up @@ -1339,6 +1348,11 @@ This file should be in the same directory as the visualization (e.g. `gender.jso

If this property is specified, the value of the `config` property is ignored.

### SZVisualization.dataConfigObj
**required** [SZVisualizationDataConfig](#szvisualizationdataconfig)

Deserialized configuration of the visualization. VizDataConfig protocol buffer as Java object.

### SZVisualization.name
**required** String

Expand Down Expand Up @@ -1374,3 +1388,195 @@ Visible title of the visualization.



## SZVisualizationDCSANBIntervals
Intervals {min:1, max:5, count: 2}, creates buckets [1, 3) and [3, 5).

### SZVisualizationDCSANBIntervals.count
**required** int

Count

### SZVisualizationDCSANBIntervals.max
**required** double

Maximum

### SZVisualizationDCSANBIntervals.min
**required** double

Minimum



## SZVisualizationDCSANumericBucketing
Converts a continuous numeric range into ids with count as the value.

### SZVisualizationDCSANumericBucketing.includeLesser
**optional** boolean

Whether to create buckets for values lesser than the explicitly specified ones or ignore them

### SZVisualizationDCSANumericBucketing.includeLesser
**optional** boolean

Whether to create buckets for values greater than the explicitly specified ones or ignore them

### SZVisualizationDCSANumericBucketing.intervals
**optional** [SZVisualizationDCSANBIntervals](#szvisualizationdcsanbintervals)

Intervals

### SZVisualizationDCSANumericBucketing.thresholds
**required** List [ Double ]

Buckets can be specified as either a list of thresholds or a range and number of buckets. For thresholds [18, 45, 65], results in two buckets [18, 45), and [45, 65). Lesser and greater buckets can be added if desired.



## SZVisualizationDCSASortType
Sort type.

### SZVisualizationDCSASortType.NAME
**required** [SZVisualizationDCSASortType](#szvisualizationdcsasorttype)

Name.

### SZVisualizationDCSASortType.UNKNOWN
**required** [SZVisualizationDCSASortType](#szvisualizationdcsasorttype)

Unknown.

### SZVisualizationDCSASortType.VALUE
**required** [SZVisualizationDCSASortType](#szvisualizationdcsasorttype)

Value.



## SZVisualizationDCSAttribute
Attribute configuration.

### SZVisualizationDCSAttribute.attribute
**required** String

The attribute to read.

### SZVisualizationDCSAttribute.limit
**optional** int

Whether a limited amount of data should be returned (e.g. 10 most common conditions).

### SZVisualizationDCSAttribute.numericBucketing
**required** [SZVisualizationDCSANumericBucketing](#szvisualizationdcsanumericbucketing)

Numeric Bucketing.

### SZVisualizationDCSAttribute.sortDescending
**optional** boolean

Whether to sort in descending order.

### SZVisualizationDCSAttribute.sortType
**optional** [SZVisualizationDCSASortType](#szvisualizationdcsasorttype)

How to sort this attribute for display. Defaults to NAME.

*Default value:* `NAME`



## SZVisualizationDCSJAType
Aggregation type.

### SZVisualizationDCSJAType.AVERAGE
**required** [SZVisualizationDCSJAType](#szvisualizationdcsjatype)

Average.

### SZVisualizationDCSJAType.MAX
**required** [SZVisualizationDCSJAType](#szvisualizationdcsjatype)

Maximum.

### SZVisualizationDCSJAType.MIN
**required** [SZVisualizationDCSJAType](#szvisualizationdcsjatype)

Minimum.

### SZVisualizationDCSJAType.UNIQUE
**required** [SZVisualizationDCSJAType](#szvisualizationdcsjatype)

Unique.



## SZVisualizationDCSJAggregation
Aggregation configuration.

### SZVisualizationDCSJAggregation.attribute
**optional** String

The output is always ids and values but aggregation may occur over another field (e.g. date to find the most recent value).

### SZVisualizationDCSJAggregation.type
**optional** [SZVisualizationDCSJAType](#szvisualizationdcsjatype)

The type of aggregation being performed.



## SZVisualizationDCSJoin
Join configuration.

### SZVisualizationDCSJoin.aggregation
**required** [SZVisualizationDCSJAggregation](#szvisualizationdcsjaggregation)

When joining an entity with an N:1 relationship (e.g. multiple weight values to a person), an aggregation is often required to make the data visualizable. For example to visualize weight vs. race, each person needs to have a single weight value associated with them, such as the average or most recent. For simple cases, simply counting unique instances of a related entity may be sufficient (e.g. to count people with related condition occurrences).

### SZVisualizationDCSJoin.entity
**required** String

The next entity to join to in order to eventually get to the entity the visualization is displaying (e.g. person when joining condition_occurences to age).



## SZVisualizationDCSource
Configuration for a single visualization data config source.

### SZVisualizationDCSource.attributes
**required** List [ SZVisualization$SZVisualizationDataConfig$SZVisualizationDCSource$SZVisualizationDCSAttribute ]

Attributes to be returned from the selected data source (e.g. condition_name from condition_occurrence or age from person).

### SZVisualizationDCSource.criteriaSelector
**required** String

Name of the criteriaSelector.

### SZVisualizationDCSource.entity
**optional** String

Name of the entity (for criteria selectors that return more than one entity).

### SZVisualizationDCSource.joins
**required** List [ SZVisualization$SZVisualizationDataConfig$SZVisualizationDCSource$SZVisualizationDCSJoin ]

To visualize data from different entities, the data must be joined to a common entity. Each source must specify a series of joins that ends up atthe same entity if it does not already come from that entity.

### SZVisualizationDCSource.selectionData
**optional** String

Specified criteria selection. (e.g. to select conditions under diabetes)



## SZVisualizationDataConfig
Configuration for a single visualization data config.

### SZVisualizationDataConfig.sources
**required** List [ SZVisualization$SZVisualizationDataConfig$SZVisualizationDCSource ]

List of data config sources for a single visualization.



Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,12 @@
import bio.terra.tanagra.generated.model.ApiCohortCloneInfo;
import bio.terra.tanagra.generated.model.ApiCohortCountQuery;
import bio.terra.tanagra.generated.model.ApiCohortCreateInfo;
import bio.terra.tanagra.generated.model.ApiCohortIdVisualizationsBody;
import bio.terra.tanagra.generated.model.ApiCohortList;
import bio.terra.tanagra.generated.model.ApiCohortUpdateInfo;
import bio.terra.tanagra.generated.model.ApiInstanceCountList;
import bio.terra.tanagra.generated.model.ApiVisualization;
import bio.terra.tanagra.generated.model.ApiVisualizationList;
import bio.terra.tanagra.service.UnderlayService;
import bio.terra.tanagra.service.accesscontrol.AccessControlService;
import bio.terra.tanagra.service.accesscontrol.Permissions;
Expand All @@ -37,6 +40,7 @@
import bio.terra.tanagra.underlay.entitymodel.Entity;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.lang3.NotImplementedException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
Expand Down Expand Up @@ -220,4 +224,35 @@ public ResponseEntity<ApiInstanceCountList> queryCohortCounts(
body.getPageSize());
return ResponseEntity.ok(ToApiUtils.toApiObject(countQueryResult));
}

@Override
public ResponseEntity<ApiVisualizationList> visualizeCohortCounts(
String studyId, String cohortId, ApiCohortIdVisualizationsBody body) {
accessControlService.checkReadAccess(studyId, List.of(cohortId), List.of());
Cohort cohort = cohortService.getCohort(studyId, cohortId);

accessControlService.throwIfUnauthorized(
SpringAuthentication.getCurrentUser(),
Permissions.forActions(UNDERLAY, READ),
ResourceId.forUnderlay(cohort.getUnderlay()));

EntityFilter cohortFilter =
filterBuilderService.buildFilterForCohortRevision(
cohort.getUnderlay(), cohort.getMostRecentRevision());

if (cohortFilter != null) {
// TODO(BENCH-4945): add support for charts
throw new NotImplementedException(
"visualizeCohortCounts not implemented yet for cohorts with filters");
}

List<ApiVisualization> vizList =
body.getVisualizationNames().stream()
.map(
vizName ->
ToApiUtils.toApiObject(
underlayService.getVisualization(cohort.getUnderlay(), vizName)))
.toList();
return ResponseEntity.ok(new ApiVisualizationList().visualizations(vizList));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,19 @@
import bio.terra.tanagra.generated.model.ApiStudy;
import bio.terra.tanagra.generated.model.ApiUnderlaySummary;
import bio.terra.tanagra.generated.model.ApiValueDisplay;
import bio.terra.tanagra.generated.model.ApiVisualization;
import bio.terra.tanagra.generated.model.ApiVisualizationData;
import bio.terra.tanagra.generated.model.ApiVisualizationDataKey;
import bio.terra.tanagra.generated.model.ApiVisualizationDataValue;
import bio.terra.tanagra.service.artifact.model.AnnotationValue;
import bio.terra.tanagra.service.artifact.model.Cohort;
import bio.terra.tanagra.service.artifact.model.CohortRevision;
import bio.terra.tanagra.service.artifact.model.Criteria;
import bio.terra.tanagra.service.artifact.model.Study;
import bio.terra.tanagra.underlay.Underlay;
import bio.terra.tanagra.underlay.entitymodel.Attribute;
import bio.terra.tanagra.underlay.visualization.Visualization;
import bio.terra.tanagra.underlay.visualization.VisualizationData;
import bio.terra.tanagra.utils.SqlFormatter;
import java.util.ArrayList;
import java.util.HashMap;
Expand Down Expand Up @@ -322,4 +328,31 @@ public static ApiUnderlaySummary toApiObject(Underlay underlay) {
.description(underlay.getDescription())
.primaryEntity(underlay.getPrimaryEntity().getName());
}

private static ApiVisualizationData toApiObject(VisualizationData vizData) {
return new ApiVisualizationData()
.keys(
vizData.getKeys().stream()
.map(
k ->
new ApiVisualizationDataKey()
.name(k.name())
.numericId(k.numericId())
.stringId(k.stringId()))
.toList())
.values(
vizData.getValues().stream()
.map(
v ->
new ApiVisualizationDataValue()
.numeric(v.numeric())
.quartiles(v.quartiles()))
.toList());
}

public static ApiVisualization toApiObject(Visualization visualization) {
return new ApiVisualization()
.name(visualization.getName())
.vizDataList(visualization.getVizDataList().stream().map(ToApiUtils::toApiObject).toList());
}
}
Loading
Loading