From 9d8e3a723513a2d132276869460e27155be93727 Mon Sep 17 00:00:00 2001 From: Jackson Morgan Date: Tue, 29 Apr 2025 19:10:07 -0400 Subject: [PATCH] Structure for starting queries --- packages/connected/src/ConnectedLdoBuilder.ts | 43 +++++++++++++++++++ packages/connected/src/ConnectedLdoDataset.ts | 9 ++++ packages/connected/src/ResourceLinkQuery.ts | 43 +++++++++++++++++++ .../src/types/IConnectedLdoBuilder.ts | 11 +++-- .../src/types/IConnectedLdoDataset.ts | 7 ++- .../{linkQuery/LinkQuery.ts => ILinkQuery.ts} | 26 +++++------ .../connected/src/types/linkQuery/test.ts | 0 packages/ldo/src/LdoBuilder.ts | 4 +- tsconfig.json | 4 +- 9 files changed, 123 insertions(+), 24 deletions(-) create mode 100644 packages/connected/src/ConnectedLdoBuilder.ts create mode 100644 packages/connected/src/ResourceLinkQuery.ts rename packages/connected/src/types/{linkQuery/LinkQuery.ts => ILinkQuery.ts} (75%) delete mode 100644 packages/connected/src/types/linkQuery/test.ts diff --git a/packages/connected/src/ConnectedLdoBuilder.ts b/packages/connected/src/ConnectedLdoBuilder.ts new file mode 100644 index 0000000..8ce4d7b --- /dev/null +++ b/packages/connected/src/ConnectedLdoBuilder.ts @@ -0,0 +1,43 @@ +import type { LdoBase, ShapeType } from "@ldo/ldo"; +import { LdoBuilder } from "@ldo/ldo"; +import type { IConnectedLdoBuilder } from "./types/IConnectedLdoBuilder"; +import type { JsonldDatasetProxyBuilder } from "@ldo/jsonld-dataset-proxy"; +import type { SubjectNode } from "@ldo/rdf-utils"; +import type { LQInput, ILinkQuery } from "./types/ILinkQuery"; +import { ResourceLinkQuery } from "./ResourceLinkQuery"; +import type { ConnectedLdoDataset } from "./ConnectedLdoDataset"; +import type { ConnectedPlugin } from "./types/ConnectedPlugin"; + +export class ConnectedLdoBuilder< + Type extends LdoBase, + Plugins extends ConnectedPlugin[], + > + extends LdoBuilder + implements IConnectedLdoBuilder +{ + protected parentDataset: ConnectedLdoDataset; + + constructor( + parentDataset: ConnectedLdoDataset, + jsonldDatasetProxyBuilder: JsonldDatasetProxyBuilder, + shapeType: ShapeType, + ) { + super(jsonldDatasetProxyBuilder, shapeType); + this.parentDataset = parentDataset; + } + + startLinkQuery>( + startingResource: Plugins[number]["types"]["resource"], + startingSubject: SubjectNode | string, + linkQueryInput: Input, + ): ILinkQuery { + return new ResourceLinkQuery( + this.parentDataset, + this.shapeType, + this.jsonldDatasetProxyBuilder, + startingResource, + startingSubject, + linkQueryInput, + ); + } +} diff --git a/packages/connected/src/ConnectedLdoDataset.ts b/packages/connected/src/ConnectedLdoDataset.ts index cd9cdb5..f71f424 100644 --- a/packages/connected/src/ConnectedLdoDataset.ts +++ b/packages/connected/src/ConnectedLdoDataset.ts @@ -12,6 +12,8 @@ import type { } from "./types/IConnectedLdoDataset"; import { ConnectedLdoTransactionDataset } from "./ConnectedLdoTransactionDataset"; import type { SubjectNode } from "@ldo/rdf-utils"; +import { ConnectedLdoBuilder } from "./ConnectedLdoBuilder"; +import jsonldDatasetProxy from "@ldo/jsonld-dataset-proxy"; /** * A ConnectedLdoDataset has all the functionality of a LdoDataset with the @@ -277,6 +279,13 @@ export class ConnectedLdoDataset< this.context[pluginName] = { ...this.context[pluginName], ...context }; } + public usingType( + shapeType: ShapeType, + ): ConnectedLdoBuilder { + const proxyBuilder = jsonldDatasetProxy(this, shapeType.context); + return new ConnectedLdoBuilder(this, proxyBuilder, shapeType); + } + public startTransaction(): ConnectedLdoTransactionDataset { return new ConnectedLdoTransactionDataset( this, diff --git a/packages/connected/src/ResourceLinkQuery.ts b/packages/connected/src/ResourceLinkQuery.ts new file mode 100644 index 0000000..96ec6d7 --- /dev/null +++ b/packages/connected/src/ResourceLinkQuery.ts @@ -0,0 +1,43 @@ +import type { LdoBase, ShapeType } from "@ldo/ldo"; +import type { + ExpandDeep, + ILinkQuery, + LQInput, + LQReturn, +} from "./types/ILinkQuery"; +import type { ConnectedPlugin } from "./types/ConnectedPlugin"; +import type { JsonldDatasetProxyBuilder } from "@ldo/jsonld-dataset-proxy"; +import type { ConnectedLdoDataset } from "./ConnectedLdoDataset"; +import type { SubjectNode } from "@ldo/rdf-utils"; + +export class ResourceLinkQuery< + Type extends LdoBase, + QueryInput extends LQInput, + Plugins extends ConnectedPlugin[], +> implements ILinkQuery +{ + constructor( + protected parentDataset: ConnectedLdoDataset, + protected shapeType: ShapeType, + protected jsonldDatasetProxyBuilder: JsonldDatasetProxyBuilder, + protected startingResource: Plugins[number]["types"]["resource"], + protected startingSubject: SubjectNode | string, + protected linkQueryInput: QueryInput, + ) {} + + run(): Promise>> { + throw new Error("Method not implemented."); + } + + subscribe(): Promise { + throw new Error("Method not implemented."); + } + + unsubscribe(): void { + throw new Error("Method not implemented."); + } + + fromSubject(): ExpandDeep> { + throw new Error("Method not implemented."); + } +} diff --git a/packages/connected/src/types/IConnectedLdoBuilder.ts b/packages/connected/src/types/IConnectedLdoBuilder.ts index ae2c756..126e014 100644 --- a/packages/connected/src/types/IConnectedLdoBuilder.ts +++ b/packages/connected/src/types/IConnectedLdoBuilder.ts @@ -1,12 +1,15 @@ import type { LdoBase, LdoBuilder } from "@ldo/ldo"; import type { ConnectedPlugin } from "./ConnectedPlugin"; -import { SubjectNode } from "@ldo/rdf-utils"; +import type { SubjectNode } from "@ldo/rdf-utils"; +import type { ILinkQuery, LQInput } from "./ILinkQuery"; export interface IConnectedLdoBuilder< Type extends LdoBase, Plugins extends ConnectedPlugin[], > extends LdoBuilder { - fromLinkQuery(startingResource: Plugins[number]["types"]["resource"], startingSubject: SubjectNode | string, linkQueryInput: - - ) + startLinkQuery>( + startingResource: Plugins[number]["types"]["resource"], + startingSubject: SubjectNode | string, + linkQueryInput: Input, + ): ILinkQuery; } diff --git a/packages/connected/src/types/IConnectedLdoDataset.ts b/packages/connected/src/types/IConnectedLdoDataset.ts index 18b3969..214e4f7 100644 --- a/packages/connected/src/types/IConnectedLdoDataset.ts +++ b/packages/connected/src/types/IConnectedLdoDataset.ts @@ -1,7 +1,8 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import type { LdoDataset } from "@ldo/ldo"; +import type { LdoBase, LdoDataset, ShapeType } from "@ldo/ldo"; import type { ConnectedPlugin } from "./ConnectedPlugin"; import type { InvalidIdentifierResource } from "../InvalidIdentifierResource"; +import type { IConnectedLdoBuilder } from "./IConnectedLdoBuilder"; export type ReturnTypeFromArgs = Func extends ( arg: Arg, @@ -136,4 +137,8 @@ export interface IConnectedLdoDataset name: Name, context: Plugin["types"]["context"], ); + + usingType( + shapeType: ShapeType, + ): IConnectedLdoBuilder; } diff --git a/packages/connected/src/types/linkQuery/LinkQuery.ts b/packages/connected/src/types/ILinkQuery.ts similarity index 75% rename from packages/connected/src/types/linkQuery/LinkQuery.ts rename to packages/connected/src/types/ILinkQuery.ts index be5f083..efeb229 100644 --- a/packages/connected/src/types/linkQuery/LinkQuery.ts +++ b/packages/connected/src/types/ILinkQuery.ts @@ -3,9 +3,7 @@ // If I ever want to implement a global query interface, this is a good place // to start. -import type { LdoBase, LdSet, ShapeType } from "@ldo/ldo"; -import { ProfileShapeType } from "packages/ldo/test/profileData"; -import type { SolidProfileShape } from "packages/ldo/test/profileData"; +import type { LdoBase, LdSet } from "@ldo/ldo"; /** * Link Query Input @@ -60,22 +58,18 @@ export type LQReturn< ? LdSet> : LQReturnSubSet; -type ExpandDeep = T extends LdSet +export type ExpandDeep = T extends LdSet ? LdSet> // recursively expand sets : T extends object ? { [K in keyof T]: ExpandDeep } // recursively expand objects : T; // base case (primitive types) -function sampleFunction>( - _shapeType: ShapeType, - _input: Input, -): ExpandDeep> { - throw new Error("NotImplemented"); +/** + * ILinkQuery: Manages resources in a link query + */ +export interface ILinkQuery> { + run(): Promise>>; + subscribe(): Promise; + unsubscribe(): void; + fromSubject(): ExpandDeep>; } - -const value = sampleFunction(ProfileShapeType, { - hasTelephone: { type: { "@id": true }, value: true }, - name: true, -}); - -value; diff --git a/packages/connected/src/types/linkQuery/test.ts b/packages/connected/src/types/linkQuery/test.ts deleted file mode 100644 index e69de29..0000000 diff --git a/packages/ldo/src/LdoBuilder.ts b/packages/ldo/src/LdoBuilder.ts index b20fa0a..63a148a 100644 --- a/packages/ldo/src/LdoBuilder.ts +++ b/packages/ldo/src/LdoBuilder.ts @@ -31,8 +31,8 @@ export class LdoBuilder { /** * @internal */ - private jsonldDatasetProxyBuilder: JsonldDatasetProxyBuilder; - private shapeType: ShapeType; + protected jsonldDatasetProxyBuilder: JsonldDatasetProxyBuilder; + protected shapeType: ShapeType; /** * Initializes the LdoBuilder diff --git a/tsconfig.json b/tsconfig.json index 7c40b21..a571c61 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,9 @@ "extends": "./tsconfig.base.json", "compilerOptions": { "paths": { - "@ldo/*": ["packages/*/src"] + "@ldo/*": [ + "packages/*/src" + ] }, "allowJs": true }