@sixb/sqlite 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +40 -32
- package/dist/index.js.map +4 -4
- package/dist/ontology-storage/materialization-state.d.ts +7 -3
- package/dist/ontology-storage/materialization-state.d.ts.map +1 -1
- package/dist/ontology-storage/materializations.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/ontology-storage/materialization-state.ts +53 -33
- package/src/ontology-storage/materializations.ts +4 -5
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Database } from "bun:sqlite";
|
|
2
2
|
import type { OntologyLinkRef, OntologyObjectRef, TelemetrySeriesRef } from "@sixb/core/internal/materialization";
|
|
3
|
-
import type { MaterializationLinkScopeState, MaterializationLinkState, MaterializationObjectState, SourceReplacementLinkState, SourceReplacementObjectState, StoredTelemetryPoint } from "@sixb/core/storage";
|
|
3
|
+
import type { MaterializationLinkScopeRevision, MaterializationLinkScopeState, MaterializationLinkState, MaterializationObjectState, SourceReplacementLinkState, SourceReplacementObjectState, StoredTelemetryPoint } from "@sixb/core/storage";
|
|
4
4
|
export declare const SQLITE_MATERIALIZATION_WORK_TABLE = "ontology_materialization_work";
|
|
5
5
|
export declare const SQLITE_REPLACEMENT_WORK_TABLE = "ontology_replacement_work";
|
|
6
6
|
export type ReplacementIdentity = {
|
|
@@ -35,11 +35,15 @@ export declare class SqliteMaterializationStateReader {
|
|
|
35
35
|
readonly series: TelemetrySeriesRef;
|
|
36
36
|
readonly at: string;
|
|
37
37
|
}[]): readonly StoredTelemetryPoint[];
|
|
38
|
-
|
|
38
|
+
linkScopeRevisions(scopes: readonly {
|
|
39
|
+
readonly source: OntologyObjectRef;
|
|
40
|
+
readonly linkId: string;
|
|
41
|
+
}[]): readonly MaterializationLinkScopeRevision[];
|
|
42
|
+
linkSlotStates(scopes: readonly {
|
|
39
43
|
readonly source: OntologyObjectRef;
|
|
40
44
|
readonly linkId: string;
|
|
41
45
|
}[]): readonly MaterializationLinkScopeState[];
|
|
42
|
-
|
|
46
|
+
private readEffectiveLinkScopes;
|
|
43
47
|
incidentLinks(objects: readonly OntologyObjectRef[], pageRows: number): Iterable<OntologyLinkRef[]>;
|
|
44
48
|
replacementIdentities(input: ReplacementIdentityInput): Iterable<ReplacementIdentity[]>;
|
|
45
49
|
replacementObjectStates(sourceId: string, candidateMaterializationId: string, refs: readonly OntologyObjectRef[]): readonly SourceReplacementObjectState[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"materialization-state.d.ts","sourceRoot":"","sources":["../../src/ontology-storage/materialization-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,KAAK,EAGV,eAAe,EACf,iBAAiB,EAEjB,kBAAkB,EACnB,MAAM,qCAAqC,CAAA;AAe5C,OAAO,KAAK,EACV,6BAA6B,EAC7B,wBAAwB,EACxB,0BAA0B,EAC1B,0BAA0B,EAC1B,4BAA4B,EAO5B,oBAAoB,EACrB,MAAM,oBAAoB,CAAA;AAU3B,eAAO,MAAM,iCAAiC,kCAAkC,CAAA;AAChF,eAAO,MAAM,6BAA6B,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"materialization-state.d.ts","sourceRoot":"","sources":["../../src/ontology-storage/materialization-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"materializations.d.ts","sourceRoot":"","sources":["../../src/ontology-storage/materializations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AA2B1C,OAAO,KAAK,EACV,8BAA8B,EAC9B,0BAA0B,EAC1B,4BAA4B,EAC5B,8BAA8B,EAC9B,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,EAEvB,8BAA8B,EAC9B,uCAAuC,EAEvC,0BAA0B,EAC1B,6BAA6B,EAC7B,+BAA+B,EAC/B,8BAA8B,EAC9B,iCAAiC,EAClC,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAGL,KAAK,gCAAgC,EACtC,MAAM,2BAA2B,CAAA;AAiBlC,qBAAa,oCAAqC,YAAW,8BAA8B;IAKvF,OAAO,CAAC,QAAQ,CAAC,EAAE;IAJrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+B;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;gBAGjC,EAAE,EAAE,QAAQ,EAC7B,OAAO,EAAE,gCAAgC,GAAG,IAAI;IAM5C,KAAK,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"materializations.d.ts","sourceRoot":"","sources":["../../src/ontology-storage/materializations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AA2B1C,OAAO,KAAK,EACV,8BAA8B,EAC9B,0BAA0B,EAC1B,4BAA4B,EAC5B,8BAA8B,EAC9B,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,EAEvB,8BAA8B,EAC9B,uCAAuC,EAEvC,0BAA0B,EAC1B,6BAA6B,EAC7B,+BAA+B,EAC/B,8BAA8B,EAC9B,iCAAiC,EAClC,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAGL,KAAK,gCAAgC,EACtC,MAAM,2BAA2B,CAAA;AAiBlC,qBAAa,oCAAqC,YAAW,8BAA8B;IAKvF,OAAO,CAAC,QAAQ,CAAC,EAAE;IAJrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+B;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;gBAGjC,EAAE,EAAE,QAAQ,EAC7B,OAAO,EAAE,gCAAgC,GAAG,IAAI;IAM5C,KAAK,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAmCvE,WAAW,CAChB,KAAK,EAAE,+BAA+B,GACrC,aAAa,CAAC,wBAAwB,CAAC;IAmDnC,4BAA4B,CACjC,KAAK,EAAE,iCAAiC,GACvC,aAAa,CAAC,0BAA0B,CAAC;IA0FtC,SAAS,CAAC,KAAK,EAAE,6BAA6B,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpE,UAAU,CAAC,KAAK,EAAE,8BAA8B,GAAG,aAAa,CAAC,uBAAuB,CAAC;IAKnF,mBAAmB,CACvB,KAAK,EAAE,uCAAuC,GAC7C,OAAO,CAAC,SAAS,8BAA8B,EAAE,CAAC;IAK/C,UAAU,CAAC,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBhE,QAAQ,CAAC,KAAK,EAAE,4BAA4B,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAYxF,kBAAkB,IAAI,IAAI;IAI1B,OAAO,CAAC,kBAAkB;IA2D1B,OAAO,CAAC,kBAAkB;IA+C1B,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,YAAY;IAsBpB,OAAO,CAAC,UAAU;YAsBJ,kBAAkB;IAwDhC,OAAO,CAAC,sBAAsB;IAwD9B,OAAO,CAAC,cAAc;IAqGtB,OAAO,CAAC,YAAY;IAmDpB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,SAAS;CAYlB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sixb/sqlite",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "SQLite storage provider for Sixb",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sixb",
|
|
@@ -36,10 +36,10 @@
|
|
|
36
36
|
"prepack": "bun run build"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
|
-
"@sixb/core": "0.1.
|
|
39
|
+
"@sixb/core": "0.1.6"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@sixb/core": "0.1.
|
|
42
|
+
"@sixb/core": "0.1.6",
|
|
43
43
|
"@types/bun": "latest",
|
|
44
44
|
"typescript": "^5.7.0"
|
|
45
45
|
},
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
startScopeAccumulator,
|
|
23
23
|
} from "@sixb/core/internal/ontology-storage-provider"
|
|
24
24
|
import type {
|
|
25
|
+
MaterializationLinkScopeRevision,
|
|
25
26
|
MaterializationLinkScopeState,
|
|
26
27
|
MaterializationLinkState,
|
|
27
28
|
MaterializationObjectState,
|
|
@@ -83,6 +84,19 @@ interface LinkScopeRow extends EffectiveLinkRow {
|
|
|
83
84
|
readonly scope_sort_key: string
|
|
84
85
|
}
|
|
85
86
|
|
|
87
|
+
function linkScopeRequestJson(
|
|
88
|
+
scopes: readonly { readonly source: OntologyObjectRef; readonly linkId: string }[]
|
|
89
|
+
): string {
|
|
90
|
+
return canonicalJson(
|
|
91
|
+
scopes.map(({ source, linkId }) => ({
|
|
92
|
+
scopeSortKey: linkScopeSortKey(source, linkId),
|
|
93
|
+
sourceTypeId: source.objectTypeId,
|
|
94
|
+
sourceId: source.primaryId,
|
|
95
|
+
linkId,
|
|
96
|
+
}))
|
|
97
|
+
)
|
|
98
|
+
}
|
|
99
|
+
|
|
86
100
|
interface ObjectOverrideRow extends SqliteStoredOverrideRow {
|
|
87
101
|
readonly object_type_id: string
|
|
88
102
|
readonly primary_id: string
|
|
@@ -426,23 +440,18 @@ export class SqliteMaterializationStateReader {
|
|
|
426
440
|
})
|
|
427
441
|
}
|
|
428
442
|
|
|
429
|
-
|
|
443
|
+
linkScopeRevisions(
|
|
444
|
+
scopes: readonly { readonly source: OntologyObjectRef; readonly linkId: string }[]
|
|
445
|
+
): readonly MaterializationLinkScopeRevision[] {
|
|
446
|
+
if (scopes.length === 0) return []
|
|
447
|
+
return this.readEffectiveLinkScopes(scopes, linkScopeRequestJson(scopes)).revisions
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
linkSlotStates(
|
|
430
451
|
scopes: readonly { readonly source: OntologyObjectRef; readonly linkId: string }[]
|
|
431
452
|
): readonly MaterializationLinkScopeState[] {
|
|
432
453
|
if (scopes.length === 0) return []
|
|
433
|
-
const
|
|
434
|
-
scopeSortKey: linkScopeSortKey(source, linkId),
|
|
435
|
-
sourceTypeId: source.objectTypeId,
|
|
436
|
-
sourceId: source.primaryId,
|
|
437
|
-
linkId,
|
|
438
|
-
}))
|
|
439
|
-
const accumulators = new Map(
|
|
440
|
-
scopes.map(({ source, linkId }) => {
|
|
441
|
-
const key = linkScopeSortKey(source, linkId)
|
|
442
|
-
return [key, startScopeAccumulator(source, linkId)] as const
|
|
443
|
-
})
|
|
444
|
-
)
|
|
445
|
-
const requestedJson = canonicalJson(requested)
|
|
454
|
+
const requestedJson = linkScopeRequestJson(scopes)
|
|
446
455
|
const sourceRows = this.db
|
|
447
456
|
.query(
|
|
448
457
|
`WITH requested AS (
|
|
@@ -491,6 +500,31 @@ export class SqliteMaterializationStateReader {
|
|
|
491
500
|
return [linkScopeSortKey(stored.ref.source, stored.ref.linkId), stored] as const
|
|
492
501
|
})
|
|
493
502
|
)
|
|
503
|
+
const { revisions, effective } = this.readEffectiveLinkScopes(scopes, requestedJson)
|
|
504
|
+
return scopes.map(({ source, linkId }, index) => {
|
|
505
|
+
const key = linkScopeSortKey(source, linkId)
|
|
506
|
+
return {
|
|
507
|
+
...revisions[index]!,
|
|
508
|
+
sourceAssertion: sources.get(key) ?? null,
|
|
509
|
+
override: overrides.get(key) ?? null,
|
|
510
|
+
effective: effective.get(key) ?? null,
|
|
511
|
+
}
|
|
512
|
+
})
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
private readEffectiveLinkScopes(
|
|
516
|
+
scopes: readonly { readonly source: OntologyObjectRef; readonly linkId: string }[],
|
|
517
|
+
requestedJson: string
|
|
518
|
+
): {
|
|
519
|
+
readonly revisions: readonly MaterializationLinkScopeRevision[]
|
|
520
|
+
readonly effective: ReadonlyMap<string, EffectiveLinkSnapshot | null>
|
|
521
|
+
} {
|
|
522
|
+
const accumulators = new Map(
|
|
523
|
+
scopes.map(({ source, linkId }) => {
|
|
524
|
+
const key = linkScopeSortKey(source, linkId)
|
|
525
|
+
return [key, startScopeAccumulator(source, linkId)] as const
|
|
526
|
+
})
|
|
527
|
+
)
|
|
494
528
|
const effective = new Map<string, EffectiveLinkSnapshot | null>()
|
|
495
529
|
const rows = this.db
|
|
496
530
|
.query(
|
|
@@ -526,26 +560,12 @@ export class SqliteMaterializationStateReader {
|
|
|
526
560
|
appendScopeSnapshot(accumulator, snapshot)
|
|
527
561
|
effective.set(row.scope_sort_key, accumulator.effectiveCount === 1 ? snapshot : null)
|
|
528
562
|
}
|
|
529
|
-
return
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
override: overrides.get(key) ?? null,
|
|
535
|
-
effective: effective.get(key) ?? null,
|
|
536
|
-
}
|
|
537
|
-
})
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
linkScope(source: OntologyObjectRef, linkId: string): MaterializationLinkScopeState {
|
|
541
|
-
const [scope] = this.linkScopes([{ source, linkId }])
|
|
542
|
-
if (!scope) {
|
|
543
|
-
throw new MaterializationConflictError(
|
|
544
|
-
"effective-state",
|
|
545
|
-
"Link scope lookup returned no row."
|
|
546
|
-
)
|
|
563
|
+
return {
|
|
564
|
+
revisions: scopes.map(({ source, linkId }) =>
|
|
565
|
+
finishScopeAccumulator(accumulators.get(linkScopeSortKey(source, linkId))!)
|
|
566
|
+
),
|
|
567
|
+
effective,
|
|
547
568
|
}
|
|
548
|
-
return scope
|
|
549
569
|
}
|
|
550
570
|
|
|
551
571
|
*incidentLinks(
|
|
@@ -88,10 +88,9 @@ export class SqliteOntologyMaterializationStorage implements OntologyMaterializa
|
|
|
88
88
|
this.assertSource(expected, input.commit.projectId)
|
|
89
89
|
for (const expected of input.expected.objects) this.assertObject(reader, expected)
|
|
90
90
|
for (const expected of input.expected.links) this.assertLink(reader, expected)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
) {
|
|
91
|
+
const linkScopeRevisions = reader.linkScopeRevisions(input.expected.linkScopes)
|
|
92
|
+
for (const [index, expected] of input.expected.linkScopes.entries()) {
|
|
93
|
+
if (linkScopeRevisions[index]?.fingerprint !== expected.fingerprint) {
|
|
95
94
|
throw new MaterializationConflictError(
|
|
96
95
|
"effective-state",
|
|
97
96
|
`Expected link scope changed for ${expected.source.objectTypeId}:${expected.source.primaryId}.${expected.linkId}.`
|
|
@@ -151,7 +150,7 @@ export class SqliteOntologyMaterializationStorage implements OntologyMaterializa
|
|
|
151
150
|
yield {
|
|
152
151
|
objects: [],
|
|
153
152
|
links: [],
|
|
154
|
-
linkScopes: reader.
|
|
153
|
+
linkScopes: reader.linkSlotStates(scopes.slice(offset, offset + input.pageRows)),
|
|
155
154
|
points: [],
|
|
156
155
|
}
|
|
157
156
|
}
|