From d678a86594223e71f83438ec8812ff0c0c9d62d8 Mon Sep 17 00:00:00 2001 From: Leonardo Christino <lchristino@graphpolaris.com> Date: Fri, 21 Mar 2025 19:25:53 +0100 Subject: [PATCH] fix: fixes due to abort query --- src/lib/data-access/store/hooks.ts | 10 +- src/lib/management/database/DatabaseLine.tsx | 22 ++-- .../panel/QueryBuilderContextMenu.tsx | 4 +- src/lib/vis/components/VisualizationPanel.tsx | 2 +- .../nodelinkvis/components/NLPixi.tsx | 3 +- .../nodelinkvis/components/query2NL.tsx | 12 +- .../nodelinkvis/nodelinkvis.tsx | 2 +- .../vis/visualizations/paohvis/paohvis.tsx | 10 +- .../utils/ResultNodeLinkParserUseCase.tsx | 2 +- .../paohvis/utils/dataProcessing.tsx | 109 +++++++++--------- .../semanticsubstratesvis.tsx | 6 +- .../vis/visualizations/tablevis/tablevis.tsx | 8 +- src/lib/vis/visualizations/vis0D/Vis0D.tsx | 2 +- src/lib/vis/visualizations/vis1D/model.ts | 4 +- 14 files changed, 111 insertions(+), 85 deletions(-) diff --git a/src/lib/data-access/store/hooks.ts b/src/lib/data-access/store/hooks.ts index fab5de314..7c5f7b80f 100644 --- a/src/lib/data-access/store/hooks.ts +++ b/src/lib/data-access/store/hooks.ts @@ -1,5 +1,11 @@ import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'; -import { GraphQueryResult, selectGraphQuery, selectGraphQueryResult, selectGraphQueryResultMetaData } from './graphQueryResultSlice'; +import { + GraphQueryResult, + selectGraphQuery, + selectGraphQueryCounts, + selectGraphQueryResult, + selectGraphQueryResultMetaData, +} from './graphQueryResultSlice'; import { schemaGraph, selectSchemaLayout, schemaSettingsState, schemaStatsState, SchemaSliceI, schema } from './schemaSlice'; import type { RootState, AppDispatch } from './store'; import { ConfigStateI, configState } from '@/lib/data-access/store/configSlice'; @@ -35,6 +41,7 @@ import { SchemaGraphStats, SaveStateWithAuthorization, GraphQueryResultMetaFromBackend, + GraphQueryCountResultFromBackend, } from 'ts-common'; import { ProjectState, selectProject } from './projectSlice'; import { AllLayoutAlgorithms } from 'ts-common/src/model/layouts'; @@ -48,6 +55,7 @@ export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector; export const useGraphQuery: () => GraphQueryResult = () => useAppSelector(selectGraphQuery); export const useGraphQueryResult: () => GraphQueryResultMetaFromBackend = () => useAppSelector(selectGraphQueryResult); export const useGraphQueryResultMeta: () => GraphStatistics | undefined = () => useAppSelector(selectGraphQueryResultMetaData); +export const useGraphQueryCounts: () => GraphQueryCountResultFromBackend | undefined = () => useAppSelector(selectGraphQueryCounts); // Gives the schema export const useSchema: () => SchemaSliceI = () => useAppSelector(schema); diff --git a/src/lib/management/database/DatabaseLine.tsx b/src/lib/management/database/DatabaseLine.tsx index 4c48fc31d..ea926ab57 100644 --- a/src/lib/management/database/DatabaseLine.tsx +++ b/src/lib/management/database/DatabaseLine.tsx @@ -12,10 +12,16 @@ import { } from '@/lib/components'; import { Heatmap1D } from '@/lib/components/charts/heatmap1D'; import { IndicatorGraph } from '@/lib/components/charts/indicatorGraph'; -import { wsDeleteState, nilUUID, useSessionCache, useAppDispatch, useActiveQuery, useGraphQueryResult } from '@/lib/data-access'; +import { wsDeleteState, nilUUID, useSessionCache, useAppDispatch, useActiveQuery, useGraphQueryCounts } from '@/lib/data-access'; import { clearSchema } from '@/lib/data-access/store/schemaSlice'; import { selectSaveState, clearQB, deleteSaveState } from '@/lib/data-access/store/sessionSlice'; -import { CountQueryResultFromBackend, GraphQueryResultMetaFromBackend, Query, SaveState } from 'ts-common'; +import { + CountQueryResultFromBackend, + GraphQueryCountResultFromBackend, + GraphQueryResultMetaFromBackend, + Query, + SaveState, +} from 'ts-common'; // Update props to include missing functions and optional sharing flag. interface DatabaseLineProps { @@ -38,8 +44,8 @@ const configVisuals = { function timestampFor(saveState: SaveState, queryIndex: number = 0) { const query = saveState.queryStates.openQueryArray[queryIndex]; - if (query.graph?.nodeCounts == null || query.graph.nodeCounts.updatedAt == null) return 'unknown'; - return new Date(query.graph.nodeCounts.updatedAt).toLocaleString('nl-NL', { + if (query.graphCounts.nodeCounts == null || query.graphCounts.nodeCounts.updatedAt == null) return 'unknown'; + return new Date(query.graphCounts.nodeCounts.updatedAt).toLocaleString('nl-NL', { month: '2-digit', day: '2-digit', year: 'numeric', @@ -51,16 +57,16 @@ function timestampFor(saveState: SaveState, queryIndex: number = 0) { function differentiationFor( saveState: SaveState, queryIndex: number = 0, - queryResult: GraphQueryResultMetaFromBackend, + countQueryResult?: GraphQueryCountResultFromBackend, activeQuery?: Query, ): number { const query = saveState.queryStates.openQueryArray[queryIndex]; // Use the most up-to-date counts based on active query. let nodeCountsObj: CountQueryResultFromBackend | undefined; if (activeQuery?.id === query.id) { - nodeCountsObj = queryResult.nodeCounts ?? query.graph?.nodeCounts; + nodeCountsObj = countQueryResult?.nodeCounts ?? query.graphCounts?.nodeCounts; } else { - nodeCountsObj = query.graph?.nodeCounts; + nodeCountsObj = query.graphCounts?.nodeCounts; } if (nodeCountsObj == null || saveState?.schemas[0]?.stats == null || !nodeCountsObj.updatedAt || nodeCountsObj.updatedAt === 0) return 0; const nodeCounts = query.graph.nodes @@ -78,7 +84,7 @@ export const DatabaseLine = (props: DatabaseLineProps) => { const session = useSessionCache(); const dispatch = useAppDispatch(); const activeQuery = useActiveQuery(); - const queryResult = useGraphQueryResult(); + const queryResult = useGraphQueryCounts(); const sharing = props.sharing ?? false; return ( diff --git a/src/lib/querybuilder/panel/QueryBuilderContextMenu.tsx b/src/lib/querybuilder/panel/QueryBuilderContextMenu.tsx index 4439d0a13..edba4258b 100644 --- a/src/lib/querybuilder/panel/QueryBuilderContextMenu.tsx +++ b/src/lib/querybuilder/panel/QueryBuilderContextMenu.tsx @@ -190,7 +190,9 @@ export const QueryBuilderContextMenu = (props: { <DropdownItem value="" disabled className="text-muted pointer-events-none"> <div className="flex items-between text-neutral-400"> <div className="inline-block w-[70px]">Total:</div> - <span>{activeQuery?.graph?.nodeCounts ? activeQuery.graph.nodeCounts[props.node.id + '_count'] : 'unknown'}</span> + <span> + {activeQuery?.graphCounts.nodeCounts ? activeQuery.graphCounts.nodeCounts[props.node.id + '_count'] : 'unknown'} + </span> </div> </DropdownItem>, ]} diff --git a/src/lib/vis/components/VisualizationPanel.tsx b/src/lib/vis/components/VisualizationPanel.tsx index b668570ab..a8781866e 100644 --- a/src/lib/vis/components/VisualizationPanel.tsx +++ b/src/lib/vis/components/VisualizationPanel.tsx @@ -119,7 +119,7 @@ export const VisualizationPanel = ({ fullSize }: { fullSize: () => void }) => { viz.id === openVisualizationArray[activeVisualizationIndex].id && graphQuery.graph.metaData && ( <viz.component - data={graphQuery.graph} + data={graphQuery} schema={schema} ml={ml} settings={openVisualizationArray[activeVisualizationIndex]} diff --git a/src/lib/vis/visualizations/nodelinkvis/components/NLPixi.tsx b/src/lib/vis/visualizations/nodelinkvis/components/NLPixi.tsx index dfa7db015..7b1d7a00b 100644 --- a/src/lib/vis/visualizations/nodelinkvis/components/NLPixi.tsx +++ b/src/lib/vis/visualizations/nodelinkvis/components/NLPixi.tsx @@ -19,7 +19,7 @@ import { } from 'pixi.js'; import { forwardRef, RefObject, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'; import { useML, useSearchResultData } from '../../../../data-access'; -import { AllLayoutAlgorithms, GraphologyForceAtlas2Webworker, LayoutFactory, Layouts, LayoutTypes } from '../../../../graph-layout'; +import { GraphologyForceAtlas2Webworker, LayoutFactory, Layouts, LayoutTypes } from '../../../../graph-layout'; import { NodelinkVisProps } from '../nodelinkvis'; import { GraphType, GraphTypeD3, EdgeType, EdgeTypeD3, NodeType, NodeTypeD3 } from '../types'; import { NLPopUp } from './NLPopup'; @@ -27,6 +27,7 @@ import { nodeColor, nodeColorHex } from './utils'; import { useAsyncMemo } from '@/utils'; import { ForceEdgeBundling, type Point } from './edgeBundling'; import { canViewFeature } from '@/lib/components/featureFlags'; +import { AllLayoutAlgorithms } from 'ts-common/src/model/layouts'; type Props = { onClick: (event?: { node: NodeTypeD3; pos: PointData }) => void; diff --git a/src/lib/vis/visualizations/nodelinkvis/components/query2NL.tsx b/src/lib/vis/visualizations/nodelinkvis/components/query2NL.tsx index b62875a7a..e3a7fb358 100644 --- a/src/lib/vis/visualizations/nodelinkvis/components/query2NL.tsx +++ b/src/lib/vis/visualizations/nodelinkvis/components/query2NL.tsx @@ -4,11 +4,9 @@ * © Copyright Utrecht University (Department of Information and Computing Sciences) */ import { GraphType, EdgeType as EdgeType, NodeType } from '../types'; -import { Edge, Node, GraphQueryResult } from '../../../../data-access/store'; -import { ML } from '../../../../data-access/store/mlSlice'; +import { GraphQueryResult } from '../../../../data-access/store'; import { processML } from './NLMachineLearning'; -import { UniqueEdge } from '@/lib/data-access/store/graphQueryResultSlice'; -import { a } from 'vitest/dist/chunks/suite.B2jumIFP.js'; +import { EdgeQueryResult, GraphQueryResultMetaFromBackend, ML, NodeQueryResult } from 'ts-common'; /** ResultNodeLinkParserUseCase implements methods to parse and translate websocket messages from the backend into a GraphType. */ /** @@ -39,7 +37,7 @@ import { a } from 'vitest/dist/chunks/suite.B2jumIFP.js'; // to: string; // } -export type AxisType = Node | Edge; +export type AxisType = NodeQueryResult | EdgeQueryResult; /** Gets the group to which the node/edge belongs */ export function getGroupName(axisType: AxisType): string { @@ -68,7 +66,7 @@ export function isNodeEdgeResult(jsonObject: any): jsonObject is GraphQueryResul } /** Returns a record with a type of the nodes as key and a number that represents how many times this type is present in the nodeLinkResult as value. */ -export function getNodeTypes(nodeEdgeResult: GraphQueryResult): Record<string, number> { +export function getNodeTypes(nodeEdgeResult: GraphQueryResultMetaFromBackend): Record<string, number> { const types: Record<string, number> = {}; nodeEdgeResult.nodes.forEach(node => { @@ -91,7 +89,7 @@ type OptionsI = { * @param {any} queryResult An incoming query result from the websocket. * @returns {GraphType} A node-link graph containing the nodes and edges for the diagram. */ -export function parseQueryResult(queryResult: GraphQueryResult, ml: ML, options: OptionsI = {}): GraphType { +export function parseQueryResult(queryResult: GraphQueryResultMetaFromBackend, ml: ML, options: OptionsI = {}): GraphType { const ret: GraphType = { nodes: {}, edges: {}, diff --git a/src/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx b/src/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx index 6c0a7c8e1..3ebff7d4e 100644 --- a/src/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx +++ b/src/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx @@ -98,7 +98,7 @@ const NodeLinkVis = forwardRef<NodeLinkVisHandle, VisualizationPropTypes<Nodelin useEffect(() => { if (data) { - setGraph(parseQueryResult(data, ml)); + setGraph(parseQueryResult(data.graph, ml)); } }, [data, ml]); diff --git a/src/lib/vis/visualizations/paohvis/paohvis.tsx b/src/lib/vis/visualizations/paohvis/paohvis.tsx index b33323202..c8d86b1aa 100644 --- a/src/lib/vis/visualizations/paohvis/paohvis.tsx +++ b/src/lib/vis/visualizations/paohvis/paohvis.tsx @@ -84,7 +84,7 @@ const PaohVis = forwardRef<PaohVisHandle, VisualizationPropTypes<PaohVisProps>>( const divRef = useRef<HTMLDivElement>(null); // states track order headers attributes - const prevDisplayAttributesColumns = useRef<string[]>(); + const prevDisplayAttributesColumns = useRef<string[]>([]); // information hyperedgesBlock // dataModel renders bounded by pagination @@ -213,13 +213,13 @@ const PaohVis = forwardRef<PaohVisHandle, VisualizationPropTypes<PaohVisProps>>( // initialize rows/cols data - const rowNodesRaw = data.nodes + const rowNodesRaw = data.graph.nodes .filter(obj => obj['label'].includes(settings.rowNode)) .reduce((acc: { [_id: string]: NodeQueryResult }, node) => { acc[node._id] = node; return acc; }, {}); - const columnNodesRaw = data.nodes + const columnNodesRaw = data.graph.nodes .filter(obj => obj['label'].includes(settings.columnNode)) .reduce((acc: { [_id: string]: NodeQueryResult }, node) => { acc[node._id] = node; @@ -887,6 +887,7 @@ const PaohSettings = ({ settings, graphMetadata, updateSettings }: Visualization <div> <span className="text-xs font-semibold">Node used in Row</span> <Input + label="" className="w-full text-justify justify-start" type="dropdown" value={settings.rowNode} @@ -912,6 +913,7 @@ const PaohSettings = ({ settings, graphMetadata, updateSettings }: Visualization </AccordionHead> <AccordionBody> <Input + label="" type="checkbox" value={settings.attributeRowShow} options={rowNodeInformation.attributes} @@ -928,6 +930,7 @@ const PaohSettings = ({ settings, graphMetadata, updateSettings }: Visualization <div> <span className="text-xs font-semibold">Node used in Column</span> <Input + label="" className="w-full text-justify justify-start" type="dropdown" value={settings.columnNode} @@ -953,6 +956,7 @@ const PaohSettings = ({ settings, graphMetadata, updateSettings }: Visualization </AccordionHead> <AccordionBody> <Input + label="" type="checkbox" value={settings.attributeColumnShow} options={columnsNodeInformation.attributes} diff --git a/src/lib/vis/visualizations/paohvis/utils/ResultNodeLinkParserUseCase.tsx b/src/lib/vis/visualizations/paohvis/utils/ResultNodeLinkParserUseCase.tsx index 5ad6ea5e0..d11144dc0 100644 --- a/src/lib/vis/visualizations/paohvis/utils/ResultNodeLinkParserUseCase.tsx +++ b/src/lib/vis/visualizations/paohvis/utils/ResultNodeLinkParserUseCase.tsx @@ -39,7 +39,7 @@ export function isNodeLinkResult(jsonObject: any): jsonObject is GraphQueryResul export function getNodeTypes(nodeLinkResult: GraphQueryResult): Record<string, number> { const types: Record<string, number> = {}; - nodeLinkResult.nodes.forEach(node => { + nodeLinkResult.graph.nodes.forEach(node => { const type = getGroupName(node); if (types[type] != undefined) types[type]++; else types[type] = 0; diff --git a/src/lib/vis/visualizations/paohvis/utils/dataProcessing.tsx b/src/lib/vis/visualizations/paohvis/utils/dataProcessing.tsx index 2bc3b62a8..99e2827ef 100644 --- a/src/lib/vis/visualizations/paohvis/utils/dataProcessing.tsx +++ b/src/lib/vis/visualizations/paohvis/utils/dataProcessing.tsx @@ -1,14 +1,15 @@ +import { EdgeQueryResult, NodeQueryResult } from 'ts-common'; import { PaohVisProps } from '../paohvis'; import { PaohvisData, HyperEdgeRange, HyperEdgeI } from '../types'; import AttributeFilterUsecase, { getIds } from './AttributesFilterUseCase'; import { countRepetition } from './utils'; -import { Edge, GraphQueryResult, Node } from '@/lib/data-access'; +import { GraphQueryResult } from '@/lib/data-access'; -type AugmentedNode = Node & { +type AugmentedNode = NodeQueryResult & { reduced_ids: string[]; }; -function parseNodes(nodes: Node[]): string[] { +function parseNodes(nodes: NodeQueryResult[]): string[] { const rowNodes = nodes; const rowLabels = getIds(rowNodes); @@ -26,11 +27,10 @@ function parseNodes(nodes: Node[]): string[] { function parseHyperEdgeRanges( nodesColumn: AugmentedNode[], nodesRow: AugmentedNode[], - edges: Edge[], + edges: EdgeQueryResult[], rowInfo: string[], nodeIdIndex: { [id: string]: number }, ): [HyperEdgeRange[], { [key: string]: number }] { - if (nodesColumn.length == 0 || nodesRow.length == 0) return [[], {}]; const resultHyperEdgeRanges: HyperEdgeRange[] = nodesColumn.map(element => { @@ -93,13 +93,17 @@ function parseHyperEdgeRanges( return [resultHyperEdgeRanges, repetitionCountLabel]; } -function processNodesSelectAndMerge(nodes: AugmentedNode[], selectedNodeLabel: string, skipReduce: boolean, attributeShow: string[]): [AugmentedNode[], Set<string>, Record<string, string>, Record<string, string[]>, Record<string, string[]>]{ - +function processNodesSelectAndMerge( + nodes: NodeQueryResult[], + selectedNodeLabel: string, + skipReduce: boolean, + attributeShow: string[], +): [NodeQueryResult[], Set<string>, Record<string, string>, Record<string, string[]>, Record<string, string[]>] { const replaceNodeIds: Record<string, string> = {}; const reducedReplaceNodeIds: Record<string, string[]> = {}; const hashAttributesToIdMap: Record<string, string[]> = {}; - const newNodes: AugmentedNode[] = nodes + const newNodes: NodeQueryResult[] = nodes .filter(node => { // some dataset do not have label field let labelNode = ''; @@ -131,21 +135,20 @@ function processNodesSelectAndMerge(nodes: AugmentedNode[], selectedNodeLabel: s return { ...node, attributes: attributes, reduced_ids: [node._id] }; }); - // Make id->id replace map - Object.entries(hashAttributesToIdMap).forEach(([k, v]) => { - if (v.length <= 1) return; + // Make id->id replace map + Object.entries(hashAttributesToIdMap).forEach(([k, v]) => { + if (v.length <= 1) return; - v.slice(1).forEach(id => { - replaceNodeIds[id] = v[0]; - if (!(v[0] in reducedReplaceNodeIds)) reducedReplaceNodeIds[v[0]] = [id]; - else reducedReplaceNodeIds[v[0]].push(id); - }); + v.slice(1).forEach(id => { + replaceNodeIds[id] = v[0]; + if (!(v[0] in reducedReplaceNodeIds)) reducedReplaceNodeIds[v[0]] = [id]; + else reducedReplaceNodeIds[v[0]].push(id); }); + }); - const nodesIds: Set<string> = new Set(newNodes.map(node => node._id)); - - return [newNodes, nodesIds, replaceNodeIds, reducedReplaceNodeIds, hashAttributesToIdMap] + const nodesIds: Set<string> = new Set(newNodes.map(node => node._id)); + return [newNodes, nodesIds, replaceNodeIds, reducedReplaceNodeIds, hashAttributesToIdMap]; } export function parseQueryResult( @@ -154,21 +157,33 @@ export function parseQueryResult( relationTo: string, mergeData: boolean, ): PaohvisData { - const skipReduceRow = !mergeData; const skipReduceColumn = !mergeData; const nodesHaveSameLabel = configuration.rowNode === configuration.columnNode; const paohvisFilters = { nodeFilters: [], edgeFilters: [] }; // fill it with something - const filteredData = AttributeFilterUsecase.applyFilters(queryResult.nodes, queryResult.edges, paohvisFilters); - - const resultRow = processNodesSelectAndMerge(filteredData.nodes, configuration.rowNode, skipReduceRow, configuration.attributeRowShow) - const resultColumn = processNodesSelectAndMerge(filteredData.nodes, configuration.columnNode, skipReduceColumn, configuration.attributeColumnShow) + const filteredData = AttributeFilterUsecase.applyFilters(queryResult.graph.nodes, queryResult.graph.edges, paohvisFilters); + + const resultRow = processNodesSelectAndMerge(filteredData.nodes, configuration.rowNode, skipReduceRow, configuration.attributeRowShow); + const resultColumn = processNodesSelectAndMerge( + filteredData.nodes, + configuration.columnNode, + skipReduceColumn, + configuration.attributeColumnShow, + ); - let nodesRow = resultRow[0] - const [rowNodesIds, replaceRowNodeIds, reducedReplaceRowNodeIds] = resultRow.slice(1,4) as [Set<string>, Record<string, string>, Record<string, string[]>] - let nodesColumn = resultColumn[0] - const [columnNodesIds, replaceColumnNodeIds, reducedReplaceColumnNodeIds] = resultColumn.slice(1,4) as [Set<string>, Record<string, string>, Record<string, string[]>] + let nodesRow: AugmentedNode[] = resultRow[0].map(node => ({ ...node, reduced_ids: [] as string[] })); + const [rowNodesIds, replaceRowNodeIds, reducedReplaceRowNodeIds] = resultRow.slice(1, 4) as [ + Set<string>, + Record<string, string>, + Record<string, string[]>, + ]; + let nodesColumn: AugmentedNode[] = resultColumn[0].map(node => ({ ...node, reduced_ids: [] as string[] })); + const [columnNodesIds, replaceColumnNodeIds, reducedReplaceColumnNodeIds] = resultColumn.slice(1, 4) as [ + Set<string>, + Record<string, string>, + Record<string, string[]>, + ]; if (mergeData) { const toRemoveIdsRow = new Set(Object.keys(replaceRowNodeIds)); @@ -183,15 +198,14 @@ export function parseQueryResult( } const augmentedNodes = [...nodesRow, ...nodesColumn]; - const augmentedEdges: Edge[] = []; - - filteredData.edges.forEach(edge => { + const augmentedEdges: EdgeQueryResult[] = []; - if(nodesHaveSameLabel) { - const from1 = edge.from - const to1 = edge.to - const from2 = edge.to - const to2 = edge.from + filteredData.edges.forEach(edge => { + if (nodesHaveSameLabel) { + const from1 = edge.from; + const to1 = edge.to; + const from2 = edge.to; + const to2 = edge.from; augmentedEdges.push({ _id: edge._id, @@ -199,17 +213,16 @@ export function parseQueryResult( to: replaceColumnNodeIds[to1] || to1, label: edge.label, attributes: edge.attributes, - }) + }); augmentedEdges.push({ - _id: edge._id + "_2", + _id: edge._id + '_2', from: replaceRowNodeIds[from2] || from2, to: replaceColumnNodeIds[to2] || to2, - label: edge.label + "_2", + label: edge.label + '_2', attributes: edge.attributes, - }) - - }else{ + }); + } else { const from = rowNodesIds.has(edge.from) ? edge.from : edge.to; // rows const to = columnNodesIds.has(edge.to) ? edge.to : edge.from; // columns @@ -219,27 +232,19 @@ export function parseQueryResult( to: replaceColumnNodeIds[to] || to, label: edge.label, attributes: edge.attributes, - }) + }); } - }); const nodeIdIndex: { [id: string]: number } = nodesRow.reduce((acc, node, index) => ({ ...acc, [node._id]: index }), {}); - //parse nodes const rowInfo: string[] = parseNodes(nodesRow); let nodeListAttr: any[] = []; nodeListAttr = nodesRow.map(node => node._id); - const [resultHyperEdgeRanges, rowsDegree] = parseHyperEdgeRanges( - nodesColumn, - nodesRow, - augmentedEdges, - rowInfo, - nodeIdIndex, - ); + const [resultHyperEdgeRanges, rowsDegree] = parseHyperEdgeRanges(nodesColumn, nodesRow, augmentedEdges, rowInfo, nodeIdIndex); return { rowLabels: nodeListAttr, diff --git a/src/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.tsx b/src/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.tsx index 21427cc62..8040a78bb 100644 --- a/src/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.tsx +++ b/src/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.tsx @@ -6,7 +6,6 @@ import { select, selectAll } from 'd3'; import { VisualizationPropTypes, VISComponentType, VisualizationSettingsPropTypes } from '../../common'; import { findConnectionsNodes, getRegionData, setExtension, filterArray, getUniqueValues } from './components/utils'; import { cloneDeep, isEqual } from 'lodash-es'; -import { NodeQueryResult } from '@/lib/data-access/store/graphQueryResultSlice'; import { UserSelection, RegionData, @@ -26,6 +25,7 @@ import { MultiGraph } from 'graphology'; import { buildGraphology, config, numColorsCategorical, marginAxis, isColorCircleFix, noDataRange } from './utils'; import { SemSubsConfigPanel } from './configPanel'; import { nodeColorHex } from './components/utils'; +import { NodeQueryResult } from 'ts-common'; export interface VisSemanticSubstratesHandle { exportImageInternal: () => void; @@ -96,7 +96,7 @@ const VisSemanticSubstrates = forwardRef<VisSemanticSubstratesHandle, Visualizat // data structure to handle node/edge information const augmentedNodes: AugmentedNodeAttributes[] = useMemo(() => { - return data.nodes.map((node: NodeQueryResult) => ({ + return data.graph.nodes.map((node: NodeQueryResult) => ({ _id: node._id, attributes: node.attributes, label: node.label, @@ -104,7 +104,7 @@ const VisSemanticSubstrates = forwardRef<VisSemanticSubstratesHandle, Visualizat }, [data]); const augmentedEdges: AugmentedEdgeAttributes[] = useMemo(() => { - return data.edges.map((edge: any) => ({ + return data.graph.edges.map((edge: any) => ({ id: edge.id, to: edge.to, from: edge.from, diff --git a/src/lib/vis/visualizations/tablevis/tablevis.tsx b/src/lib/vis/visualizations/tablevis/tablevis.tsx index 711bf2683..7b5e19e91 100644 --- a/src/lib/vis/visualizations/tablevis/tablevis.tsx +++ b/src/lib/vis/visualizations/tablevis/tablevis.tsx @@ -53,9 +53,9 @@ export const TableVis = forwardRef<TableVisHandle, VisualizationPropTypes<TableP let dataNodes = []; if (nodesLabels.includes(settings.selectedEntity)) { - dataNodes = (searchResults?.nodes?.length ?? 0) === 0 ? data.nodes : searchResults.nodes; + dataNodes = (searchResults?.nodes?.length ?? 0) === 0 ? data.graph.nodes : searchResults.nodes; } else { - dataNodes = data.edges; + dataNodes = data.graph.edges; } return ( @@ -106,7 +106,7 @@ export const TableVis = forwardRef<TableVisHandle, VisualizationPropTypes<TableP } }) ); - }, [data.nodes, settings.selectedEntity, settings.displayAttributes, searchResults]); + }, [data.graph.nodes, settings.selectedEntity, settings.displayAttributes, searchResults]); const exportImageInternal = () => { if (ref.current) { @@ -192,6 +192,7 @@ const TableSettings = ({ settings, graphMetadata, updateSettings }: Visualizatio <SettingsContainer> <div className="my-2"> <Input + label="" className="w-full text-justify justify-center" type="dropdown" value={settings.selectedEntity} @@ -248,6 +249,7 @@ const TableSettings = ({ settings, graphMetadata, updateSettings }: Visualizatio </AccordionHead> <AccordionBody> <Input + label="" type="checkbox" value={settings.displayAttributes} options={selectedNodeAttributes} diff --git a/src/lib/vis/visualizations/vis0D/Vis0D.tsx b/src/lib/vis/visualizations/vis0D/Vis0D.tsx index b7f6e3e2a..32143bc2a 100644 --- a/src/lib/vis/visualizations/vis0D/Vis0D.tsx +++ b/src/lib/vis/visualizations/vis0D/Vis0D.tsx @@ -93,7 +93,7 @@ const Vis0D = forwardRef<Vis0DVisHandle, VisualizationPropTypes<Vis0DProps>>(({ const keys = activeQuery?.graph.nodes.filter(node => node.attributes.schemaKey === settings.selectedEntity).map(node => node.key); if (!keys || keys.length === 0) return; statValue = keys.reduce((acc, key) => { - acc += activeQuery?.graph?.nodeCounts?.[key + '_count'] ?? 0; + acc += activeQuery?.graphCounts.nodeCounts?.[key + '_count'] ?? 0; return acc; }, 0); } else { diff --git a/src/lib/vis/visualizations/vis1D/model.ts b/src/lib/vis/visualizations/vis1D/model.ts index ec1d4f109..81099b6c8 100644 --- a/src/lib/vis/visualizations/vis1D/model.ts +++ b/src/lib/vis/visualizations/vis1D/model.ts @@ -37,7 +37,7 @@ export const getAttributeValues = ( return []; } - const attValues = query.nodes + const attValues = query.graph.nodes .filter(item => item.label === selectedEntity) .map(item => { // Check if the attribute exists, return its value if it does, or an empty string otherwise @@ -74,7 +74,7 @@ export const getAttributeValues = ( } else if (groupBy === 'degree') { const attValuesMap = Object.fromEntries(attValues); const ids = attValues.map(item => item[0]); - const degree = query.edges.reduce( + const degree = query.graph.edges.reduce( (acc, item) => { if (ids.includes(item.from)) { acc[attValuesMap[item.from]] = (acc[attValuesMap[item.from]] || 0) + 1; -- GitLab