Skip to content

Commit

Permalink
Merge branch 'alpha' into gh-actions-mergeback-v0.35.4-alpha
Browse files Browse the repository at this point in the history
  • Loading branch information
actions-user committed Jan 8, 2025
2 parents 348c7cf + 74a0fb0 commit e10f1fc
Show file tree
Hide file tree
Showing 303 changed files with 10,824 additions and 921 deletions.
46 changes: 42 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ These instructions will get you a copy of the project and the API up and running
* [Database](#database)
- [Loading Data](#loading-data)
- [Submitting Data](#submitting-data)
* [Load Order Dependencies](#load-order-dependencies)
- [Querying Data](#querying-data)
* [Elastic Search](#search)
* [Database Search](#find)
Expand Down Expand Up @@ -592,9 +593,8 @@ the new version of the application can function in a consistent state upon and a
2. Reindex all data types by calling the `system/reindexeverything` endpoint with default arguments (found in the
System Endpoints section in the swagger UI) and follow-up through the log server to check for progress and errors.
3. Once reindexing completed, look at the dashboard page (where you deployed to)
and ensure that for each Entity and Ontology, the number in the `Database * count` column matches the number in the `Search index * count` column (ignore the values for `Disease Annotations` and `Literature References`). If there is a mismatch for any row,
investigate what caused this and fix the issue first before continuing the deployment.
4. If code to support new ontologies was added, create the respective new data loads through the Data loads page and load the new file.
and ensure that for each Entity and Ontology, the number in the `Database * count` column matches the number in the `Search index * count` for all indexed datatypes. If there is a mismatch for any row, investigate what caused this and fix the issue first before continuing the deployment.
4. If code to support new ontologies or datatypes was added, create the respective new data loads through the Data loads page (if not already done so via a database migration) and load the new files. Attention should be paid to any [load order dependencies](#load-order-dependencies)
5. After completing all above steps successfully, return to the code promoting section to complete the last step(s) ([alpha to beta](#promoting-code-from-alpha-to-beta) or [beta to production](#promoting-code-from-beta-to-production))
Expand Down Expand Up @@ -715,7 +715,7 @@ curl \
-F "LoadType_SubType=@/full/path/to/file2.json"
```
Valid values for LoadType, and SubType can be found in the examples below.
Valid values for LoadType, and SubType can be found in the examples below. Attention should be paid to any [load order dependencies](#load-order-dependencies).
### Curation System
Expand Down Expand Up @@ -769,6 +769,44 @@ The LinkML version for which the file is being submitted now needs to be added t
"disease_agm_ingest_set" : [ {
```
### Load Order Dependencies
When loading data, whether it be via direct DQM submissions, FMS loads, or URL loads, there are a number of load order dependencies to take notice of. The current list of loads and their dependencies (as of 16/12/2024) is given below. As a general rule, entity loads should be run first. Most loads will not remove the results of previous loads - the exception to this is the Gene load. Running the Gene load will result of the removal of cross-references attached to the genes via the BioGrid-ORCS, ExpressionAtlas, and GEO CrossReference loads. As such it is essential that these loads are rerun after a gene load.
1. Entity loads
* AGM
* Allele
* Construct
* Gene
* HTP Dataset Annotation
* HTP Dataset Sample Annotation
* Molecule
* Sequence Targeting Reagent (dependent on: Gene)
* Variant
2. Association loads
* Allele Association (dependent on: Allele, Gene)
* Construct Association (dependent on: AGM, Allele, Construct, Gene)
* Disease Annotation (dependent on: AGM, Allele, Gene)
* Expression (dependent on: Gene)
* GAF (dependent on: Gene)
* Interaction (dependent on: Gene)
* Phenotype Annotation (dependent on: AGM, Allele, Gene)
3. CrossReference loads (all need to be rerun after Gene loads)
* BioGrid-ORCS (dependent on: Gene)
* ExpressionAtlas (dependent on: Gene)
* GEO CrossReference (dependent on: Gene)
4. GFF loads
* GFF Gene (dependent on: Gene)
* GFF Transcript (dependent on: Gene)
* GFF CDS (dependent on: GFF Transcript)
* GFF Exon (dependent on: GFF Transcript)
5. Orthology loads
* Orthology (dependent on: Gene)
* Paralogy (dependent on: Gene)
6. VEP loads
* VEP Transcript (dependent on: Variant, GFF Transcript)
* VEP Gene (dependent on: VEP Transcript)
## Querying Data
### Search
Expand Down
8 changes: 6 additions & 2 deletions src/main/cliapp/src/components/Actions/EntityDetailsAction.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
import { Link } from 'react-router-dom/cjs/react-router-dom.min';
import { Tooltip } from 'primereact/tooltip';

export const EntityDetailsAction = ({ identifier, disabled }) => {
export const EntityDetailsAction = ({ endpoint, identifier, disabled }) => {
const disabledClasses = disabled ? 'pointer-events-none opacity-50' : '';

if (!identifier) return null;

return (
<>
<Link to={`allele/${identifier}`} target="_blank" className={`${identifier.replace(':', '')} ${disabledClasses}`}>
<Link
to={`${endpoint}/${identifier}`}
target="_blank"
className={`${identifier.replace(':', '')} ${disabledClasses}`}
>
<i className="pi pi-info-circle"></i>
</Link>
<Tooltip target={`.${identifier.replace(':', '')}`} content={'Open Details'} />
Expand Down
32 changes: 26 additions & 6 deletions src/main/cliapp/src/components/EntityCountsComponent.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ export const EntityCountsComponent = () => {
_tableData[type].push({
name: CLASSES[key].name,
link: CLASSES[key].link,
type: CLASSES[key].type,
isIndexed: CLASSES[key].isIndexed,
dbCount: res.entity[key]['dbCount'],
esCount: res.entity[key]['esCount'],
});
Expand All @@ -42,13 +44,15 @@ export const EntityCountsComponent = () => {
}, []);

const nameHyperlinkTemplate = (rowData) => {
if (!rowData.link) {
return rowData.name;
}
return <a href={rowData.link}>{rowData.name}</a>;
};

const ROW_HIGHLIGHT_IGNORE = ['Disease Annotations', 'Literature References', 'Bulk Loads / Failed Loads'];

const getRowClass = (rowData) => {
if (ROW_HIGHLIGHT_IGNORE.includes(rowData.name)) return;
console.log(rowData);
if (!rowData.isIndexed) return;

if (rowData?.dbCount !== rowData.esCount) {
return 'bg-gray-500 text-white';
Expand All @@ -58,7 +62,7 @@ export const EntityCountsComponent = () => {
return (
<>
<div className="grid nested dashboard">
<div className="col-4">
<div className="col-3">
<DataTable
header="Entities"
value={tableData.entity}
Expand All @@ -79,7 +83,7 @@ export const EntityCountsComponent = () => {
/>
</DataTable>
</div>
<div className="col-4">
<div className="col-3">
<DataTable
header="Ontologies"
value={tableData.ontology}
Expand All @@ -100,7 +104,23 @@ export const EntityCountsComponent = () => {
/>
</DataTable>
</div>
<div className="col-4">
<div className="col-3">
<DataTable
header="Associations"
value={tableData.association}
sortField="name"
sortOrder={1}
rowClassName={(rowData) => getRowClass(rowData)}
>
<Column field="name" header="Association Type" body={nameHyperlinkTemplate} />
<Column
field="dbCount"
header="Database Association Count"
body={(rowData) => <NumberTemplate number={rowData.dbCount} />}
/>
</DataTable>
</div>
<div className="col-3">
<DataTable
header="System"
value={tableData.system}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -370,8 +370,12 @@ export const GenericDataTable = (props) => {
{hasDetails && (
<Column
field="details"
editor={(props) => <EntityDetailsAction identifier={getIdentifier(props.rowData)} disabled={true} />}
body={(props) => <EntityDetailsAction identifier={getIdentifier(props)} disabled={isInEditMode} />}
editor={(props) => (
<EntityDetailsAction endpoint={endpoint} identifier={getIdentifier(props.rowData)} disabled={true} />
)}
body={(props) => (
<EntityDetailsAction endpoint={endpoint} identifier={getIdentifier(props)} disabled={isInEditMode} />
)}
showFilterMenu={false}
className={`text-center p-0 action-column ${isEditable ? 'visible' : 'hidden'}`}
bodyStyle={{ textAlign: 'center' }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export const ListDialogTemplate = ({ entities, handleOpen, getTextField, underli

const listTemplate = (item) => (
<div
className={`overflow-hidden text-overflow-ellipsis ${underline ? 'underline' : ''}`}
className={`overflow-hidden text-left text-overflow-ellipsis ${underline ? 'underline' : ''}`}
dangerouslySetInnerHTML={{ __html: item }}
/>
);
Expand Down
Loading

0 comments on commit e10f1fc

Please sign in to comment.