diff --git a/libs/shared/lib/data-access/api/eventBus.tsx b/libs/shared/lib/data-access/api/eventBus.tsx index da623966ee559403111ef1b33425c61dd10a7ed7..41a21217a79a2f91854e23343631213f8040913a 100644 --- a/libs/shared/lib/data-access/api/eventBus.tsx +++ b/libs/shared/lib/data-access/api/eventBus.tsx @@ -49,7 +49,7 @@ import { import { URLParams, getParam, deleteParam } from './url'; import { VisState, setVisualizationState } from '../store/visualizationSlice'; import { isEqual } from 'lodash-es'; -import { addSchemaAttributeDimensions, addSchemaAttributeInformation } from '../store/schemaSlice'; +import { setSchemaAttributeDimensions, setSchemaAttributeInformation } from '../store/schemaSlice'; import { addError } from '@graphpolaris/shared/lib/data-access/store/configSlice'; import { unSelect } from '../store/interactionSlice'; import { SchemaGraphStats } from '../../schema'; @@ -114,12 +114,12 @@ export const EventBus = (props: { onRunQuery: Function; onAuthorized: Function } ); Broker.instance().subscribe((data: SchemaGraphStats) => { - dispatch(addSchemaAttributeInformation(data)); + dispatch(setSchemaAttributeInformation(data)); dispatch(addInfo('Received attribute information')); }, 'schema_stats_result'); Broker.instance().subscribe((data: any) => { - dispatch(addSchemaAttributeDimensions(data)); + dispatch(setSchemaAttributeDimensions(JSON.parse(data))); dispatch(addInfo('Attribute dimensions added')); }, 'schema_inference'); diff --git a/libs/shared/lib/data-access/store/hooks.ts b/libs/shared/lib/data-access/store/hooks.ts index 9f1ab6ce9a0d0cb1ad0b4e1019d41c6c1633022d..a9e0dd94f835a05ba4aef220c8260c36362fe1b7 100644 --- a/libs/shared/lib/data-access/store/hooks.ts +++ b/libs/shared/lib/data-access/store/hooks.ts @@ -1,6 +1,13 @@ import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'; import { GraphQueryResult, selectGraphQueryResult, selectGraphQueryResultMetaData } from './graphQueryResultSlice'; -import { schemaGraph, selectSchemaLayout, schemaSettingsState, SchemaSettings } from './schemaSlice'; +import { + schemaGraph, + selectSchemaLayout, + schemaSettingsState, + SchemaSettings, + schemaStatsState, + schemaInferenceState, +} from './schemaSlice'; import type { RootState, AppDispatch } from './store'; import { ConfigStateI, configState } from '@graphpolaris/shared/lib/data-access/store/configSlice'; import { @@ -27,7 +34,7 @@ import { } from './searchResultSlice'; import { AllLayoutAlgorithms } from '../../graph-layout'; import { QueryGraphEdgeHandle, QueryMultiGraph } from '../../querybuilder'; -import { SchemaGraph } from '../../schema'; +import { SchemaGraph, SchemaGraphInference, SchemaGraphStats } from '../../schema'; import { GraphMetadata } from '../statistics'; import { SelectionStateI, FocusStateI, focusState, selectionState } from './interactionSlice'; import { VisualizationSettingsType } from '../../vis/common'; @@ -44,6 +51,8 @@ export const useGraphQueryResultMeta: () => GraphMetadata | undefined = () => us // Gives the schema export const useSchemaGraph: () => SchemaGraph = () => useAppSelector(schemaGraph); export const useSchemaSettings: () => SchemaSettings = () => useAppSelector(schemaSettingsState); +export const useSchemaStats: () => SchemaGraphStats = () => useAppSelector(schemaStatsState); +export const useSchemaInference: () => SchemaGraphInference = () => useAppSelector(schemaInferenceState); export const useSchemaLayout: () => AllLayoutAlgorithms = () => useAppSelector(selectSchemaLayout); // Querybuilder Slices diff --git a/libs/shared/lib/data-access/store/schemaSlice.ts b/libs/shared/lib/data-access/store/schemaSlice.ts index fd21442faa5849e5fd848c6a070f4e29ebecbe5a..39bd69e4e9e631e7800c908aa7e5e986a8968fb9 100644 --- a/libs/shared/lib/data-access/store/schemaSlice.ts +++ b/libs/shared/lib/data-access/store/schemaSlice.ts @@ -25,8 +25,8 @@ type schemaSliceI = { export const initialState: schemaSliceI = { graph: new SchemaGraphology().export(), graphInference: { - nodeInference: {}, - edgeInference: {}, + nodes: {}, + edges: {}, }, graphStats: { nodeStats: {}, @@ -59,11 +59,11 @@ export const schemaSlice = createSlice({ state.settings = action.payload; }, - addSchemaAttributeDimensions: (state, action: PayloadAction<SchemaGraphInference>) => { + setSchemaAttributeDimensions: (state, action: PayloadAction<SchemaGraphInference>) => { state.graphInference = action.payload; }, - addSchemaAttributeInformation: (state, action: PayloadAction<SchemaGraphStats>) => { + setSchemaAttributeInformation: (state, action: PayloadAction<SchemaGraphStats>) => { state.graphStats = action.payload; }, }, @@ -73,11 +73,13 @@ export const { setSchema, setSchemaSettings, clearSchema, - addSchemaAttributeDimensions, - addSchemaAttributeInformation, + setSchemaAttributeDimensions, + setSchemaAttributeInformation, } = schemaSlice.actions; export const schemaSettingsState = (state: RootState) => state.schema.settings; +export const schemaInferenceState = (state: RootState) => state.schema.graphInference; +export const schemaStatsState = (state: RootState) => state.schema.graphStats; /** * Select the schema and convert it to a graphology object diff --git a/libs/shared/lib/querybuilder/model/graphology/utils.ts b/libs/shared/lib/querybuilder/model/graphology/utils.ts index 7bc9e057824cc1f419a3b4a262757ee77f91ef7c..cf85cc7ced9e4cd96716bfc10c7929dedaea7e90 100644 --- a/libs/shared/lib/querybuilder/model/graphology/utils.ts +++ b/libs/shared/lib/querybuilder/model/graphology/utils.ts @@ -12,7 +12,7 @@ import { } from './model'; import { XYPosition } from 'reactflow'; import { Handles, QueryElementTypes } from '../reactflow'; -import { SchemaAttribute, SchemaAttributeTypes } from '@graphpolaris/shared/lib/schema'; +import { SchemaAttribute, SchemaGraphInference } from '@graphpolaris/shared/lib/schema'; import { InputNodeType, InputNodeTypeTypes } from '../logic/general'; import { checkForMetaAttributes } from './metaAttributes'; @@ -60,7 +60,11 @@ export class QueryMultiGraphology extends Graph<QueryGraphNodes, QueryGraphEdges return attributes; } - public addPill2Graphology(attributes: QueryGraphNodes, optAttributes: SchemaAttribute[] | undefined = undefined): QueryGraphNodes { + public addPill2Graphology( + attributes: QueryGraphNodes, + optAttributes: SchemaAttribute[] | undefined = undefined, + schemaInference: SchemaGraphInference | undefined = undefined, + ): QueryGraphNodes { attributes = this.configureDefaults(attributes); if (!attributes.type || !attributes.name || !attributes.id) throw Error('type or name is not defined'); @@ -82,7 +86,7 @@ export class QueryMultiGraphology extends Graph<QueryGraphNodes, QueryGraphEdges ...defaultHandleData, attributeName: optAttribute.name, // attributeType: optAttribute.type, - attributeDimension: optAttribute.dimension, + attributeDimension: undefined, // FIXME handleType: Handles.EntityAttribute, }, }); @@ -98,7 +102,7 @@ export class QueryMultiGraphology extends Graph<QueryGraphNodes, QueryGraphEdges ...defaultHandleData, attributeName: optAttribute.name, // attributeType: optAttribute.type, - attributeDimension: optAttribute.dimension, + attributeDimension: undefined, // FIXME handleType: Handles.RelationAttribute, }, }); diff --git a/libs/shared/lib/querybuilder/panel/QueryBuilder.tsx b/libs/shared/lib/querybuilder/panel/QueryBuilder.tsx index f79f55f8636c9ce05f7a8508963d7d1ec2f6f59a..b392032c70a0418ebee83768310b09ccdf366bec 100644 --- a/libs/shared/lib/querybuilder/panel/QueryBuilder.tsx +++ b/libs/shared/lib/querybuilder/panel/QueryBuilder.tsx @@ -4,6 +4,7 @@ import { useQuerybuilderHash, useQuerybuilderSettings, useSchemaGraph, + useSchemaInference, useSearchResultQB, } from '@graphpolaris/shared/lib/data-access/store'; import { clearQB, setQuerybuilderGraphology, toQuerybuilderGraphology } from '@graphpolaris/shared/lib/data-access/store/querybuilderSlice'; @@ -71,6 +72,7 @@ export const QueryBuilderInner = (props: QueryBuilderProps) => { var edgeTypes = useMemo(() => ({ connection: ConnectionLine, attribute_connection: ConnectionLine }), []); const schemaGraph = useSchemaGraph(); + const schemaInference = useSchemaInference(); const schema = useMemo(() => toSchemaGraphology(schemaGraph), [schemaGraph]); const graph = useQuerybuilderGraph(); const qbHash = useQuerybuilderHash(); @@ -197,6 +199,7 @@ export const QueryBuilderInner = (props: QueryBuilderProps) => { attributes: [], }, schema.getNodeAttribute(dragData.name, 'attributes'), + schemaInference, ); dispatch(setQuerybuilderGraphology(graphologyGraph)); @@ -619,7 +622,7 @@ export const QueryBuilderInner = (props: QueryBuilderProps) => { if (!ret) setToggleSettings(undefined); }} > - <DialogContent> + <DialogContent className="w-fit"> <QueryBuilderLogicPillsPanel onClick={(v) => { connectingNodeId.current = null; diff --git a/libs/shared/lib/querybuilder/panel/querysidepanel/queryBuilderLogicPillsPanel.tsx b/libs/shared/lib/querybuilder/panel/querysidepanel/queryBuilderLogicPillsPanel.tsx index fb74fe2cd51b3409448ab981bda18d2e8aec6aee..3b389e4c6695ca500b12fa141d11029120fcea47 100644 --- a/libs/shared/lib/querybuilder/panel/querysidepanel/queryBuilderLogicPillsPanel.tsx +++ b/libs/shared/lib/querybuilder/panel/querysidepanel/queryBuilderLogicPillsPanel.tsx @@ -24,8 +24,7 @@ export const QueryBuilderLogicPillsPanel = (props: { let filterType = props.editNode ? props.editNode.data.logic.input.type : ((props.connection?.params?.handleId ? toHandleData(props.connection.params.handleId).attributeType : null) as string); - if (!filterType) return <></>; - else if (filterType === 'string') filterType = 'string'; + if (filterType === 'string') filterType = 'string'; else if (filterType === 'int' || filterType === 'float') filterType = 'number'; const dataOps = [ @@ -156,9 +155,9 @@ export const QueryBuilderLogicPillsPanel = (props: { }; return ( - <div className={props.className + ' card'}> + <div className={props.className + ' card w-fit'}> {props.title && <h1 className="card-title mb-7">{props.title}</h1>} - <div className="gap-1 flex"> + <div className="gap-1 flex w-fit"> <TooltipProvider delayDuration={50}> {dataOps.map((item, index) => ( <Tooltip key={item.title}> @@ -192,14 +191,14 @@ export const QueryBuilderLogicPillsPanel = (props: { </div> ))} </div> - <div className="overflow-x-hidden h-[75rem] w-full mt-1"> - <ul className="menu p-0 [&_li>*]:rounded-none w-full pb-10 h-full gap-1"> + <div className="mt-1 overflow-x-hidden h-[80vh]"> + <ul className="pb-10 gap-1 flex flex-col w-full h-full"> {Object.values(AllLogicMap) .filter((item) => !filterType || item.key.toLowerCase().includes(filterType)) .filter((item) => selectedOp === -1 || item.key.toLowerCase().includes(dataOps?.[selectedOp].title)) .filter((item) => selectedType === -1 || item.key.toLowerCase().includes(dataTypes?.[selectedType].title)) .map((item, index) => ( - <li key={item.key + item.description} className="h-fit bg-white border-[1px] border-secondary-500 rounded-sm"> + <li key={item.key + item.description} className="px-3 py-2 h-fit bg-white border-[1px] border-secondary-500 rounded-sm"> <span data-tip={item.description} className="flex before:w-[10rem] before:text-center tooltip tooltip-bottom text-start " @@ -210,11 +209,6 @@ export const QueryBuilderLogicPillsPanel = (props: { else onNewNodeFromPopup(item); }} > - {item.icon && ( - <div className="w-[1rem] rounded-sm justify-center flex"> - <Icon component={item.icon} size={20} /> - </div> - )} <span className="w-full">{item.name}</span> <span className="flex scale-75"> {item.key.toLowerCase().includes('filter') && <Icon component="icon-[ic--baseline-filter-alt]" size={20} />} diff --git a/libs/shared/lib/querybuilder/pills/pilldropdown/PillDropdown.tsx b/libs/shared/lib/querybuilder/pills/pilldropdown/PillDropdown.tsx index 80ec774556ef11bc087271a0dd3bcca4d14a511f..2748689650c03cdb9e7cc241793ca393ea34f3e5 100644 --- a/libs/shared/lib/querybuilder/pills/pilldropdown/PillDropdown.tsx +++ b/libs/shared/lib/querybuilder/pills/pilldropdown/PillDropdown.tsx @@ -10,7 +10,6 @@ import { import { Button, TextInput, useAppDispatch, useQuerybuilderAttributesShown } from '../../..'; import { attributeShownToggle } from '@graphpolaris/shared/lib/data-access/store/querybuilderSlice'; import { isEqual } from 'lodash-es'; -import { QueryBuilderDispatcherContext } from '../../panel/QueryBuilderDispatcher'; import { PillDropdownItem } from './PillDropdownItem'; type PillDropdownProps = { diff --git a/libs/shared/lib/schema/model/FromBackend.ts b/libs/shared/lib/schema/model/FromBackend.ts index 5158465e19fc402c7bc8baf3bf0be99f6064aea6..d6cfa60d0bb40df3fab6bd040964df0b66a6a20d 100644 --- a/libs/shared/lib/schema/model/FromBackend.ts +++ b/libs/shared/lib/schema/model/FromBackend.ts @@ -48,8 +48,8 @@ export type SchemaNode = { }; export type SchemaGraphInference = { - nodeInference: Record<string, Record<string, DimensionType>>; // node key -> attribute label -> dimension - edgeInference: Record<string, Record<string, DimensionType>>; + nodes: Record<string, Record<string, DimensionType>>; // node key -> attribute label -> dimension + edges: Record<string, Record<string, DimensionType>>; }; export type SchemaGraphStats = {