Skip to content

Commit 2ba1e49

Browse files
author
Thom
committed
chore: reduce codesmells
1 parent f0c077e commit 2ba1e49

File tree

4 files changed

+80
-43
lines changed

4 files changed

+80
-43
lines changed

src/datastrucures/DataSliceDSL.ts

+15-9
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import rdfFactory, { SomeTerm } from "@ontologies/core";
2+
import { idToValue } from "../factoryHelpers";
23

34
import { SomeNode } from "../types";
45

56
import { DataRecord, DataSlice } from "./DataSlice";
67

8+
export type OptionalIdOrNode = string | SomeNode | undefined;
9+
710
export interface RecordBuilder {
811
/** Sets the {value} of {field} on the current record */
912
field(field: string | SomeNode, value: SomeTerm): this;
@@ -12,11 +15,19 @@ export interface RecordBuilder {
1215
}
1316

1417
export interface SliceBuilder {
15-
record(id?: string | SomeNode | undefined): RecordBuilder;
18+
record(id?: OptionalIdOrNode): RecordBuilder;
1619
}
1720

1821
export type SliceCreator = (slice: SliceBuilder) => void;
1922

23+
const stringIdOrNewLocal = (id: OptionalIdOrNode): string => {
24+
if (id === undefined) {
25+
return rdfFactory.blankNode().value;
26+
}
27+
28+
return typeof id === "string" ? id : id.value;
29+
};
30+
2031
export const buildSlice = (creator: SliceCreator): DataSlice => {
2132
if (creator === undefined) {
2233
throw new Error("No creator passed");
@@ -25,14 +36,9 @@ export const buildSlice = (creator: SliceCreator): DataSlice => {
2536
const slice: DataSlice = {};
2637

2738
const builder: SliceBuilder = {
28-
record(id: string | SomeNode | undefined): RecordBuilder {
29-
const stringId = id === undefined
30-
? rdfFactory.blankNode().value
31-
: (typeof id === "string" ? id : id.value);
32-
33-
const termId = stringId.startsWith("_:")
34-
? rdfFactory.blankNode(stringId)
35-
: rdfFactory.namedNode(stringId);
39+
record(id: OptionalIdOrNode): RecordBuilder {
40+
const stringId = stringIdOrNewLocal(id);
41+
const termId = idToValue(stringId);
3642

3743
const record: DataRecord = {
3844
_id: termId,

src/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export {
1919
export { transformers } from "./transformers/index";
2020

2121
export {
22+
OptionalIdOrNode,
2223
SliceCreator,
2324
RecordBuilder,
2425
buildSlice,
@@ -80,6 +81,11 @@ export {
8081
} from "./TypedRecord";
8182
export { RecordState } from "./store/RecordState";
8283
export { RecordStatus } from "./store/RecordStatus";
84+
export {
85+
hasReferenceTo,
86+
fieldReferences,
87+
findAllReferencingIds,
88+
} from "./store/StructuredStore/references";
8389
export {
8490
idField,
8591
StructuredStore,

src/store/StructuredStore.ts

+6-34
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import rdfFactory, { SomeTerm, TermType } from "@ontologies/core";
1+
import rdfFactory, { SomeTerm } from "@ontologies/core";
22
import * as rdf from "@ontologies/rdf";
33
import * as rdfs from "@ontologies/rdfs";
44

5-
import { DataRecord, FieldSet, Id } from "../datastrucures/DataSlice";
5+
import { DataRecord, DataSlice, FieldSet, Id } from "../datastrucures/DataSlice";
66
import { DeepRecord, DeepRecordFieldValue } from "../datastrucures/DeepSlice";
77
import { FieldId, FieldValue, MultimapTerm } from "../datastrucures/Fields";
88
import { SomeNode } from "../types";
@@ -11,6 +11,7 @@ import { normalizeType } from "../utilities";
1111
import { RecordJournal } from "./RecordJournal";
1212
import { RecordState } from "./RecordState";
1313
import { RecordStatus } from "./RecordStatus";
14+
import { findAllReferencingIds } from "./StructuredStore/references";
1415

1516
export const idField = "_id";
1617
const member = rdfs.member.value;
@@ -79,7 +80,7 @@ export class StructuredStore {
7980
public base: string;
8081

8182
/** @private */
82-
public data: Record<Id, DataRecord>;
83+
public data: DataSlice;
8384

8485
/** @private */
8586
public journal: RecordJournal;
@@ -94,7 +95,7 @@ export class StructuredStore {
9495
*/
9596
constructor(
9697
base: string = "rdf:defaultGraph",
97-
data: Record<Id, DataRecord> | undefined = {},
98+
data: DataSlice | undefined = {},
9899
onChange: (docId: string) => void = (): void => undefined,
99100
) {
100101
this.base = base;
@@ -249,36 +250,7 @@ export class StructuredStore {
249250
* Find all records which reference this given [recordId]
250251
*/
251252
public references(recordId: Id): Id[] {
252-
const references = [];
253-
const data = this.data;
254-
255-
for (const rId in data) {
256-
if (!data.hasOwnProperty(rId)) {
257-
continue;
258-
}
259-
260-
const record = data[rId];
261-
for (const field in record) {
262-
if (!record.hasOwnProperty(field) || field === idField) {
263-
continue;
264-
}
265-
266-
const values = record[field];
267-
if (Array.isArray(values)) {
268-
for (const value of values) {
269-
if (value.termType !== TermType.Literal && value.value === recordId) {
270-
references.push(rId);
271-
}
272-
}
273-
} else {
274-
if (values.termType !== TermType.Literal && values.value === recordId) {
275-
references.push(rId);
276-
}
277-
}
278-
}
279-
}
280-
281-
return references;
253+
return findAllReferencingIds(this.data, recordId);
282254
}
283255

284256
/**
+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { TermType } from "@ontologies/core";
2+
3+
import { DataRecord, DataSlice, Id } from "../../datastrucures/DataSlice";
4+
import { FieldValue } from "../../datastrucures/Fields";
5+
import { idField } from "../StructuredStore";
6+
7+
export const fieldReferences = (values: FieldValue, referenced: Id): boolean => {
8+
if (Array.isArray(values)) {
9+
for (const value of values) {
10+
if (value.termType !== TermType.Literal && value.value === referenced) {
11+
return true;
12+
}
13+
}
14+
} else {
15+
if (values.termType !== TermType.Literal && values.value === referenced) {
16+
return true;
17+
}
18+
}
19+
20+
return false;
21+
};
22+
23+
export const hasReferenceTo = (record: DataRecord, referenced: Id): boolean => {
24+
for (const field in record) {
25+
if (!record.hasOwnProperty(field) || field === idField) {
26+
continue;
27+
}
28+
29+
const values = record[field];
30+
if (fieldReferences(values, referenced)) {
31+
return true;
32+
}
33+
}
34+
35+
return false;
36+
};
37+
38+
export const findAllReferencingIds = (data: DataSlice, referenced: Id): Id[] => {
39+
const found = [];
40+
41+
for (const id in data) {
42+
if (!data.hasOwnProperty(id)) {
43+
continue;
44+
}
45+
46+
const record = data[id];
47+
if (hasReferenceTo(record, referenced)) {
48+
found.push(id);
49+
}
50+
}
51+
52+
return found;
53+
};

0 commit comments

Comments
 (0)