From 4d1069291a4f0abccdb5124f454f4b83019ed41f Mon Sep 17 00:00:00 2001 From: Yannick Marcon Date: Wed, 10 Feb 2021 12:12:48 +0100 Subject: [PATCH] Fix some issues with crosstab rendering when privacy threshold applies --- .../org/obiba/mica/web/model/DatasetDtos.java | 4 ++-- .../rest/harmonization/CombinedStatistics.java | 4 ++-- .../webapp/assets/js/mica-dataset-crosstab.js | 17 +++++++++++++---- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/mica-core/src/main/java/org/obiba/mica/web/model/DatasetDtos.java b/mica-core/src/main/java/org/obiba/mica/web/model/DatasetDtos.java index a665fa5a67..f3dcc46f30 100644 --- a/mica-core/src/main/java/org/obiba/mica/web/model/DatasetDtos.java +++ b/mica-core/src/main/java/org/obiba/mica/web/model/DatasetDtos.java @@ -496,7 +496,7 @@ else if (opalTable instanceof HarmonizationStudyTable) MicaConfig micaConfig = micaConfigService.getConfig(); int privacyThreshold = micaConfig.getPrivacyThreshold(); crossDto.setPrivacyThreshold(privacyThreshold); - boolean privacyChecks = crossVariable.hasCategories() ? validatePrivacyThreshold(results, privacyThreshold) : true; + boolean privacyChecks = !crossVariable.hasCategories() || validatePrivacyThreshold(results, privacyThreshold); boolean totalPrivacyChecks = validateTotalPrivacyThreshold(results, privacyThreshold); // add facet results in the same order as the variable categories @@ -517,7 +517,7 @@ else if (opalTable instanceof HarmonizationStudyTable) // add total facet for all variable categories results.getFacetsList().stream().filter(facet -> facet.hasFacet() && "_total".equals(facet.getFacet())) .forEach(facet -> { - boolean privacyCheck = privacyChecks && facet.getFilters(0).getCount() > micaConfig.getPrivacyThreshold(); + boolean privacyCheck = privacyChecks && facet.getFilters(0).getCount() >= micaConfig.getPrivacyThreshold(); addSummaryStatistics(crossVariable, allAggBuilder, facet, privacyCheck, totalPrivacyChecks); }); diff --git a/mica-search/src/main/java/org/obiba/mica/dataset/search/rest/harmonization/CombinedStatistics.java b/mica-search/src/main/java/org/obiba/mica/dataset/search/rest/harmonization/CombinedStatistics.java index 518e3b2177..5ac316ea13 100644 --- a/mica-search/src/main/java/org/obiba/mica/dataset/search/rest/harmonization/CombinedStatistics.java +++ b/mica-search/src/main/java/org/obiba/mica/dataset/search/rest/harmonization/CombinedStatistics.java @@ -139,8 +139,8 @@ private static void mergeAggregations(Mica.DatasetVariableAggregationDto.Builder Collection aggDtos) { mergeFrequencies(aggDto, aggDtos); mergeStatistics(aggDto, aggDtos); - aggDto.setN(aggDtos.stream().mapToInt(Mica.DatasetVariableAggregationDto::getN).sum()); - aggDto.setTotal(aggDtos.stream().mapToInt(Mica.DatasetVariableAggregationDto::getTotal).sum()); + aggDto.setN(aggDtos.stream().filter(a -> a.hasStatistics() || a.getFrequenciesCount()>0).mapToInt(Mica.DatasetVariableAggregationDto::getN).sum()); + aggDto.setTotal(aggDtos.stream().filter(a -> a.hasStatistics() || a.getFrequenciesCount()>0).mapToInt(Mica.DatasetVariableAggregationDto::getTotal).sum()); aggDtos.forEach(a -> { if(a.hasTerm()) aggDto.setTerm(a.getTerm()); }); diff --git a/mica-webapp/src/main/webapp/assets/js/mica-dataset-crosstab.js b/mica-webapp/src/main/webapp/assets/js/mica-dataset-crosstab.js index 4c0e0bfa73..49d66ca52f 100644 --- a/mica-webapp/src/main/webapp/assets/js/mica-dataset-crosstab.js +++ b/mica-webapp/src/main/webapp/assets/js/mica-dataset-crosstab.js @@ -88,6 +88,10 @@ class DatasetCrosstab { if (data.contingencies) { this._contingencies = this._normalizeData(data.contingencies); this._mainContingency = this._normalizeData([data.all]).pop(); + const mergedPrivacyCheck = this._contingencies.every(c => c.privacyCheck); + const mergedTotalPrivacyCheck = this._contingencies.every(c => c.totalPrivacyCheck); + this._mainContingency.privacyCheck = this._mainContingency.privacyCheck && mergedPrivacyCheck; + this._mainContingency.totalPrivacyCheck = this._mainContingency.totalPrivacyCheck && mergedTotalPrivacyCheck; } else { this._mainContingency = this._normalizeData([data]).pop(); } @@ -211,8 +215,7 @@ class DatasetCrosstab { if (!contingency.totalPrivacyCheck || contingency.all.n > 0) { if (that._isStatistical(that.getVariable2())) { that._normalizeStatistics(contingency, v1Cats); - } - if (v2Cats) { + } else if (v2Cats) { that._normalizeFrequencies(contingency, v2Cats); } } @@ -241,12 +244,16 @@ class DatasetCrosstab { }; } - contingency.privacyCheck = contingency.aggregations.filter(aggregation => aggregation.statistics !== null).length === contingency.aggregations.length; + contingency.privacyCheck = contingency.aggregations.every(a => a.n>-1);//contingency.aggregations.filter(aggregation => aggregation.statistics !== null).length === contingency.aggregations.length; let terms = contingency.aggregations.map(aggregation => aggregation.term); if (!contingency.privacyCheck) { // server returns no aggregation, create empty ones - contingency.aggregations.forEach(aggregation => aggregation.statistics = createEmptyStatistics()); + contingency.aggregations.forEach(aggregation => { + if (!aggregation.statistics) { + aggregation.statistics = createEmptyStatistics(); + } + }); contingency.all.statistics = createEmptyStatistics(); } else { // create the missing category aggregations @@ -488,6 +495,8 @@ const initStudySelector = function() { const renderDatasetCrosstab = function(contingency) { if (!contingency.privacyCheck || !contingency.totalPrivacyCheck) { $('#privacy-alert').show(); + } else { + $('#privacy-alert').hide(); } // init Crosstab element const crosstabElem = $('#crosstab');