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