Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
ee62e9d
Generic assay meta should load in one single call instead of per panel
alisman Sep 29, 2025
64cfc11
shut off cna discrete and generic ass meta
alisman Oct 8, 2025
7891713
Optimize studies fetch in ResultsViewPageStore
alisman Oct 10, 2025
0c94e2c
DO NOT MERGE THIS COMMIT. it is a temporary optimization
alisman Oct 10, 2025
56fc1a7
Use the new study endpoint
alisman Oct 14, 2025
fede2d6
Optimize mutationCache to use single API request for all studies
alisman Oct 16, 2025
9cb5175
In results view store, always use the detailed study projection since…
alisman Oct 23, 2025
afd8bf8
Revert "Optimize mutationCache to use single API request for all stud…
alisman Oct 23, 2025
11f6790
Revert "DO NOT MERGE THIS COMMIT. it is a temporary optimization"
alisman Oct 23, 2025
4942ccc
remove single CNA call
alisman Oct 23, 2025
0736cec
turn back on generic assay fetch in results view
alisman Oct 24, 2025
7e320d3
point e2e at staging
alisman Oct 31, 2025
bb7a4b6
Restore generic assay meta call for oncoprint.
alisman Nov 3, 2025
bafebc4
Temporarily disable namespace fetch in studyview store
alisman Nov 4, 2025
9da42f7
Run e2e against prod
alisman Nov 4, 2025
66db1c4
Fix namespace typing in studyviewpagestore
alisman Nov 4, 2025
978bea5
clickhouse mode for localdb tests
zainasir Nov 17, 2025
805e55a
Fix e2e tests (#5294)
alisman Nov 19, 2025
aef4b13
fix env files for staging
alisman Nov 19, 2025
7c318ea
update screens
alisman Nov 20, 2025
c8a4738
Merge pull request #5302 from cBioPortal/master
dippindots Nov 21, 2025
f2fa3b0
Fix sort coexpression table to stabilize genes for e2e (#5305)
alisman Nov 23, 2025
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
6 changes: 4 additions & 2 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,9 @@ jobs:
BACKEND_PORT: 8080
FRONTEND_PORT: 3000
DOCKER_IMAGE_MYSQL: cbioportal/mysql:8.0-database-test
DOCKER_IMAGE_CBIOPORTAL: cbioportal/cbioportal:master
DOCKER_IMAGE_CBIOPORTAL: cbioportal/cbioportal:rc-7.0-clickhouse-only
DOCKER_COMPOSE_REF: rc-7.0-clickhouse-only
APP_CBIOPORTAL_CORE_BRANCH: main
steps:
- attach_workspace:
at: /tmp/repo
Expand All @@ -307,7 +309,7 @@ jobs:
APPLICATION_PROPERTIES_PATH: '/tmp/repo/cbioportal-frontend/end-to-end-test/local/runtime-config/portal.properties'
command: |
cd cbioportal-test
nohup ./scripts/docker-compose.sh --portal_type='keycloak' >> /tmp/repo/docker-compose-logs.txt 2>&1 &
nohup ./scripts/docker-compose.sh --portal_type='keycloak' --compose_extensions='-f addon/clickhouse/docker-compose.clickhouse.yml' >> /tmp/repo/docker-compose-logs.txt 2>&1 &
- run:
name: Check keycloak connection at localhost
command: |
Expand Down
15 changes: 14 additions & 1 deletion end-to-end-test/local/runtime-config/portal.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,24 @@
app.name=cbioportal

# database
spring.datasource.mysql.url=jdbc:ch://cbioportal-clickhouse-database:8123/cbioportal?zeroDateTimeBehavior=convertToNull
spring.datasource.mysql.username=cbio_user
spring.datasource.mysql.password=somepassword
spring.datasource.mysql.driver-class-name=com.clickhouse.jdbc.ClickHouseDriver
spring.datasource.clickhouse.url=jdbc:ch://cbioportal-clickhouse-database:8123/cbioportal
spring.datasource.clickhouse.username=cbio_user
spring.datasource.clickhouse.password=somepassword
spring.datasource.clickhouse.driver-class-name=com.clickhouse.jdbc.ClickHouseDriver
spring.datasource.url=jdbc:mysql://cbioportal-database:3306/cbioportal?useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.username=cbio_user
spring.datasource.password=somepassword
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

# clickhouse mode
clickhouse_mode=true
spring.profiles.active=clickhouse

# set tomcat_resource_name when using dbconnector=jndi instead of the default
# dbconnector=dbcp. Note that dbconnector needs to be set in CATLINA_OPTS when
# using Tomcat (CATALINA_OPTS="-Ddbconnector=jndi"). It does not get picked up
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
35 changes: 15 additions & 20 deletions end-to-end-test/remote/specs/core/quickSearch.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,35 +34,30 @@ describe('Quick Search', () => {
});

it('should give results for studies', async () => {
await clickElement(
'strong=Adrenocortical Carcinoma (TCGA, Firehose Legacy)'
);
await (
await getElement(
'h3=Adrenocortical Carcinoma (TCGA, Firehose Legacy)'
)
).waitForExist();
//await browser.debug();

const SELECTOR =
'Adenoid Cystic Carcinoma (FMI, Am J Surg Pathl. 2014)';

await clickElement(`strong=${SELECTOR}`);
await (await getElement(`h3=${SELECTOR}`)).waitForExist();

assert.equal(
await (
await getElement(
'h3=Adrenocortical Carcinoma (TCGA, Firehose Legacy)'
)
).isDisplayed(),
await (await getElement(`h3=${SELECTOR}`)).isDisplayed(),
true,
'modal is visible'
'title is visible'
);
});

it('should give results for genes', async () => {
//browser.debug();
await clickElement('strong=458 more genes (click to load 20 more)');
await (await getElement('strong=ADAM12')).waitForExist();
await clickElement('strong=ADAM15');
await (await getElement('a=ADAM15')).waitForExist({ timeout: 60000 });
await (await getElement('strong=ADAD1')).waitForExist();

await clickElement('strong=ADAD1');

await (await getElement('a=ADAD1')).waitForExist({ timeout: 60000 });

assert.equal(
await (await getElement('a=ADAM15')).isDisplayed(),
await (await getElement('a=ADAD1')).isDisplayed(),
true,
'we navigated successfully to gene query'
);
Expand Down
2 changes: 1 addition & 1 deletion env/master.sh
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
export CBIOPORTAL_URL="${CBIOPORTAL_URL:-https://www.cbioportal.org}"
export CBIOPORTAL_URL="https://staging.cbioportal.org"
export GENOME_NEXUS_URL="${GENOME_NEXUS_URL:-https://www.genomenexus.org}"
2 changes: 2 additions & 0 deletions env/rc-7.0-clickhouse-only.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export CBIOPORTAL_URL="https://staging.cbioportal.org"
export GENOME_NEXUS_URL="${GENOME_NEXUS_URL:-https://www.genomenexus.org}"
20 changes: 18 additions & 2 deletions scripts/e2e.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@ set -e
set -o allexport

TEST_REPO_URL="https://github.com/cBioPortal/cbioportal-test.git"
TEST_REPO_REF="main"
DOCKER_COMPOSE_REPO_URL="https://github.com/cBioPortal/cbioportal-docker-compose.git"
DOCKER_COMPOSE_REF="rc-7.0-clickhouse-only"
STUDIES='ascn_test_study study_hg38 teststudy_genepanels study_es_0 lgg_ucsf_2014_test_generic_assay'
APPLICATION_PROPERTIES_PATH=$(cd -- "$(dirname -- "$0")" && cd .. && pwd)/end-to-end-test/local/runtime-config/portal.properties
KEYCLOAK="true"
CLICKHOUSE="true"
RUN_FRONTEND="false" # Set to "true" if you want to build and run frontend at localhost:3000
RUN_TESTS="false" # Set to "true" if you want to run all e2e:local tests

Expand All @@ -17,14 +20,21 @@ export DOCKER_IMAGE_MYSQL=cbioportal/mysql:8.0-database-test
export APPLICATION_PROPERTIES_PATH=$APPLICATION_PROPERTIES_PATH

# Backend image
export DOCKER_IMAGE_CBIOPORTAL=cbioportal/cbioportal:master
export DOCKER_IMAGE_CBIOPORTAL=cbioportal/cbioportal:rc-7.0-clickhouse-only

# cbioportal-core branch
export APP_CBIOPORTAL_CORE_BRANCH=main

# Use pre-release clickhouse for docker compose
export DOCKER_COMPOSE_REF=$DOCKER_COMPOSE_REF

# Create a temp dir and clone test repo
ROOT_DIR=$(pwd)
TEMP_DIR=$(mktemp -d)
git clone "$TEST_REPO_URL" "$TEMP_DIR/cbioportal-test" || exit 1
git clone "$DOCKER_COMPOSE_REPO_URL" "$TEMP_DIR/cbioportal-docker-compose" || exit 1
cd "$TEMP_DIR/cbioportal-test" || exit 1
git checkout "$TEST_REPO_REF" || exit 1

# Generate keycloak config
if [ "$KEYCLOAK" = "true" ]; then
Expand All @@ -34,7 +44,13 @@ fi

# Start backend
if [ "$KEYCLOAK" = "true" ]; then
./scripts/docker-compose.sh --portal_type='keycloak' --docker_args='-d'
if [ "$CLICKHOUSE" = "true" ]; then
COMPOSE_EXTENSIONS='-f addon/clickhouse/docker-compose.clickhouse.yml'
else
COMPOSE_EXTENSIONS=''
fi

./scripts/docker-compose.sh --portal_type='keycloak' --compose_extensions="$COMPOSE_EXTENSIONS" --docker_args='-d'

# Check keycloak connection at localhost:8081
./utils/check-connection.sh --url=localhost:8081 --max_retries=50
Expand Down
11 changes: 7 additions & 4 deletions src/pages/resultsView/ResultsViewPageStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3068,7 +3068,7 @@ export class ResultsViewPageStore extends AnalysisStore
{
invoke: async () =>
await getClient().getAllStudiesUsingGET({
projection: REQUEST_ARG_ENUM.PROJECTION_SUMMARY,
projection: REQUEST_ARG_ENUM.PROJECTION_DETAILED,
}),
},
[]
Expand Down Expand Up @@ -3238,7 +3238,6 @@ export class ResultsViewPageStore extends AnalysisStore
);
}
);

return Promise.all(promises).then((cnaData: any[]) =>
_.flattenDeep(cnaData)
);
Expand Down Expand Up @@ -4259,10 +4258,14 @@ export class ResultsViewPageStore extends AnalysisStore
{
await: () => [this.studyIds],
invoke: async () => {
return getClient().fetchStudiesUsingPOST({
studyIds: this.studyIds.result!,
// we do this because get all studies (detailed projection) will be in cache
// for all users since it is the same for everyone
const allStudies = await getClient().getAllStudiesUsingGET({
projection: REQUEST_ARG_ENUM.PROJECTION_DETAILED,
});
return allStudies.filter(study =>
this.studyIds.result!.includes(study.studyId)
);
},
},
[]
Expand Down
7 changes: 6 additions & 1 deletion src/pages/resultsView/coExpression/CoExpressionViz.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,12 @@ export default class CoExpressionViz extends React.Component<
await: () => [this.coExpressionDataPromise],
invoke: () => {
const coexpressions = this.coExpressionDataPromise.result!;
const sortedByPvalue = _.sortBy(coexpressions, c => c.pValue);

const sortedByPvalue = _.sortBy(coexpressions, [
c => c.pValue,
c => c.geneticEntityName,
]);

const qValues = calculateQValues(sortedByPvalue.map(c => c.pValue));
qValues.forEach((qValue, index) => {
(sortedByPvalue[index] as CoExpressionWithQ).qValue = qValue;
Expand Down
9 changes: 5 additions & 4 deletions src/pages/studyView/StudyViewPageStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6179,13 +6179,14 @@ export class StudyViewPageStore
},
});

readonly namespaceAttributes = remoteData({
readonly namespaceAttributes = remoteData<NamespaceAttribute[]>({
await: () => [this.queriedPhysicalStudyIds],
invoke: async () => {
if (this.queriedPhysicalStudyIds.result.length > 0) {
return await getClient().fetchNamespaceAttributesUsingPOST({
studyIds: this.queriedPhysicalStudyIds.result,
});
return [];
// return await getClient().fetchNamespaceAttributesUsingPOST({
// studyIds: this.queriedPhysicalStudyIds.result,
// });
}
return [];
},
Expand Down
2 changes: 1 addition & 1 deletion src/shared/api/cbioportalClientInstance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ proxyColumnStore(clientColumnStore, 'getSamplesByKeyword');
proxyColumnStore(clientColumnStore, 'getSampleInStudy');
proxyColumnStore(clientColumnStore, 'getAllSamplesInStudy');
proxyColumnStore(clientColumnStore, 'getAllSamplesOfPatientInStudy');
//proxyColumnStore(clientColumnStore, 'getAllStudies');
proxyColumnStore(clientColumnStore, 'getAllStudies');

export default client;
2 changes: 1 addition & 1 deletion src/shared/api/cbioportalInternalClientInstance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ proxyColumnStore(internalClientColumnStore, 'fetchGenomicDataBinCounts');
proxyColumnStore(internalClientColumnStore, 'fetchGenericAssayDataBinCounts');
proxyColumnStore(internalClientColumnStore, 'fetchGenericAssayDataCounts');
proxyColumnStore(internalClientColumnStore, 'fetchClinicalDataViolinPlots');
//proxyColumnStore(internalClientColumnStore, 'fetchAlterationEnrichments');
proxyColumnStore(internalClientColumnStore, 'fetchAlterationEnrichments');

export default internalClient;

Expand Down
1 change: 1 addition & 0 deletions src/shared/components/oncoprint/OncoprintUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -739,6 +739,7 @@ export function makeGeneticTrackWith({
? oql.list.map(({ gene }) => gene)
: [oql.gene];
const dataByCase = caseData.cases;

const data = sampleMode
? makeGeneticTrackData(
dataByCase.samples,
Expand Down
24 changes: 14 additions & 10 deletions src/shared/lib/GenericAssayUtils/GenericAssayCommonUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,17 +96,21 @@ export async function fetchGenericAssayMetaByMolecularProfileIdsGroupByMolecular
[molecularProfileId: string]: GenericAssayMeta[];
} = {};

await Promise.all(
genericAssayProfiles.map(profile =>
fetchGenericAssayMetaByProfileIds([
profile.molecularProfileId,
]).then(genericAssayMeta => {
genericAssayMetaGroupByMolecularProfileId[
profile.molecularProfileId
] = genericAssayMeta;
})
)
const allProfileIds = genericAssayProfiles.map(
profile => profile.molecularProfileId
);
const allGenericAssayMeta = await fetchGenericAssayMetaByProfileIds(
allProfileIds
);

// Populate each profile with the full metadata list
// Note: The API returns all metadata for all profiles combined,
// so each profile gets the same complete list
allProfileIds.forEach(profileId => {
genericAssayMetaGroupByMolecularProfileId[
profileId
] = allGenericAssayMeta;
});
return genericAssayMetaGroupByMolecularProfileId;
}

Expand Down
Loading