Skip to content

Commit

Permalink
Handle Open Access Binned Response
Browse files Browse the repository at this point in the history
  • Loading branch information
Gcolon021 committed Jul 14, 2023
1 parent f746f22 commit bf818ad
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -530,12 +530,11 @@ protected String processContinuousCrossCounts(String continuousCrossCountRespons

// call the binning endpoint
HttpResponse httpResponse = getHttpResponse(queryRequest, properties.getVisualizationResourceId(), "/format/continuous");

HttpEntity entity = httpResponse.getEntity();
String responseString = EntityUtils.toString(entity, "UTF-8");

logger.info("Response from binning endpoint: {}", responseString);
Map<String, Map<String, Integer>> binnedContinuousCrossCounts = objectMapper.convertValue(responseString, new TypeReference<>() {});
Map<String, Map<String, Object>> binnedContinuousCrossCounts = objectMapper.convertValue(responseString, new TypeReference<>() {});

Map<String, String> crossCounts = objectMapper.readValue(crossCountEntityString, new TypeReference<>(){});
int generatedVariance = this.generateVarianceWithCrossCounts(crossCounts);
Expand All @@ -547,6 +546,19 @@ protected String processContinuousCrossCounts(String continuousCrossCountRespons
return objectMapper.writeValueAsString(binnedContinuousCrossCounts);
}

// TODO: We can refactor this code as it is duplicated in the categorical cross count obfuscation
binnedContinuousCrossCounts.forEach((key, value) -> {
value.forEach((innerKey, innerValue) -> {
Optional<String> aggregateCount = aggregateCountHelper(innerValue);
if (aggregateCount.isPresent()) {
value.put(innerKey, aggregateCount.get());
} else {
value.put(innerKey, randomize(innerValue.toString(), generatedVariance));
}
});
});


return objectMapper.writeValueAsString(binnedContinuousCrossCounts);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,13 @@ public ContinuousData(String title, Map<String, Integer> continuousMap, String x
this.setYAxisName(yAxisLabel);
this.continuousMap = continuousMap;
}

public ContinuousData(String title, Map<String, Integer> continuousMap, String xAxisLabel, String yAxisLabel, boolean isObfuscated) {
super();
this.setTitle(title);
this.setXAxisName(xAxisLabel);
this.setYAxisName(yAxisLabel);
this.setObfuscated(isObfuscated);
this.continuousMap = continuousMap;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -85,27 +85,42 @@ private static boolean skipKey(Map.Entry<String, Map<String, Integer>> entry) {
return false;
}

public List<ContinuousData> getContinuousData(Map<String, Map<String, Integer>> crossCountsMap) {
return handleGetContinuousData(crossCountsMap, false);
}

public List<ContinuousData> getContinuousData(Map<String, Map<String, Integer>> crossCountsMap, boolean isObfuscated) {
return handleGetContinuousData(crossCountsMap, isObfuscated);
}

/**
* For each continuous cross count we create a histogram of the values.
*
* @return List<CategoricalData> - result of query
*/
public List<ContinuousData> getContinuousData(Map<String, Map<String, Integer>> crossCountsMap) {
private List<ContinuousData> handleGetContinuousData(Map<String, Map<String, Integer>> crossCountsMap, boolean isObfuscated) {
List<ContinuousData> continuousDataList = new ArrayList<>();

// If it's not obfuscated we need to bin the data
for (Map.Entry<String, Map<String, Integer>> entry : crossCountsMap.entrySet()) {
String title = getChartTitle(entry.getKey());

LinkedHashMap<String, Integer> binnedData;
if (!isObfuscated) {
binnedData = new LinkedHashMap<>(bucketData(entry.getValue()));
} else {
// If it is obfuscated the data is already binned
binnedData = new LinkedHashMap<>(entry.getValue());
}

continuousDataList.add(new ContinuousData(
title,
new LinkedHashMap<>(
bucketData(entry.getValue())
),
binnedData,
createXAxisLabel(title),
"Number of Participants"
));
}

logger.debug("Finished Categorical Data with " + continuousDataList.size() + " results");
return continuousDataList;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import edu.harvard.dbmi.avillach.domain.QueryRequest;
import edu.harvard.hms.dbmi.avillach.resource.visualization.ApplicationProperties;
import edu.harvard.hms.dbmi.avillach.resource.visualization.model.ContinuousData;
import edu.harvard.hms.dbmi.avillach.resource.visualization.model.ProcessedCrossCountsResponse;
import edu.harvard.hms.dbmi.avillach.resource.visualization.model.domain.Query;
import edu.harvard.hms.dbmi.avillach.resource.visualization.model.domain.ResultType;
Expand All @@ -15,7 +14,6 @@
import javax.inject.Inject;
import javax.ws.rs.core.Response;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Stateless
Expand Down Expand Up @@ -73,9 +71,10 @@ public Response handleQuerySync(QueryRequest query, String requestSource) {
return getProcessedCrossCountResponse(categroyCrossCountsMap, continuousCrossCountsMap);
} else {
Map<String, Map<String, String>> openCategoricalCrossCounts = getOpenCrossCounts(query, queryJson, ResultType.CATEGORICAL_CROSS_COUNT);
Map<String, Map<String, String>> openContinuousCrossCounts = getOpenCrossCounts(query, queryJson, ResultType.CONTINUOUS_CROSS_COUNT);

logger.info("openCategoricalCrossCounts: " + openCategoricalCrossCounts);
return getOpenProcessedCrossCountResponse(openCategoricalCrossCounts);
return getOpenProcessedCrossCountResponse(openCategoricalCrossCounts, openContinuousCrossCounts);
}
}

Expand All @@ -86,14 +85,18 @@ private Response getProcessedCrossCountResponse(Map<String, Map<String, Integer>
return Response.ok(response).build();
}

private Response getOpenProcessedCrossCountResponse(Map<String, Map<String, String>> categroyCrossCountsMap) {
private Response getOpenProcessedCrossCountResponse(Map<String, Map<String, String>> categroyCrossCountsMap,
Map<String, Map<String, String>> continuousCrossCountsMap) {
if ((categroyCrossCountsMap == null || categroyCrossCountsMap.isEmpty()))
return Response.ok().build();

boolean isCategoricalObfuscated = isObfuscated(categroyCrossCountsMap);
Map<String, Map<String, Integer>> cleanedCategoricalData = cleanCategoricalData(categroyCrossCountsMap);

ProcessedCrossCountsResponse response = buildOpenProcessedCrossCountsResponse(cleanedCategoricalData, isCategoricalObfuscated);
boolean isContinuousObfuscated = isObfuscated(continuousCrossCountsMap);
Map<String, Map<String, Integer>> cleanedContinuousData = cleanCategoricalData(continuousCrossCountsMap);

ProcessedCrossCountsResponse response = buildOpenProcessedCrossCountsResponse(cleanedCategoricalData, cleanedContinuousData, (isCategoricalObfuscated || isContinuousObfuscated));
return Response.ok(response).build();
}

Expand Down Expand Up @@ -157,10 +160,12 @@ private boolean isObfuscated(Map<String, Map<String, String>> categroyCrossCount
}

private ProcessedCrossCountsResponse buildOpenProcessedCrossCountsResponse(Map<String, Map<String, Integer>> categroyCrossCountsMap,
Map<String, Map<String, Integer>> continuousCrossCountsMap,
boolean isObfuscated) {

ProcessedCrossCountsResponse response = new ProcessedCrossCountsResponse();
response.getCategoricalData().addAll(dataProcessingServices.getCategoricalData(categroyCrossCountsMap, isObfuscated));
response.getContinuousData().addAll(dataProcessingServices.getContinuousData(continuousCrossCountsMap, isObfuscated));
return response;
}

Expand Down

0 comments on commit bf818ad

Please sign in to comment.