diff --git a/package.json b/package.json index 2066ec40..f9bc8b18 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "rxjs": "~7.8.0", "sigma": "3.0.1", "tslib": "^2.3.0", - "typedb-driver-http": "0.0.1", + "@typedb/driver-http": "3.7.0", "typedb-web-common": "workspace:*", "uuid": "11.1.0", "zone.js": "~0.15.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dcc4b576..1577446e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,6 +80,9 @@ importers: '@tauri-apps/plugin-opener': specifier: ^2 version: 2.2.7 + '@typedb/driver-http': + specifier: 3.7.0 + version: 3.7.0 chroma-js: specifier: 3.1.2 version: 3.1.2 @@ -113,9 +116,6 @@ importers: tslib: specifier: ^2.3.0 version: 2.8.1 - typedb-driver-http: - specifier: 0.0.1 - version: 0.0.1 typedb-web-common: specifier: workspace:* version: link:typedb-web/common @@ -2790,6 +2790,9 @@ packages: resolution: {integrity: sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==} engines: {node: ^18.17.0 || >=20.5.0} + '@typedb/driver-http@3.7.0': + resolution: {integrity: sha512-vFdyq7K/0MCU1QezoL3cJ6BrowG883d9Hvh6rtdgos4yN4qsQFTtLG0pnkA3H+1IENA5YWVq+YKuMfb9gq+Amg==} + '@types/body-parser@1.19.6': resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} @@ -5715,10 +5718,6 @@ packages: typed-assert@1.0.9: resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} - typedb-driver-http@0.0.1: - resolution: {integrity: sha512-9rs1hC3Rvysw7pX8/DL3/fD5zwjgsZ8xLXFhVNKBCg02qMPUt82sz11mmJ1oMq2ximJt3/t2N+WpSLBQJKIRlg==} - engines: {node: '>=22.16 <23'} - typescript@5.5.4: resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} @@ -9005,6 +9004,8 @@ snapshots: '@tufjs/canonical-json': 2.0.0 minimatch: 9.0.5 + '@typedb/driver-http@3.7.0': {} + '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 @@ -12380,8 +12381,6 @@ snapshots: typed-assert@1.0.9: {} - typedb-driver-http@0.0.1: {} - typescript@5.5.4: {} typescript@5.8.3: {} diff --git a/src/concept/action.ts b/src/concept/action.ts index b97f79d5..d8bf87f5 100644 --- a/src/concept/action.ts +++ b/src/concept/action.ts @@ -4,7 +4,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { ApiResponse, QueryResponse } from "typedb-driver-http"; +import { ApiResponse, QueryResponse } from "@typedb/driver-http"; import { TransactionOperation } from "./transaction"; interface DriverActionBase { diff --git a/src/concept/connection.ts b/src/concept/connection.ts index c5695bab..d283cd3c 100644 --- a/src/concept/connection.ts +++ b/src/concept/connection.ts @@ -6,7 +6,7 @@ import { Database, DriverParams, DriverParamsBasic, DriverParamsTranslated, isBasicParams, TranslatedAddress -} from "typedb-driver-http"; +} from "@typedb/driver-http"; export class ConnectionConfig { diff --git a/src/concept/transaction.ts b/src/concept/transaction.ts index 9e2dadce..3c9d969a 100644 --- a/src/concept/transaction.ts +++ b/src/concept/transaction.ts @@ -4,7 +4,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { TransactionType } from "typedb-driver-http"; +import { TransactionType } from "@typedb/driver-http"; import { QueryRunAction } from "./action"; export class Transaction { diff --git a/src/framework/graph-visualiser/config.ts b/src/framework/graph-visualiser/config.ts index 04b6bb60..fd157142 100644 --- a/src/framework/graph-visualiser/config.ts +++ b/src/framework/graph-visualiser/config.ts @@ -1,4 +1,4 @@ -import { EdgeKind, RoleType } from "typedb-driver-http"; +import { EdgeKind, RoleType } from "@typedb/driver-http"; import {DataVertex, DataVertexKind, VertexUnavailable} from "./graph"; import {Color} from "chroma-js"; diff --git a/src/framework/graph-visualiser/converter.ts b/src/framework/graph-visualiser/converter.ts index 149af599..b8f37b25 100644 --- a/src/framework/graph-visualiser/converter.ts +++ b/src/framework/graph-visualiser/converter.ts @@ -1,4 +1,4 @@ -import { getVariableName, QueryConstraintAny, QueryStructure, QueryVertex } from "typedb-driver-http"; +import { getVariableName, ConstraintVertexAny } from "@typedb/driver-http"; import { EdgeAttributes, EdgeMetadata, @@ -21,13 +21,18 @@ import { } from "./graph"; import {ILogicalGraphConverter} from "./visualisation"; import {StudioConverterStructureParameters, StudioConverterStyleParameters} from "./config"; +import { + AnalyzedPipelineBackCompat, + backCompat_expressionAssigned, + ConstraintBackCompat +} from "./index"; -type QueryVertexOrSpecial = QueryVertex | VertexFunction | VertexExpression; +type ConstraintVertexOrSpecial = ConstraintVertexAny | VertexFunction | VertexExpression; export class StudioConverter implements ILogicalGraphConverter { constructor( - public readonly graph: VisualGraph, public readonly queryStructure: QueryStructure, + public readonly graph: VisualGraph, public readonly queryStructure: AnalyzedPipelineBackCompat, public readonly isFollowupQuery: boolean, public readonly structureParameters: StudioConverterStructureParameters, public readonly styleParameters: StudioConverterStyleParameters ) { @@ -81,11 +86,11 @@ export class StudioConverter implements ILogicalGraphConverter { return `${from_id}:${to_id}:${edge_type_id}`; } - private shouldCreateNode(queryVertex: QueryVertexOrSpecial) { + private shouldCreateNode(queryVertex: ConstraintVertexOrSpecial) { return shouldCreateNode(this.queryStructure, queryVertex); } - private shouldCreateEdge(edge: DataConstraintAny, from: QueryVertexOrSpecial, to: QueryVertexOrSpecial) { + private shouldCreateEdge(edge: DataConstraintAny, from: ConstraintVertexOrSpecial, to: ConstraintVertexOrSpecial) { return shouldCreateEdge(this.queryStructure, edge.queryConstraint, from, to); } @@ -105,7 +110,7 @@ export class StudioConverter implements ILogicalGraphConverter { } } - private maybeCreateEdge(answerIndex: number, edge: DataConstraintAny, label: string, from: DataVertex, to: DataVertex, queryFrom: QueryVertexOrSpecial, queryTo: QueryVertexOrSpecial) { + private maybeCreateEdge(answerIndex: number, edge: DataConstraintAny, label: string, from: DataVertex, to: DataVertex, queryFrom: ConstraintVertexOrSpecial, queryTo: ConstraintVertexOrSpecial) { if (this.shouldCreateEdge(edge, queryFrom, queryTo)) { let fromKey = this.put_vertex(answerIndex, from, queryFrom); let toKey = this.put_vertex(answerIndex, to, queryTo); @@ -124,7 +129,7 @@ export class StudioConverter implements ILogicalGraphConverter { // ILogicalGraphConverter // Vertices - put_vertex(answerIndex: number, vertex: DataVertex, queryVertex: QueryVertexOrSpecial): string { + put_vertex(answerIndex: number, vertex: DataVertex, queryVertex: ConstraintVertexOrSpecial): string { const key = vertexMapKey(vertex); if (this.shouldCreateNode(queryVertex)) { this.createVertex(key, this.vertexAttributes(vertex)) @@ -207,13 +212,11 @@ export class StudioConverter implements ILogicalGraphConverter { repr: constraint.text, vertex_map_key: expressionVertexKey } - expression.assigned - .forEach((assigned, i) => { - let queryVertex = constraint.queryConstraint.assigned[i]; - let varNameOrId = getVariableName(this.queryStructure, queryVertex) ?? `$_${queryVertex.id}`; - let label = `assign[${varNameOrId}]`; - this.maybeCreateEdge(answerIndex, constraint, label, expressionVertex, assigned, expressionVertex, queryVertex); - }); + + let queryVertex = backCompat_expressionAssigned(constraint.queryConstraint); + let varNameOrId = getVariableName(this.queryStructure, queryVertex) ?? `$_${queryVertex.id}`; + let label = `assign[${varNameOrId}]`; + this.maybeCreateEdge(answerIndex, constraint, label, expressionVertex, expression.assigned, expressionVertex, queryVertex); expression.arguments .forEach((arg, i) => { let queryVertex = constraint.queryConstraint.arguments[i]; @@ -253,7 +256,7 @@ export class StudioConverter implements ILogicalGraphConverter { } } -export function shouldCreateNode(structure: QueryStructure, vertex: QueryVertexOrSpecial) { +export function shouldCreateNode(structure: AnalyzedPipelineBackCompat, vertex: ConstraintVertexOrSpecial) { return !( (vertex.tag === "label" || (vertex.tag == "variable" && !structure.outputs.includes(vertex.id)) @@ -261,7 +264,7 @@ export function shouldCreateNode(structure: QueryStructure, vertex: QueryVertexO ); } -export function shouldCreateEdge(structure: QueryStructure, _edge: QueryConstraintAny, from: QueryVertexOrSpecial, to: QueryVertexOrSpecial) { +export function shouldCreateEdge(structure: AnalyzedPipelineBackCompat, _edge: ConstraintBackCompat, from: ConstraintVertexOrSpecial, to: ConstraintVertexOrSpecial) { return shouldCreateNode(structure, from) && shouldCreateNode(structure, to); } @@ -297,6 +300,6 @@ function functionVertexKeyFromArgsAndAssigned(constraint: DataConstraintFunction function expressionVertexKeyFromArgsAndAssigned(constraint: DataConstraintExpression): string { let args = constraint.arguments.map(v => vertexMapKey(v)).join(","); - let assigned = constraint.assigned.map(v => vertexMapKey(v)).join(","); + let assigned = constraint.assigned; return `${constraint.text}(${args}) -> ${assigned}`; } diff --git a/src/framework/graph-visualiser/defaults.ts b/src/framework/graph-visualiser/defaults.ts index 580e34fc..9b8aa237 100644 --- a/src/framework/graph-visualiser/defaults.ts +++ b/src/framework/graph-visualiser/defaults.ts @@ -1,4 +1,4 @@ -import { RoleType } from "typedb-driver-http"; +import { RoleType } from "@typedb/driver-http"; import chroma from "chroma-js"; import { vertexMapKey } from "./converter"; import {DataVertex, VertexUnavailable} from "./graph"; diff --git a/src/framework/graph-visualiser/graph.ts b/src/framework/graph-visualiser/graph.ts index 4dd49448..98a34591 100644 --- a/src/framework/graph-visualiser/graph.ts +++ b/src/framework/graph-visualiser/graph.ts @@ -1,12 +1,20 @@ import { - Attribute, AttributeType, Concept, ConceptRow, ConceptRowsQueryResponse, Entity, EntityType, getVariableName, - InstantiableType, QueryConstraintAny, QueryConstraintComparison, QueryConstraintExpression, QueryConstraintFunction, - QueryConstraintHas, QueryConstraintIid, QueryConstraintIs, QueryConstraintIsa, QueryConstraintIsaExact, QueryConstraintKind, - QueryConstraintLabel, QueryConstraintLinks, QueryConstraintOwns, QueryConstraintPlays, QueryConstraintRelates, - QueryConstraintSpan, QueryConstraintSub, QueryConstraintSubExact, QueryConstraintValue, QueryStructure, QueryVertex, + Attribute, AttributeType, Concept, ConceptRow, ConceptRowsQueryResponse, Entity, EntityType, InstantiableType, + getVariableName, ConstraintComparison, ConstraintExpression, ConstraintFunction, + ConstraintHas, ConstraintIid, ConstraintIs, ConstraintIsa, ConstraintIsaExact, ConstraintKind, + ConstraintLabel, ConstraintLinks, ConstraintOwns, ConstraintPlays, ConstraintRelates, + ConstraintSpan, ConstraintSub, ConstraintSubExact, ConstraintValue, ConstraintVertexAny, + ConstraintExpressionLegacy, ConstraintLinksLegacy, Relation, RelationType, RoleType, ThingKind, Type, TypeKind, Value, ValueKind -} from "typedb-driver-http"; +} from "@typedb/driver-http"; import {MultiGraph} from "graphology"; +import { + ConstraintBackCompat, + ConceptRowsQueryResponseBackCompat, + backCompat_expressionAssigned, + backCompat_pipelineBlocks, + AnalyzedPipelineBackCompat +} from "./index"; /////////////////////// // TypeDB Data Graph // @@ -33,14 +41,14 @@ export type DataConstraintAny = DataConstraintIsa | DataConstraintIsaExact | Dat DataConstraintExpression | DataConstraintFunction | DataConstraintComparison | DataConstraintIs | DataConstraintIid | DataConstraintLabel | DataConstraintValue | DataConstraintKind; -export type DataConstraintSpan = QueryConstraintSpan; +export type DataConstraintSpan = ConstraintSpan; // Instance export interface DataConstraintIsa { tag: "isa", textSpan: DataConstraintSpan, queryCoordinates: QueryCoordinates, - queryConstraint: QueryConstraintIsa, + queryConstraint: ConstraintIsa, instance: Entity | Relation | Attribute | VertexUnavailable, type: InstantiableType | VertexUnavailable, @@ -50,7 +58,7 @@ export interface DataConstraintIsaExact { tag: "isa!", textSpan: DataConstraintSpan, queryCoordinates: QueryCoordinates, - queryConstraint: QueryConstraintIsaExact, + queryConstraint: ConstraintIsaExact, instance: Entity | Relation | Attribute | VertexUnavailable, type: InstantiableType | VertexUnavailable, @@ -60,7 +68,7 @@ export interface DataConstraintHas { tag: "has", textSpan: DataConstraintSpan, queryCoordinates: QueryCoordinates, - queryConstraint: QueryConstraintHas, + queryConstraint: ConstraintHas, owner: Entity | Relation | VertexUnavailable, attribute: Attribute | VertexUnavailable, @@ -71,7 +79,7 @@ export interface DataConstraintLinks { tag: "links", textSpan: DataConstraintSpan, queryCoordinates: QueryCoordinates, - queryConstraint: QueryConstraintLinks, + queryConstraint: ConstraintLinks | ConstraintLinksLegacy, relation: Relation | VertexUnavailable, player: Relation | Entity | VertexUnavailable, @@ -83,7 +91,7 @@ export interface DataConstraintSub { tag: "sub", textSpan: DataConstraintSpan, queryCoordinates: QueryCoordinates, - queryConstraint: QueryConstraintSub, + queryConstraint: ConstraintSub, subtype: Type | VertexUnavailable, supertype: Type | VertexUnavailable, @@ -93,7 +101,7 @@ export interface DataConstraintSubExact { tag: "sub!", textSpan: DataConstraintSpan, queryCoordinates: QueryCoordinates, - queryConstraint: QueryConstraintSubExact, + queryConstraint: ConstraintSubExact, subtype: Type | VertexUnavailable, supertype: Type | VertexUnavailable, @@ -103,7 +111,7 @@ export interface DataConstraintOwns { tag: "owns", textSpan: DataConstraintSpan, queryCoordinates: QueryCoordinates, - queryConstraint: QueryConstraintOwns, + queryConstraint: ConstraintOwns, owner: EntityType | RelationType | VertexUnavailable, attribute: AttributeType | VertexUnavailable, @@ -113,7 +121,7 @@ export interface DataConstraintRelates { tag: "relates", textSpan: DataConstraintSpan, queryCoordinates: QueryCoordinates, - queryConstraint: QueryConstraintRelates, + queryConstraint: ConstraintRelates, relation: RelationType | VertexUnavailable, role: RoleType | VertexUnavailable, @@ -123,7 +131,7 @@ export interface DataConstraintPlays { tag: "plays", textSpan: DataConstraintSpan, queryCoordinates: QueryCoordinates, - queryConstraint: QueryConstraintPlays, + queryConstraint: ConstraintPlays, player: EntityType | RelationType | VertexUnavailable, role: RoleType | VertexUnavailable, @@ -134,18 +142,18 @@ export interface DataConstraintExpression { tag: "expression", textSpan: DataConstraintSpan, queryCoordinates: QueryCoordinates, - queryConstraint: QueryConstraintExpression, + queryConstraint: ConstraintExpression | ConstraintExpressionLegacy, text: string, arguments: (Entity | Relation | Attribute | Value | VertexUnavailable)[], - assigned: (Entity | Relation | Attribute | Value | VertexUnavailable)[], + assigned: (Entity | Relation | Attribute | Value | VertexUnavailable), } export interface DataConstraintFunction { tag: "function", textSpan: DataConstraintSpan, queryCoordinates: QueryCoordinates, - queryConstraint: QueryConstraintFunction, + queryConstraint: ConstraintFunction, name: string, arguments: (Entity | Relation | Attribute | Value | VertexUnavailable)[], @@ -156,7 +164,7 @@ export interface DataConstraintComparison { tag: "comparison", textSpan: DataConstraintSpan, queryCoordinates: QueryCoordinates, - queryConstraint: QueryConstraintComparison, + queryConstraint: ConstraintComparison, lhs: Value | Attribute | VertexUnavailable, rhs: Value | Attribute | VertexUnavailable, @@ -167,7 +175,7 @@ export interface DataConstraintIs { tag: "is", textSpan: DataConstraintSpan, queryCoordinates: QueryCoordinates, - queryConstraint: QueryConstraintIs, + queryConstraint: ConstraintIs, lhs: Concept | VertexUnavailable, rhs: Concept | VertexUnavailable, @@ -177,7 +185,7 @@ export interface DataConstraintIid { tag: "iid", textSpan: DataConstraintSpan, queryCoordinates: QueryCoordinates, - queryConstraint: QueryConstraintIid, + queryConstraint: ConstraintIid, concept: Concept | VertexUnavailable, iid: string, @@ -187,7 +195,7 @@ export interface DataConstraintLabel { tag: "label", textSpan: DataConstraintSpan, queryCoordinates: QueryCoordinates, - queryConstraint: QueryConstraintLabel, + queryConstraint: ConstraintLabel, type: Type | VertexUnavailable, label: string, @@ -197,7 +205,7 @@ export interface DataConstraintValue { tag: "value", textSpan: DataConstraintSpan, queryCoordinates: QueryCoordinates, - queryConstraint: QueryConstraintValue, + queryConstraint: ConstraintValue, attributeType: AttributeType | VertexUnavailable, valueType: string, @@ -207,7 +215,7 @@ export interface DataConstraintKind { tag: "kind", textSpan: DataConstraintSpan, queryCoordinates: QueryCoordinates, - queryConstraint: QueryConstraintKind, + queryConstraint: ConstraintKind, kind: string, type: Type | VertexUnavailable, @@ -254,7 +262,7 @@ export const newVisualGraph: () => VisualGraph = () => new MultiGraph logical graph /////////////////////////////////// -export function constructGraphFromRowsResult(rows_result: ConceptRowsQueryResponse): DataGraph { +export function constructGraphFromRowsResult(rows_result: ConceptRowsQueryResponseBackCompat): DataGraph { return new LogicalGraphBuilder().build(rows_result); } @@ -262,23 +270,23 @@ class LogicalGraphBuilder { constructor() { } - build(rows_result: ConceptRowsQueryResponse): DataGraph { + build(rows_result: ConceptRowsQueryResponseBackCompat): DataGraph { let answers: DataConstraintAny[][] = []; rows_result.answers.forEach((row, answerIndex) => { - let current_answer_edges = row.involvedBlocks.flatMap(branchIndex => { - return rows_result.query!.blocks[branchIndex].constraints.map((constraint, constraintIndex) => { + let current_answer_edges = row.involvedBlocks!.flatMap(branchIndex => { + return backCompat_pipelineBlocks(rows_result.query!)[branchIndex].constraints.map((constraint, constraintIndex) => { return this.toDataConstraint(rows_result.query!, answerIndex, constraint, row.data, { branch: branchIndex, constraint: constraintIndex }); - }); + }).filter(x => x != null); }); answers.push(current_answer_edges); }); return {answers: answers}; } - translate_vertex(structure: QueryStructure, structure_vertex: QueryVertex, answerIndex: number, data: ConceptRow): DataVertex { + translate_vertex(structure: AnalyzedPipelineBackCompat, structure_vertex: ConstraintVertexAny, answerIndex: number, data: ConceptRow): DataVertex { switch (structure_vertex.tag) { case "variable": { let name = getVariableName(structure, structure_vertex); @@ -302,10 +310,13 @@ class LogicalGraphBuilder { case "value": { return structure_vertex.value; } + case "namedRole": { + return { kind: "roleType", label: structure_vertex.name }; + } } } - private toDataConstraint(structure: QueryStructure, answerIndex: number, constraint: QueryConstraintAny, data: ConceptRow, coordinates: QueryCoordinates): DataConstraintAny { + private toDataConstraint(structure: AnalyzedPipelineBackCompat, answerIndex: number, constraint: ConstraintBackCompat, data: ConceptRow, coordinates: QueryCoordinates): DataConstraintAny | null{ switch (constraint.tag) { case "isa": { return { @@ -408,6 +419,7 @@ class LogicalGraphBuilder { } } case "expression": { + const queryAssigned = backCompat_expressionAssigned(constraint); return { tag: "expression", textSpan: constraint.textSpan, @@ -416,7 +428,7 @@ class LogicalGraphBuilder { text: constraint.text, arguments: constraint.arguments.map(vertex => this.translate_vertex(structure, vertex, answerIndex, data) as (Entity | Relation | Attribute | Value | VertexUnavailable)), - assigned: constraint.assigned.map(vertex => this.translate_vertex(structure, vertex, answerIndex, data) as (Entity | Relation | Attribute | Value | VertexUnavailable)), + assigned: this.translate_vertex(structure, queryAssigned, answerIndex, data) as (Entity | Relation | Attribute | Value | VertexUnavailable), } } case "functionCall": { @@ -498,6 +510,11 @@ class LogicalGraphBuilder { kind: constraint.kind, } } + case "or": + case "not": + case "try": { + return null; + } } } } diff --git a/src/framework/graph-visualiser/index.ts b/src/framework/graph-visualiser/index.ts index 08ec1e5c..c86e2611 100644 --- a/src/framework/graph-visualiser/index.ts +++ b/src/framework/graph-visualiser/index.ts @@ -1,7 +1,13 @@ -import { ApiResponse, isApiErrorResponse, QueryConstraintAny, QueryConstraintSpan, QueryResponse, QueryStructure } from "typedb-driver-http"; +import { + ApiResponse, ConceptRowsQueryResponse, AnalyzedConjunction, AnalyzedPipeline, + isApiErrorResponse, + QueryResponse, + ConstraintAny, ConstraintExpression, ConstraintSpan, ConstraintVertexVariable, + ConstraintExpressionLegacy, ConstraintLinksLegacy, + QueryStructureLegacy, QueryConjunctionLegacy, ConceptRowsQueryResponseLegacy +} from "@typedb/driver-http"; import MultiGraph from "graphology"; import Sigma from "sigma"; -import ForceSupervisor from "graphology-layout-force/worker"; import { Settings as SigmaSettings } from "sigma/settings"; import { StudioConverterStructureParameters, StudioConverterStyleParameters } from "./config"; @@ -59,7 +65,7 @@ export class GraphVisualiser { if (res.ok.answerType == "conceptRows" && res.ok.query != null) { let converter = new StudioConverter(this.graph, res.ok.query, true, this.structureParameters, this.styleParameters); - let logicalGraph = constructGraphFromRowsResult(res.ok); // In memory, not visualised + let logicalGraph = constructGraphFromRowsResult(res.ok as ConceptRowsQueryResponse); // In memory, not visualised convertLogicalGraphWith(logicalGraph, converter); } } @@ -103,8 +109,8 @@ export class GraphVisualiser { return this.getColorForConstraintIndex(branchIndex, constraintIndex); } - colorQuery(queryString: string, queryStructure: QueryStructure): string { - function shouldColourConstraint(constraint: QueryConstraintAny): boolean { + colorQuery(queryString: string, queryStructure: AnalyzedPipelineBackCompat): string { + function shouldColourConstraint(constraint: ConstraintAny | ConstraintExpressionLegacy | ConstraintLinksLegacy): boolean { switch (constraint.tag) { case "isa": return shouldCreateEdge(queryStructure, constraint, constraint.instance, constraint.type); case "isa!": return shouldCreateEdge(queryStructure, constraint, constraint.instance, constraint.type); @@ -122,9 +128,10 @@ export class GraphVisualiser { case "plays": return shouldCreateEdge(queryStructure, constraint, constraint.player, constraint.role); case "expression": + return ( constraint.arguments.map(arg => shouldCreateNode(queryStructure, arg)).reduce((a,b) => a || b, false) - || constraint.assigned.map(assigned => shouldCreateNode(queryStructure, assigned)).reduce((a,b) => a || b, false) + || shouldCreateNode(queryStructure, backCompat_expressionAssigned(constraint)) ); case "functionCall": return ( @@ -137,14 +144,19 @@ export class GraphVisualiser { case "kind": return false; case "label": return false; case "value": return false; + case "or": return false; + case "not": return false; + case "try": return false; } } - let spans: { span: QueryConstraintSpan, coordinates: QueryCoordinates}[] = []; - queryStructure.blocks.forEach((branch, branchIndex) => { + let spans: { span: ConstraintSpan, coordinates: QueryCoordinates}[] = []; + + backCompat_pipelineBlocks(queryStructure).forEach((branch, branchIndex) => { branch.constraints.forEach((constraint, constraintIndex) => { if (shouldColourConstraint(constraint)) { - if (constraint.textSpan != null) { - spans.push({span: constraint.textSpan, coordinates: { branch: branchIndex, constraint: constraintIndex}}); + let span = "textSpan" in constraint ? constraint["textSpan"] : null; + if (span != null) { + spans.push({span, coordinates: { branch: branchIndex, constraint: constraintIndex}}); } } }) @@ -192,3 +204,21 @@ export function createSigmaRenderer(containerEl: HTMLElement, sigma_settings: Si // Create the sigma return new Sigma(graph, containerEl, sigma_settings); } + +export function backCompat_pipelineBlocks(pipeline : AnalyzedPipelineBackCompat): AnalyzedConjunction[] | QueryConjunctionLegacy[] { + if ("blocks" in pipeline) { + return pipeline["blocks"]; + } else if ("conjunctions" in pipeline) { + return pipeline["conjunctions"]; + } else { + throw new Error("Unreachable: pipeline neither had blocks nor conjunctions"); + } +} + +export function backCompat_expressionAssigned(expr: ConstraintExpression | ConstraintExpressionLegacy): ConstraintVertexVariable { + return (Array.isArray(expr.assigned) ? expr.assigned[0] : expr.assigned) as ConstraintVertexVariable; +} + +export type ConstraintBackCompat = ConstraintAny | ConstraintLinksLegacy | ConstraintExpressionLegacy; +export type ConceptRowsQueryResponseBackCompat = ConceptRowsQueryResponse | ConceptRowsQueryResponseLegacy; +export type AnalyzedPipelineBackCompat = AnalyzedPipeline | QueryStructureLegacy; diff --git a/src/framework/graph-visualiser/visualisation.ts b/src/framework/graph-visualiser/visualisation.ts index be5c42cc..9ae08abe 100644 --- a/src/framework/graph-visualiser/visualisation.ts +++ b/src/framework/graph-visualiser/visualisation.ts @@ -1,4 +1,4 @@ -import { QueryVertex } from "typedb-driver-http"; +import { ConstraintVertexAny } from "@typedb/driver-http"; import { DataGraph, DataVertex, DataConstraintAny, DataConstraintLinks, DataConstraintHas, DataConstraintIsa, DataConstraintOwns, DataConstraintRelates, DataConstraintPlays, DataConstraintSub, DataConstraintFunction, @@ -20,7 +20,7 @@ export interface ILogicalGraphConverter { // TODO: Functional vertices & edges like expressions, comparisons & function calls // Vertices - put_vertex(answer_index: number, vertex: DataVertex, queryVertex: QueryVertex): void; + put_vertex(answer_index: number, vertex: DataVertex, queryVertex: ConstraintVertexAny): void; // Edges put_isa(answer_index: number, constraint: DataConstraintIsa): void; diff --git a/src/module/connection/create/connection-creator.component.ts b/src/module/connection/create/connection-creator.component.ts index 32425f87..e967f61f 100644 --- a/src/module/connection/create/connection-creator.component.ts +++ b/src/module/connection/create/connection-creator.component.ts @@ -12,7 +12,7 @@ import { MatFormFieldModule } from "@angular/material/form-field"; import { MatInputModule } from "@angular/material/input"; import { MatSelectModule } from "@angular/material/select"; import { MatTooltipModule } from "@angular/material/tooltip"; -import { DriverParams, isApiErrorResponse, isBasicParams } from "typedb-driver-http"; +import { DriverParams, isApiErrorResponse, isBasicParams } from "@typedb/driver-http"; import { CONNECTION_URL_PLACEHOLDER, ConnectionConfig, connectionUrl, parseConnectionUrlOrNull } from "../../../concept/connection"; import { RichTooltipDirective } from "../../../framework/tooltip/rich-tooltip.directive"; import { INTERNAL_ERROR } from "../../../framework/util/strings"; diff --git a/src/module/connection/transaction/transaction-control.component.ts b/src/module/connection/transaction/transaction-control.component.ts index 10b8d18b..48ff9371 100644 --- a/src/module/connection/transaction/transaction-control.component.ts +++ b/src/module/connection/transaction/transaction-control.component.ts @@ -15,7 +15,7 @@ import { combineLatest, map } from "rxjs"; import { INTERNAL_ERROR } from "../../../framework/util/strings"; import { DriverState } from "../../../service/driver-state.service"; import { SnackbarService } from "../../../service/snackbar.service"; -import { TransactionType } from "typedb-driver-http"; +import { TransactionType } from "@typedb/driver-http"; import { OperationMode } from "../../../concept/transaction"; @Component({ diff --git a/src/module/connection/widget/connection-widget.component.ts b/src/module/connection/widget/connection-widget.component.ts index 83479e44..d158438a 100644 --- a/src/module/connection/widget/connection-widget.component.ts +++ b/src/module/connection/widget/connection-widget.component.ts @@ -12,7 +12,7 @@ import { MatDividerModule } from "@angular/material/divider"; import { MatMenuModule, MatMenuTrigger } from "@angular/material/menu"; import { MatTooltipModule } from "@angular/material/tooltip"; import { Router, RouterLink } from "@angular/router"; -import { Database } from "typedb-driver-http"; +import { Database } from "@typedb/driver-http"; import { combineLatest, distinctUntilChanged, map } from "rxjs"; import { DriverState } from "../../../service/driver-state.service"; import { SnackbarService } from "../../../service/snackbar.service"; diff --git a/src/module/database/create-dialog/database-create-dialog.component.ts b/src/module/database/create-dialog/database-create-dialog.component.ts index fdc4199d..ecc3574e 100644 --- a/src/module/database/create-dialog/database-create-dialog.component.ts +++ b/src/module/database/create-dialog/database-create-dialog.component.ts @@ -10,7 +10,7 @@ import { AbstractControl, AsyncValidatorFn, FormBuilder, FormsModule, ReactiveFo import { MAT_DIALOG_DATA, MatDialogRef } from "@angular/material/dialog"; import { MatFormFieldModule } from "@angular/material/form-field"; import { MatInputModule } from "@angular/material/input"; -import { isApiErrorResponse } from "typedb-driver-http"; +import { isApiErrorResponse } from "@typedb/driver-http"; import { combineLatest, first, map, Subject } from "rxjs"; import { ButtonComponent } from "../../../framework/button/button.component"; import { FormActionsComponent, FormComponent, FormInputComponent, patternValidator, requiredValidator } from "../../../framework/form"; diff --git a/src/module/database/delete-dialog/database-delete-dialog.component.ts b/src/module/database/delete-dialog/database-delete-dialog.component.ts index 1c8c5e09..7c5c7deb 100644 --- a/src/module/database/delete-dialog/database-delete-dialog.component.ts +++ b/src/module/database/delete-dialog/database-delete-dialog.component.ts @@ -11,7 +11,7 @@ import { MAT_DIALOG_DATA, MatDialogRef } from "@angular/material/dialog"; import { MatDivider } from "@angular/material/divider"; import { MatFormFieldModule } from "@angular/material/form-field"; import { MatInputModule } from "@angular/material/input"; -import { Database, isApiErrorResponse } from "typedb-driver-http"; +import { Database, isApiErrorResponse } from "@typedb/driver-http"; import { Subject } from "rxjs"; import { FormActionsComponent, FormComponent, FormInputComponent } from "../../../framework/form"; import { ModalComponent } from "../../../framework/modal"; diff --git a/src/module/database/select-dialog/database-select-dialog.component.ts b/src/module/database/select-dialog/database-select-dialog.component.ts index 40c35a86..35ab6760 100644 --- a/src/module/database/select-dialog/database-select-dialog.component.ts +++ b/src/module/database/select-dialog/database-select-dialog.component.ts @@ -10,7 +10,7 @@ import { FormBuilder, FormsModule, ReactiveFormsModule } from "@angular/forms"; import { MatDialogRef } from "@angular/material/dialog"; import { MatFormFieldModule } from "@angular/material/form-field"; import { MatInputModule } from "@angular/material/input"; -import { Database } from "typedb-driver-http"; +import { Database } from "@typedb/driver-http"; import { map, Observable, Subject } from "rxjs"; import { FormActionsComponent, FormComponent, FormOption, FormSelectComponent, requiredValidator } from "../../../framework/form"; import { ModalComponent } from "../../../framework/modal"; diff --git a/src/module/schema/text-dialog/schema-text-dialog.component.ts b/src/module/schema/text-dialog/schema-text-dialog.component.ts index 12439881..dfaf3037 100644 --- a/src/module/schema/text-dialog/schema-text-dialog.component.ts +++ b/src/module/schema/text-dialog/schema-text-dialog.component.ts @@ -12,7 +12,7 @@ import { ModalComponent } from "../../../framework/modal"; import { DriverState } from "../../../service/driver-state.service"; import { CodeSnippetComponent } from "../../../framework/code-snippet/code-snippet.component"; import { filter, map, Observable } from "rxjs"; -import { isOkResponse } from "typedb-driver-http"; +import { isOkResponse } from "@typedb/driver-http"; @Component({ selector: "ts-schema-text-dialog", diff --git a/src/module/user/change-password-dialog/user-change-password-dialog.component.ts b/src/module/user/change-password-dialog/user-change-password-dialog.component.ts index 250b7a5d..351690c6 100644 --- a/src/module/user/change-password-dialog/user-change-password-dialog.component.ts +++ b/src/module/user/change-password-dialog/user-change-password-dialog.component.ts @@ -10,7 +10,7 @@ import { FormBuilder, FormsModule, ReactiveFormsModule } from "@angular/forms"; import { MAT_DIALOG_DATA, MatDialogRef } from "@angular/material/dialog"; import { MatFormFieldModule } from "@angular/material/form-field"; import { MatInputModule } from "@angular/material/input"; -import { isApiErrorResponse } from "typedb-driver-http"; +import { isApiErrorResponse } from "@typedb/driver-http"; import { of, Subject, switchMap } from "rxjs"; import { FormActionsComponent, FormComponent, FormPasswordInputComponent, requiredValidator } from "../../../framework/form"; import { ModalComponent } from "../../../framework/modal"; diff --git a/src/module/user/create-dialog/user-create-dialog.component.ts b/src/module/user/create-dialog/user-create-dialog.component.ts index 0a801634..5bb568ca 100644 --- a/src/module/user/create-dialog/user-create-dialog.component.ts +++ b/src/module/user/create-dialog/user-create-dialog.component.ts @@ -10,7 +10,7 @@ import { FormBuilder, FormsModule, ReactiveFormsModule } from "@angular/forms"; import { MatDialogRef } from "@angular/material/dialog"; import { MatFormFieldModule } from "@angular/material/form-field"; import { MatInputModule } from "@angular/material/input"; -import { isApiErrorResponse } from "typedb-driver-http"; +import { isApiErrorResponse } from "@typedb/driver-http"; import { Subject, switchMap } from "rxjs"; import { FormActionsComponent, FormComponent, FormInputComponent, FormPasswordInputComponent, requiredValidator } from "../../../framework/form"; import { ModalComponent } from "../../../framework/modal"; diff --git a/src/module/user/delete-dialog/user-delete-dialog.component.ts b/src/module/user/delete-dialog/user-delete-dialog.component.ts index e7576a78..b3708e08 100644 --- a/src/module/user/delete-dialog/user-delete-dialog.component.ts +++ b/src/module/user/delete-dialog/user-delete-dialog.component.ts @@ -11,7 +11,7 @@ import { MAT_DIALOG_DATA, MatDialogRef } from "@angular/material/dialog"; import { MatDivider } from "@angular/material/divider"; import { MatFormFieldModule } from "@angular/material/form-field"; import { MatInputModule } from "@angular/material/input"; -import { isApiErrorResponse } from "typedb-driver-http"; +import { isApiErrorResponse } from "@typedb/driver-http"; import { Subject, switchMap } from "rxjs"; import { FormActionsComponent, FormComponent, FormInputComponent } from "../../../framework/form"; import { ModalComponent } from "../../../framework/modal"; diff --git a/src/module/user/table/users-table.component.ts b/src/module/user/table/users-table.component.ts index 33942878..796466b9 100644 --- a/src/module/user/table/users-table.component.ts +++ b/src/module/user/table/users-table.component.ts @@ -11,7 +11,7 @@ import { Component, Input } from "@angular/core"; import { MatDialog } from "@angular/material/dialog"; import { MatTableModule } from "@angular/material/table"; import { MatSortModule } from "@angular/material/sort"; -import { User } from "typedb-driver-http"; +import { User } from "@typedb/driver-http"; import { MatTooltipModule } from "@angular/material/tooltip"; import { MatMenuModule } from "@angular/material/menu"; import { MatButtonModule } from "@angular/material/button"; diff --git a/src/module/user/users-page.component.ts b/src/module/user/users-page.component.ts index 1f537c97..815bed98 100644 --- a/src/module/user/users-page.component.ts +++ b/src/module/user/users-page.component.ts @@ -16,7 +16,7 @@ import { MatInputModule } from "@angular/material/input"; import { MatSortModule } from "@angular/material/sort"; import { MatTooltipModule } from "@angular/material/tooltip"; import { of, switchMap } from "rxjs"; -import { isApiErrorResponse } from "typedb-driver-http"; +import { isApiErrorResponse } from "@typedb/driver-http"; import { SpinnerComponent } from "../../framework/spinner/spinner.component"; import { DriverState } from "../../service/driver-state.service"; import { PageScaffoldComponent } from "../scaffold/page/page-scaffold.component"; diff --git a/src/service/driver-state.service.ts b/src/service/driver-state.service.ts index 43d39ed0..0820a1c0 100644 --- a/src/service/driver-state.service.ts +++ b/src/service/driver-state.service.ts @@ -17,7 +17,7 @@ import { AppData } from "./app-data.service"; import { ApiOkResponse, ApiResponse, Database, isApiErrorResponse, isOkResponse, QueryResponse, TransactionType, TypeDBHttpDriver, User, VersionResponse -} from "typedb-driver-http"; +} from "@typedb/driver-http"; import { FormBuilder } from "@angular/forms"; export type DriverStatus = "disconnected" | "connecting" | "connected" | "reconnecting"; diff --git a/src/service/error-handler.service.ts b/src/service/error-handler.service.ts index 90cc81a9..007703eb 100644 --- a/src/service/error-handler.service.ts +++ b/src/service/error-handler.service.ts @@ -1,6 +1,6 @@ import { ErrorHandler, forwardRef, Inject, Injectable, Injector, NgZone } from '@angular/core'; import { SnackbarService } from './snackbar.service'; -import { isApiErrorResponse } from 'typedb-driver-http'; +import { isApiErrorResponse } from '@typedb/driver-http'; @Injectable() export class StudioErrorHandler implements ErrorHandler { @@ -13,7 +13,7 @@ export class StudioErrorHandler implements ErrorHandler { console.error(err); let msg = ``; - // TODO: delete object check once we upgrade typedb-driver-http + // TODO: delete object check once we upgrade @typedb/driver-http if (typeof err === "object" && isApiErrorResponse(err)) { msg = err.err.message; } else { diff --git a/src/service/query-page-state.service.ts b/src/service/query-page-state.service.ts index b34fa4e6..57c0473c 100644 --- a/src/service/query-page-state.service.ts +++ b/src/service/query-page-state.service.ts @@ -8,7 +8,7 @@ import { inject, Injectable } from "@angular/core"; import { FormControl } from "@angular/forms"; import { BehaviorSubject, combineLatest, first, map, Observable, shareReplay, startWith } from "rxjs"; import { DriverAction } from "../concept/action"; -import { createSigmaRenderer, GraphVisualiser } from "../framework/graph-visualiser"; +import {createSigmaRenderer, GraphVisualiser} from "../framework/graph-visualiser"; import { defaultSigmaSettings } from "../framework/graph-visualiser/defaults"; import { newVisualGraph } from "../framework/graph-visualiser/graph"; import { Layouts } from "../framework/graph-visualiser/layouts"; @@ -19,7 +19,7 @@ import { SchemaState } from "./schema-state.service"; import { SnackbarService } from "./snackbar.service"; import { ApiResponse, Attribute, Concept, ConceptDocument, ConceptRow, isApiErrorResponse, QueryResponse, Value -} from "typedb-driver-http"; +} from "@typedb/driver-http"; import { VibeQueryState } from "./vibe-query-state.service"; export type QueryType = "code" | "chat"; diff --git a/src/service/schema-state.service.ts b/src/service/schema-state.service.ts index 6d6a9a75..edcec6b5 100644 --- a/src/service/schema-state.service.ts +++ b/src/service/schema-state.service.ts @@ -8,7 +8,7 @@ import { Injectable } from "@angular/core"; import { ApiOkResponse, ApiResponse, AttributeType, ConceptRowsQueryResponse, EntityType, isApiErrorResponse, QueryResponse, RelationType, RoleType, Type -} from "typedb-driver-http"; +} from "@typedb/driver-http"; import Graph from "graphology"; import { BehaviorSubject, combineLatest, distinctUntilChanged, finalize, first, map } from "rxjs"; import Sigma, { Camera } from "sigma"; diff --git a/src/service/vibe-query-state.service.ts b/src/service/vibe-query-state.service.ts index c312ce80..cc7ced66 100644 --- a/src/service/vibe-query-state.service.ts +++ b/src/service/vibe-query-state.service.ts @@ -7,7 +7,7 @@ import { inject, Injectable } from "@angular/core"; import { FormBuilder, FormControl } from "@angular/forms"; import { BehaviorSubject, switchMap } from "rxjs"; -import { isOkResponse } from "typedb-driver-http"; +import { isOkResponse } from "@typedb/driver-http"; import { INTERNAL_ERROR } from "../framework/util/strings"; import { ChatMessage, CloudService } from "./cloud.service"; import { DriverState } from "./driver-state.service";