Structure for starting queries

main
Jackson Morgan 4 months ago
parent b95b8568d3
commit 9d8e3a7235
  1. 43
      packages/connected/src/ConnectedLdoBuilder.ts
  2. 9
      packages/connected/src/ConnectedLdoDataset.ts
  3. 43
      packages/connected/src/ResourceLinkQuery.ts
  4. 11
      packages/connected/src/types/IConnectedLdoBuilder.ts
  5. 7
      packages/connected/src/types/IConnectedLdoDataset.ts
  6. 26
      packages/connected/src/types/ILinkQuery.ts
  7. 0
      packages/connected/src/types/linkQuery/test.ts
  8. 4
      packages/ldo/src/LdoBuilder.ts
  9. 4
      tsconfig.json

@ -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<Type>
implements IConnectedLdoBuilder<Type, Plugins>
{
protected parentDataset: ConnectedLdoDataset<Plugins>;
constructor(
parentDataset: ConnectedLdoDataset<Plugins>,
jsonldDatasetProxyBuilder: JsonldDatasetProxyBuilder,
shapeType: ShapeType<Type>,
) {
super(jsonldDatasetProxyBuilder, shapeType);
this.parentDataset = parentDataset;
}
startLinkQuery<Input extends LQInput<Type>>(
startingResource: Plugins[number]["types"]["resource"],
startingSubject: SubjectNode | string,
linkQueryInput: Input,
): ILinkQuery<Type, Input> {
return new ResourceLinkQuery(
this.parentDataset,
this.shapeType,
this.jsonldDatasetProxyBuilder,
startingResource,
startingSubject,
linkQueryInput,
);
}
}

@ -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<Type extends LdoBase>(
shapeType: ShapeType<Type>,
): ConnectedLdoBuilder<Type, Plugins> {
const proxyBuilder = jsonldDatasetProxy(this, shapeType.context);
return new ConnectedLdoBuilder(this, proxyBuilder, shapeType);
}
public startTransaction(): ConnectedLdoTransactionDataset<Plugins> {
return new ConnectedLdoTransactionDataset(
this,

@ -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<Type>,
Plugins extends ConnectedPlugin[],
> implements ILinkQuery<Type, QueryInput>
{
constructor(
protected parentDataset: ConnectedLdoDataset<Plugins>,
protected shapeType: ShapeType<Type>,
protected jsonldDatasetProxyBuilder: JsonldDatasetProxyBuilder,
protected startingResource: Plugins[number]["types"]["resource"],
protected startingSubject: SubjectNode | string,
protected linkQueryInput: QueryInput,
) {}
run(): Promise<ExpandDeep<LQReturn<Type, QueryInput>>> {
throw new Error("Method not implemented.");
}
subscribe(): Promise<void> {
throw new Error("Method not implemented.");
}
unsubscribe(): void {
throw new Error("Method not implemented.");
}
fromSubject(): ExpandDeep<LQReturn<Type, QueryInput>> {
throw new Error("Method not implemented.");
}
}

@ -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<Type> {
fromLinkQuery(startingResource: Plugins[number]["types"]["resource"], startingSubject: SubjectNode | string, linkQueryInput:
)
startLinkQuery<Input extends LQInput<Type>>(
startingResource: Plugins[number]["types"]["resource"],
startingSubject: SubjectNode | string,
linkQueryInput: Input,
): ILinkQuery<Type, Input>;
}

@ -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, Arg> = Func extends (
arg: Arg,
@ -136,4 +137,8 @@ export interface IConnectedLdoDataset<Plugins extends ConnectedPlugin[]>
name: Name,
context: Plugin["types"]["context"],
);
usingType<Type extends LdoBase>(
shapeType: ShapeType<Type>,
): IConnectedLdoBuilder<Type, Plugins>;
}

@ -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<SetSubType, Input>>
: LQReturnSubSet<Type, Input>;
type ExpandDeep<T> = T extends LdSet<infer U>
export type ExpandDeep<T> = T extends LdSet<infer U>
? LdSet<ExpandDeep<U>> // recursively expand sets
: T extends object
? { [K in keyof T]: ExpandDeep<T[K]> } // recursively expand objects
: T; // base case (primitive types)
function sampleFunction<Type extends LdoBase, Input extends LQInput<Type>>(
_shapeType: ShapeType<Type>,
_input: Input,
): ExpandDeep<LQReturn<Type, Input>> {
throw new Error("NotImplemented");
/**
* ILinkQuery: Manages resources in a link query
*/
export interface ILinkQuery<Type extends LdoBase, Input extends LQInput<Type>> {
run(): Promise<ExpandDeep<LQReturn<Type, Input>>>;
subscribe(): Promise<void>;
unsubscribe(): void;
fromSubject(): ExpandDeep<LQReturn<Type, Input>>;
}
const value = sampleFunction(ProfileShapeType, {
hasTelephone: { type: { "@id": true }, value: true },
name: true,
});
value;

@ -31,8 +31,8 @@ export class LdoBuilder<Type extends LdoBase> {
/**
* @internal
*/
private jsonldDatasetProxyBuilder: JsonldDatasetProxyBuilder;
private shapeType: ShapeType<Type>;
protected jsonldDatasetProxyBuilder: JsonldDatasetProxyBuilder;
protected shapeType: ShapeType<Type>;
/**
* Initializes the LdoBuilder

@ -2,7 +2,9 @@
"extends": "./tsconfig.base.json",
"compilerOptions": {
"paths": {
"@ldo/*": ["packages/*/src"]
"@ldo/*": [
"packages/*/src"
]
},
"allowJs": true
}

Loading…
Cancel
Save