Skip to content

Commit

Permalink
SQLs
Browse files Browse the repository at this point in the history
  • Loading branch information
fuzhaoyuan committed Feb 27, 2025
1 parent 3ef5db7 commit 62abff3
Show file tree
Hide file tree
Showing 6 changed files with 120 additions and 61 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import org.cbioportal.legacy.model.ClinicalData;
import org.cbioportal.legacy.model.ClinicalDataCountItem;
import org.cbioportal.domain.studyview.StudyViewFilterContext;
import org.cbioportal.shared.enums.ProjectionType;

import java.util.List;

Expand All @@ -18,11 +19,9 @@ public interface ClinicalDataRepository {
* @param filteredAttributes A list of attributes to filter the clinical data.
* @return A list of {@link ClinicalData} representing patient clinical data.
*/
List<ClinicalData> getPatientClinicalData(StudyViewFilterContext studyViewFilterContext, List<String> filteredAttributes);
List<ClinicalData> getPatientClinicalDataFromStudyViewFilter(StudyViewFilterContext studyViewFilterContext, List<String> filteredAttributes);

List<ClinicalData> getPatientClinicalDataSummary(List<String> studyIds, List<String> sampleIds, List<String> filteredAttributes);

List<ClinicalData> getPatientClinicalDataDetailed(List<String> studyIds, List<String> sampleIds, List<String> filteredAttributes);
List<ClinicalData> getPatientClinicalData(List<String> studyIds, List<String> sampleIds, List<String> filteredAttributes, ProjectionType projectionType);

/**
* Retrieves clinical data for samples based on the given study view filter context and filtered attributes.
Expand All @@ -31,11 +30,9 @@ public interface ClinicalDataRepository {
* @param filteredAttributes A list of attributes to filter the clinical data.
* @return A list of {@link ClinicalData} representing sample clinical data.
*/
List<ClinicalData> getSampleClinicalData(StudyViewFilterContext studyViewFilterContext, List<String> filteredAttributes);
List<ClinicalData> getSampleClinicalDataFromStudyViewFilter(StudyViewFilterContext studyViewFilterContext, List<String> filteredAttributes);

List<ClinicalData> getSampleClinicalDataSummary(List<String> studyIds, List<String> sampleIds, List<String> filteredAttributes);

List<ClinicalData> getSampleClinicalDataDetailed(List<String> studyIds, List<String> sampleIds, List<String> filteredAttributes);
List<ClinicalData> getSampleClinicalData(List<String> studyIds, List<String> sampleIds, List<String> filteredAttributes, ProjectionType projectionType);

/**
* Retrieves counts of clinical data records based on the given study view filter context and filtered attributes.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public GetPatientClinicalDataUseCase(ClinicalDataRepository clinicalDataReposito
* @return a list of {@link ClinicalData} representing the patient's clinical data
*/
public List<ClinicalData> execute(StudyViewFilterContext studyViewFilterContext, List<String> filteredAttributes) {
return clinicalDataRepository.getPatientClinicalData(studyViewFilterContext, filteredAttributes);
return clinicalDataRepository.getPatientClinicalDataFromStudyViewFilter(studyViewFilterContext, filteredAttributes);
}

public List<ClinicalData> execute(ClinicalDataMultiStudyFilter clinicalDataMultiStudyFilter, List<String> attributeIds, ProjectionType projectionType) {
Expand All @@ -51,20 +51,7 @@ public List<ClinicalData> execute(ClinicalDataMultiStudyFilter clinicalDataMulti
patientIds.add(identifier.getEntityId());
}

// DETAILED level
if (projectionType == ProjectionType.DETAILED) {
return clinicalDataRepository.getPatientClinicalDataDetailed(studyIds, patientIds, attributeIds);
}

// ID or SUMMARY level
List<ClinicalData> clinicalDataList = clinicalDataRepository.getPatientClinicalDataSummary(studyIds, patientIds, attributeIds);
// ID level doesn't have attrValue
if (projectionType == ProjectionType.ID) {
for (ClinicalData clinicalData : clinicalDataList) {
clinicalData.setAttrValue(null);
}
}
return clinicalDataList;
return clinicalDataRepository.getPatientClinicalData(studyIds, patientIds, attributeIds, projectionType);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public GetSampleClinicalDataUseCase(ClinicalDataRepository clinicalDataRepositor
* @return a list of {@link ClinicalData} representing the sample's clinical data
*/
public List<ClinicalData> execute(StudyViewFilterContext studyViewFilterContext, List<String> filteredAttributes) {
return clinicalDataRepository.getSampleClinicalData(studyViewFilterContext, filteredAttributes);
return clinicalDataRepository.getSampleClinicalDataFromStudyViewFilter(studyViewFilterContext, filteredAttributes);
}

public List<ClinicalData> execute(ClinicalDataMultiStudyFilter clinicalDataMultiStudyFilter, List<String> attributeIds, ProjectionType projectionType) {
Expand All @@ -51,20 +51,7 @@ public List<ClinicalData> execute(ClinicalDataMultiStudyFilter clinicalDataMulti
sampleIds.add(identifier.getEntityId());
}

// DETAILED level
if (projectionType == ProjectionType.DETAILED) {
return clinicalDataRepository.getSampleClinicalDataDetailed(studyIds, sampleIds, attributeIds);
}

// ID or SUMMARY level
List<ClinicalData> clinicalDataList = clinicalDataRepository.getSampleClinicalDataSummary(studyIds, sampleIds, attributeIds);
// ID level doesn't have attrValue
if (projectionType == ProjectionType.ID) {
for (ClinicalData clinicalData : clinicalDataList) {
clinicalData.setAttrValue(null);
}
}
return clinicalDataList;
return clinicalDataRepository.getSampleClinicalData(studyIds, sampleIds, attributeIds, projectionType);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import org.cbioportal.legacy.model.ClinicalData;
import org.cbioportal.legacy.model.ClinicalDataCountItem;
import org.cbioportal.domain.studyview.StudyViewFilterContext;
import org.cbioportal.shared.enums.ProjectionType;

import java.util.List;

Expand Down Expand Up @@ -31,9 +32,7 @@ public interface ClickhouseClinicalDataMapper {
*/
List<ClinicalData> getSampleClinicalDataFromStudyViewFilter(StudyViewFilterContext studyViewFilterContext, List<String> attributeIds);

List<ClinicalData> getSampleClinicalDataSummary(List<String> studyIds, List<String> sampleIds, List<String> attributeIds);

List<ClinicalData> getSampleClinicalDataDetailed(List<String> studyIds, List<String> sampleIds, List<String> attributeIds);
List<ClinicalData> getSampleClinicalData(List<String> studyIds, List<String> sampleIds, List<String> attributeIds, ProjectionType projectionType);

/**
* Retrieves patient clinical data based on the study view filter context and attribute IDs.
Expand All @@ -44,9 +43,7 @@ public interface ClickhouseClinicalDataMapper {
*/
List<ClinicalData> getPatientClinicalDataFromStudyViewFilter(StudyViewFilterContext studyViewFilterContext, List<String> attributeIds);

List<ClinicalData> getPatientClinicalDataSummary(List<String> studyIds, List<String> patientIds, List<String> attributeIds);

List<ClinicalData> getPatientClinicalDataDetailed(List<String> studyIds, List<String> patientIds, List<String> attributeIds);
List<ClinicalData> getPatientClinicalData(List<String> studyIds, List<String> patientIds, List<String> attributeIds, ProjectionType projectionType);

}

Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.cbioportal.legacy.model.ClinicalData;
import org.cbioportal.legacy.model.ClinicalDataCountItem;
import org.cbioportal.domain.studyview.StudyViewFilterContext;
import org.cbioportal.shared.enums.ProjectionType;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Repository;

Expand All @@ -24,33 +25,23 @@ public ClickhouseClinicalDataRepository(ClickhouseClinicalDataMapper mapper) {


@Override
public List<ClinicalData> getPatientClinicalData(StudyViewFilterContext studyViewFilterContext, List<String> filteredAttributes) {
public List<ClinicalData> getPatientClinicalDataFromStudyViewFilter(StudyViewFilterContext studyViewFilterContext, List<String> filteredAttributes) {
return mapper.getPatientClinicalDataFromStudyViewFilter(studyViewFilterContext, filteredAttributes);
}

@Override
public List<ClinicalData> getPatientClinicalDataSummary(List<String> studyIds, List<String> patientIds, List<String> attributeIds) {
return mapper.getPatientClinicalDataSummary(studyIds, patientIds, attributeIds);
public List<ClinicalData> getPatientClinicalData(List<String> studyIds, List<String> patientIds, List<String> attributeIds, ProjectionType projectionType) {
return mapper.getPatientClinicalData(studyIds, patientIds, attributeIds, projectionType);
}

@Override
public List<ClinicalData> getPatientClinicalDataDetailed(List<String> studyIds, List<String> patientIds, List<String> attributeIds) {
return mapper.getPatientClinicalDataDetailed(studyIds, patientIds, attributeIds);
}

@Override
public List<ClinicalData> getSampleClinicalData(StudyViewFilterContext studyViewFilterContext, List<String> filteredAttributes) {
public List<ClinicalData> getSampleClinicalDataFromStudyViewFilter(StudyViewFilterContext studyViewFilterContext, List<String> filteredAttributes) {
return mapper.getSampleClinicalDataFromStudyViewFilter(studyViewFilterContext, filteredAttributes);
}

@Override
public List<ClinicalData> getSampleClinicalDataSummary(List<String> studyIds, List<String> sampleIds, List<String> attributeIds) {
return mapper.getSampleClinicalDataSummary(studyIds, sampleIds, attributeIds);
}

@Override
public List<ClinicalData> getSampleClinicalDataDetailed(List<String> studyIds, List<String> sampleIds, List<String> attributeIds) {
return mapper.getSampleClinicalDataDetailed(studyIds, sampleIds, attributeIds);
public List<ClinicalData> getSampleClinicalData(List<String> studyIds, List<String> sampleIds, List<String> attributeIds, ProjectionType projectionType) {
return mapper.getSampleClinicalData(studyIds, sampleIds, attributeIds, projectionType);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,85 @@
AND type = 'patient'
</select>

<select id="getSampleClinicalData" resultMap="clinicalDataResultMap">
SELECT
cd.internal_id as internalId,
replaceOne(cd.sample_unique_id, concat(cd.cancer_study_identifier, '_'), '') as sampleId,
replaceOne(cd.patient_unique_id, concat(cd.cancer_study_identifier, '_'), '') as patientId,
cd.attribute_name as attrId,
<if test="projectionType != 'ID'">
cd.attribute_value as attrValue,
</if>
cd.cancer_study_identifier as studyId,
<if test="projectionType == 'DETAILED'">
cam.display_name as displayName,
cam.description,
cam.datatype,
cam.patient_attribute as patientAttribute,
cam.priority,
cam.cancer_study_id as cancerStudyId,
</if>
FROM clinical_data_derived cd
<if test="projectionType == 'DETAILED'">
LEFT JOIN cancer_study cs ON cd.cancer_study_identifier = cs.cancer_study_identifier
LEFT JOIN clinical_attribute_meta cam ON cd.attribute_name = cam.attr_id AND cs.cancer_study_id = cam.cancer_study_id
</if>
<where>
cd.type = 'sample'
<if test="sampleIds != null and !sampleIds.isEmpty()">
AND cd.sample_unique_id IN
<foreach index="i" collection="sampleIds" open="(" separator="," close=")">
concat(#{studyIds[${i}]}, '_', #{sampleIds[${i}]})
</foreach>
</if>
<if test="attributeIds != null and !attributeIds.isEmpty()">
AND cd.attribute_name IN
<foreach item="attributeId" collection="attributeIds" open="(" separator="," close=")">
#{attributeId}
</foreach>
</if>
</where>
</select>

<select id="getPatientClinicalData" resultMap="clinicalDataResultMap">
SELECT
cd.internal_id as internalId,
replaceOne(cd.patient_unique_id, concat(cd.cancer_study_identifier, '_'), '') as patientId,
cd.attribute_name as attrId,
<if test="projectionType != 'ID'">
cd.attribute_value as attrValue,
</if>
cd.cancer_study_identifier as studyId,
<if test="projectionType == 'DETAILED'">
cam.display_name as displayName,
cam.description,
cam.datatype,
cam.patient_attribute as patientAttribute,
cam.priority,
cam.cancer_study_id as cancerStudyId,
</if>
FROM clinical_data_derived cd
<if test="projectionType == 'DETAILED'">
LEFT JOIN cancer_study cs ON cd.cancer_study_identifier = cs.cancer_study_identifier
LEFT JOIN clinical_attribute_meta cam ON cd.attribute_name = cam.attr_id AND cs.cancer_study_id = cam.cancer_study_id
</if>
<where>
cd.type = 'patient'
<if test="patientIds != null and !patientIds.isEmpty()">
AND cd.patient_unique_id IN
<foreach index="i" collection="patientIds" open="(" separator="," close=")">
concat(#{studyIds[${i}]}, '_', #{patientIds[${i}]})
</foreach>
</if>
<if test="attributeIds != null and !attributeIds.isEmpty()">
AND cd.attribute_name IN
<foreach item="attributeId" collection="attributeIds" open="(" separator="," close=")">
#{attributeId}
</foreach>
</if>
</where>
</select>

<!-- for /clinical-data-counts/fetch (returns ClinicalData) which will then be converted to clinicalDataCountItems -->
<select id="getClinicalDataCounts" resultMap="ClinicalDataCountItemResultMap">
<include refid="getClinicalDataCountsQuery">
Expand Down Expand Up @@ -111,7 +190,6 @@
)
</sql>


<resultMap id="ClinicalDataCountItemResultMap" type="org.cbioportal.legacy.model.ClinicalDataCountItem">
<result property="attributeId" column="attributeId"/>
<collection property="counts" ofType="org.cbioportal.legacy.model.ClinicalDataCount">
Expand All @@ -120,4 +198,26 @@
<result property="count" column="count"/>
</collection>
</resultMap>

<resultMap id="clinicalAttributeResultMap" type="org.cbioportal.legacy.model.ClinicalAttribute">
<id property="attrId" column="attrId"/>
<result property="displayName" column="displayName"/>
<result property="description" column="description"/>
<result property="datatype" column="datatype"/>
<result property="patientAttribute" column="patientAttribute"/>
<result property="priority" column="priority"/>
<result property="cancerStudyId" column="cancerStudyId"/>
<result property="cancerStudyIdentifier" column="studyId"/>
</resultMap>

<resultMap id="clinicalDataResultMap" type="org.cbioportal.legacy.model.ClinicalData">
<id property="internalId" column="internalId"/>
<result property="sampleId" column="sampleId"/>
<result property="patientId" column="patientId"/>
<result property="studyId" column="studyId"/>
<result property="attrId" column="attrId"/>
<result property="attrValue" column="attrValue"/>
<association property="clinicalAttribute" resultMap="clinicalAttributeResultMap"/>
</resultMap>

</mapper>

0 comments on commit 62abff3

Please sign in to comment.