From 893e745903970b10734c984a689237ebe181b01d Mon Sep 17 00:00:00 2001 From: jaxoncreed Date: Thu, 15 Feb 2024 10:59:46 -0500 Subject: [PATCH] Updated @ldo/ldo to have a transaction dataset --- packages/ldo/src/LdoDataset.ts | 17 ++++++- packages/ldo/src/LdoDatasetFactory.ts | 47 ++++++++----------- packages/ldo/src/LdoTransactionDataset.ts | 19 ++++++++ packages/ldo/src/LdoTransactionalDataset.ts | 23 --------- packages/ldo/src/createLdoDataset.ts | 6 ++- packages/ldo/src/types.ts | 9 ++++ packages/ldo/src/util.ts | 15 +++--- .../ldo/test/TransactionLdoDataset.test.ts | 21 +++++++++ packages/ldo/test/methods.test.ts | 4 +- .../src/SubscribableDatasetFactory.ts | 4 +- 10 files changed, 101 insertions(+), 64 deletions(-) create mode 100644 packages/ldo/src/LdoTransactionDataset.ts delete mode 100644 packages/ldo/src/LdoTransactionalDataset.ts create mode 100644 packages/ldo/src/types.ts create mode 100644 packages/ldo/test/TransactionLdoDataset.test.ts diff --git a/packages/ldo/src/LdoDataset.ts b/packages/ldo/src/LdoDataset.ts index f8e73e0..bdd736e 100644 --- a/packages/ldo/src/LdoDataset.ts +++ b/packages/ldo/src/LdoDataset.ts @@ -1,9 +1,11 @@ import type { Quad } from "@rdfjs/types"; import jsonldDatasetProxy from "@ldo/jsonld-dataset-proxy"; -import { WrapperSubscribableDataset } from "@ldo/subscribable-dataset"; +import { SubscribableDataset } from "@ldo/subscribable-dataset"; import { LdoBuilder } from "./LdoBuilder"; import type { ShapeType } from "./ShapeType"; import type { LdoBase } from "./index"; +import { LdoTransactionDataset } from "./LdoTransactionDataset"; +import type { ILdoDataset } from "./types"; /** * @category Getting an LdoDataset @@ -22,7 +24,10 @@ import type { LdoBase } from "./index"; * const ldoBuilder = ldoDataset.usingType(FoafProfileShapeType); * ``` */ -export class LdoDataset extends WrapperSubscribableDataset { +export class LdoDataset + extends SubscribableDataset + implements ILdoDataset +{ /** * Creates an LdoBuilder for a given shapeType * @@ -35,4 +40,12 @@ export class LdoDataset extends WrapperSubscribableDataset { const proxyBuilder = jsonldDatasetProxy(this, shapeType.context); return new LdoBuilder(proxyBuilder, shapeType); } + + public startTransaction(): LdoTransactionDataset { + return new LdoTransactionDataset( + this, + this.datasetFactory, + this.transactionDatasetFactory, + ); + } } diff --git a/packages/ldo/src/LdoDatasetFactory.ts b/packages/ldo/src/LdoDatasetFactory.ts index b0150b2..94343a3 100644 --- a/packages/ldo/src/LdoDatasetFactory.ts +++ b/packages/ldo/src/LdoDatasetFactory.ts @@ -1,4 +1,6 @@ -import type { DatasetFactory, Dataset, Quad } from "@rdfjs/types"; +import type { Dataset, Quad } from "@rdfjs/types"; +import type { ISubscribableDatasetFactory } from "@ldo/subscribable-dataset"; +import { SubscribableDatasetFactory } from "@ldo/subscribable-dataset"; import { LdoDataset } from "./LdoDataset"; /** @@ -9,37 +11,28 @@ import { LdoDataset } from "./LdoDataset"; * * @example * ```typescript - * import { createLdoDatasetFactory } from "ldo"; + * import { createLdoDatasetFactory } from "@ldo/ldo"; + * import { createExtendedDatasetFactory } from "@ldo/dataset"; + * import { createTransactionDatasetFactory } from "@ldo/subscribable-dataset"; * - * const datasetFactory = // some RDF/JS Dataset Factory - * const ldoDatasetFactory = new LdoDatasetFactory(datasetFactory); + * const datasetFactory = createExtendedDatasetFactory(); + * const transactionDatasetFactory = createTransactionDatasetFactroy(); + * const ldoDatasetFactory = new LdoDatasetFactory( + * datasetFactory, + * transactionDatasetFactory + * ); * const ldoDataset = ldoDatasetFactory.dataset(initialDataset); * ``` */ -export class LdoDatasetFactory implements DatasetFactory { - private datasetFactory: DatasetFactory; - - /** - * @constructor - * @param datasetFactory - A generic dataset factory this factory will wrap - */ - constructor(datasetFactory: DatasetFactory) { - this.datasetFactory = datasetFactory; - } - - /** - * Creates an LdoDataset - * @param quads - A list of quads to initialize the dataset - * @returns an LdoDataset - */ - dataset(quads?: Dataset | Quad[]): LdoDataset { +export class LdoDatasetFactory + extends SubscribableDatasetFactory + implements ISubscribableDatasetFactory +{ + dataset(quads?: Dataset | Quad[] | undefined): LdoDataset { return new LdoDataset( - this, - quads - ? Array.isArray(quads) - ? this.datasetFactory.dataset(quads) - : quads - : undefined, + this.datasetFactory, + this.transactionDatasetFactory, + this.datasetFactory.dataset(quads), ); } } diff --git a/packages/ldo/src/LdoTransactionDataset.ts b/packages/ldo/src/LdoTransactionDataset.ts new file mode 100644 index 0000000..762a068 --- /dev/null +++ b/packages/ldo/src/LdoTransactionDataset.ts @@ -0,0 +1,19 @@ +import { TransactionDataset } from "@ldo/subscribable-dataset"; +import type { Quad } from "@rdfjs/types"; +import type { ILdoDataset } from "./types"; +import { LdoBuilder } from "./LdoBuilder"; +import type { ShapeType } from "./ShapeType"; +import type { LdoBase } from "./util"; +import jsonldDatasetProxy from "@ldo/jsonld-dataset-proxy"; + +export class LdoTransactionDataset + extends TransactionDataset + implements ILdoDataset +{ + usingType( + shapeType: ShapeType, + ): LdoBuilder { + const proxyBuilder = jsonldDatasetProxy(this, shapeType.context); + return new LdoBuilder(proxyBuilder, shapeType); + } +} diff --git a/packages/ldo/src/LdoTransactionalDataset.ts b/packages/ldo/src/LdoTransactionalDataset.ts deleted file mode 100644 index 38baf93..0000000 --- a/packages/ldo/src/LdoTransactionalDataset.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { TransactionalDataset } from "@ldo/subscribable-dataset"; -import { LdoDataset } from "../dist/LdoDataset"; -import type { Quad } from "@rdfjs/types"; -import type { DatasetChanges } from "@ldo/rdf-utils"; - -export class LdoTransactionalDataset - extends LdoDataset - implements TransactionalDataset -{ - constructor() { - - } - - rollback(): void { - throw new Error("Method not implemented."); - } - commit(): void { - throw new Error("Method not implemented."); - } - getChanges(): DatasetChanges { - throw new Error("Method not implemented."); - } -} diff --git a/packages/ldo/src/createLdoDataset.ts b/packages/ldo/src/createLdoDataset.ts index cca5b04..9ec6037 100644 --- a/packages/ldo/src/createLdoDataset.ts +++ b/packages/ldo/src/createLdoDataset.ts @@ -1,6 +1,7 @@ import type { Dataset, DatasetFactory, Quad } from "@rdfjs/types"; import { createDataset } from "@ldo/dataset"; import { LdoDatasetFactory } from "./LdoDatasetFactory"; +import { createTransactionDatasetFactory } from "@ldo/subscribable-dataset"; import type { LdoDataset } from "./LdoDataset"; /** @@ -22,7 +23,10 @@ export function createLdoDatasetFactory() { return createDataset(quads); }, }; - return new LdoDatasetFactory(datasetFactory); + return new LdoDatasetFactory( + datasetFactory, + createTransactionDatasetFactory(), + ); } /** diff --git a/packages/ldo/src/types.ts b/packages/ldo/src/types.ts new file mode 100644 index 0000000..6f751f3 --- /dev/null +++ b/packages/ldo/src/types.ts @@ -0,0 +1,9 @@ +import type { ISubscribableDataset } from "@ldo/subscribable-dataset"; +import type { LdoBuilder } from "./LdoBuilder"; +import type { ShapeType } from "./ShapeType"; +import type { LdoBase } from "./util"; +import type { Quad } from "@rdfjs/types"; + +export interface ILdoDataset extends ISubscribableDataset { + usingType(shapeType: ShapeType): LdoBuilder; +} diff --git a/packages/ldo/src/util.ts b/packages/ldo/src/util.ts index fa7ad0a..322a3b7 100644 --- a/packages/ldo/src/util.ts +++ b/packages/ldo/src/util.ts @@ -8,14 +8,15 @@ import { } from "@ldo/jsonld-dataset-proxy"; import type { AnyNode } from "@ldo/rdf-utils"; import type { - SubscribableDataset, - TransactionalDataset, + ISubscribableDataset, + ITransactionDataset, } from "@ldo/subscribable-dataset"; /** * @category Types * `LdoBase` is an interface defining that a Linked Data Object is a JavaScript Object Literal. */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any export type LdoBase = Record; /** @@ -42,21 +43,21 @@ export function normalizeNodeNames( export function canDatasetStartTransaction( dataset: Dataset, -): dataset is SubscribableDataset { +): dataset is ISubscribableDataset { return ( - typeof (dataset as SubscribableDataset).startTransaction === "function" + typeof (dataset as ISubscribableDataset).startTransaction === "function" ); } export function isTransactionalDataset( dataset: Dataset, -): dataset is TransactionalDataset { - return typeof (dataset as TransactionalDataset).commit === "function"; +): dataset is ITransactionDataset { + return typeof (dataset as ITransactionDataset).commit === "function"; } export function getTransactionalDatasetFromLdo( ldo: LdoBase, -): [TransactionalDataset, SubjectProxy | ArrayProxy] { +): [ITransactionDataset, SubjectProxy | ArrayProxy] { const proxy = getProxyFromObject(ldo); const dataset = proxy[_getUnderlyingDataset]; if ( diff --git a/packages/ldo/test/TransactionLdoDataset.test.ts b/packages/ldo/test/TransactionLdoDataset.test.ts new file mode 100644 index 0000000..482b530 --- /dev/null +++ b/packages/ldo/test/TransactionLdoDataset.test.ts @@ -0,0 +1,21 @@ +import { createLdoDataset } from "../src/createLdoDataset"; +import { ProfileShapeType } from "./profileData"; + +describe("TransactionLdoDataset", () => { + it("Uses transactions with an LdoBuilder", () => { + const ldoDataset = createLdoDataset(); + const transaction = ldoDataset.startTransaction(); + const profile = transaction + .usingType(ProfileShapeType) + .fromSubject("https://example.com/Person1"); + profile.fn = "John Doe"; + expect(transaction.getChanges().added?.toString()).toBe( + ' "John Doe" .\n', + ); + expect(ldoDataset.toString()).toBe(""); + transaction.commit(); + expect(ldoDataset.toString()).toBe( + ' "John Doe" .\n', + ); + }); +}); diff --git a/packages/ldo/test/methods.test.ts b/packages/ldo/test/methods.test.ts index c89bc3c..a63d2fd 100644 --- a/packages/ldo/test/methods.test.ts +++ b/packages/ldo/test/methods.test.ts @@ -9,7 +9,6 @@ import { import { createDataset } from "@ldo/dataset"; import type { SolidProfileShape } from "./profileData"; import { ProfileShapeType } from "./profileData"; -import type { LdoDataset } from "../src"; import { commitTransaction, createLdoDataset, @@ -25,9 +24,10 @@ import { setLanguagePreferences, languagesOf, } from "../src"; +import type { ILdoDataset } from "../src/types"; describe("methods", () => { - let dataset: LdoDataset; + let dataset: ILdoDataset; let profile: SolidProfileShape; beforeEach(() => { dataset = createLdoDataset(); diff --git a/packages/subscribable-dataset/src/SubscribableDatasetFactory.ts b/packages/subscribable-dataset/src/SubscribableDatasetFactory.ts index 483ee06..3fbbcfe 100644 --- a/packages/subscribable-dataset/src/SubscribableDatasetFactory.ts +++ b/packages/subscribable-dataset/src/SubscribableDatasetFactory.ts @@ -9,8 +9,8 @@ export class SubscribableDatasetFactory< InAndOutQuad extends BaseQuad = BaseQuad, > implements DatasetFactory { - private datasetFactory: DatasetFactory; - private transactionDatasetFactory: ITransactionDatasetFactory; + protected datasetFactory: DatasetFactory; + protected transactionDatasetFactory: ITransactionDatasetFactory; constructor( datasetFactory: DatasetFactory, transactionDatasetFactory: ITransactionDatasetFactory,