synapse-react-client 4.0.46 → 4.0.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SWC.index.js +1 -1
- package/dist/aridhia-queries/useSubmitAridhiaDar.js +2 -2
- package/dist/aridhia-queries/useSubmitAridhiaDar.js.map +1 -1
- package/dist/components/AccessTokenPage/CreateAccessTokenModal.js +1 -1
- package/dist/components/AccessTokenPage/CreateAccessTokenModal.js.map +1 -1
- package/dist/components/AccountLevelBadges/AccountLevelBadges.js +1 -1
- package/dist/components/AccountLevelBadges/AccountLevelBadges.js.map +1 -1
- package/dist/components/AclEditor/AclEditor.test-utils.js +3 -5
- package/dist/components/AclEditor/AclEditor.test-utils.js.map +1 -1
- package/dist/components/Aridhia/AridhiaAccessStatus.d.ts.map +1 -1
- package/dist/components/Aridhia/AridhiaAccessStatus.js +43 -30
- package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
- package/dist/components/Aridhia/AridhiaDarStatusPopover.d.ts +6 -2
- package/dist/components/Aridhia/AridhiaDarStatusPopover.d.ts.map +1 -1
- package/dist/components/Aridhia/AridhiaDarStatusPopover.js +101 -31
- package/dist/components/Aridhia/AridhiaDarStatusPopover.js.map +1 -1
- package/dist/components/Aridhia/aridhiaAccessStatusUtils.d.ts +11 -9
- package/dist/components/Aridhia/aridhiaAccessStatusUtils.d.ts.map +1 -1
- package/dist/components/Aridhia/aridhiaAccessStatusUtils.js +24 -13
- package/dist/components/Aridhia/aridhiaAccessStatusUtils.js.map +1 -1
- package/dist/components/Authentication/LastLoginInfo.js +2 -2
- package/dist/components/Authentication/LastLoginInfo.js.map +1 -1
- package/dist/components/Authentication/RecoveryCodeForm.js +1 -1
- package/dist/components/Authentication/RecoveryCodeForm.js.map +1 -1
- package/dist/components/Authentication/RecoveryCodeGrid.js.map +1 -1
- package/dist/components/Authentication/TOTPForm.d.ts.map +1 -1
- package/dist/components/Authentication/TOTPForm.js +3 -3
- package/dist/components/Authentication/TOTPForm.js.map +1 -1
- package/dist/components/Authentication/index.d.ts +6 -6
- package/dist/components/Authentication/index.d.ts.map +1 -1
- package/dist/components/CannedRejectionDialog/CannedRejectionDialog.js +1 -1
- package/dist/components/CannedRejectionDialog/CannedRejectionDialog.js.map +1 -1
- package/dist/components/CardContainer/CardContainer.js +7 -7
- package/dist/components/CardContainer/CardContainer.js.map +1 -1
- package/dist/components/ChallengeRequirementsModal/ChallengeRequirementsModal.js +1 -1
- package/dist/components/ChallengeRequirementsModal/ChallengeRequirementsModal.js.map +1 -1
- package/dist/components/ChallengeSubmission/ChallengeSubmission.d.ts.map +1 -1
- package/dist/components/ChallengeSubmission/ChallengeSubmission.js +1 -1
- package/dist/components/ChallengeSubmission/ChallengeSubmission.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/SelectChallengeTeam.js +1 -1
- package/dist/components/ChallengeTeamWizard/SelectChallengeTeam.js.map +1 -1
- package/dist/components/CitationPopover/CitationPopoverUtils.js +2 -2
- package/dist/components/CitationPopover/CitationPopoverUtils.js.map +1 -1
- package/dist/components/CohortBuilder/CohortBuilder.css +1 -0
- package/dist/components/CohortBuilder/CohortBuilder.d.ts +35 -0
- package/dist/components/CohortBuilder/CohortBuilder.d.ts.map +1 -0
- package/dist/components/CohortBuilder/CohortBuilder.js +108 -0
- package/dist/components/CohortBuilder/CohortBuilder.js.map +1 -0
- package/dist/components/CohortBuilder/CohortBuilder.module.js +10 -0
- package/dist/components/CohortBuilder/CohortBuilder.module.js.map +1 -0
- package/dist/components/CohortBuilder/CohortBuilder.module.scss +20 -0
- package/dist/components/CohortBuilder/CohortFilesPanel.d.ts +16 -0
- package/dist/components/CohortBuilder/CohortFilesPanel.d.ts.map +1 -0
- package/dist/components/CohortBuilder/CohortFilesPanel.js +124 -0
- package/dist/components/CohortBuilder/CohortFilesPanel.js.map +1 -0
- package/dist/components/CohortBuilder/cohortHandOff.d.ts +25 -0
- package/dist/components/CohortBuilder/cohortHandOff.d.ts.map +1 -0
- package/dist/components/CohortBuilder/cohortHandOff.js +26 -0
- package/dist/components/CohortBuilder/cohortHandOff.js.map +1 -0
- package/dist/components/ColumnFilter/ColumnFilter.d.ts.map +1 -1
- package/dist/components/ColumnFilter/ColumnFilter.js +14 -13
- package/dist/components/ColumnFilter/ColumnFilter.js.map +1 -1
- package/dist/components/DataExplorer/DataExplorer.d.ts.map +1 -1
- package/dist/components/DataExplorer/DataExplorer.js.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts +11 -2
- package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.js +115 -109
- package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/NumberColumn.js +1 -1
- package/dist/components/DataGrid/columns/NumberColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/NumberOrEnumColumn.d.ts +20 -0
- package/dist/components/DataGrid/columns/NumberOrEnumColumn.d.ts.map +1 -0
- package/dist/components/DataGrid/columns/NumberOrEnumColumn.js +18 -0
- package/dist/components/DataGrid/columns/NumberOrEnumColumn.js.map +1 -0
- package/dist/components/DataGrid/components/contextMenu.js +3 -3
- package/dist/components/DataGrid/components/contextMenu.js.map +1 -1
- package/dist/components/DataGrid/hooks/useGridUndoRedo.d.ts.map +1 -1
- package/dist/components/DataGrid/hooks/useGridUndoRedo.js +9 -7
- package/dist/components/DataGrid/hooks/useGridUndoRedo.js.map +1 -1
- package/dist/components/DataGrid/hooks/useStack.d.ts +1 -1
- package/dist/components/DataGrid/hooks/useStack.js +2 -2
- package/dist/components/DataGrid/hooks/useStack.js.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.js +47 -42
- package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
- package/dist/components/DataGrid/utils/extractColumnValidationMessages.js +7 -7
- package/dist/components/DataGrid/utils/extractColumnValidationMessages.js.map +1 -1
- package/dist/components/DataGrid/utils/json-rx/JsonRx.js +2 -2
- package/dist/components/DataGrid/utils/json-rx/JsonRx.js.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
- package/dist/components/DownloadCart/MeetAccessRequirementCard.js +1 -1
- package/dist/components/DownloadCart/MeetAccessRequirementCard.js.map +1 -1
- package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js +5 -5
- package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js.map +1 -1
- package/dist/components/EntityFinder/details/view/DetailsView.d.ts.map +1 -1
- package/dist/components/EntityFinder/details/view/DetailsView.js +4 -4
- package/dist/components/EntityFinder/details/view/DetailsView.js.map +1 -1
- package/dist/components/EntityHeaderTable/EntityHeaderTable.js +4 -4
- package/dist/components/EntityHeaderTable/Filter.d.ts.map +1 -1
- package/dist/components/EntityHeaderTable/Filter.js +1 -1
- package/dist/components/EntityHeaderTable/Filter.js.map +1 -1
- package/dist/components/Evaluation/EvaluationRoundEditor.js.map +1 -1
- package/dist/components/FeaturedDataTabs/FacetPlotsCard.d.ts.map +1 -1
- package/dist/components/FeaturedDataTabs/FacetPlotsCard.js +80 -84
- package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
- package/dist/components/FormTemplateEditor/FormStructurePanel.js +7 -7
- package/dist/components/FormTemplateEditor/StepCard.js +9 -9
- package/dist/components/FormTemplateEditor/schemaFieldUtils.js +2 -2
- package/dist/components/FormTemplateEditor/schemaFieldUtils.js.map +1 -1
- package/dist/components/FullTextSearch/FullTextSearch.js +8 -8
- package/dist/components/GenericCard/CardUtils.js.map +1 -1
- package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js +1 -1
- package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js.map +1 -1
- package/dist/components/GenericCard/DuoTermTags/duoTerms.js +1 -1
- package/dist/components/GenericCard/DuoTermTags/duoTerms.js.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.js +37 -37
- package/dist/components/GoalsV3/GoalsV3.js +1 -1
- package/dist/components/GoalsV3/GoalsV3.js.map +1 -1
- package/dist/components/HexGrid/HexGrid.d.ts +3 -1
- package/dist/components/HexGrid/HexGrid.d.ts.map +1 -1
- package/dist/components/HexGrid/HexGrid.js +14 -13
- package/dist/components/HexGrid/HexGrid.js.map +1 -1
- package/dist/components/IconSvg/index.d.ts +1 -1
- package/dist/components/IconSvg/index.d.ts.map +1 -1
- package/dist/components/IconSvg/index.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js +3 -3
- package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js.map +1 -1
- package/dist/components/Markdown/MarkdownEditor.js +1 -1
- package/dist/components/Markdown/MarkdownEditor.js.map +1 -1
- package/dist/components/Markdown/widget/index.d.ts +1 -1
- package/dist/components/Markdown/widget/index.d.ts.map +1 -1
- package/dist/components/ModalDownload/ModalDownload.d.ts.map +1 -1
- package/dist/components/ModalDownload/ModalDownload.js +2 -1
- package/dist/components/ModalDownload/ModalDownload.js.map +1 -1
- package/dist/components/Plot/BarPlot.js +1 -1
- package/dist/components/Plot/BarPlot.js.map +1 -1
- package/dist/components/Plot/PlotPanelHeader.d.ts +3 -2
- package/dist/components/Plot/PlotPanelHeader.d.ts.map +1 -1
- package/dist/components/Plot/PlotPanelHeader.js.map +1 -1
- package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js +1 -1
- package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceGraph.d.ts.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceGraph.js +3 -3
- package/dist/components/ProvenanceGraph/ProvenanceGraph.js.map +1 -1
- package/dist/components/QueryBuilder/FilterConditionRow.d.ts.map +1 -1
- package/dist/components/QueryBuilder/FilterConditionRow.js +28 -27
- package/dist/components/QueryBuilder/FilterConditionRow.js.map +1 -1
- package/dist/components/QueryBuilder/FilterGroupNode.d.ts.map +1 -1
- package/dist/components/QueryBuilder/FilterGroupNode.js +91 -75
- package/dist/components/QueryBuilder/FilterGroupNode.js.map +1 -1
- package/dist/components/QueryBuilder/QueryBuilderControls.css +1 -1
- package/dist/components/QueryBuilder/QueryBuilderControls.d.ts.map +1 -1
- package/dist/components/QueryBuilder/QueryBuilderControls.js +91 -79
- package/dist/components/QueryBuilder/QueryBuilderControls.js.map +1 -1
- package/dist/components/QueryBuilder/QueryBuilderControls.module.js +11 -11
- package/dist/components/QueryBuilder/QueryBuilderControls.module.js.map +1 -1
- package/dist/components/QueryBuilder/QueryBuilderControls.module.scss +2 -0
- package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts +2 -0
- package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts.map +1 -1
- package/dist/components/QueryBuilder/QueryBuilderInternalContext.js.map +1 -1
- package/dist/components/QueryBuilder/queryBuilderLimits.d.ts +18 -0
- package/dist/components/QueryBuilder/queryBuilderLimits.d.ts.map +1 -0
- package/dist/components/QueryBuilder/queryBuilderLimits.js +38 -0
- package/dist/components/QueryBuilder/queryBuilderLimits.js.map +1 -0
- package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts +0 -8
- package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts.map +1 -1
- package/dist/components/QueryBuilder/queryBuilderMetadata.js +6 -9
- package/dist/components/QueryBuilder/queryBuilderMetadata.js.map +1 -1
- package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts +5 -4
- package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts.map +1 -1
- package/dist/components/QueryBuilder/queryBuilderTranslation.js +58 -33
- package/dist/components/QueryBuilder/queryBuilderTranslation.js.map +1 -1
- package/dist/components/QueryBuilder/useQBCombinedSql.d.ts.map +1 -1
- package/dist/components/QueryBuilder/useQBCombinedSql.js +4 -4
- package/dist/components/QueryBuilder/useQBCombinedSql.js.map +1 -1
- package/dist/components/QueryBuilder/useQBValueDisplayName.d.ts.map +1 -1
- package/dist/components/QueryBuilder/useQBValueDisplayName.js +5 -5
- package/dist/components/QueryBuilder/useQBValueDisplayName.js.map +1 -1
- package/dist/components/QuerySortSelector.js +5 -5
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +21 -21
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
- package/dist/components/QueryWrapper/AggregateQueryErrorNotice.d.ts +20 -0
- package/dist/components/QueryWrapper/AggregateQueryErrorNotice.d.ts.map +1 -0
- package/dist/components/QueryWrapper/AggregateQueryErrorNotice.js +50 -0
- package/dist/components/QueryWrapper/AggregateQueryErrorNotice.js.map +1 -0
- package/dist/components/QueryWrapper/TableQueryUseQueryOptions.d.ts +5 -3
- package/dist/components/QueryWrapper/TableQueryUseQueryOptions.d.ts.map +1 -1
- package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js +7 -3
- package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js.map +1 -1
- package/dist/components/QueryWrapper/downloadListFiles.d.ts +25 -0
- package/dist/components/QueryWrapper/downloadListFiles.d.ts.map +1 -0
- package/dist/components/QueryWrapper/downloadListFiles.js +39 -0
- package/dist/components/QueryWrapper/downloadListFiles.js.map +1 -0
- package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.d.ts +16 -0
- package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.d.ts.map +1 -0
- package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.js +50 -0
- package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.js.map +1 -0
- package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.d.ts +4 -1
- package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.d.ts.map +1 -1
- package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.js +15 -28
- package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.js.map +1 -1
- package/dist/components/QueryWrapper/useOnQueryDataChange.d.ts.map +1 -1
- package/dist/components/QueryWrapper/useOnQueryDataChange.js +7 -6
- package/dist/components/QueryWrapper/useOnQueryDataChange.js.map +1 -1
- package/dist/components/QueryWrapperErrorBoundary.d.ts +3 -1
- package/dist/components/QueryWrapperErrorBoundary.d.ts.map +1 -1
- package/dist/components/QueryWrapperErrorBoundary.js +26 -21
- package/dist/components/QueryWrapperErrorBoundary.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/LastUpdatedOn.js +7 -7
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +2 -2
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +34 -32
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperSynapsePlot.js +7 -7
- package/dist/components/QueryWrapperPlotNav/UseRowSet.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/UseRowSet.js +12 -12
- package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
- package/dist/components/RowDataTable/CategorizedRowDataTable.css +1 -0
- package/dist/components/RowDataTable/CategorizedRowDataTable.d.ts +33 -0
- package/dist/components/RowDataTable/CategorizedRowDataTable.d.ts.map +1 -0
- package/dist/components/RowDataTable/CategorizedRowDataTable.js +64 -0
- package/dist/components/RowDataTable/CategorizedRowDataTable.js.map +1 -0
- package/dist/components/RowDataTable/CategorizedRowDataTable.module.js +8 -0
- package/dist/components/RowDataTable/CategorizedRowDataTable.module.js.map +1 -0
- package/dist/components/RowDataTable/CategorizedRowDataTable.module.scss +18 -0
- package/dist/components/RowDataTable/RowDataTable.d.ts +13 -0
- package/dist/components/RowDataTable/RowDataTable.d.ts.map +1 -1
- package/dist/components/RowDataTable/RowDataTable.js +25 -8
- package/dist/components/RowDataTable/RowDataTable.js.map +1 -1
- package/dist/components/RssFeedCards/RssFeedCards.js +1 -1
- package/dist/components/RssFeedCards/RssFeedCards.js.map +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.d.ts.map +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.js +2 -2
- package/dist/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.js.map +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/template/ObjectFieldTemplate.js +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/template/ObjectFieldTemplate.js.map +1 -1
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts +17 -9
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -1
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +39 -30
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
- package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js +24 -24
- package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
- package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.js +8 -8
- package/dist/components/SynapseChat/SynapseChatMessage.js +1 -1
- package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
- package/dist/components/SynapseForm/NavButtons.js.map +1 -1
- package/dist/components/SynapseForm/StepsSideNav.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/HighlightedTypography.js +1 -1
- package/dist/components/SynapseSearchPageResults/HighlightedTypography.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.d.ts.map +1 -1
- package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js +3 -3
- package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js.map +1 -1
- package/dist/components/SynapseTable/RowSelection/RowSelectionControls.d.ts.map +1 -1
- package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js +38 -44
- package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
- package/dist/components/SynapseTable/RowSelection/RowSelectionUI.js +4 -4
- package/dist/components/SynapseTable/SqlEditor.js +7 -7
- package/dist/components/SynapseTable/SynapseTable.js +8 -8
- package/dist/components/SynapseTable/SynapseTable.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableRenderers.d.ts.map +1 -1
- package/dist/components/SynapseTable/SynapseTableRenderers.js +73 -72
- package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableUtils.js +1 -1
- package/dist/components/SynapseTable/SynapseTableUtils.js.map +1 -1
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.d.ts.map +1 -1
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js +44 -45
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js.map +1 -1
- package/dist/components/SynapseTable/datasets/DatasetEditorVersionCell.js +1 -1
- package/dist/components/SynapseTable/datasets/DatasetEditorVersionCell.js.map +1 -1
- package/dist/components/SynapseTable/datasets/DatasetItemsEditor.d.ts.map +1 -1
- package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js +142 -142
- package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
- package/dist/components/SynapseTable/export/ExportToAnalysisPlatformDialog.js +4 -4
- package/dist/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.js +12 -12
- package/dist/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.js.map +1 -1
- package/dist/components/SynapseTable/table-top/ColumnSelection.js +6 -6
- package/dist/components/SynapseTable/table-top/DownloadOptions.d.ts +0 -1
- package/dist/components/SynapseTable/table-top/DownloadOptions.d.ts.map +1 -1
- package/dist/components/SynapseTable/table-top/DownloadOptions.js +64 -57
- package/dist/components/SynapseTable/table-top/DownloadOptions.js.map +1 -1
- package/dist/components/SynapseTable/usePrefetchTableData.d.ts.map +1 -1
- package/dist/components/SynapseTable/usePrefetchTableData.js +3 -3
- package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorTestUtils.js +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorTestUtils.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js +2 -2
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js +60 -60
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js.map +1 -1
- package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js +1 -1
- package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js.map +1 -1
- package/dist/components/TanStackTable/StyledTanStackTable.d.ts.map +1 -1
- package/dist/components/TanStackTable/StyledTanStackTable.js +1 -4
- package/dist/components/TanStackTable/StyledTanStackTable.js.map +1 -1
- package/dist/components/TermsAndConditions/TermsAndConditions.js.map +1 -1
- package/dist/components/TotalQueryResults.js +14 -14
- package/dist/components/Webhook/WebhookDashboard.d.ts.map +1 -1
- package/dist/components/Webhook/WebhookDashboard.js +2 -2
- package/dist/components/Webhook/WebhookDashboard.js.map +1 -1
- package/dist/components/download_list/DownloadConfirmationUtils.d.ts +5 -1
- package/dist/components/download_list/DownloadConfirmationUtils.d.ts.map +1 -1
- package/dist/components/download_list/DownloadConfirmationUtils.js +2 -2
- package/dist/components/download_list/DownloadConfirmationUtils.js.map +1 -1
- package/dist/components/error/ErrorBanner.d.ts.map +1 -1
- package/dist/components/error/ErrorBanner.js +49 -46
- package/dist/components/error/ErrorBanner.js.map +1 -1
- package/dist/components/file/upload/MultiFileUploadProgress.js +5 -5
- package/dist/components/row_renderers/Dataset.d.ts.map +1 -1
- package/dist/components/row_renderers/Dataset.js +6 -6
- package/dist/components/row_renderers/Dataset.js.map +1 -1
- package/dist/components/row_renderers/Funder.js +1 -1
- package/dist/components/row_renderers/Funder.js.map +1 -1
- package/dist/components/widgets/ElementWithTooltip.d.ts +6 -1
- package/dist/components/widgets/ElementWithTooltip.d.ts.map +1 -1
- package/dist/components/widgets/ElementWithTooltip.js +22 -14
- package/dist/components/widgets/ElementWithTooltip.js.map +1 -1
- package/dist/components/widgets/RangeSlider/RangeSlider.d.ts.map +1 -1
- package/dist/components/widgets/RangeSlider/RangeSlider.js +1 -1
- package/dist/components/widgets/RangeSlider/RangeSlider.js.map +1 -1
- package/dist/components/widgets/SynapseImage.js +1 -1
- package/dist/components/widgets/SynapseImage.js.map +1 -1
- package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts +16 -5
- package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/FacetNavPanel.js +115 -102
- package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
- package/dist/components/widgets/facet-nav/FacetPlotLegendList.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/FacetPlotLegendList.js +4 -2
- package/dist/components/widgets/facet-nav/FacetPlotLegendList.js.map +1 -1
- package/dist/components/widgets/facet-nav/FacetPlotLegendTable.js +1 -1
- package/dist/components/widgets/facet-nav/FacetPlotLegendTable.js.map +1 -1
- package/dist/components/widgets/facet-nav/FacetPlotLegendUtils.d.ts +2 -0
- package/dist/components/widgets/facet-nav/FacetPlotLegendUtils.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/FacetPlotLegendUtils.js.map +1 -1
- package/dist/components/widgets/facet-nav/PlotsContainer.d.ts +7 -0
- package/dist/components/widgets/facet-nav/PlotsContainer.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/PlotsContainer.js +47 -45
- package/dist/components/widgets/facet-nav/PlotsContainer.js.map +1 -1
- package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js +4 -4
- package/dist/components/widgets/facet-nav/useFacetPlots.d.ts +3 -2
- package/dist/components/widgets/facet-nav/useFacetPlots.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/useFacetPlots.js +16 -15
- package/dist/components/widgets/facet-nav/useFacetPlots.js.map +1 -1
- package/dist/components/widgets/query-filter/CombinedRangeFacetFilter.js +4 -4
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts +2 -2
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js +62 -60
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.d.ts +2 -0
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js +10 -10
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts +1 -0
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js +2 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUtils.d.ts +3 -2
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUtils.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUtils.js.map +1 -1
- package/dist/components/widgets/query-filter/FacetFilterControls.d.ts +3 -2
- package/dist/components/widgets/query-filter/FacetFilterControls.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/FacetFilterControls.js +63 -62
- package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
- package/dist/components/widgets/query-filter/JsonColumnFacetFilters.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/JsonColumnFacetFilters.js +30 -29
- package/dist/components/widgets/query-filter/JsonColumnFacetFilters.js.map +1 -1
- package/dist/components/widgets/query-filter/RangeFacetFilter.js +5 -5
- package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.d.ts +53 -0
- package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.d.ts.map +1 -0
- package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.js +391 -0
- package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.js.map +1 -0
- package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.d.ts +41 -0
- package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.d.ts.map +1 -0
- package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.js +379 -0
- package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.js.map +1 -0
- package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.d.ts +26 -0
- package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.d.ts.map +1 -0
- package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.js +112 -0
- package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.js.map +1 -0
- package/dist/mocks/mockAnnotationColumns.d.ts.map +1 -1
- package/dist/mocks/mockAnnotationColumns.js +1 -1
- package/dist/mocks/mockAnnotationColumns.js.map +1 -1
- package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts +9 -0
- package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers/aridhiaHandlers.js +24 -15
- package/dist/mocks/msw/handlers/aridhiaHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/asyncJobHandlers.d.ts +21 -2
- package/dist/mocks/msw/handlers/asyncJobHandlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers/asyncJobHandlers.js +30 -22
- package/dist/mocks/msw/handlers/asyncJobHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/cohortBuilderHandlers.d.ts +27 -0
- package/dist/mocks/msw/handlers/cohortBuilderHandlers.d.ts.map +1 -0
- package/dist/mocks/msw/handlers/cohortBuilderHandlers.js +158 -0
- package/dist/mocks/msw/handlers/cohortBuilderHandlers.js.map +1 -0
- package/dist/mocks/msw/handlers/subscriptionHandlers.js +1 -1
- package/dist/mocks/msw/handlers/subscriptionHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/userProfileHandlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers/userProfileHandlers.js +2 -2
- package/dist/mocks/msw/handlers/userProfileHandlers.js.map +1 -1
- package/dist/mocks/query/mockColumnCategoryTable.d.ts +19 -0
- package/dist/mocks/query/mockColumnCategoryTable.d.ts.map +1 -0
- package/dist/mocks/query/mockColumnCategoryTable.js +188 -0
- package/dist/mocks/query/mockColumnCategoryTable.js.map +1 -0
- package/dist/stories/ColorPaletteInspector.d.ts.map +1 -1
- package/dist/stories/ColorPaletteInspector.js +2 -2
- package/dist/stories/ColorPaletteInspector.js.map +1 -1
- package/dist/style/components/facet_nav/_facet-nav-panel.scss +8 -0
- package/dist/style/main.css +1 -1
- package/dist/synapse-queries/auth/useOIDC.js +2 -2
- package/dist/synapse-queries/auth/useOIDC.js.map +1 -1
- package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.js +2 -2
- package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.js.map +1 -1
- package/dist/synapse-queries/challenge/useChallenge.js +2 -2
- package/dist/synapse-queries/challenge/useChallenge.js.map +1 -1
- package/dist/synapse-queries/chat/useChat.js +8 -8
- package/dist/synapse-queries/chat/useChat.js.map +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.js +10 -10
- package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useAccessRequirements.js +24 -24
- package/dist/synapse-queries/dataaccess/useAccessRequirements.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useDataAccessSubmission.js +4 -4
- package/dist/synapse-queries/dataaccess/useDataAccessSubmission.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useEDuc.js +6 -6
- package/dist/synapse-queries/dataaccess/useEDuc.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useFormTemplate.js +4 -4
- package/dist/synapse-queries/dataaccess/useFormTemplate.js.map +1 -1
- package/dist/synapse-queries/download/index.js +2 -2
- package/dist/synapse-queries/download/useDownloadList.d.ts +5 -0
- package/dist/synapse-queries/download/useDownloadList.d.ts.map +1 -1
- package/dist/synapse-queries/download/useDownloadList.js +14 -13
- package/dist/synapse-queries/download/useDownloadList.js.map +1 -1
- package/dist/synapse-queries/entity/useEntity.d.ts.map +1 -1
- package/dist/synapse-queries/entity/useEntity.js +20 -20
- package/dist/synapse-queries/entity/useEntity.js.map +1 -1
- package/dist/synapse-queries/entity/useExportToADWorkbench.d.ts.map +1 -1
- package/dist/synapse-queries/entity/useExportToADWorkbench.js +2 -1
- package/dist/synapse-queries/entity/useExportToADWorkbench.js.map +1 -1
- package/dist/synapse-queries/entity/useExportToCavatica.d.ts.map +1 -1
- package/dist/synapse-queries/entity/useExportToCavatica.js +3 -2
- package/dist/synapse-queries/entity/useExportToCavatica.js.map +1 -1
- package/dist/synapse-queries/entity/useExportToPluto.d.ts.map +1 -1
- package/dist/synapse-queries/entity/useExportToPluto.js +2 -1
- package/dist/synapse-queries/entity/useExportToPluto.js.map +1 -1
- package/dist/synapse-queries/entity/useGetQueryResultBundle.d.ts.map +1 -1
- package/dist/synapse-queries/entity/useGetQueryResultBundle.js +4 -7
- package/dist/synapse-queries/entity/useGetQueryResultBundle.js.map +1 -1
- package/dist/synapse-queries/forum/useReply.js +6 -6
- package/dist/synapse-queries/forum/useReply.js.map +1 -1
- package/dist/synapse-queries/forum/useThread.js +14 -14
- package/dist/synapse-queries/forum/useThread.js.map +1 -1
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js +1 -1
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js.map +1 -1
- package/dist/synapse-queries/grid/useGridSession.js +4 -4
- package/dist/synapse-queries/grid/useGridSession.js.map +1 -1
- package/dist/synapse-queries/index.js +177 -176
- package/dist/synapse-queries/oauth/useOAuthClient.js +9 -9
- package/dist/synapse-queries/oauth/useOAuthClient.js.map +1 -1
- package/dist/synapse-queries/portal/usePortal.js +7 -7
- package/dist/synapse-queries/portal/usePortal.js.map +1 -1
- package/dist/synapse-queries/subscription/useSubscription.js +4 -4
- package/dist/synapse-queries/subscription/useSubscription.js.map +1 -1
- package/dist/synapse-queries/table/useTableUpdateTransaction.js +2 -2
- package/dist/synapse-queries/table/useTableUpdateTransaction.js.map +1 -1
- package/dist/synapse-queries/team/useTeam.js +2 -2
- package/dist/synapse-queries/team/useTeam.js.map +1 -1
- package/dist/synapse-queries/team/useTeamList.d.ts.map +1 -1
- package/dist/synapse-queries/team/useTeamList.js +3 -3
- package/dist/synapse-queries/team/useTeamList.js.map +1 -1
- package/dist/synapse-queries/team/useTeamMembers.js +8 -8
- package/dist/synapse-queries/team/useTeamMembers.js.map +1 -1
- package/dist/synapse-queries/termsOfService/useTermsOfService.js +2 -2
- package/dist/synapse-queries/termsOfService/useTermsOfService.js.map +1 -1
- package/dist/synapse-queries/trash/useTrashCan.js +4 -4
- package/dist/synapse-queries/trash/useTrashCan.js.map +1 -1
- package/dist/synapse-queries/user/useCertificationQuiz.js +2 -2
- package/dist/synapse-queries/user/useCertificationQuiz.js.map +1 -1
- package/dist/synapse-queries/user/useFavorites.js +4 -4
- package/dist/synapse-queries/user/useFavorites.js.map +1 -1
- package/dist/synapse-queries/user/useRevokeCertification.js +2 -2
- package/dist/synapse-queries/user/useRevokeCertification.js.map +1 -1
- package/dist/synapse-queries/wiki/useWiki.js +10 -10
- package/dist/synapse-queries/wiki/useWiki.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/ContentTypeUtils.js +4 -4
- package/dist/utils/ContentTypeUtils.js.map +1 -1
- package/dist/utils/PermissionLevelToAccessType.js +1 -1
- package/dist/utils/PermissionLevelToAccessType.js.map +1 -1
- package/dist/utils/analytics/useGoogleAnalytics.js +1 -1
- package/dist/utils/analytics/useGoogleAnalytics.js.map +1 -1
- package/dist/utils/context/DocumentMetadataContext.js +1 -1
- package/dist/utils/context/DocumentMetadataContext.js.map +1 -1
- package/dist/utils/functions/AccessControlListUtils.d.ts.map +1 -1
- package/dist/utils/functions/AccessControlListUtils.js +3 -3
- package/dist/utils/functions/AccessControlListUtils.js.map +1 -1
- package/dist/utils/functions/ArrayUtils.js +2 -2
- package/dist/utils/functions/ArrayUtils.js.map +1 -1
- package/dist/utils/functions/FileHandleUtils.js +1 -1
- package/dist/utils/functions/FileHandleUtils.js.map +1 -1
- package/dist/utils/functions/RegularExpressions.js +1 -1
- package/dist/utils/functions/RegularExpressions.js.map +1 -1
- package/dist/utils/functions/StringUtils.d.ts.map +1 -1
- package/dist/utils/functions/StringUtils.js +1 -2
- package/dist/utils/functions/StringUtils.js.map +1 -1
- package/dist/utils/functions/deepLinkingUtils.js +2 -2
- package/dist/utils/functions/deepLinkingUtils.js.map +1 -1
- package/dist/utils/functions/enumerationFacet.d.ts +26 -0
- package/dist/utils/functions/enumerationFacet.d.ts.map +1 -0
- package/dist/utils/functions/enumerationFacet.js +27 -0
- package/dist/utils/functions/enumerationFacet.js.map +1 -0
- package/dist/utils/functions/facetCountUtils.d.ts +12 -0
- package/dist/utils/functions/facetCountUtils.d.ts.map +1 -0
- package/dist/utils/functions/facetCountUtils.js +9 -0
- package/dist/utils/functions/facetCountUtils.js.map +1 -0
- package/dist/utils/functions/getEndpoint.js.map +1 -1
- package/dist/utils/functions/getUserData.js +1 -1
- package/dist/utils/functions/getUserData.js.map +1 -1
- package/dist/utils/functions/queryUtils.d.ts +1 -1
- package/dist/utils/functions/queryUtils.d.ts.map +1 -1
- package/dist/utils/functions/queryUtils.js +26 -22
- package/dist/utils/functions/queryUtils.js.map +1 -1
- package/dist/utils/functions/testDownloadSpeed.d.ts.map +1 -1
- package/dist/utils/functions/testDownloadSpeed.js +17 -26
- package/dist/utils/functions/testDownloadSpeed.js.map +1 -1
- package/dist/utils/functions/unCamelCase.js +1 -1
- package/dist/utils/functions/unCamelCase.js.map +1 -1
- package/dist/utils/hooks/useGetInfoFromIds.js +5 -5
- package/dist/utils/hooks/useGetInfoFromIds.js.map +1 -1
- package/dist/utils/hooks/useImmutableTableQuery/TableQueryReducerActions.js +1 -1
- package/dist/utils/hooks/useImmutableTableQuery/TableQueryReducerActions.js.map +1 -1
- package/dist/utils/hooks/useLogin.d.ts.map +1 -1
- package/dist/utils/hooks/useLogin.js +5 -5
- package/dist/utils/hooks/useLogin.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useCreateFolderPath.js.map +1 -1
- package/dist/utils/jsonschema/collectTopLevelProperties.d.ts +6 -0
- package/dist/utils/jsonschema/collectTopLevelProperties.d.ts.map +1 -1
- package/dist/utils/jsonschema/collectTopLevelProperties.js +1 -1
- package/dist/utils/jsonschema/collectTopLevelProperties.js.map +1 -1
- package/dist/utils/jsonschema/getNumberOrEnumInfo.d.ts +22 -0
- package/dist/utils/jsonschema/getNumberOrEnumInfo.d.ts.map +1 -0
- package/dist/utils/jsonschema/getNumberOrEnumInfo.js +39 -0
- package/dist/utils/jsonschema/getNumberOrEnumInfo.js.map +1 -0
- package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.d.ts +1 -0
- package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.d.ts.map +1 -1
- package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.js +1 -1
- package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.js.map +1 -1
- package/dist/utils/jsonschema/getSchemaPropertyInfo.d.ts +5 -0
- package/dist/utils/jsonschema/getSchemaPropertyInfo.d.ts.map +1 -1
- package/dist/utils/jsonschema/getSchemaPropertyInfo.js +30 -15
- package/dist/utils/jsonschema/getSchemaPropertyInfo.js.map +1 -1
- package/dist/utils/jsonschema/submissionContext.js +2 -2
- package/dist/utils/jsonschema/submissionContext.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import "../../utils/SynapseConstants.js";
|
|
2
|
+
import { DATA_REFERENCE_COLUMN_NAME as e, PARTICIPANT_ID_COLUMN_NAME as t, REFERENCE_TYPE_COLUMN_NAME as n, STUDY_COLUMN_NAME as r } from "./cohortBuilderMockProfiles.js";
|
|
3
|
+
import { createSeededRandom as i } from "./cohortBuilderSyntheticData.js";
|
|
4
|
+
import { ColumnMultiValueFunction as a, ColumnSingleValueFilterOperator as o } from "@sage-bionetworks/synapse-types";
|
|
5
|
+
//#region src/mocks/cohortBuilder/cohortBuilderMockQueryEngine.ts
|
|
6
|
+
var s = 403, c = 403, l = "id", u = "name", d = "2026-10-01T00:00:00.000Z", f = 1e3, p = class extends Error {
|
|
7
|
+
status;
|
|
8
|
+
body;
|
|
9
|
+
constructor(e, t) {
|
|
10
|
+
super(t.reason), this.status = e, this.body = t;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
function m(e) {
|
|
14
|
+
return new p(400, {
|
|
15
|
+
concreteType: "org.sagebionetworks.repo.model.ErrorResponse",
|
|
16
|
+
reason: e
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function h(e) {
|
|
20
|
+
let { profile: i, dataAttributeNames: a } = e, o = 1, s = (e, t, n) => ({
|
|
21
|
+
id: String(o++),
|
|
22
|
+
name: e,
|
|
23
|
+
columnType: t,
|
|
24
|
+
facetType: n ? "enumeration" : void 0
|
|
25
|
+
});
|
|
26
|
+
return {
|
|
27
|
+
participants: [
|
|
28
|
+
s(t, "STRING", !1),
|
|
29
|
+
s(r, "STRING", !0),
|
|
30
|
+
...i.participantAttributes.map((e) => s(e.name, "STRING", !0)),
|
|
31
|
+
...a.map((e) => s(e, "STRING_LIST", !0))
|
|
32
|
+
],
|
|
33
|
+
dataReferences: [
|
|
34
|
+
s(l, "ENTITYID", !1),
|
|
35
|
+
s(u, "STRING", !1),
|
|
36
|
+
s(n, "STRING", !0),
|
|
37
|
+
s(r, "STRING", !0),
|
|
38
|
+
...a.map((e) => s(e, "STRING", !0))
|
|
39
|
+
]
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function g(e) {
|
|
43
|
+
let t = e.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`).replaceAll("%", ".*").replaceAll("_", ".");
|
|
44
|
+
return RegExp(`^${t}$`, "i");
|
|
45
|
+
}
|
|
46
|
+
function _(e, t) {
|
|
47
|
+
let n = Number(e), r = Number(t);
|
|
48
|
+
return Number.isFinite(n) && Number.isFinite(r) ? n - r : String(e).localeCompare(String(t));
|
|
49
|
+
}
|
|
50
|
+
function v(e, t, n) {
|
|
51
|
+
switch (t) {
|
|
52
|
+
case o.EQUAL:
|
|
53
|
+
case o.IN: return n.includes(String(e));
|
|
54
|
+
case o.LIKE: return n.some((t) => g(t).test(String(e)));
|
|
55
|
+
case o.NOT_EQUAL: return n.every((t) => String(e) !== t);
|
|
56
|
+
case o.GREATER_THAN: return _(e, n[0]) > 0;
|
|
57
|
+
case o.GREATER_THAN_OR_EQUAL: return _(e, n[0]) >= 0;
|
|
58
|
+
case o.LESS_THAN: return _(e, n[0]) < 0;
|
|
59
|
+
case o.LESS_THAN_OR_EQUAL: return _(e, n[0]) <= 0;
|
|
60
|
+
case o.BETWEEN: return _(e, n[0]) >= 0 && _(e, n[1]) <= 0;
|
|
61
|
+
default: throw m(`Unsupported operator: ${t}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function y(e, t) {
|
|
65
|
+
if (!(t.columnName in e)) throw m(`Column does not exist: ${t.columnName}`);
|
|
66
|
+
let n = e[t.columnName], r = Array.isArray(n) ? n.length === 0 : n === "";
|
|
67
|
+
return t.operator === o.IS_NULL ? r : t.operator === o.IS_NOT_NULL ? !r : (Array.isArray(n) ? n : [n]).some((e) => v(e, t.operator, t.values));
|
|
68
|
+
}
|
|
69
|
+
function b(e, t, n) {
|
|
70
|
+
if (!n.listColumnNames.has(t.columnName)) throw m(`${t.function} can only be used on a multi-value (list) column: ${t.columnName}`);
|
|
71
|
+
let r = e[t.columnName];
|
|
72
|
+
return t.function === a.HAS_LIKE ? t.values.some((e) => r.some((t) => g(e).test(t))) : r.some((e) => t.values.includes(e));
|
|
73
|
+
}
|
|
74
|
+
function x(e, t, n) {
|
|
75
|
+
if (!(t.columnName in e)) throw m(`Column does not exist: ${t.columnName}`);
|
|
76
|
+
return n.cohortValues.get(t.cohortName)?.has(String(e[t.columnName])) ?? !1;
|
|
77
|
+
}
|
|
78
|
+
function S(e, t, n) {
|
|
79
|
+
switch (t.concreteType) {
|
|
80
|
+
case "org.sagebionetworks.repo.model.table.FilterGroup": {
|
|
81
|
+
let r = t.children ?? [], i = t.operator === "OR" ? r.some((t) => S(e, t, n)) : r.every((t) => S(e, t, n));
|
|
82
|
+
return t.not ? !i : i;
|
|
83
|
+
}
|
|
84
|
+
case "org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter": return y(e, t);
|
|
85
|
+
case "org.sagebionetworks.repo.model.table.ColumnMultiValueFunctionQueryFilter": return b(e, t, n);
|
|
86
|
+
case "org.sagebionetworks.repo.model.table.ColumnCohortFilter": return x(e, t, n);
|
|
87
|
+
default: throw m(`The Cohort Builder mock does not support ${t.concreteType}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function C(e, t) {
|
|
91
|
+
let n = e[t.columnName], r = Array.isArray(n) ? n : [n];
|
|
92
|
+
return t.concreteType === "org.sagebionetworks.repo.model.table.FacetColumnValuesRequest" ? r.some((e) => t.facetValues.includes(String(e))) : r.some((e) => (t.min === void 0 || _(e, t.min) >= 0) && (t.max === void 0 || _(e, t.max) <= 0));
|
|
93
|
+
}
|
|
94
|
+
function w(e, n) {
|
|
95
|
+
let i = /* @__PURE__ */ new Map();
|
|
96
|
+
for (let n of e) {
|
|
97
|
+
let e = n[t], r = i.get(e);
|
|
98
|
+
r ? r.push(n) : i.set(e, [n]);
|
|
99
|
+
}
|
|
100
|
+
return Array.from(i.values(), (e) => {
|
|
101
|
+
let i = e[0], a = {
|
|
102
|
+
[t]: i[t],
|
|
103
|
+
[r]: i[r]
|
|
104
|
+
};
|
|
105
|
+
for (let e of n.profile.participantAttributes) a[e.name] = i[e.name];
|
|
106
|
+
for (let t of n.dataAttributeNames) a[t] = Array.from(new Set(e.map((e) => e[t]))).sort((e, t) => e.localeCompare(t));
|
|
107
|
+
return a;
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
function T(t, i) {
|
|
111
|
+
let a = new Set(t.map((t) => t[e]));
|
|
112
|
+
return Array.from(a, (e) => {
|
|
113
|
+
let t = i.references.get(e);
|
|
114
|
+
return {
|
|
115
|
+
[l]: t.id,
|
|
116
|
+
[u]: t.name,
|
|
117
|
+
[n]: t.referenceType,
|
|
118
|
+
[r]: t.study,
|
|
119
|
+
...t.attributes
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
function E(e) {
|
|
124
|
+
let t = 2166136261;
|
|
125
|
+
for (let n of e) t ^= n.codePointAt(0), t = Math.imul(t, 16777619);
|
|
126
|
+
return t >>> 0;
|
|
127
|
+
}
|
|
128
|
+
function D(e, t, n) {
|
|
129
|
+
let r = i(E(n))() - .5, a = -(1 / t) * Math.sign(r) * Math.log(1 - 2 * Math.abs(r));
|
|
130
|
+
return Math.max(0, Math.round(e + a));
|
|
131
|
+
}
|
|
132
|
+
function O(e, t) {
|
|
133
|
+
let n = /* @__PURE__ */ new Map();
|
|
134
|
+
for (let r of e) {
|
|
135
|
+
let e = r[t], i = typeof e == "object" ? e : [String(e)];
|
|
136
|
+
for (let e of i) n.set(e, (n.get(e) ?? 0) + 1);
|
|
137
|
+
}
|
|
138
|
+
return n;
|
|
139
|
+
}
|
|
140
|
+
function k(e, t, n, r, i) {
|
|
141
|
+
let a = Array.from(t).sort(([e, t], [n, r]) => r - t || e.localeCompare(n)), o = r?.facetPostProcessingConfig, s = o?.parameters;
|
|
142
|
+
if (o?.algorithm === "ROUNDING" && s?.concreteType === "org.sagebionetworks.repo.model.FacetRoundingParameters") {
|
|
143
|
+
let t = s.roundTo ?? 1;
|
|
144
|
+
return {
|
|
145
|
+
concreteType: "org.sagebionetworks.repo.model.table.FacetColumnResultBinnedValues",
|
|
146
|
+
columnName: e,
|
|
147
|
+
facetType: "enumeration",
|
|
148
|
+
binSize: t,
|
|
149
|
+
binnedValues: a.map(([e, r]) => ({
|
|
150
|
+
value: e,
|
|
151
|
+
binMin: Math.floor(r / t) * t,
|
|
152
|
+
isSelected: n.includes(e)
|
|
153
|
+
}))
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
let c = o?.algorithm === "NOISE" && s?.concreteType === "org.sagebionetworks.repo.model.FacetNoiseParameters" ? s.epsilon ?? 1 : void 0;
|
|
157
|
+
return {
|
|
158
|
+
concreteType: "org.sagebionetworks.repo.model.table.FacetColumnResultValues",
|
|
159
|
+
columnName: e,
|
|
160
|
+
facetType: "enumeration",
|
|
161
|
+
facetValues: a.map(([t, r]) => ({
|
|
162
|
+
value: t,
|
|
163
|
+
count: c === void 0 ? r : D(r, c, `${i}\u0000${e}\u0000${t}`),
|
|
164
|
+
isSelected: n.includes(t)
|
|
165
|
+
}))
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
function A(e) {
|
|
169
|
+
return `'${e.replaceAll("'", "''")}'`;
|
|
170
|
+
}
|
|
171
|
+
var j = {
|
|
172
|
+
EQUAL: "=",
|
|
173
|
+
NOT_EQUAL: "<>",
|
|
174
|
+
GREATER_THAN: ">",
|
|
175
|
+
GREATER_THAN_OR_EQUAL: ">=",
|
|
176
|
+
LESS_THAN: "<",
|
|
177
|
+
LESS_THAN_OR_EQUAL: "<=",
|
|
178
|
+
LIKE: "LIKE"
|
|
179
|
+
};
|
|
180
|
+
function M(e) {
|
|
181
|
+
switch (e.concreteType) {
|
|
182
|
+
case "org.sagebionetworks.repo.model.table.FilterGroup": {
|
|
183
|
+
let t = (e.children ?? []).map(M).join(` ${e.operator ?? "AND"} `);
|
|
184
|
+
return `${e.not ? "NOT " : ""}(${t})`;
|
|
185
|
+
}
|
|
186
|
+
case "org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter": {
|
|
187
|
+
let t = `"${e.columnName}"`;
|
|
188
|
+
switch (e.operator) {
|
|
189
|
+
case o.IN: return `${t} IN (${e.values.map(A).join(", ")})`;
|
|
190
|
+
case o.IS_NULL: return `${t} IS NULL`;
|
|
191
|
+
case o.IS_NOT_NULL: return `${t} IS NOT NULL`;
|
|
192
|
+
case o.BETWEEN: return `${t} BETWEEN ${A(e.values[0])} AND ${A(e.values[1])}`;
|
|
193
|
+
default: {
|
|
194
|
+
let n = j[e.operator], r = e.values.map((e) => `${t} ${n} ${A(e)}`);
|
|
195
|
+
return r.length === 1 ? r[0] : `(${r.join(" OR ")})`;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
case "org.sagebionetworks.repo.model.table.ColumnMultiValueFunctionQueryFilter": return `"${e.columnName}" ${e.function} (${e.values.map(A).join(", ")})`;
|
|
200
|
+
case "org.sagebionetworks.repo.model.table.ColumnCohortFilter": return `"${e.columnName}" IN COHORT(${e.cohortName})`;
|
|
201
|
+
default: return "";
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
function N(e, t) {
|
|
205
|
+
return !t || t.length === 0 ? e : [...e].sort((e, n) => {
|
|
206
|
+
for (let { column: r, direction: i } of t) {
|
|
207
|
+
let t = (e) => Array.isArray(e) ? e.join(",") : e, a = _(t(e[r]), t(n[r]));
|
|
208
|
+
if (a !== 0) return i === "DESC" ? -a : a;
|
|
209
|
+
}
|
|
210
|
+
return 0;
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
function P(e, t) {
|
|
214
|
+
if (t === e.participantsVirtualTableId) return "PARTICIPANTS";
|
|
215
|
+
if (t === e.dataVirtualTableId) return "DATA";
|
|
216
|
+
throw new p(404, {
|
|
217
|
+
concreteType: "org.sagebionetworks.repo.model.ErrorResponse",
|
|
218
|
+
reason: `The Cohort Builder mock has no table ${t}`
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
function F(e, t, n) {
|
|
222
|
+
return n === "FULL" ? t.aggregateDataPreview : {
|
|
223
|
+
suppressionThreshold: e.suppressionThreshold,
|
|
224
|
+
countSuppressionStrategy: e.countSuppressionStrategy,
|
|
225
|
+
facetPostProcessingConfig: e.facetPostProcessingConfig
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
function I(e, t, n) {
|
|
229
|
+
if (n && e === "PARTICIPANTS" && t & 1) throw new p(403, {
|
|
230
|
+
concreteType: "org.sagebionetworks.repo.model.table.RowSuppressionErrorResponse",
|
|
231
|
+
reason: "Row results are withheld because the query projects a quasi-identifier column. Re-run the query without requesting row results.",
|
|
232
|
+
errorCode: "ROW_SUPPRESSED",
|
|
233
|
+
rowSuppressionReasonCode: "QID_PROJECTED"
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
function L(e, t) {
|
|
237
|
+
if (!t) return;
|
|
238
|
+
let n = t.suppressionThreshold;
|
|
239
|
+
if (e > 0 && e < n) throw new p(403, {
|
|
240
|
+
concreteType: "org.sagebionetworks.repo.model.table.BelowThresholdErrorResponse",
|
|
241
|
+
reason: `The number of records matched by this query is below the minimum threshold of ${n} required to return a result.`,
|
|
242
|
+
errorCode: "BELOW_THRESHOLD",
|
|
243
|
+
suppressionThreshold: n
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
function R(e, t, n, r) {
|
|
247
|
+
let i = n.additionalFilters ?? [], a = n.selectedFacets ?? [], o = i.filter((e) => e.isDefiningCondition), s = i.filter((e) => !e.isDefiningCondition), c = {
|
|
248
|
+
...r,
|
|
249
|
+
listColumnNames: /* @__PURE__ */ new Set()
|
|
250
|
+
}, l = e.materialRows.filter((e) => o.every((t) => S(e, t, c))), u = t === "PARTICIPANTS" ? w(l, e) : T(l, e), d = (e) => u.filter((t) => s.every((e) => S(t, e, r)) && a.every((n) => n.columnName === e || C(t, n)));
|
|
251
|
+
return {
|
|
252
|
+
rows: d(),
|
|
253
|
+
ignoringFacetSelection: d
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
function z(e, t, n, r, i) {
|
|
257
|
+
let a = i.offset ?? 0;
|
|
258
|
+
return {
|
|
259
|
+
concreteType: "org.sagebionetworks.repo.model.table.QueryResult",
|
|
260
|
+
queryResults: {
|
|
261
|
+
concreteType: "org.sagebionetworks.repo.model.table.RowSet",
|
|
262
|
+
tableId: e,
|
|
263
|
+
headers: n,
|
|
264
|
+
rows: N(r, i.sort).slice(a, a + (i.limit ?? r.length)).map((e) => ({ values: t.map(({ name: t }) => {
|
|
265
|
+
let n = e[t];
|
|
266
|
+
return Array.isArray(n) ? JSON.stringify(n) : String(n);
|
|
267
|
+
}) }))
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
function B(e, t, n, r) {
|
|
272
|
+
let i = t.selectedFacets ?? [], a = JSON.stringify([t.additionalFilters ?? [], i]);
|
|
273
|
+
return e.filter((e) => e.facetType === "enumeration").map(({ name: e }) => {
|
|
274
|
+
let t = i.find((t) => t.columnName === e);
|
|
275
|
+
return k(e, O(n.ignoringFacetSelection(e), e), t?.concreteType === "org.sagebionetworks.repo.model.table.FacetColumnValuesRequest" ? t.facetValues : [], r, a);
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
function V(e, t) {
|
|
279
|
+
let n = t.map(M).filter(Boolean);
|
|
280
|
+
return `SELECT * FROM ${e}${n.length > 0 ? ` WHERE ${n.join(" AND ")}` : ""}`;
|
|
281
|
+
}
|
|
282
|
+
var H = 1e4, U = 5, W = /^[A-Za-z_]\w*$/, G = /^\s*SELECT\s+(\w+)\s+FROM\s+(syn\d+)\s*$/i;
|
|
283
|
+
function K(e, t = !1) {
|
|
284
|
+
return e.flatMap((e) => {
|
|
285
|
+
let n = t || e.isDefiningCondition === !0;
|
|
286
|
+
return e.concreteType === "org.sagebionetworks.repo.model.table.FilterGroup" ? K(e.children ?? [], n) : e.concreteType === "org.sagebionetworks.repo.model.table.ColumnCohortFilter" ? [{
|
|
287
|
+
filter: e,
|
|
288
|
+
isDefining: n
|
|
289
|
+
}] : [];
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
function q(e, t) {
|
|
293
|
+
let { name: n, query: r } = t;
|
|
294
|
+
if ((r.cohorts?.length ?? 0) > 0 || K(r.additionalFilters ?? []).length > 0) throw m(`Cohort '${n}' cannot reference other cohorts.`);
|
|
295
|
+
if ((r.sort?.length ?? 0) > 0 || r.limit !== void 0 || r.offset !== void 0) throw m(`Cohort '${n}' cannot use sort, limit or offset.`);
|
|
296
|
+
let i = G.exec(r.sql);
|
|
297
|
+
if (!i) throw m(`Cohort '${n}' must select exactly one plain column from a single table.`);
|
|
298
|
+
let [, a, o] = i, s = P(e.profile, o), c = h(e)[s === "PARTICIPANTS" ? "participants" : "dataReferences"], l = c.find((e) => e.name === a);
|
|
299
|
+
if (!l?.columnType || l.columnType.endsWith("_LIST")) throw m(`Cohort '${n}' must select a non-list column of ${o}: ${a}`);
|
|
300
|
+
return {
|
|
301
|
+
name: n,
|
|
302
|
+
query: r,
|
|
303
|
+
perspective: s,
|
|
304
|
+
columnName: a,
|
|
305
|
+
columnType: l.columnType,
|
|
306
|
+
columnModels: c
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
function J(e, t, n, r, i) {
|
|
310
|
+
let { rows: a } = R(e, t.perspective, t.query, {
|
|
311
|
+
listColumnNames: new Set(t.columnModels.filter((e) => e.columnType?.endsWith("_LIST")).map((e) => e.name)),
|
|
312
|
+
cohortValues: /* @__PURE__ */ new Map()
|
|
313
|
+
}), o = new Set(a.map((e) => String(e[t.columnName])));
|
|
314
|
+
if (o.size > i) throw new p(400, {
|
|
315
|
+
concreteType: "org.sagebionetworks.repo.model.ErrorResponse",
|
|
316
|
+
reason: `Cohort '${t.name}' exceeds the maximum of ${i} values.`,
|
|
317
|
+
errorCode: "COHORT_TOO_LARGE"
|
|
318
|
+
});
|
|
319
|
+
return r === "AGGREGATE_ONLY" && L(o.size, F(e.profile, n, r)), o;
|
|
320
|
+
}
|
|
321
|
+
function Y(e, t, n, r, i) {
|
|
322
|
+
let { filter: a, isDefining: o } = t, s = e.materialRows.length > 0 && a.columnName in e.materialRows[0] ? "STRING" : void 0, c = o ? s : r.find((e) => e.name === a.columnName)?.columnType;
|
|
323
|
+
if (c === void 0) throw m(`Column does not exist: ${a.columnName}`);
|
|
324
|
+
if (c !== n.columnType) throw m(`The column type of cohort '${a.cohortName}' (${n.columnType}) does not match ${a.columnName} (${c}).`);
|
|
325
|
+
let l = a.columnName === "individualId" || e.profile.participantAttributes.some((e) => e.name === a.columnName && e.isQuasiIdentifier);
|
|
326
|
+
if (i === "AGGREGATE_ONLY" && !l) throw new p(403, {
|
|
327
|
+
concreteType: "org.sagebionetworks.repo.model.ErrorResponse",
|
|
328
|
+
reason: `A cohort from an aggregate-only source can only filter a quasi-identifier column, and ${a.columnName} is not one.`
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
function X(e, t, n, r, i) {
|
|
332
|
+
let a = t.query.cohorts ?? [], o = K(t.query.additionalFilters ?? []);
|
|
333
|
+
if (a.length > U) throw m(`A query can define at most ${U} cohorts.`);
|
|
334
|
+
let s = /* @__PURE__ */ new Set();
|
|
335
|
+
for (let { name: e } of a) {
|
|
336
|
+
if (!W.test(e)) throw m(`Cohort name must be a simple identifier: ${e}`);
|
|
337
|
+
if (s.has(e)) throw m(`Cohort names must be unique: ${e}`);
|
|
338
|
+
s.add(e);
|
|
339
|
+
}
|
|
340
|
+
let c = new Set(o.map((e) => e.filter.cohortName));
|
|
341
|
+
for (let e of c) if (!s.has(e)) throw m(`Cohort is not defined: ${e}`);
|
|
342
|
+
for (let e of s) if (!c.has(e)) throw m(`Cohort is defined but never referenced: ${e}`);
|
|
343
|
+
let l = new Map(a.map((t) => [t.name, q(e, t)]));
|
|
344
|
+
for (let t of o) Y(e, t, l.get(t.filter.cohortName), r, n);
|
|
345
|
+
return new Map(Array.from(l, ([r, a]) => [r, J(e, a, t, n, i)]));
|
|
346
|
+
}
|
|
347
|
+
function Z(e, t, n, r) {
|
|
348
|
+
let i = P(e.profile, t.entityId), a = h(e)[i === "PARTICIPANTS" ? "participants" : "dataReferences"], o = new Set(a.filter((e) => e.columnType?.endsWith("_LIST")).map((e) => e.name)), s = t.partMask ?? 0, { query: c } = t, l = F(e.profile, t, n);
|
|
349
|
+
I(i, s, l !== void 0);
|
|
350
|
+
let u = R(e, i, c, {
|
|
351
|
+
listColumnNames: o,
|
|
352
|
+
cohortValues: X(e, t, n, a, r.maxCohortValues ?? 1e4)
|
|
353
|
+
});
|
|
354
|
+
L(u.rows.length, l);
|
|
355
|
+
let p = { concreteType: "org.sagebionetworks.repo.model.table.QueryResultBundle" }, m = a.map(({ id: e, name: t, columnType: n }) => ({
|
|
356
|
+
id: e,
|
|
357
|
+
name: t,
|
|
358
|
+
columnType: n
|
|
359
|
+
}));
|
|
360
|
+
return s & 1 && (p.queryResult = z(t.entityId, a, m, u.rows, c)), s & 2 && (p.queryCount = u.rows.length), s & 4 && (p.selectColumns = m), s & 8 && (p.maxRowsPerPage = f), s & 16 && (p.columnModels = a), s & 32 && (p.facets = B(a, c, u, l), p.facetPostProcessingApplied = l?.facetPostProcessingConfig !== void 0), s & 128 && (p.lastUpdatedOn = d), s & 256 && (p.combinedSql = V(t.entityId, c.additionalFilters ?? [])), p;
|
|
361
|
+
}
|
|
362
|
+
function Q(e, t, n, r = {}) {
|
|
363
|
+
try {
|
|
364
|
+
return {
|
|
365
|
+
status: 200,
|
|
366
|
+
body: Z(e, t, n, r)
|
|
367
|
+
};
|
|
368
|
+
} catch (e) {
|
|
369
|
+
if (e instanceof p) return {
|
|
370
|
+
status: e.status,
|
|
371
|
+
body: e.body
|
|
372
|
+
};
|
|
373
|
+
throw e;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
//#endregion
|
|
377
|
+
export { s as MOCK_BELOW_THRESHOLD_HTTP_STATUS, H as MOCK_MAX_COHORT_VALUES, c as MOCK_ROW_SUPPRESSED_HTTP_STATUS, h as getCohortBuilderColumnModels, Q as runCohortBuilderMockQuery };
|
|
378
|
+
|
|
379
|
+
//# sourceMappingURL=cohortBuilderMockQueryEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cohortBuilderMockQueryEngine.js","names":[],"sources":["../../../src/mocks/cohortBuilder/cohortBuilderMockQueryEngine.ts"],"sourcesContent":["import {\n BUNDLE_MASK_COMBINED_SQL,\n BUNDLE_MASK_LAST_UPDATED_ON,\n BUNDLE_MASK_QUERY_COLUMN_MODELS,\n BUNDLE_MASK_QUERY_COUNT,\n BUNDLE_MASK_QUERY_FACETS,\n BUNDLE_MASK_QUERY_MAX_ROWS_PER_PAGE,\n BUNDLE_MASK_QUERY_RESULTS,\n BUNDLE_MASK_QUERY_SELECT_COLUMNS,\n} from '@/utils/SynapseConstants'\nimport { AggregateDataConfiguration } from '@sage-bionetworks/synapse-client/generated/models/AggregateDataConfiguration'\nimport { BelowThresholdErrorResponse } from '@sage-bionetworks/synapse-client/generated/models/BelowThresholdErrorResponse'\nimport { ColumnModel } from '@sage-bionetworks/synapse-client/generated/models/ColumnModel'\nimport { ErrorResponse } from '@sage-bionetworks/synapse-client/generated/models/ErrorResponse'\nimport { FacetColumnResult } from '@sage-bionetworks/synapse-client/generated/models/FacetColumnResult'\nimport { QueryResultBundle } from '@sage-bionetworks/synapse-client/generated/models/QueryResultBundle'\nimport { RowSuppressionErrorResponse } from '@sage-bionetworks/synapse-client/generated/models/RowSuppressionErrorResponse'\nimport { TableQueryResult } from '@sage-bionetworks/synapse-client/generated/models/TableQueryResult'\nimport { TableSelectColumn } from '@sage-bionetworks/synapse-client/generated/models/TableSelectColumn'\nimport {\n CohortDefinition,\n ColumnCohortFilter,\n ColumnMultiValueFunction,\n ColumnMultiValueFunctionQueryFilter,\n ColumnSingleValueFilterOperator,\n ColumnSingleValueQueryFilter,\n FacetColumnRequest,\n Query,\n QueryBundleRequest,\n QueryFilter,\n SortItem,\n} from '@sage-bionetworks/synapse-types'\nimport {\n CohortBuilderMockProfile,\n DATA_REFERENCE_COLUMN_NAME,\n PARTICIPANT_ID_COLUMN_NAME,\n REFERENCE_TYPE_COLUMN_NAME,\n STUDY_COLUMN_NAME,\n} from './cohortBuilderMockProfiles'\nimport {\n CohortBuilderSyntheticData,\n createSeededRandom,\n MaterialRow,\n} from './cohortBuilderSyntheticData'\n\n/**\n * Which access tier the mocked caller has on the participants source:\n * - `FULL`: the caller met the access requirement (exact results, rows allowed).\n * - `AGGREGATE_ONLY`: authenticated but unapproved (count gate, post-processed\n * facets, no participant rows).\n */\nexport type CohortBuilderAccess = 'FULL' | 'AGGREGATE_ONLY'\n\nexport type CohortBuilderMockErrorBody =\n | ErrorResponse\n | BelowThresholdErrorResponse\n | RowSuppressionErrorResponse\n\nexport type CohortBuilderMockQueryResult =\n | { status: 200; body: QueryResultBundle }\n | { status: number; body: CohortBuilderMockErrorBody }\n\nexport const MOCK_BELOW_THRESHOLD_HTTP_STATUS = 403\nexport const MOCK_ROW_SUPPRESSED_HTTP_STATUS = 403\n\nconst DATA_VIRTUAL_TABLE_ID_COLUMN_NAME = 'id'\nconst DATA_VIRTUAL_TABLE_NAME_COLUMN_NAME = 'name'\nconst MOCK_LAST_UPDATED_ON = '2026-10-01T00:00:00.000Z'\nconst MOCK_MAX_ROWS_PER_PAGE = 1000\n\ntype CellValue = string | number | readonly string[]\ntype VirtualTableRow = Readonly<Record<string, CellValue>>\ntype Perspective = 'PARTICIPANTS' | 'DATA'\n\nclass MockQueryError extends Error {\n constructor(\n readonly status: number,\n readonly body: CohortBuilderMockErrorBody,\n ) {\n super(body.reason)\n }\n}\n\nfunction invalidQuery(reason: string): MockQueryError {\n return new MockQueryError(400, {\n concreteType: 'org.sagebionetworks.repo.model.ErrorResponse',\n reason,\n })\n}\n\n/** Column models of both VirtualTables, derived from the synthetic data's profile. */\nexport function getCohortBuilderColumnModels(data: CohortBuilderSyntheticData) {\n const { profile, dataAttributeNames } = data\n let nextColumnId = 1\n const column = (\n name: string,\n columnType: ColumnModel['columnType'],\n isFaceted: boolean,\n ): ColumnModel => ({\n id: String(nextColumnId++),\n name,\n columnType,\n facetType: isFaceted ? 'enumeration' : undefined,\n })\n const participants: ColumnModel[] = [\n column(PARTICIPANT_ID_COLUMN_NAME, 'STRING', false),\n column(STUDY_COLUMN_NAME, 'STRING', true),\n ...profile.participantAttributes.map(attribute =>\n column(attribute.name, 'STRING', true),\n ),\n ...dataAttributeNames.map(name => column(name, 'STRING_LIST', true)),\n ]\n const dataReferences: ColumnModel[] = [\n column(DATA_VIRTUAL_TABLE_ID_COLUMN_NAME, 'ENTITYID', false),\n column(DATA_VIRTUAL_TABLE_NAME_COLUMN_NAME, 'STRING', false),\n column(REFERENCE_TYPE_COLUMN_NAME, 'STRING', true),\n column(STUDY_COLUMN_NAME, 'STRING', true),\n ...dataAttributeNames.map(name => column(name, 'STRING', true)),\n ]\n return { participants, dataReferences }\n}\n\n// -----------------------------------------------------------------------------\n// Filter evaluation\n// -----------------------------------------------------------------------------\n\nfunction likeToRegExp(pattern: string): RegExp {\n const escaped = pattern\n .replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)\n .replaceAll('%', '.*')\n .replaceAll('_', '.')\n return new RegExp(`^${escaped}$`, 'i')\n}\n\nfunction compareCellValues(a: string | number, b: string | number): number {\n const aNumber = Number(a)\n const bNumber = Number(b)\n if (Number.isFinite(aNumber) && Number.isFinite(bNumber)) {\n return aNumber - bNumber\n }\n return String(a).localeCompare(String(b))\n}\n\nfunction singleValueMatches(\n value: string | number,\n operator: ColumnSingleValueFilterOperator,\n values: readonly string[],\n): boolean {\n switch (operator) {\n case ColumnSingleValueFilterOperator.EQUAL:\n case ColumnSingleValueFilterOperator.IN:\n return values.includes(String(value))\n case ColumnSingleValueFilterOperator.LIKE:\n return values.some(pattern => likeToRegExp(pattern).test(String(value)))\n case ColumnSingleValueFilterOperator.NOT_EQUAL:\n return values.every(v => String(value) !== v)\n case ColumnSingleValueFilterOperator.GREATER_THAN:\n return compareCellValues(value, values[0]) > 0\n case ColumnSingleValueFilterOperator.GREATER_THAN_OR_EQUAL:\n return compareCellValues(value, values[0]) >= 0\n case ColumnSingleValueFilterOperator.LESS_THAN:\n return compareCellValues(value, values[0]) < 0\n case ColumnSingleValueFilterOperator.LESS_THAN_OR_EQUAL:\n return compareCellValues(value, values[0]) <= 0\n case ColumnSingleValueFilterOperator.BETWEEN:\n return (\n compareCellValues(value, values[0]) >= 0 &&\n compareCellValues(value, values[1]) <= 0\n )\n default:\n throw invalidQuery(`Unsupported operator: ${operator}`)\n }\n}\n\nfunction singleValueFilterMatches(\n row: VirtualTableRow | MaterialRow,\n filter: ColumnSingleValueQueryFilter,\n): boolean {\n if (!(filter.columnName in row)) {\n throw invalidQuery(`Column does not exist: ${filter.columnName}`)\n }\n const cell = row[filter.columnName]\n const isEmpty = Array.isArray(cell) ? cell.length === 0 : cell === ''\n if (filter.operator === ColumnSingleValueFilterOperator.IS_NULL) {\n return isEmpty\n }\n if (filter.operator === ColumnSingleValueFilterOperator.IS_NOT_NULL) {\n return !isEmpty\n }\n const cellValues: readonly (string | number)[] = Array.isArray(cell)\n ? cell\n : [cell as string | number]\n return cellValues.some(value =>\n singleValueMatches(value, filter.operator, filter.values),\n )\n}\n\n/** What a filter needs beyond the row: which columns are lists, and the resolved values of each request-scoped cohort. */\ntype FilterContext = {\n listColumnNames: ReadonlySet<string>\n cohortValues: ReadonlyMap<string, ReadonlySet<string>>\n}\n\nfunction multiValueFilterMatches(\n row: VirtualTableRow | MaterialRow,\n filter: ColumnMultiValueFunctionQueryFilter,\n context: FilterContext,\n): boolean {\n if (!context.listColumnNames.has(filter.columnName)) {\n throw invalidQuery(\n `${filter.function} can only be used on a multi-value (list) column: ${filter.columnName}`,\n )\n }\n const cell = row[filter.columnName] as readonly string[]\n if (filter.function === ColumnMultiValueFunction.HAS_LIKE) {\n return filter.values.some(pattern =>\n cell.some(value => likeToRegExp(pattern).test(value)),\n )\n }\n return cell.some(value => filter.values.includes(value))\n}\n\nfunction cohortFilterMatches(\n row: VirtualTableRow | MaterialRow,\n filter: ColumnCohortFilter,\n context: FilterContext,\n): boolean {\n // A plain cohort filter must name a column of the queried table; a defining one is evaluated on MATERIAL rows.\n if (!(filter.columnName in row)) {\n throw invalidQuery(`Column does not exist: ${filter.columnName}`)\n }\n // An empty cohort expands to IN (NULL), which matches nothing.\n return (\n context.cohortValues\n .get(filter.cohortName)\n ?.has(String(row[filter.columnName])) ?? false\n )\n}\n\n/** Evaluates a query filter against one row. */\nfunction filterMatches(\n row: VirtualTableRow | MaterialRow,\n filter: QueryFilter,\n context: FilterContext,\n): boolean {\n switch (filter.concreteType) {\n case 'org.sagebionetworks.repo.model.table.FilterGroup': {\n const children = filter.children ?? []\n const matches =\n filter.operator === 'OR'\n ? children.some(child => filterMatches(row, child, context))\n : children.every(child => filterMatches(row, child, context))\n return filter.not ? !matches : matches\n }\n case 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter':\n return singleValueFilterMatches(row, filter)\n case 'org.sagebionetworks.repo.model.table.ColumnMultiValueFunctionQueryFilter':\n return multiValueFilterMatches(row, filter, context)\n case 'org.sagebionetworks.repo.model.table.ColumnCohortFilter':\n return cohortFilterMatches(row, filter, context)\n default:\n throw invalidQuery(\n `The Cohort Builder mock does not support ${filter.concreteType}`,\n )\n }\n}\n\nfunction facetSelectionMatches(\n row: VirtualTableRow,\n selection: FacetColumnRequest,\n): boolean {\n const cell = row[selection.columnName]\n const cellValues: readonly (string | number)[] = Array.isArray(cell)\n ? cell\n : [cell as string | number]\n if (\n selection.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnValuesRequest'\n ) {\n return cellValues.some(value =>\n selection.facetValues.includes(String(value)),\n )\n }\n return cellValues.some(\n value =>\n (selection.min === undefined ||\n compareCellValues(value, selection.min) >= 0) &&\n (selection.max === undefined ||\n compareCellValues(value, selection.max) <= 0),\n )\n}\n\n// -----------------------------------------------------------------------------\n// VirtualTable materialization (the defining SQL's GROUP BY)\n// -----------------------------------------------------------------------------\n\nfunction groupByParticipant(\n rows: readonly MaterialRow[],\n data: CohortBuilderSyntheticData,\n): VirtualTableRow[] {\n const byParticipant = new Map<string, MaterialRow[]>()\n for (const row of rows) {\n const participantId = row[PARTICIPANT_ID_COLUMN_NAME]\n const group = byParticipant.get(participantId)\n if (group) {\n group.push(row)\n } else {\n byParticipant.set(participantId, [row])\n }\n }\n return Array.from(byParticipant.values(), group => {\n const first = group[0]\n const participantRow: Record<string, CellValue> = {\n [PARTICIPANT_ID_COLUMN_NAME]: first[PARTICIPANT_ID_COLUMN_NAME],\n [STUDY_COLUMN_NAME]: first[STUDY_COLUMN_NAME],\n }\n for (const attribute of data.profile.participantAttributes) {\n participantRow[attribute.name] = first[attribute.name]\n }\n for (const name of data.dataAttributeNames) {\n participantRow[name] = Array.from(\n new Set(group.map(row => row[name])),\n ).sort((a, b) => a.localeCompare(b))\n }\n return participantRow\n })\n}\n\nfunction groupByDataReference(\n rows: readonly MaterialRow[],\n data: CohortBuilderSyntheticData,\n): VirtualTableRow[] {\n const referenceIds = new Set(rows.map(row => row[DATA_REFERENCE_COLUMN_NAME]))\n return Array.from(referenceIds, referenceId => {\n const reference = data.references.get(referenceId)!\n return {\n [DATA_VIRTUAL_TABLE_ID_COLUMN_NAME]: reference.id,\n [DATA_VIRTUAL_TABLE_NAME_COLUMN_NAME]: reference.name,\n [REFERENCE_TYPE_COLUMN_NAME]: reference.referenceType,\n [STUDY_COLUMN_NAME]: reference.study,\n ...reference.attributes,\n }\n })\n}\n\n// -----------------------------------------------------------------------------\n// Facets and post-processing\n// -----------------------------------------------------------------------------\n\nfunction hashString(value: string): number {\n // FNV-1a, 32-bit\n let hash = 0x811c9dc5\n for (const character of value) {\n hash ^= character.codePointAt(0)!\n hash = Math.imul(hash, 0x01000193)\n }\n return hash >>> 0\n}\n\n/**\n * Adds Laplace noise (scale 1/epsilon) and clamps at zero, like the backend's\n * NOISE algorithm. The mock derives the noise from `noiseKey` so a re-render of\n * the same query shows the same counts; the backend re-samples per execution.\n */\nfunction addLaplaceNoise(\n count: number,\n epsilon: number,\n noiseKey: string,\n): number {\n const u = createSeededRandom(hashString(noiseKey))() - 0.5\n const noise = -(1 / epsilon) * Math.sign(u) * Math.log(1 - 2 * Math.abs(u))\n return Math.max(0, Math.round(count + noise))\n}\n\nfunction countFacetValues(\n rows: readonly VirtualTableRow[],\n columnName: string,\n): Map<string, number> {\n const counts = new Map<string, number>()\n for (const row of rows) {\n const cell = row[columnName]\n const values: readonly string[] =\n typeof cell === 'object' ? cell : [String(cell)]\n for (const value of values) {\n counts.set(value, (counts.get(value) ?? 0) + 1)\n }\n }\n return counts\n}\n\nfunction buildFacet(\n columnName: string,\n counts: ReadonlyMap<string, number>,\n selectedValues: readonly string[],\n aggregateConfig: AggregateDataConfiguration | undefined,\n noiseKeyPrefix: string,\n): FacetColumnResult {\n const sortedCounts = Array.from(counts).sort(\n ([valueA, countA], [valueB, countB]) =>\n countB - countA || valueA.localeCompare(valueB),\n )\n const postProcessing = aggregateConfig?.facetPostProcessingConfig\n const parameters = postProcessing?.parameters\n if (\n postProcessing?.algorithm === 'ROUNDING' &&\n parameters?.concreteType ===\n 'org.sagebionetworks.repo.model.FacetRoundingParameters'\n ) {\n const binSize = parameters.roundTo ?? 1\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.table.FacetColumnResultBinnedValues',\n columnName,\n facetType: 'enumeration',\n binSize,\n binnedValues: sortedCounts.map(([value, count]) => ({\n value,\n binMin: Math.floor(count / binSize) * binSize,\n isSelected: selectedValues.includes(value),\n })),\n }\n }\n const epsilon =\n postProcessing?.algorithm === 'NOISE' &&\n parameters?.concreteType ===\n 'org.sagebionetworks.repo.model.FacetNoiseParameters'\n ? (parameters.epsilon ?? 1)\n : undefined\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.table.FacetColumnResultValues',\n columnName,\n facetType: 'enumeration',\n facetValues: sortedCounts.map(([value, count]) => ({\n value,\n count:\n epsilon === undefined\n ? count\n : addLaplaceNoise(\n count,\n epsilon,\n `${noiseKeyPrefix}\\u0000${columnName}\\u0000${value}`,\n ),\n isSelected: selectedValues.includes(value),\n })),\n }\n}\n\n// -----------------------------------------------------------------------------\n// Combined SQL (for the Query Builder's SQL summary)\n// -----------------------------------------------------------------------------\n\nfunction sqlLiteral(value: string): string {\n return `'${value.replaceAll(\"'\", \"''\")}'`\n}\n\nconst SQL_OPERATOR_BY_FILTER_OPERATOR: Partial<\n Record<ColumnSingleValueFilterOperator, string>\n> = {\n EQUAL: '=',\n NOT_EQUAL: '<>',\n GREATER_THAN: '>',\n GREATER_THAN_OR_EQUAL: '>=',\n LESS_THAN: '<',\n LESS_THAN_OR_EQUAL: '<=',\n LIKE: 'LIKE',\n}\n\nfunction filterToSql(filter: QueryFilter): string {\n switch (filter.concreteType) {\n case 'org.sagebionetworks.repo.model.table.FilterGroup': {\n const joined = (filter.children ?? [])\n .map(filterToSql)\n .join(` ${filter.operator ?? 'AND'} `)\n return `${filter.not ? 'NOT ' : ''}(${joined})`\n }\n case 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter': {\n const column = `\"${filter.columnName}\"`\n switch (filter.operator) {\n case ColumnSingleValueFilterOperator.IN:\n return `${column} IN (${filter.values.map(sqlLiteral).join(', ')})`\n case ColumnSingleValueFilterOperator.IS_NULL:\n return `${column} IS NULL`\n case ColumnSingleValueFilterOperator.IS_NOT_NULL:\n return `${column} IS NOT NULL`\n case ColumnSingleValueFilterOperator.BETWEEN:\n return `${column} BETWEEN ${sqlLiteral(filter.values[0])} AND ${sqlLiteral(filter.values[1])}`\n default: {\n const sqlOperator = SQL_OPERATOR_BY_FILTER_OPERATOR[filter.operator]\n const predicates = filter.values.map(\n value => `${column} ${sqlOperator} ${sqlLiteral(value)}`,\n )\n return predicates.length === 1\n ? predicates[0]\n : `(${predicates.join(' OR ')})`\n }\n }\n }\n case 'org.sagebionetworks.repo.model.table.ColumnMultiValueFunctionQueryFilter':\n return `\"${filter.columnName}\" ${filter.function} (${filter.values.map(sqlLiteral).join(', ')})`\n case 'org.sagebionetworks.repo.model.table.ColumnCohortFilter':\n return `\"${filter.columnName}\" IN COHORT(${filter.cohortName})`\n default:\n return ''\n }\n}\n\n// -----------------------------------------------------------------------------\n// Query execution\n// -----------------------------------------------------------------------------\n\nfunction sortRows(\n rows: VirtualTableRow[],\n sort: readonly SortItem[] | undefined,\n): VirtualTableRow[] {\n if (!sort || sort.length === 0) {\n return rows\n }\n return [...rows].sort((a, b) => {\n for (const { column, direction } of sort) {\n const toComparable = (cell: CellValue) =>\n Array.isArray(cell) ? cell.join(',') : (cell as string | number)\n const comparison = compareCellValues(\n toComparable(a[column]),\n toComparable(b[column]),\n )\n if (comparison !== 0) {\n return direction === 'DESC' ? -comparison : comparison\n }\n }\n return 0\n })\n}\n\nfunction getPerspective(\n profile: CohortBuilderMockProfile,\n entityId: string,\n): Perspective {\n if (entityId === profile.participantsVirtualTableId) {\n return 'PARTICIPANTS'\n }\n if (entityId === profile.dataVirtualTableId) {\n return 'DATA'\n }\n throw new MockQueryError(404, {\n concreteType: 'org.sagebionetworks.repo.model.ErrorResponse',\n reason: `The Cohort Builder mock has no table ${entityId}`,\n })\n}\n\nfunction getAggregateConfig(\n profile: CohortBuilderMockProfile,\n request: QueryBundleRequest,\n access: CohortBuilderAccess,\n): AggregateDataConfiguration | undefined {\n // A data manager's preview applies only to callers who already have full access.\n if (access === 'FULL') {\n return request.aggregateDataPreview\n }\n return {\n suppressionThreshold: profile.suppressionThreshold,\n countSuppressionStrategy: profile.countSuppressionStrategy,\n facetPostProcessingConfig: profile.facetPostProcessingConfig,\n }\n}\n\nfunction assertRowsAllowed(\n perspective: Perspective,\n partMask: number,\n isAggregateOnlyRead: boolean,\n): void {\n // The participant VT projects individualId, a quasi-identifier, so the backend withholds its rows during preflight\n // from aggregate-only callers and from data manager previews.\n if (\n isAggregateOnlyRead &&\n perspective === 'PARTICIPANTS' &&\n (partMask & BUNDLE_MASK_QUERY_RESULTS) !== 0\n ) {\n throw new MockQueryError(MOCK_ROW_SUPPRESSED_HTTP_STATUS, {\n concreteType:\n 'org.sagebionetworks.repo.model.table.RowSuppressionErrorResponse',\n reason:\n 'Row results are withheld because the query projects a quasi-identifier column. Re-run the query without requesting row results.',\n errorCode: 'ROW_SUPPRESSED',\n rowSuppressionReasonCode: 'QID_PROJECTED',\n })\n }\n}\n\nfunction assertAboveSuppressionThreshold(\n matchedRowCount: number,\n aggregateConfig: AggregateDataConfiguration | undefined,\n): void {\n if (!aggregateConfig) {\n return\n }\n // Like the backend's COUNT(*) gate, both perspectives count the rows of the\n // queried VirtualTable: participants, or files and datasets.\n const threshold = aggregateConfig.suppressionThreshold\n if (matchedRowCount > 0 && matchedRowCount < threshold) {\n throw new MockQueryError(MOCK_BELOW_THRESHOLD_HTTP_STATUS, {\n concreteType:\n 'org.sagebionetworks.repo.model.table.BelowThresholdErrorResponse',\n reason: `The number of records matched by this query is below the minimum threshold of ${threshold} required to return a result.`,\n errorCode: 'BELOW_THRESHOLD',\n suppressionThreshold: threshold,\n })\n }\n}\n\ntype MatchedRows = {\n rows: VirtualTableRow[]\n /** The matching rows when one column's facet selection is ignored, as that column's facet counts require. */\n ignoringFacetSelection: (columnName: string) => VirtualTableRow[]\n}\n\nfunction matchRows(\n data: CohortBuilderSyntheticData,\n perspective: Perspective,\n query: Query,\n context: FilterContext,\n): MatchedRows {\n const additionalFilters = query.additionalFilters ?? []\n const selectedFacets = query.selectedFacets ?? []\n const definingFilters = additionalFilters.filter(\n filter => filter.isDefiningCondition,\n )\n const outerFilters = additionalFilters.filter(\n filter => !filter.isDefiningCondition,\n )\n // MATERIAL columns are all scalars.\n const materialContext: FilterContext = {\n ...context,\n listColumnNames: new Set(),\n }\n const materialRows = data.materialRows.filter(row =>\n definingFilters.every(filter =>\n filterMatches(row, filter, materialContext),\n ),\n )\n const virtualTableRows =\n perspective === 'PARTICIPANTS'\n ? groupByParticipant(materialRows, data)\n : groupByDataReference(materialRows, data)\n const filterRows = (ignoredFacetColumnName?: string) =>\n virtualTableRows.filter(\n row =>\n outerFilters.every(filter => filterMatches(row, filter, context)) &&\n selectedFacets.every(\n selection =>\n selection.columnName === ignoredFacetColumnName ||\n facetSelectionMatches(row, selection),\n ),\n )\n return { rows: filterRows(), ignoringFacetSelection: filterRows }\n}\n\nfunction toQueryResult(\n entityId: string,\n columnModels: readonly ColumnModel[],\n selectColumns: TableSelectColumn[],\n rows: VirtualTableRow[],\n query: Query,\n): TableQueryResult {\n const offset = query.offset ?? 0\n const page = sortRows(rows, query.sort).slice(\n offset,\n offset + (query.limit ?? rows.length),\n )\n return {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryResult',\n queryResults: {\n concreteType: 'org.sagebionetworks.repo.model.table.RowSet',\n tableId: entityId,\n headers: selectColumns,\n rows: page.map(row => ({\n values: columnModels.map(({ name }) => {\n const cell = row[name!]\n return Array.isArray(cell) ? JSON.stringify(cell) : String(cell)\n }),\n })),\n },\n }\n}\n\nfunction buildFacets(\n columnModels: readonly ColumnModel[],\n query: Query,\n matchedRows: MatchedRows,\n aggregateConfig: AggregateDataConfiguration | undefined,\n): FacetColumnResult[] {\n const selectedFacets = query.selectedFacets ?? []\n const noiseKeyPrefix = JSON.stringify([\n query.additionalFilters ?? [],\n selectedFacets,\n ])\n return columnModels\n .filter(column => column.facetType === 'enumeration')\n .map(({ name }) => {\n const selection = selectedFacets.find(facet => facet.columnName === name)\n return buildFacet(\n name!,\n countFacetValues(matchedRows.ignoringFacetSelection(name!), name!),\n selection?.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnValuesRequest'\n ? selection.facetValues\n : [],\n aggregateConfig,\n noiseKeyPrefix,\n )\n })\n}\n\nfunction toCombinedSql(entityId: string, filters: readonly QueryFilter[]) {\n const predicates = filters.map(filterToSql).filter(Boolean)\n const where =\n predicates.length > 0 ? ` WHERE ${predicates.join(' AND ')}` : ''\n return `SELECT * FROM ${entityId}${where}`\n}\n\n// -----------------------------------------------------------------------------\n// Request-scoped cohorts (design doc §5)\n// -----------------------------------------------------------------------------\n\n/** The stack default of `org.sagebionetworks.table.query.cohort.max.values`. */\nexport const MOCK_MAX_COHORT_VALUES = 10_000\nconst MAX_COHORTS_PER_QUERY = 5\nconst COHORT_NAME_PATTERN = /^[A-Za-z_]\\w*$/\nconst COHORT_SQL_PATTERN = /^\\s*SELECT\\s+(\\w+)\\s+FROM\\s+(syn\\d+)\\s*$/i\n\nexport type CohortBuilderMockQueryOptions = {\n /** Maximum number of distinct values in one cohort. Defaults to {@link MOCK_MAX_COHORT_VALUES}. */\n maxCohortValues?: number\n}\n\ntype CohortReference = {\n filter: ColumnCohortFilter\n /** True when the filter, or the top-level filter containing it, is a defining condition. */\n isDefining: boolean\n}\n\nfunction findCohortReferences(\n filters: readonly QueryFilter[],\n isDefining = false,\n): CohortReference[] {\n return filters.flatMap(filter => {\n const filterIsDefining = isDefining || filter.isDefiningCondition === true\n if (\n filter.concreteType === 'org.sagebionetworks.repo.model.table.FilterGroup'\n ) {\n return findCohortReferences(filter.children ?? [], filterIsDefining)\n }\n return filter.concreteType ===\n 'org.sagebionetworks.repo.model.table.ColumnCohortFilter'\n ? [{ filter, isDefining: filterIsDefining }]\n : []\n })\n}\n\ntype ParsedCohort = {\n name: string\n query: Query\n perspective: Perspective\n columnName: string\n columnType: string\n columnModels: ColumnModel[]\n}\n\n/** Validates a cohort definition's shape without running it. */\nfunction parseCohort(\n data: CohortBuilderSyntheticData,\n cohort: CohortDefinition,\n): ParsedCohort {\n const { name, query } = cohort\n if (\n (query.cohorts?.length ?? 0) > 0 ||\n findCohortReferences(query.additionalFilters ?? []).length > 0\n ) {\n throw invalidQuery(`Cohort '${name}' cannot reference other cohorts.`)\n }\n if (\n (query.sort?.length ?? 0) > 0 ||\n query.limit !== undefined ||\n query.offset !== undefined\n ) {\n throw invalidQuery(`Cohort '${name}' cannot use sort, limit or offset.`)\n }\n const sqlMatch = COHORT_SQL_PATTERN.exec(query.sql)\n if (!sqlMatch) {\n throw invalidQuery(\n `Cohort '${name}' must select exactly one plain column from a single table.`,\n )\n }\n const [, columnName, tableId] = sqlMatch\n const perspective = getPerspective(data.profile, tableId)\n const columnModels =\n getCohortBuilderColumnModels(data)[\n perspective === 'PARTICIPANTS' ? 'participants' : 'dataReferences'\n ]\n const column = columnModels.find(model => model.name === columnName)\n if (!column?.columnType || column.columnType.endsWith('_LIST')) {\n throw invalidQuery(\n `Cohort '${name}' must select a non-list column of ${tableId}: ${columnName}`,\n )\n }\n return {\n name,\n query,\n perspective,\n columnName,\n columnType: column.columnType,\n columnModels,\n }\n}\n\n/** Runs a parsed cohort query as the caller and returns the cohort's distinct values. */\nfunction runCohortQuery(\n data: CohortBuilderSyntheticData,\n cohort: ParsedCohort,\n request: QueryBundleRequest,\n access: CohortBuilderAccess,\n maxCohortValues: number,\n): Set<string> {\n const { rows } = matchRows(data, cohort.perspective, cohort.query, {\n listColumnNames: new Set(\n cohort.columnModels\n .filter(model => model.columnType?.endsWith('_LIST'))\n .map(model => model.name!),\n ),\n cohortValues: new Map(),\n })\n const values = new Set(rows.map(row => String(row[cohort.columnName])))\n if (values.size > maxCohortValues) {\n throw new MockQueryError(400, {\n concreteType: 'org.sagebionetworks.repo.model.ErrorResponse',\n reason: `Cohort '${cohort.name}' exceeds the maximum of ${maxCohortValues} values.`,\n errorCode: 'COHORT_TOO_LARGE',\n })\n }\n if (access === 'AGGREGATE_ONLY') {\n assertAboveSuppressionThreshold(\n values.size,\n getAggregateConfig(data.profile, request, access),\n )\n }\n return values\n}\n\nfunction assertCohortReferenceAllowed(\n data: CohortBuilderSyntheticData,\n reference: CohortReference,\n cohort: ParsedCohort,\n columnModels: readonly ColumnModel[],\n access: CohortBuilderAccess,\n): void {\n const { filter, isDefining } = reference\n // A defining-condition filter is resolved against the VirtualTable's source (MATERIAL), whose columns are strings.\n const sourceColumnType =\n data.materialRows.length > 0 && filter.columnName in data.materialRows[0]\n ? 'STRING'\n : undefined\n const referencedColumnType = isDefining\n ? sourceColumnType\n : columnModels.find(model => model.name === filter.columnName)?.columnType\n if (referencedColumnType === undefined) {\n throw invalidQuery(`Column does not exist: ${filter.columnName}`)\n }\n if (referencedColumnType !== cohort.columnType) {\n throw invalidQuery(\n `The column type of cohort '${filter.cohortName}' (${cohort.columnType}) does not match ${filter.columnName} (${referencedColumnType}).`,\n )\n }\n // §5.6: a cohort from an aggregate-only source may only filter a quasi-identifier column (of a query that is itself\n // aggregate-only, which both mock VirtualTables are for this caller).\n const isQuasiIdentifier =\n filter.columnName === PARTICIPANT_ID_COLUMN_NAME ||\n data.profile.participantAttributes.some(\n attribute =>\n attribute.name === filter.columnName && attribute.isQuasiIdentifier,\n )\n if (access === 'AGGREGATE_ONLY' && !isQuasiIdentifier) {\n throw new MockQueryError(403, {\n concreteType: 'org.sagebionetworks.repo.model.ErrorResponse',\n reason: `A cohort from an aggregate-only source can only filter a quasi-identifier column, and ${filter.columnName} is not one.`,\n })\n }\n}\n\n/** Validates the query's cohorts and their references, runs each cohort query, and returns each cohort's values. */\nfunction resolveCohorts(\n data: CohortBuilderSyntheticData,\n request: QueryBundleRequest,\n access: CohortBuilderAccess,\n columnModels: readonly ColumnModel[],\n maxCohortValues: number,\n): Map<string, Set<string>> {\n const cohorts = request.query.cohorts ?? []\n const references = findCohortReferences(request.query.additionalFilters ?? [])\n if (cohorts.length > MAX_COHORTS_PER_QUERY) {\n throw invalidQuery(\n `A query can define at most ${MAX_COHORTS_PER_QUERY} cohorts.`,\n )\n }\n const names = new Set<string>()\n for (const { name } of cohorts) {\n if (!COHORT_NAME_PATTERN.test(name)) {\n throw invalidQuery(`Cohort name must be a simple identifier: ${name}`)\n }\n if (names.has(name)) {\n throw invalidQuery(`Cohort names must be unique: ${name}`)\n }\n names.add(name)\n }\n const referencedNames = new Set(\n references.map(reference => reference.filter.cohortName),\n )\n for (const name of referencedNames) {\n if (!names.has(name)) {\n throw invalidQuery(`Cohort is not defined: ${name}`)\n }\n }\n for (const name of names) {\n if (!referencedNames.has(name)) {\n throw invalidQuery(`Cohort is defined but never referenced: ${name}`)\n }\n }\n const parsed = new Map(\n cohorts.map(cohort => [cohort.name, parseCohort(data, cohort)]),\n )\n for (const reference of references) {\n assertCohortReferenceAllowed(\n data,\n reference,\n parsed.get(reference.filter.cohortName)!,\n columnModels,\n access,\n )\n }\n return new Map(\n Array.from(parsed, ([name, cohort]) => [\n name,\n runCohortQuery(data, cohort, request, access, maxCohortValues),\n ]),\n )\n}\n\nfunction executeQuery(\n data: CohortBuilderSyntheticData,\n request: QueryBundleRequest,\n access: CohortBuilderAccess,\n options: CohortBuilderMockQueryOptions,\n): QueryResultBundle {\n const perspective = getPerspective(data.profile, request.entityId)\n const columnModels =\n getCohortBuilderColumnModels(data)[\n perspective === 'PARTICIPANTS' ? 'participants' : 'dataReferences'\n ]\n const listColumnNames = new Set(\n columnModels\n .filter(column => column.columnType?.endsWith('_LIST'))\n .map(column => column.name!),\n )\n const partMask = request.partMask ?? 0\n const { query } = request\n const aggregateConfig = getAggregateConfig(data.profile, request, access)\n assertRowsAllowed(perspective, partMask, aggregateConfig !== undefined)\n const cohortValues = resolveCohorts(\n data,\n request,\n access,\n columnModels,\n options.maxCohortValues ?? MOCK_MAX_COHORT_VALUES,\n )\n const matchedRows = matchRows(data, perspective, query, {\n listColumnNames,\n cohortValues,\n })\n assertAboveSuppressionThreshold(matchedRows.rows.length, aggregateConfig)\n\n const bundle: QueryResultBundle = {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryResultBundle',\n }\n const selectColumns = columnModels.map(({ id, name, columnType }) => ({\n id,\n name,\n columnType,\n }))\n if (partMask & BUNDLE_MASK_QUERY_RESULTS) {\n bundle.queryResult = toQueryResult(\n request.entityId,\n columnModels,\n selectColumns,\n matchedRows.rows,\n query,\n )\n }\n if (partMask & BUNDLE_MASK_QUERY_COUNT) {\n bundle.queryCount = matchedRows.rows.length\n }\n if (partMask & BUNDLE_MASK_QUERY_SELECT_COLUMNS) {\n bundle.selectColumns = selectColumns\n }\n if (partMask & BUNDLE_MASK_QUERY_MAX_ROWS_PER_PAGE) {\n bundle.maxRowsPerPage = MOCK_MAX_ROWS_PER_PAGE\n }\n if (partMask & BUNDLE_MASK_QUERY_COLUMN_MODELS) {\n bundle.columnModels = columnModels\n }\n if (partMask & BUNDLE_MASK_QUERY_FACETS) {\n bundle.facets = buildFacets(\n columnModels,\n query,\n matchedRows,\n aggregateConfig,\n )\n bundle.facetPostProcessingApplied =\n aggregateConfig?.facetPostProcessingConfig !== undefined\n }\n if (partMask & BUNDLE_MASK_LAST_UPDATED_ON) {\n bundle.lastUpdatedOn = MOCK_LAST_UPDATED_ON\n }\n if (partMask & BUNDLE_MASK_COMBINED_SQL) {\n bundle.combinedSql = toCombinedSql(\n request.entityId,\n query.additionalFilters ?? [],\n )\n }\n return bundle\n}\n\n/**\n * Emulates a Cohort Builder 2.0 table query against synthetic data, returning\n * either a QueryResultBundle or the error the backend would return.\n */\nexport function runCohortBuilderMockQuery(\n data: CohortBuilderSyntheticData,\n request: QueryBundleRequest,\n access: CohortBuilderAccess,\n options: CohortBuilderMockQueryOptions = {},\n): CohortBuilderMockQueryResult {\n try {\n return { status: 200, body: executeQuery(data, request, access, options) }\n } catch (error) {\n if (error instanceof MockQueryError) {\n return { status: error.status, body: error.body }\n }\n throw error\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CohortBuilderMockProfile } from './cohortBuilderMockProfiles';
|
|
2
|
+
export type ReferenceType = 'FILE' | 'DATASET';
|
|
3
|
+
/** One MATERIAL row: a participant joined to one file or dataset reference. */
|
|
4
|
+
export type MaterialRow = Readonly<Record<string, string>>;
|
|
5
|
+
export type SyntheticDataReference = {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
referenceType: ReferenceType;
|
|
9
|
+
study: string;
|
|
10
|
+
attributes: Readonly<Record<string, string>>;
|
|
11
|
+
};
|
|
12
|
+
export type CohortBuilderSyntheticData = {
|
|
13
|
+
profile: CohortBuilderMockProfile;
|
|
14
|
+
dataAttributeNames: readonly string[];
|
|
15
|
+
references: ReadonlyMap<string, SyntheticDataReference>;
|
|
16
|
+
materialRows: readonly MaterialRow[];
|
|
17
|
+
};
|
|
18
|
+
export declare const DEFAULT_SYNTHETIC_DATA_SEED = 42;
|
|
19
|
+
/** Mulberry32: a small, fast, seedable PRNG returning floats in [0, 1). */
|
|
20
|
+
export declare function createSeededRandom(seed: number): () => number;
|
|
21
|
+
/**
|
|
22
|
+
* Generates a deterministic synthetic participant ⋈ file/dataset dataset (the
|
|
23
|
+
* MATERIAL rows) from a mock profile.
|
|
24
|
+
*/
|
|
25
|
+
export declare function createCohortBuilderSyntheticData(profile: CohortBuilderMockProfile, seed?: number): CohortBuilderSyntheticData;
|
|
26
|
+
//# sourceMappingURL=cohortBuilderSyntheticData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cohortBuilderSyntheticData.d.ts","sourceRoot":"","sources":["../../../src/mocks/cohortBuilder/cohortBuilderSyntheticData.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EASzB,MAAM,6BAA6B,CAAA;AAEpC,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,CAAA;AAE9C,+EAA+E;AAC/E,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAE1D,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,aAAa,CAAA;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAC7C,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,EAAE,wBAAwB,CAAA;IACjC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAA;IACrC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;IACvD,YAAY,EAAE,SAAS,WAAW,EAAE,CAAA;CACrC,CAAA;AAED,eAAO,MAAM,2BAA2B,KAAK,CAAA;AAQ7C,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,MAAM,CAS7D;AAuMD;;;GAGG;AACH,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,wBAAwB,EACjC,IAAI,GAAE,MAAoC,GACzC,0BAA0B,CA2B5B"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { CORE_DATA_ATTRIBUTE_NAMES as e, DATA_REFERENCE_COLUMN_NAME as t, PARTICIPANT_ID_COLUMN_NAME as n, REFERENCE_TYPE_COLUMN_NAME as r, STUDY_COLUMN_NAME as i } from "./cohortBuilderMockProfiles.js";
|
|
2
|
+
//#region src/mocks/cohortBuilder/cohortBuilderSyntheticData.ts
|
|
3
|
+
var a = 42, o = 3, s = 4;
|
|
4
|
+
function c(e) {
|
|
5
|
+
let t = e >>> 0;
|
|
6
|
+
return () => {
|
|
7
|
+
t = t + 1831565813 >>> 0;
|
|
8
|
+
let e = t;
|
|
9
|
+
return e = Math.imul(e ^ e >>> 15, e | 1), e ^= e + Math.imul(e ^ e >>> 7, e | 61), ((e ^ e >>> 14) >>> 0) / 4294967296;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function l(e, t) {
|
|
13
|
+
let n = Object.entries(t), r = n.reduce((e, [, t]) => e + t, 0), i = e() * r;
|
|
14
|
+
for (let [e, t] of n) if (i -= t, i < 0) return e;
|
|
15
|
+
return n.at(-1)[0];
|
|
16
|
+
}
|
|
17
|
+
function u(e, t) {
|
|
18
|
+
return t[Math.floor(e() * t.length)];
|
|
19
|
+
}
|
|
20
|
+
function d(e, t, n) {
|
|
21
|
+
let r = t.filter(() => e() < .6);
|
|
22
|
+
for (; r.length < n;) {
|
|
23
|
+
let n = u(e, t);
|
|
24
|
+
r.includes(n) || r.push(n);
|
|
25
|
+
}
|
|
26
|
+
return r;
|
|
27
|
+
}
|
|
28
|
+
function f(e, t, r, a) {
|
|
29
|
+
return Array.from({ length: r.participantCount }, (o, s) => {
|
|
30
|
+
let c = {
|
|
31
|
+
[n]: `${t.participantIdPrefix}-${String(a + s).padStart(6, "0")}`,
|
|
32
|
+
[i]: r.name
|
|
33
|
+
};
|
|
34
|
+
for (let n of t.participantAttributes) c[n.name] = l(e, n.values);
|
|
35
|
+
return c;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function p(e, n) {
|
|
39
|
+
let i = /* @__PURE__ */ new Map(), a = [], o = n.firstReferenceEntityId;
|
|
40
|
+
return {
|
|
41
|
+
random: e,
|
|
42
|
+
references: i,
|
|
43
|
+
materialRows: a,
|
|
44
|
+
addReference(t, r, a, s) {
|
|
45
|
+
let c = {
|
|
46
|
+
dataType: r.dataType,
|
|
47
|
+
assay: r.assay,
|
|
48
|
+
fileFormat: u(e, r.fileFormats)
|
|
49
|
+
};
|
|
50
|
+
for (let t of n.extraDataAttributeNames) c[t] = u(e, r.extraAttributes[t] ?? ["Unknown"]);
|
|
51
|
+
let l = {
|
|
52
|
+
id: `syn${o++}`,
|
|
53
|
+
name: s,
|
|
54
|
+
referenceType: a,
|
|
55
|
+
study: t.name,
|
|
56
|
+
attributes: c
|
|
57
|
+
};
|
|
58
|
+
return i.set(l.id, l), l;
|
|
59
|
+
},
|
|
60
|
+
link(e, n) {
|
|
61
|
+
for (let i of e) a.push({
|
|
62
|
+
...i,
|
|
63
|
+
[t]: n.id,
|
|
64
|
+
[r]: n.referenceType,
|
|
65
|
+
...n.attributes
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function m(e, t, n) {
|
|
71
|
+
for (let r of t.assays) {
|
|
72
|
+
let i = e.addReference(t, r, "DATASET", `${t.name} ${r.assay} (synthetic)`);
|
|
73
|
+
e.link(n, i);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function h(e, t, n, r) {
|
|
77
|
+
let { random: i } = e;
|
|
78
|
+
for (let a = 1; a <= s; a++) {
|
|
79
|
+
let s = o + Math.floor(i() * 10), c = e.addReference(t, n, "FILE", `${t.name}_${n.assay}_batch${a}_matrix`), l = Math.floor(i() * Math.max(1, r.length - s));
|
|
80
|
+
e.link(r.slice(l, l + s), c);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function g(e, t, n) {
|
|
84
|
+
let r = new Map(t.assays.map((e) => [e, []]));
|
|
85
|
+
for (let i of n) for (let n of d(e.random, t.assays, 1)) {
|
|
86
|
+
r.get(n).push(i);
|
|
87
|
+
let a = e.addReference(t, n, "FILE", `${t.name}_${n.assay}_sample${String(e.references.size).padStart(5, "0")}`);
|
|
88
|
+
e.link([i], a);
|
|
89
|
+
}
|
|
90
|
+
for (let [n, i] of r) {
|
|
91
|
+
if (i.length === 0) continue;
|
|
92
|
+
let r = e.addReference(t, n, "FILE", `${t.name}_${n.assay}_all_participants_matrix`);
|
|
93
|
+
e.link(i, r), h(e, t, n, i);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function _(t, n = 42) {
|
|
97
|
+
let r = c(n), i = p(r, t), a = 1;
|
|
98
|
+
for (let e of t.studies) {
|
|
99
|
+
let n = f(r, t, e, a);
|
|
100
|
+
a += n.length, e.mapping === "DATASET" ? m(i, e, n) : g(i, e, n);
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
profile: t,
|
|
104
|
+
dataAttributeNames: [...e, ...t.extraDataAttributeNames],
|
|
105
|
+
references: i.references,
|
|
106
|
+
materialRows: i.materialRows
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//#endregion
|
|
110
|
+
export { a as DEFAULT_SYNTHETIC_DATA_SEED, _ as createCohortBuilderSyntheticData, c as createSeededRandom };
|
|
111
|
+
|
|
112
|
+
//# sourceMappingURL=cohortBuilderSyntheticData.js.map
|