Completed all libraries upgrading to the transactionLdoDataset

main
jaxoncreed 2 years ago
parent d2384b2fc7
commit db47f8bd14
  1. 8
      packages/jsonld-dataset-proxy/src/arrayProxy/modifyArray.ts
  2. 7
      packages/solid/src/SolidLdoTransactionDataset.ts
  3. 13
      packages/subscribable-dataset/src/TransactionDataset.ts
  4. 1
      packages/subscribable-dataset/src/index.ts
  5. 4
      packages/subscribable-dataset/src/types.ts
  6. 27
      packages/subscribable-dataset/src/util.ts
  7. 20
      packages/subscribable-dataset/test/TransactionalDataset.test.ts

@ -1,7 +1,10 @@
import { defaultGraph } from "@rdfjs/data-model"; import { defaultGraph } from "@rdfjs/data-model";
import type { Quad } from "@rdfjs/types"; import type { Quad } from "@rdfjs/types";
import type { ObjectNode } from "@ldo/rdf-utils"; import type { ObjectNode } from "@ldo/rdf-utils";
import { ProxyTransactionalDataset } from "@ldo/subscribable-dataset"; import {
TransactionDataset,
createTransactionDatasetFactory,
} from "@ldo/subscribable-dataset";
import { createDatasetFactory } from "@ldo/dataset"; import { createDatasetFactory } from "@ldo/dataset";
import type { ProxyContext } from "../ProxyContext"; import type { ProxyContext } from "../ProxyContext";
import { addObjectToDataset } from "../util/addObjectToDataset"; import { addObjectToDataset } from "../util/addObjectToDataset";
@ -31,9 +34,10 @@ export function checkArrayModification(
); );
} }
// Create a test dataset to see if the inputted data is valid // Create a test dataset to see if the inputted data is valid
const testDataset = new ProxyTransactionalDataset( const testDataset = new TransactionDataset(
proxyContext.dataset, proxyContext.dataset,
createDatasetFactory(), createDatasetFactory(),
createTransactionDatasetFactory(),
); );
addObjectToDataset( addObjectToDataset(
objectToAdd as RawObject, objectToAdd as RawObject,

@ -10,7 +10,10 @@ import {
} from "./util/uriTypes"; } from "./util/uriTypes";
import type { SolidLdoDatasetContext } from "./SolidLdoDatasetContext"; import type { SolidLdoDatasetContext } from "./SolidLdoDatasetContext";
import type { DatasetFactory, Quad } from "@rdfjs/types"; import type { DatasetFactory, Quad } from "@rdfjs/types";
import type { ITransactionDatasetFactory } from "@ldo/subscribable-dataset"; import {
updateDatasetInBulk,
type ITransactionDatasetFactory,
} from "@ldo/subscribable-dataset";
import type { SolidLdoDataset } from "./SolidLdoDataset"; import type { SolidLdoDataset } from "./SolidLdoDataset";
import type { AggregateSuccess } from "./requester/results/success/SuccessResult"; import type { AggregateSuccess } from "./requester/results/success/SuccessResult";
import type { ResourceResult } from "./resource/resourceResult/ResourceResult"; import type { ResourceResult } from "./resource/resourceResult/ResourceResult";
@ -124,7 +127,7 @@ export class SolidLdoTransactionDataset
async ([graph, datasetChanges]) => { async ([graph, datasetChanges]) => {
if (graph.termType === "DefaultGraph") { if (graph.termType === "DefaultGraph") {
// Undefined means that this is the default graph // Undefined means that this is the default graph
this.parentDataset.bulk(datasetChanges); updateDatasetInBulk(this.parentDataset, datasetChanges);
return [ return [
graph, graph,
datasetChanges, datasetChanges,

@ -1,12 +1,9 @@
import type { Dataset, BaseQuad, Term, DatasetFactory } from "@rdfjs/types"; import type { Dataset, BaseQuad, Term, DatasetFactory } from "@rdfjs/types";
import type { DatasetChanges } from "@ldo/rdf-utils"; import type { DatasetChanges } from "@ldo/rdf-utils";
import type { import type { ITransactionDataset, ITransactionDatasetFactory } from "./types";
ISubscribableDataset,
ITransactionDataset,
ITransactionDatasetFactory,
} from "./types";
import { mergeDatasetChanges } from "./mergeDatasetChanges"; import { mergeDatasetChanges } from "./mergeDatasetChanges";
import { SubscribableDataset } from "./SubscribableDataset"; import { SubscribableDataset } from "./SubscribableDataset";
import { updateDatasetInBulk } from "./util";
/** /**
* Proxy Transactional Dataset is a transactional dataset that does not duplicate * Proxy Transactional Dataset is a transactional dataset that does not duplicate
@ -20,7 +17,7 @@ export class TransactionDataset<InAndOutQuad extends BaseQuad = BaseQuad>
/** /**
* The parent dataset that will be updated upon commit * The parent dataset that will be updated upon commit
*/ */
public readonly parentDataset: ISubscribableDataset<InAndOutQuad>; public readonly parentDataset: Dataset<InAndOutQuad, InAndOutQuad>;
/** /**
* The changes made that are ready to commit * The changes made that are ready to commit
@ -41,7 +38,7 @@ export class TransactionDataset<InAndOutQuad extends BaseQuad = BaseQuad>
* @param parentDataset The dataset that will be updated upon commit * @param parentDataset The dataset that will be updated upon commit
*/ */
constructor( constructor(
parentDataset: ISubscribableDataset<InAndOutQuad>, parentDataset: Dataset<InAndOutQuad, InAndOutQuad>,
datasetFactory: DatasetFactory<InAndOutQuad, InAndOutQuad>, datasetFactory: DatasetFactory<InAndOutQuad, InAndOutQuad>,
transactionDatasetFactory: ITransactionDatasetFactory<InAndOutQuad>, transactionDatasetFactory: ITransactionDatasetFactory<InAndOutQuad>,
) { ) {
@ -250,7 +247,7 @@ export class TransactionDataset<InAndOutQuad extends BaseQuad = BaseQuad>
* Helper method to update the parent dataset or any other provided dataset * Helper method to update the parent dataset or any other provided dataset
*/ */
private updateParentDataset(datasetChanges: DatasetChanges<InAndOutQuad>) { private updateParentDataset(datasetChanges: DatasetChanges<InAndOutQuad>) {
this.parentDataset.bulk(datasetChanges); return updateDatasetInBulk(this.parentDataset, datasetChanges);
} }
/** /**

@ -6,3 +6,4 @@ export * from "./SubscribableDataset";
export * from "./SubscribableDatasetFactory"; export * from "./SubscribableDatasetFactory";
export * from "./types"; export * from "./types";
export * from "./mergeDatasetChanges"; export * from "./mergeDatasetChanges";
export * from "./util";

@ -151,7 +151,7 @@ export interface ITransactionDatasetFactory<
InAndOutQuad extends BaseQuad = BaseQuad, InAndOutQuad extends BaseQuad = BaseQuad,
> { > {
transactionDataset( transactionDataset(
parent: ISubscribableDataset<InAndOutQuad>, parent: Dataset<InAndOutQuad, InAndOutQuad>,
): ITransactionDataset<InAndOutQuad>; ): ITransactionDataset<InAndOutQuad>;
} }
@ -160,7 +160,7 @@ export interface ITransactionDatasetFactory<
*/ */
export interface ITransactionDataset<InAndOutQuad extends BaseQuad = BaseQuad> export interface ITransactionDataset<InAndOutQuad extends BaseQuad = BaseQuad>
extends ISubscribableDataset<InAndOutQuad> { extends ISubscribableDataset<InAndOutQuad> {
readonly parentDataset: ISubscribableDataset<InAndOutQuad>; readonly parentDataset: Dataset<InAndOutQuad, InAndOutQuad>;
rollback(): void; rollback(): void;
commit(): void; commit(): void;
getChanges(): DatasetChanges<InAndOutQuad>; getChanges(): DatasetChanges<InAndOutQuad>;

@ -0,0 +1,27 @@
import type { DatasetChanges } from "@ldo/rdf-utils";
import type { BaseQuad, Dataset } from "@rdfjs/types";
import type { IBulkEditableDataset } from "./types";
/**
* Performs a bulk update for a dataset even if it doesn't have a bulk method.
* @param dataset - the input dataset
* @param datasetChanges - changes to be applied
*/
export function updateDatasetInBulk<InAndOutQuad extends BaseQuad = BaseQuad>(
dataset: Dataset<InAndOutQuad>,
datasetChanges: DatasetChanges<InAndOutQuad>,
) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
if ((dataset as any).bulk) {
(dataset as IBulkEditableDataset<InAndOutQuad>).bulk(datasetChanges);
} else {
if (datasetChanges.added) {
dataset.addAll(datasetChanges.added);
}
if (datasetChanges.removed) {
datasetChanges.removed.forEach((curQuad) => {
dataset.delete(curQuad);
});
}
}
}

@ -6,7 +6,7 @@ import type {
DatasetCore, DatasetCore,
} from "@rdfjs/types"; } from "@rdfjs/types";
import type { ISubscribableDataset } from "../src"; import type { ISubscribableDataset } from "../src";
import { ExtendedDatasetFactory } from "@ldo/dataset"; import { ExtendedDatasetFactory, createDataset } from "@ldo/dataset";
import { import {
TransactionDataset, TransactionDataset,
createSubscribableDataset, createSubscribableDataset,
@ -323,6 +323,24 @@ describe("TransactionDataset", () => {
expect(mockParent.bulk).toHaveBeenCalled(); expect(mockParent.bulk).toHaveBeenCalled();
}); });
it("Uses bulk update on commit when the parent dataset is not bulk updatable", () => {
// Disable for tests
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const mockParent: Dataset<Quad> = createDataset([tomTypeQuad]);
transactionalDataset = new TransactionDataset<Quad>(
mockParent,
extendedDatasetFactory,
createTransactionDatasetFactory(),
);
transactionalDataset.add(lickyNameQuad);
transactionalDataset.delete(tomTypeQuad);
transactionalDataset.commit();
expect(mockParent.has(lickyNameQuad)).toBe(true);
expect(mockParent.has(tomTypeQuad)).toBe(false);
});
it("Returns a transactional dataset", () => { it("Returns a transactional dataset", () => {
expect( expect(
transactionalDataset.startTransaction() instanceof TransactionDataset, transactionalDataset.startTransaction() instanceof TransactionDataset,

Loading…
Cancel
Save