Skip to content

Commit

Permalink
add samples field and handling to custom filters
Browse files Browse the repository at this point in the history
  • Loading branch information
Bryan Lai committed Sep 18, 2024
1 parent 8c2425d commit a3e3be0
Show file tree
Hide file tree
Showing 6 changed files with 900 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Component
public class CustomDataFilterUtil {
Expand All @@ -42,6 +43,60 @@ public List<CustomSampleIdentifier> extractCustomDataSamples(final StudyViewFilt
return null;
}

final List<CustomSampleIdentifier> flattenedSamples = studyViewFilter.getCustomDataFilters().stream()
.flatMap(filter -> {
List<CustomSampleIdentifier> samples = filter.getSamples();
return (samples != null) ? samples.stream() : Stream.empty();
})
.collect(Collectors.toList());

if (!flattenedSamples.isEmpty()) {
customSampleIdentifiers.addAll(flattenedSamples);

List<ClinicalDataFilter> equalityFilters = new ArrayList<>();
List<ClinicalDataFilter> intervalFilters = new ArrayList<>();

studyViewFilter.getCustomDataFilters().forEach(filter -> {
if (filter.getDatatype()
.equals(CustomDatatype.STRING.name())
) {
equalityFilters.add(filter);
} else {
intervalFilters.add(filter);
}
});

MultiKeyMap<String, String> customDataByStudySampleName = new MultiKeyMap<>();

studyViewFilter.getCustomDataFilters().stream().forEach(filter -> {
filter.getSamples().forEach(datum -> {
String value = datum.getValue().toUpperCase();
if (value.equals("NAN") || value.equals("N/A")) {
value = "NA";
}
customDataByStudySampleName.put(datum.getStudyId(), datum.getSampleId(), filter.getDisplayName(), value);
});
});

List<CustomSampleIdentifier> filtered = new ArrayList<>();
customSampleIdentifiers.forEach(customSampleIdentifier -> {
int equalityFilterCount = getFilteredCountByDataEqualityWithStudySampleNameMap(equalityFilters, customDataByStudySampleName,
customSampleIdentifier.getSampleId(), customSampleIdentifier.getStudyId(), false);
int intervalFilterCount = getFilteredCountByDataIntervalWithStudySampleNameMap(intervalFilters, customDataByStudySampleName,
customSampleIdentifier.getSampleId(), customSampleIdentifier.getStudyId());
if (equalityFilterCount == equalityFilters.size()
&& intervalFilterCount == intervalFilters.size()
) {
filtered.add(customSampleIdentifier);
}
else {
customSampleIdentifier.setIsFilteredOut(true);
filtered.add(customSampleIdentifier);
}
});
return filtered;
}

final List<String> attributeIds = studyViewFilter.getCustomDataFilters().stream()
.map(ClinicalDataFilter::getAttributeId)
.collect(Collectors.toList());
Expand Down Expand Up @@ -115,6 +170,27 @@ public List<CustomSampleIdentifier> extractCustomDataSamples(final StudyViewFilt
return filtered;
}

private Integer getFilteredCountByDataEqualityWithStudySampleNameMap(List<ClinicalDataFilter> attributes, MultiKeyMap<String, String> clinicalDataMap,
String entityId, String studyId, boolean negateFilters) {
Integer count = 0;
for (ClinicalDataFilter s : attributes) {
List<String> filteredValues = s.getValues()
.stream()
.map(DataFilterValue::getValue)
.collect(Collectors.toList());
filteredValues.replaceAll(String::toUpperCase);
if (clinicalDataMap.containsKey(studyId, entityId, s.getDisplayName())) {
String value = clinicalDataMap.get(studyId, entityId, s.getDisplayName());
if (negateFilters ^ filteredValues.contains(value)) {
count++;
}
} else if (negateFilters ^ filteredValues.contains("NA")) {
count++;
}
}
return count;
}

private <S> Integer getFilteredCountByDataInterval(List<ClinicalDataFilter> attributes, MultiKeyMap<String, S> clinicalDataMap,
String entityId, String studyId) {
int count = 0;
Expand Down Expand Up @@ -152,6 +228,43 @@ else if (specialValues.contains(attrValue.toUpperCase())) {
return count;
}

private Integer getFilteredCountByDataIntervalWithStudySampleNameMap(List<ClinicalDataFilter> attributes, MultiKeyMap<String, String> clinicalDataMap,
String entityId, String studyId) {
int count = 0;

for (ClinicalDataFilter filter : attributes) {
if (clinicalDataMap.containsKey(studyId, entityId, filter.getDisplayName())) {
String attrValue = clinicalDataMap.get(studyId, entityId, filter.getDisplayName());
Range<BigDecimal> rangeValue = calculateRangeValueForAttr(attrValue);

// find range filters
List<Range<BigDecimal>> ranges = filter.getValues().stream()
.map(this::calculateRangeValueForFilter)
.filter(Objects::nonNull)
.collect(Collectors.toList());

// find special value filters
List<String> specialValues = filter.getValues().stream()
.filter(f -> f.getValue() != null)
.map(f -> f.getValue().toUpperCase())
.collect(Collectors.toList());

if (rangeValue != null) {
if (ranges.stream().anyMatch(r -> r.encloses(rangeValue))) {
count++;
}
}
else if (specialValues.contains(attrValue.toUpperCase())) {
count++;
}
} else if (containsNA(filter)) {
count++;
}
}

return count;
}

private Range<BigDecimal> calculateRangeValueForAttr(String attrValue) {
if (attrValue == null) {
return null;
Expand Down
30 changes: 30 additions & 0 deletions src/main/java/org/cbioportal/web/parameter/ClinicalDataFilter.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
package org.cbioportal.web.parameter;

import org.cbioportal.service.util.CustomAttributeWithData;
import org.cbioportal.service.util.CustomDataValue;

import java.io.Serializable;
import java.util.List;

public class ClinicalDataFilter extends DataFilter implements Serializable {

private String attributeId;
private List<CustomSampleIdentifier> samples;
private String datatype;
private String displayName;

public String getAttributeId() {
return attributeId;
Expand All @@ -15,4 +21,28 @@ public void setAttributeId(String attributeId) {
this.attributeId = attributeId;
}

public List<CustomSampleIdentifier> getSamples() {
return samples;
}

public void setSamples(List<CustomSampleIdentifier> samples) {
this.samples = samples;
}

public String getDatatype() {
return datatype;
}

public void setDatatype(String datatype) {
this.datatype = datatype;
}

public String getDisplayName() {
return displayName;
}

public void setDisplayName(String displayName) {
this.displayName = displayName;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ public class CustomSampleIdentifier extends SampleIdentifier implements Serializ

private boolean isFilteredOut = false;
private String attributeId;
private String value;

public boolean getIsFilteredOut() {
return isFilteredOut;
Expand All @@ -22,4 +23,12 @@ public String getAttributeId() {
public void setAttributeId(String attributeId) {
this.attributeId = attributeId;
}

public String getValue() {
return value;
}

public void setValue(String value) {
this.value = value;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@
sample_unique_id IN (
'',
<foreach item="sampleIdentifier" collection="studyViewFilterHelper.customDataSamples" separator=",">
<if test="customDataFilter.attributeId == sampleIdentifier.getAttributeId() and !sampleIdentifier.getIsFilteredOut()">
<if test="(customDataFilter.attributeId == sampleIdentifier.getAttributeId() or sampleIdentifier.getAttributeId() == null) and !sampleIdentifier.getIsFilteredOut()">
'${sampleIdentifier.studyId}_${sampleIdentifier.sampleId}'
</if>
</foreach>
Expand All @@ -94,7 +94,7 @@
OR
sample_unique_id NOT IN (
<foreach item="sampleIdentifier" collection="studyViewFilterHelper.customDataSamples" separator=",">
<if test="customDataFilter.attributeId == sampleIdentifier.getAttributeId()">
<if test="customDataFilter.attributeId == sampleIdentifier.getAttributeId() or sampleIdentifier.getAttributeId() == null">
'${sampleIdentifier.studyId}_${sampleIdentifier.sampleId}'
</if>
</foreach>
Expand Down
Loading

0 comments on commit a3e3be0

Please sign in to comment.