From 8d95917ab810dbd6b375844de758e2331f0008a4 Mon Sep 17 00:00:00 2001 From: ajuvercr Date: Thu, 22 Aug 2024 14:53:02 +0200 Subject: [PATCH 1/7] feat: only send new relations --- package-lock.json | 33 +- src/bucketizers.ts | 259 +-- src/bucketizers/index.ts | 60 +- src/bucketizers/pagedBucketizer.ts | 5 +- src/bucketizers/subjectBucketizer.ts | 6 +- src/bucketizers/timebasedBucketizer.ts | 33 +- src/utils/index.ts | 7 +- test/bucketizer.test.ts | 29 +- test/timebasedBucketizer.test.ts | 2727 +++++++++++++++++++----- 9 files changed, 2442 insertions(+), 717 deletions(-) diff --git a/package-lock.json b/package-lock.json index a543fc1..b214e9e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "extract-cbd-shape": "^0.1.8", "jsonld": "^8.3.2", "n3": "^1.17.3", + "rdf-canonize": "^4.0.1", "rdf-data-factory": "^1.1.2", "rdf-lens": "^1.2.8", "rdf-stores": "^1.0.0" @@ -3565,6 +3566,18 @@ "readable-stream": "^4.0.0" } }, + "node_modules/jsonld/node_modules/rdf-canonize": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.4.0.tgz", + "integrity": "sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA==", + "license": "BSD-3-Clause", + "dependencies": { + "setimmediate": "^1.0.5" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/kafkajs": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/kafkajs/-/kafkajs-2.2.4.tgz", @@ -4456,14 +4469,15 @@ ] }, "node_modules/rdf-canonize": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.4.0.tgz", - "integrity": "sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-4.0.1.tgz", + "integrity": "sha512-B5ynHt4sasbUafzrvYI2GFARgeFcD8Sx9yXPbg7gEyT2EH76rlCv84kyO6tnxzVbxUN/uJDbK1S/MXh+DsnuTA==", + "license": "BSD-3-Clause", "dependencies": { "setimmediate": "^1.0.5" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/rdf-data-factory": { @@ -4527,6 +4541,17 @@ "rdf-terms": "^1.7.0" } }, + "node_modules/rdf-js": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/rdf-js/-/rdf-js-4.0.2.tgz", + "integrity": "sha512-ApvlFa/WsQh8LpPK/6hctQwG06Z9ztQQGWVtrcrf9L6+sejHNXLPOqL+w7q3hF+iL0C4sv3AX1PUtGkLNzyZ0Q==", + "deprecated": "Use @types/rdf-js instead. See https://github.com/rdfjs/types?tab=readme-ov-file#what-about-typesrdf-js", + "license": "MIT", + "peer": true, + "dependencies": { + "@rdfjs/types": "*" + } + }, "node_modules/rdf-lens": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rdf-lens/-/rdf-lens-1.2.8.tgz", diff --git a/src/bucketizers.ts b/src/bucketizers.ts index aade207..42e4482 100644 --- a/src/bucketizers.ts +++ b/src/bucketizers.ts @@ -6,7 +6,7 @@ import { getLatestShape, getLatestStream, transformMetadata } from "./core"; import { LDES, PPLAN, PROV, RDF, SDS } from "@treecg/types"; import type { Stream, Writer } from "@rdfc/js-runner"; import { BucketizerConfig, BucketizerOrchestrator } from "./bucketizers/index"; -import { Bucket, Extractor, getOrDefaultMap, Record } from "./utils/index"; +import { Bucket, BucketRelation, Extractor, Record } from "./utils/index"; import { CBDShapeExtractor } from "extract-cbd-shape"; import { Cleanup } from "./exitHandler"; import { RdfStore } from "rdf-stores"; @@ -22,6 +22,44 @@ async function writeState( } } +/* tslint:disable:no-unused-variable */ +async function prettyPrintQuads(quads: Quad[]): Promise { + quads.sort((a, b) => + a.subject.value == b.subject.value + ? 0 + : a.subject.value > b.subject.value + ? 1 + : -1, + ); + quads.sort((a, b) => + a.graph.value == b.graph.value + ? 0 + : a.graph.value > b.graph.value + ? 1 + : -1, + ); + + const writer = new N3Writer({ + prefixes: { + uk: "http://mumo.be/data/unknown/", + sds: "https://w3id.org/sds#", + data: "http://mumo.be/data/", + ob: "http://def.isotc211.org/iso19156/2011/Observation#", + xsd: "http://www.w3.org/2001/XMLSchema#", + sosa: "http://www.w3.org/ns/sosa/", + }, + format: "application/trig", + }); + writer.addQuads(quads); + + return new Promise((res) => { + writer.end((_error, result) => { + console.log(result); + res(); + }); + }); +} + function addProcess( id: Term | undefined, store: RdfStore, @@ -135,60 +173,16 @@ function bucket_to_quads( ); } - if (includeRelations) { - for (const rel of bucket.links) { - const id = df.blankNode(); - out.push( - df.quad( - bucket.id, - SDS.terms.relation, - id, - SDS.terms.custom("DataDescription"), - ), - df.quad( - id, - SDS.terms.relationType, - rel.type, - SDS.terms.custom("DataDescription"), - ), - df.quad( - id, - SDS.terms.relationBucket, - rel.target, - SDS.terms.custom("DataDescription"), - ), - ); - - if (rel.path) { - out.push( - df.quad( - id, - SDS.terms.relationPath, - rel.path.id, - SDS.terms.custom("DataDescription"), - ), - ...rel.path.quads.map((x) => - df.quad( - x.subject, - x.predicate, - x.object, - SDS.terms.custom("DataDescription"), - ), - ), - ); - } - - if (rel.value) { - out.push( - df.quad( - id, - SDS.terms.relationValue, - rel.value, - SDS.terms.custom("DataDescription"), - ), - ); - } - } + // Send empty triples for the bucket if it is set as true. + if (bucket.empty) { + out.push( + df.quad( + bucket.id, + SDS.terms.custom("empty"), + df.literal("true"), + SDS.terms.custom("DataDescription"), + ), + ); } if (stream) { @@ -205,6 +199,63 @@ function bucket_to_quads( return out; } +function relationToQuads(bucket: Bucket, rel: BucketRelation): Quad[] { + const out: Quad[] = []; + const id = df.blankNode(); + out.push( + df.quad( + bucket.id, + SDS.terms.relation, + id, + SDS.terms.custom("DataDescription"), + ), + df.quad( + id, + SDS.terms.relationType, + rel.type, + SDS.terms.custom("DataDescription"), + ), + df.quad( + id, + SDS.terms.relationBucket, + rel.target, + SDS.terms.custom("DataDescription"), + ), + ); + + if (rel.path) { + out.push( + df.quad( + id, + SDS.terms.relationPath, + rel.path.id, + SDS.terms.custom("DataDescription"), + ), + ...rel.path.quads.map((x) => + df.quad( + x.subject, + x.predicate, + x.object, + SDS.terms.custom("DataDescription"), + ), + ), + ); + } + + if (rel.value) { + out.push( + df.quad( + id, + SDS.terms.relationValue, + rel.value, + SDS.terms.custom("DataDescription"), + ), + ); + } + + return out; +} + function set_metadata( channels: Channels, resultingStream: Term, @@ -278,19 +329,27 @@ export async function bucketize( const quads = new Parser().parse(x); const records = await extractor.parse_records(quads); - const relatedBuckets = new Map>(); - const requestedBuckets = new Map>(); - const includedBuckets = new Map>(); + const requestedBuckets = new Set(); const newMembers = new Map>(); + const newRelations: { + origin: Bucket; + relation: BucketRelation; + }[] = []; + for (const record of records) { const record_buckets = orchestrator.bucketize( record, buckets, requestedBuckets, newMembers, + newRelations, sourceStream?.value || "root", ); + + record_buckets.forEach((x) => requestedBuckets.add(x)); + + // Write SDS Record for resulting stream outputQuads.push( ...record_to_quads( record, @@ -298,42 +357,6 @@ export async function bucketize( record_buckets.map((x) => buckets[x]), ), ); - // Register the record buckets as included in the output, so we do not have to write it again as requested bucket without relations - record_buckets.forEach((x) => - getOrDefaultMap(includedBuckets, x, new Set()).add( - record.stream, - ), - ); - - for (const b of record_buckets) { - getOrDefaultMap(relatedBuckets, b, new Set()).add( - record.stream, - ); - let parent = buckets[b].parent; - while (parent) { - getOrDefaultMap( - relatedBuckets, - parent.id.value, - new Set(), - ).add(record.stream); - parent = parent.parent; - } - } - } - - for (const [relatedBucket, streams] of relatedBuckets) { - for (const stream of streams) { - outputQuads.push( - ...bucket_to_quads(buckets[relatedBucket], true, stream), - ); - - // Register the related bucket as included in the output, so we do not have to write it again as requested bucket without relations - getOrDefaultMap( - includedBuckets, - relatedBucket, - new Set(), - ).add(stream); - } } // Write records for the new members. @@ -355,46 +378,24 @@ export async function bucketize( ), ); } + // Register the bucket as included in the output, so we do not have to write it again as requested bucket without relations - getOrDefaultMap(includedBuckets, bucket, new Set()).add( - resultingStream, - ); + requestedBuckets.add(bucket); } // Only write the requested buckets that are not included in the output yet - for (const [requestedBucket, streams] of requestedBuckets) { - for (const stream of streams) { - if ( - !getOrDefaultMap( - includedBuckets, - requestedBucket, - new Set(), - ).has(stream) - ) { - outputQuads.push( - ...bucket_to_quads( - buckets[requestedBucket], - false, - stream, - ), - ); - } - } - - // Send empty triples for the bucket if it is set as true. - if (buckets[requestedBucket].empty) { - outputQuads.push( - df.quad( - buckets[requestedBucket].id, - SDS.terms.custom("empty"), - df.literal("true"), - SDS.terms.custom("DataDescription"), - ), - ); + for (const requestedBucket of requestedBuckets) { + outputQuads.push( + ...bucket_to_quads( + buckets[requestedBucket], + false, + resultingStream, + ), + ); + } - // Undo marking as to be emptied. - buckets[requestedBucket].empty = false; - } + for (const { origin, relation } of newRelations) { + outputQuads.push(...relationToQuads(origin, relation)); } await channels.dataOutput.push( diff --git a/src/bucketizers/index.ts b/src/bucketizers/index.ts index c96fefc..0faf897 100644 --- a/src/bucketizers/index.ts +++ b/src/bucketizers/index.ts @@ -2,7 +2,13 @@ import { readFileSync } from "fs"; import * as path from "path"; import { Term } from "@rdfjs/types"; import { BasicLensM, Cont } from "rdf-lens"; -import { Bucket, getOrDefaultMap, Record } from "../utils"; +import { + Bucket, + BucketRelation, + getOrDefaultMap, + RdfThing, + Record, +} from "../utils"; import { TREE } from "@treecg/types"; import { DataFactory } from "rdf-data-factory"; import PagedBucketizer from "./pagedBucketizer"; @@ -46,10 +52,19 @@ export type TimebasedFragmentation = { minBucketSpan: number; }; +export type AddRelation = ( + origin: Bucket, + target: Bucket, + type: Term, + value?: Term, + path?: RdfThing, +) => void; + export interface Bucketizer { bucketize( sdsMember: Record, getBucket: (key: string, root?: boolean) => Bucket, + addRelation: AddRelation, ): Bucket[]; save(): string; @@ -91,12 +106,39 @@ export class BucketizerOrchestrator { bucketize( record: Record, buckets: { [id: string]: Bucket }, - requestedBuckets: Map>, + requestedBuckets: Set, newMembers: Map>, + newRelations: { + origin: Bucket; + relation: BucketRelation; + }[], prefix = "", ): string[] { let queue = [prefix]; + const addRelation = ( + origin: Bucket, + target: Bucket, + type: Term, + value?: Term, + path?: RdfThing, + ) => { + const relation = { + type, + value, + path, + target: target.id, + }; + const newRel = { + origin, + relation, + }; + newRelations.push(newRel); + + origin.links.push(relation); + target.parent = origin; + }; + for (let i = 0; i < this.configs.length; i++) { const todo = queue.slice(); queue = []; @@ -122,14 +164,18 @@ export class BucketizerOrchestrator { ).add(memberId); }; } - // Add the bucket to the requested buckets, so we can send it through to propagate any changes to it. - getOrDefaultMap(requestedBuckets, id, new Set()).add( - record.stream, - ); + + // This bucket is requested, please remember + requestedBuckets.add(id); + return buckets[id]; }; - const foundBucket = bucketizer.bucketize(record, getBucket); + const foundBucket = bucketizer.bucketize( + record, + getBucket, + addRelation, + ); for (const bucket of foundBucket) { queue.push(bucket.id.value); diff --git a/src/bucketizers/pagedBucketizer.ts b/src/bucketizers/pagedBucketizer.ts index 4e74b43..d4634f0 100644 --- a/src/bucketizers/pagedBucketizer.ts +++ b/src/bucketizers/pagedBucketizer.ts @@ -1,4 +1,4 @@ -import { Bucketizer, PageFragmentation } from "./index"; +import { AddRelation, Bucketizer, PageFragmentation } from "./index"; import { Bucket, Record } from "../utils"; import { TREE } from "@treecg/types"; @@ -17,6 +17,7 @@ export default class PagedBucketizer implements Bucketizer { bucketize( _: Record, getBucket: (key: string, root?: boolean) => Bucket, + addRelation: AddRelation, ): Bucket[] { const index = Math.floor(this.count / this.pageSize); this.count += 1; @@ -25,7 +26,7 @@ export default class PagedBucketizer implements Bucketizer { if (this.count % this.pageSize == 1 && this.count > 1) { const oldBucket = getBucket("page-" + (index - 1), index - 1 == 0); oldBucket.immutable = true; - oldBucket.addRelation(currentbucket, TREE.terms.Relation); + addRelation(oldBucket, currentbucket, TREE.terms.Relation); } return [currentbucket]; diff --git a/src/bucketizers/subjectBucketizer.ts b/src/bucketizers/subjectBucketizer.ts index dd18084..947ced3 100644 --- a/src/bucketizers/subjectBucketizer.ts +++ b/src/bucketizers/subjectBucketizer.ts @@ -1,4 +1,4 @@ -import { Bucketizer, SubjectFragmentation } from "./index"; +import { AddRelation, Bucketizer, SubjectFragmentation } from "./index"; import { BasicLensM, Cont } from "rdf-lens"; import { Term } from "@rdfjs/types"; import { Bucket, RdfThing, Record } from "../utils"; @@ -29,6 +29,7 @@ export default class SubjectBucketizer implements Bucketizer { bucketize( record: Record, getBucket: (key: string, root?: boolean) => Bucket, + addRelation: AddRelation, ): Bucket[] { const values = this.path .execute(record.data) @@ -65,7 +66,8 @@ export default class SubjectBucketizer implements Bucketizer { if (!this.seen.has(bucket.id.value)) { this.seen.add(bucket.id.value); - root.addRelation( + addRelation( + root, bucket, TREE.terms.EqualToRelation, value.literal, diff --git a/src/bucketizers/timebasedBucketizer.ts b/src/bucketizers/timebasedBucketizer.ts index 3d2270d..6b9ed4c 100644 --- a/src/bucketizers/timebasedBucketizer.ts +++ b/src/bucketizers/timebasedBucketizer.ts @@ -1,10 +1,9 @@ -import { Bucketizer, TimebasedFragmentation } from "./index"; +import { AddRelation, Bucketizer, TimebasedFragmentation } from "./index"; import { Bucket, Member, RdfThing, Record } from "../utils"; import { BasicLensM, Cont } from "rdf-lens"; import { Term } from "@rdfjs/types"; -import { TREE, XSD } from "@treecg/types"; +import { getLogger, TREE, XSD } from "@treecg/types"; import { DataFactory } from "n3"; -import { getLoggerFor } from "../utils/logUtil"; import literal = DataFactory.literal; import namedNode = DataFactory.namedNode; @@ -15,10 +14,15 @@ export default class TimebasedBucketizer implements Bucketizer { private readonly k: number = 4; private readonly minBucketSpan: number = 300000; + private readonly logger = getLogger("TimebasedBucketizer"); + private mutableLeafBucketKeys: Array = []; private members: Array = []; constructor(config: TimebasedFragmentation, save?: string) { + console.log("============================="); + console.log("CREATING TIMEBASED BUCKETIZER"); + console.log("============================"); this.path = config.path.mapAll((x) => ({ value: x.id.value, literal: x.id, @@ -38,6 +42,7 @@ export default class TimebasedBucketizer implements Bucketizer { bucketize( record: Record, getBucket: (key: string, root?: boolean) => Bucket, + addRelation: AddRelation, ): Bucket[] { const values = this.path .execute(record.data) @@ -46,6 +51,11 @@ export default class TimebasedBucketizer implements Bucketizer { ); const out: Bucket[] = []; + console.log( + `Bucketizer: Adding record ${record.data.id.value} to buckets ${values.map( + (x) => x.value, + )}`, + ); for (const value of values) { if (value.literal) { @@ -83,6 +93,7 @@ export default class TimebasedBucketizer implements Bucketizer { yearBucket, newBucketTimestamp, yearTimespan, + addRelation, ); // Add the new bucket to the list of leaf buckets. @@ -146,12 +157,15 @@ export default class TimebasedBucketizer implements Bucketizer { console.log("We need to make a new page"); // We need to make a new page. const newBucket = getBucket( - `${bucketProperties[0]}_${bucketProperties[1]}_${parseInt(bucketProperties[2]) + 1}`, + `${bucketProperties[0]}_${bucketProperties[1]}_${ + parseInt(bucketProperties[2]) + 1 + }`, ); // Make the old bucket as immutable and add the relation to the new bucket. candidateBucket.immutable = true; - candidateBucket.addRelation( + addRelation( + candidateBucket, newBucket, TREE.terms.Relation, ); @@ -242,6 +256,7 @@ export default class TimebasedBucketizer implements Bucketizer { newBucket, newTimestamp, newBucketSpan, + addRelation, ); } @@ -296,14 +311,18 @@ export default class TimebasedBucketizer implements Bucketizer { childBucket: Bucket, startTimestamp: Date, timespan: number, + addRelation: AddRelation, ) { - rootBucket.addRelation( + addRelation( + rootBucket, childBucket, TREE.terms.GreaterThanOrEqualToRelation, literal(startTimestamp.toISOString(), namedNode(XSD.dateTime)), this.pathQuads, ); - rootBucket.addRelation( + + addRelation( + rootBucket, childBucket, TREE.terms.LessThanRelation, literal( diff --git a/src/utils/index.ts b/src/utils/index.ts index 373ac55..fc62d45 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,4 +1,4 @@ -import { Quad, Term, Quad_Object, Quad_Subject } from "@rdfjs/types"; +import { Quad, Quad_Object, Quad_Subject, Term } from "@rdfjs/types"; import { DataFactory } from "rdf-data-factory"; import { NBNode } from "../core"; import { Parser, Writer } from "n3"; @@ -151,11 +151,6 @@ export class Bucket { return out; } - addRelation(target: Bucket, type: Term, value?: Term, path?: RdfThing) { - this.links.push({ type, value, path, target: target.id }); - target.parent = this; - } - write(writer: Writer) { const id = this.id; const relations = this.links diff --git a/test/bucketizer.test.ts b/test/bucketizer.test.ts index 5e4ac66..5f56ae9 100644 --- a/test/bucketizer.test.ts +++ b/test/bucketizer.test.ts @@ -11,6 +11,7 @@ import { } from "../src/bucketizers/index"; import { Bucket, Record } from "../src/"; import { Term } from "@rdfjs/types"; +import { BucketRelation } from "../src/utils"; const { namedNode, literal, quad } = DataFactory; @@ -170,8 +171,12 @@ describe("Bucketizer behavior", () => { const stream = namedNode("MyStream"); const buckets: { [id: string]: Bucket } = {}; - const requestedBuckets = new Map>(); + const requestedBuckets = new Set(); const newMembers = new Map>(); + const newRelations: { + origin: Bucket; + relation: BucketRelation; + }[] = []; const recordBuckets: string[] = []; for (const member of [ new Record({ id: namedNode("a1"), quads: [] }, stream), @@ -184,6 +189,7 @@ describe("Bucketizer behavior", () => { buckets, requestedBuckets, newMembers, + newRelations, ), ); } @@ -213,8 +219,12 @@ describe("Bucketizer behavior", () => { const stream = namedNode("MyStream"); const buckets: { [id: string]: Bucket } = {}; - const requestedBuckets = new Map>(); + const requestedBuckets = new Set(); const newMembers = new Map>(); + const newRelations: { + origin: Bucket; + relation: BucketRelation; + }[] = []; const recordBuckets: string[] = []; for (const member of [ new Record({ id: namedNode("a1"), quads: [] }, stream), @@ -227,6 +237,7 @@ describe("Bucketizer behavior", () => { buckets, requestedBuckets, newMembers, + newRelations, ), ); } @@ -256,8 +267,12 @@ describe("Bucketizer behavior", () => { const stream = namedNode("MyStream"); const buckets: { [id: string]: Bucket } = {}; - const requestedBuckets = new Map>(); + const requestedBuckets = new Set(); const newMembers = new Map>(); + const newRelations: { + origin: Bucket; + relation: BucketRelation; + }[] = []; const recordBuckets: string[] = []; const pred = namedNode("http://example.org/test"); for (const member of [ @@ -289,6 +304,7 @@ describe("Bucketizer behavior", () => { buckets, requestedBuckets, newMembers, + newRelations, ), ); } @@ -324,8 +340,12 @@ describe("Bucketizer behavior", () => { const stream = namedNode("MyStream"); const buckets: { [id: string]: Bucket } = {}; - const requestedBuckets = new Map>(); + const requestedBuckets = new Set(); const newMembers = new Map>(); + const newRelations: { + origin: Bucket; + relation: BucketRelation; + }[] = []; const recordBuckets: string[] = []; for (const member of [ @@ -340,6 +360,7 @@ describe("Bucketizer behavior", () => { buckets, requestedBuckets, newMembers, + newRelations, ), ); } diff --git a/test/timebasedBucketizer.test.ts b/test/timebasedBucketizer.test.ts index fb675d4..073782b 100644 --- a/test/timebasedBucketizer.test.ts +++ b/test/timebasedBucketizer.test.ts @@ -13,6 +13,8 @@ import { bucketize } from "../lib/main"; import { RDF, SDS } from "@treecg/types"; import namedNode = DataFactory.namedNode; +type Member = { id: string; timestamp: Date; text: string }; + describe("TimebasedBucketizer tests", () => { const members: { id: string; timestamp: Date; text: string }[] = []; const startDate = new Date("2023-01-01T00:00:00Z"); @@ -28,27 +30,35 @@ describe("TimebasedBucketizer tests", () => { const seventeenthOfMonth = new Date(firstOfMonth); seventeenthOfMonth.setUTCDate(17); - const firstMemberId = `abcd-beginning-of-${firstOfMonth.toLocaleString("default", { month: "long" })}-${firstOfMonth.getFullYear()}-efgh`; - const secondMemberId = `ijkl-middle-of-${seventeenthOfMonth.toLocaleString("default", { month: "long" })}-${seventeenthOfMonth.getFullYear()}-mnop`; + const firstMemberId = `abcd-beginning-of-${firstOfMonth.toLocaleString( + "default", + { month: "long" }, + )}-${firstOfMonth.getFullYear()}-efgh`; + const secondMemberId = `ijkl-middle-of-${seventeenthOfMonth.toLocaleString( + "default", + { month: "long" }, + )}-${seventeenthOfMonth.getFullYear()}-mnop`; members.push({ id: firstMemberId, timestamp: firstOfMonth, - text: `This is a member that was added at the beginning of ${firstOfMonth.toLocaleString("default", { month: "long" })} ${firstOfMonth.getFullYear()}`, + text: `This is a member that was added at the beginning of ${firstOfMonth.toLocaleString( + "default", + { month: "long" }, + )} ${firstOfMonth.getFullYear()}`, }); members.push({ id: secondMemberId, timestamp: seventeenthOfMonth, - text: `This is a member that was added in the middle of ${seventeenthOfMonth.toLocaleString("default", { month: "long" })} ${seventeenthOfMonth.getFullYear()}`, + text: `This is a member that was added in the middle of ${seventeenthOfMonth.toLocaleString( + "default", + { month: "long" }, + )} ${seventeenthOfMonth.getFullYear()}`, }); } - function memberToRecord(member: { - id: string; - timestamp: Date; - text: string; - }): Record { + function memberToRecord(member: Member): Record { const quadsStr = ` @prefix ex: . @prefix xsd: . @@ -118,8 +128,9 @@ ex:Fragmentation a tree:TimebasedFragmentation ; const recordBuckets = orchestrator.bucketize( memberToRecord(members[i]), buckets, - new Map>(), + new Set(), new Map>(), + [], ); expect(recordBuckets.length).toBe(1); expect(recordBuckets[0]).toBe(firstBucketExpected); @@ -132,8 +143,9 @@ ex:Fragmentation a tree:TimebasedFragmentation ; const recordBuckets = orchestrator.bucketize( memberToRecord(members[i]), buckets, - new Map>(), + new Set(), new Map>(), + [], ); expect(recordBuckets.length).toBe(1); if (members[i].timestamp < new Date("2023-07-01T12:00:00.000Z")) { @@ -161,8 +173,9 @@ ex:Fragmentation a tree:TimebasedFragmentation ; const recordBuckets = orchestrator.bucketize( memberToRecord(members[i]), buckets, - new Map>(), + new Set(), new Map>(), + [], ); expect(recordBuckets.length).toBe(1); expect(recordBuckets[0]).toBe(firstBucketExpected); @@ -186,8 +199,9 @@ ex:Fragmentation a tree:TimebasedFragmentation ; const recordBuckets = orchestrator.bucketize( memberToRecord(members[i]), buckets, - new Map>(), + new Set(), new Map>(), + [], ); expect(recordBuckets.length).toBe(1); expect(recordBuckets[0]).toBe(firstBucketExpected); @@ -200,8 +214,9 @@ ex:Fragmentation a tree:TimebasedFragmentation ; const recordBuckets = orchestrator.bucketize( memberToRecord(members[i]), buckets, - new Map>(), + new Set(), new Map>(), + [], ); expect(recordBuckets.length).toBe(1); expect(recordBuckets[0]).toBe(secondBucketExpected); @@ -214,8 +229,9 @@ ex:Fragmentation a tree:TimebasedFragmentation ; const recordBuckets = orchestrator.bucketize( memberToRecord(members[i]), buckets, - new Map>(), + new Set(), new Map>(), + [], ); expect(recordBuckets.length).toBe(1); expect(recordBuckets[0]).toBe(thirdBucketExpected); @@ -242,8 +258,9 @@ ex:Fragmentation a tree:TimebasedFragmentation ; const recordBuckets = orchestrator.bucketize( memberToRecord(members[i]), buckets, - new Map>(), + new Set(), new Map>(), + [], ); expect(recordBuckets.length).toBe(1); expect(recordBuckets[0]).toBe(firstBucketExpected); @@ -264,8 +281,9 @@ ex:Fragmentation a tree:TimebasedFragmentation ; const recordBuckets = orchestrator2.bucketize( memberToRecord(members[i]), buckets, - new Map>(), + new Set(), new Map>(), + [], ); expect(recordBuckets.length).toBe(1); if (members[i].timestamp < new Date("2023-07-01T12:00:00.000Z")) { @@ -293,8 +311,9 @@ ex:Fragmentation a tree:TimebasedFragmentation ; const recordBuckets = orchestrator.bucketize( memberToRecord(members[i]), buckets, - new Map>(), + new Set(), new Map>(), + [], ); expect(recordBuckets.length).toBe(1); expect(recordBuckets[0]).toBe(firstBucketExpected); @@ -315,8 +334,9 @@ ex:Fragmentation a tree:TimebasedFragmentation ; const recordBuckets = orchestrator2.bucketize( memberToRecord(members[i]), buckets, - new Map>(), + new Set(), new Map>(), + [], ); expect(recordBuckets.length).toBe(1); expect(recordBuckets[0]).toBe(firstBucketExpected); @@ -338,8 +358,9 @@ ex:Fragmentation a tree:TimebasedFragmentation ; const recordBuckets = orchestrator.bucketize( memberToRecord(members[i]), buckets, - new Map>(), + new Set(), new Map>(), + [], ); expect(recordBuckets.length).toBe(1); expect(recordBuckets[0]).toBe(firstBucketExpected); @@ -351,8 +372,9 @@ ex:Fragmentation a tree:TimebasedFragmentation ; const recordBuckets = orchestrator.bucketize( memberToRecord(members[3]), buckets, - new Map>(), + new Set(), new Map>(), + [], ); expect(recordBuckets.length).toBe(1); expect(recordBuckets[0]).toBe(secondBucketExpected); @@ -374,8 +396,9 @@ ex:Fragmentation a tree:TimebasedFragmentation ; const recordBuckets = orchestrator.bucketize( memberToRecord(member), buckets, - new Map>(), + new Set(), new Map>(), + [], ); expect(recordBuckets.length).toBe(1); expect(recordBuckets[0]).toBe(firstBucketExpected); @@ -390,12 +413,13 @@ ex:Fragmentation a tree:TimebasedFragmentation ; const recordBuckets = orchestrator.bucketize( memberToRecord(fourthMember), buckets, - new Map>(), + new Set(), new Map>(), + [], ); expect(recordBuckets.length).toBe(1); expect(recordBuckets[0]).toBe(secondBucketExpected); - expect(buckets[secondBucketExpected].parent?.links.length).toBe(1); + expect(buckets[secondBucketExpected].parent!.links.length).toBe(1); }); test("bucketize with (k = 4, m = 100, s = 3600) should add to a first bucket with adjusted timespan for leap year", () => { @@ -411,8 +435,9 @@ ex:Fragmentation a tree:TimebasedFragmentation ; const recordBuckets = orchestrator.bucketize( memberToRecord(member), buckets, - new Map>(), + new Set(), new Map>(), + [], ); expect(recordBuckets.length).toBe(1); expect(recordBuckets[0]).toBe(firstBucketExpected); @@ -441,7 +466,7 @@ ex:Fragmentation a tree:TimebasedFragmentation ; const start = new Date("2024-07-23T01:00:00Z"); for (let i = 0; i < 26; i++) { const startAtDate = new Date(start.getTime() + i * 86400000); - const datesAtDate = []; + const datesAtDate: Date[] = []; for (let j = 0; j < 15; j++) { datesAtDate.push(new Date(startAtDate.getTime() + j * 5000)); } @@ -474,7 +499,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `ra${i + 1}`, - bucket: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, + bucket: `root/${encodeURIComponent(b0.toISOString())}_${ts( + b0, + b1, + )}_0`, }, ], ); @@ -515,14 +543,29 @@ ex:Fragmentation a tree:TimebasedFragmentation ; // Expected new page testOutput( output, - `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_1`, + `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_1`, [ `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, - `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts(b0_2_0, b0_2_1)}_0`, - `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts(b0_2_0_3, b0_2_0_4)}_0`, - `root/${encodeURIComponent(b0_2_0_3_2.toISOString())}_${ts(b0_2_0_3_2, b0_2_0_3_3)}_0`, - `root/${encodeURIComponent(b0_2_0_3_2_2.toISOString())}_${ts(b0_2_0_3_2_2, b0_2_0_3_2_3)}_0`, + `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts( + b0_2_0, + b0_2_1, + )}_0`, + `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts( + b0_2_0_3, + b0_2_0_4, + )}_0`, + `root/${encodeURIComponent(b0_2_0_3_2.toISOString())}_${ts( + b0_2_0_3_2, + b0_2_0_3_3, + )}_0`, + `root/${encodeURIComponent(b0_2_0_3_2_2.toISOString())}_${ts( + b0_2_0_3_2_2, + b0_2_0_3_2_3, + )}_0`, ], [ { id: "root", immutable: false, relations: 2 }, @@ -532,127 +575,202 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_0.toISOString())}_${ts(b0_0, b0_1)}_0`, + id: `root/${encodeURIComponent(b0_0.toISOString())}_${ts( + b0_0, + b0_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_1.toISOString())}_${ts(b0_1, b0_2)}_0`, + id: `root/${encodeURIComponent(b0_1.toISOString())}_${ts( + b0_1, + b0_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_3.toISOString())}_${ts(b0_3, b0_4)}_0`, + id: `root/${encodeURIComponent(b0_3.toISOString())}_${ts( + b0_3, + b0_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts(b0_2_0, b0_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts( + b0_2_0, + b0_2_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_2.toISOString())}_${ts(b0_2_2, b0_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_2.toISOString())}_${ts( + b0_2_2, + b0_2_3, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_3.toISOString())}_${ts(b0_2_3, b0_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_3.toISOString())}_${ts( + b0_2_3, + b0_2_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_0.toISOString())}_${ts(b0_2_0_0, b0_2_0_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0_0.toISOString())}_${ts( + b0_2_0_0, + b0_2_0_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_1.toISOString())}_${ts(b0_2_0_1, b0_2_0_2)}_0`, + id: `root/${encodeURIComponent(b0_2_0_1.toISOString())}_${ts( + b0_2_0_1, + b0_2_0_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_2.toISOString())}_${ts(b0_2_0_2, b0_2_0_3)}_0`, + id: `root/${encodeURIComponent(b0_2_0_2.toISOString())}_${ts( + b0_2_0_2, + b0_2_0_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts(b0_2_0_3, b0_2_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts( + b0_2_0_3, + b0_2_0_4, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3_0.toISOString())}_${ts(b0_2_0_3_0, b0_2_0_3_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_0.toISOString())}_${ts( + b0_2_0_3_0, + b0_2_0_3_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_1.toISOString())}_${ts(b0_2_0_3_1, b0_2_0_3_2)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_1.toISOString())}_${ts( + b0_2_0_3_1, + b0_2_0_3_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2.toISOString())}_${ts(b0_2_0_3_2, b0_2_0_3_3)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2.toISOString())}_${ts( + b0_2_0_3_2, + b0_2_0_3_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts(b0_2_0_3_3, b0_2_0_3_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts( + b0_2_0_3_3, + b0_2_0_3_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_0.toISOString())}_${ts(b0_2_0_3_2_0, b0_2_0_3_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_0.toISOString())}_${ts( + b0_2_0_3_2_0, + b0_2_0_3_2_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_1.toISOString())}_${ts(b0_2_0_3_2_1, b0_2_0_3_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_1.toISOString())}_${ts( + b0_2_0_3_2_1, + b0_2_0_3_2_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_2.toISOString())}_${ts(b0_2_0_3_2_2, b0_2_0_3_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_2.toISOString())}_${ts( + b0_2_0_3_2_2, + b0_2_0_3_2_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_3.toISOString())}_${ts(b0_2_0_3_2_3, b0_2_0_3_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_3.toISOString())}_${ts( + b0_2_0_3_2_3, + b0_2_0_3_2_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_2_0.toISOString())}_${ts(b0_2_0_3_2_2_0, b0_2_0_3_2_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_2_0.toISOString())}_${ts( + b0_2_0_3_2_2_0, + b0_2_0_3_2_2_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_2_1.toISOString())}_${ts(b0_2_0_3_2_2_1, b0_2_0_3_2_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_2_1.toISOString())}_${ts( + b0_2_0_3_2_2_1, + b0_2_0_3_2_2_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_2_2.toISOString())}_${ts(b0_2_0_3_2_2_2, b0_2_0_3_2_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_2_2.toISOString())}_${ts( + b0_2_0_3_2_2_2, + b0_2_0_3_2_2_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_0`, immutable: true, relations: 1, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_1`, + id: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_1`, immutable: false, relations: 0, }, @@ -660,47 +778,80 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "ra1", - bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_0`, }, { id: "ra2", - bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_0`, }, { id: "ra3", - bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_0`, }, { id: "ra4", - bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_0`, }, { id: "ra5", - bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_0`, }, { id: "ra6", - bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_0`, }, { id: "ra7", - bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_0`, }, { id: "ra8", - bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_0`, }, { id: "ra9", - bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_0`, }, { id: "ra10", - bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_0`, }, { id: "ra11", - bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_1`, + bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_1`, }, ], ); @@ -713,7 +864,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_1`, + `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_1`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -723,37 +877,58 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts(b0_2_0, b0_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts( + b0_2_0, + b0_2_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts(b0_2_0_3, b0_2_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts( + b0_2_0_3, + b0_2_0_4, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2.toISOString())}_${ts(b0_2_0_3_2, b0_2_0_3_3)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2.toISOString())}_${ts( + b0_2_0_3_2, + b0_2_0_3_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_2.toISOString())}_${ts(b0_2_0_3_2_2, b0_2_0_3_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_2.toISOString())}_${ts( + b0_2_0_3_2_2, + b0_2_0_3_2_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_0`, immutable: true, relations: 1, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_1`, + id: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_1`, immutable: false, relations: 0, }, @@ -761,7 +936,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `ra${i + 1}`, - bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_1`, + bucket: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_1`, }, ], ); @@ -774,7 +952,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts(b0_2_0_3_3, b0_2_0_3_4)}_0`, + `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts( + b0_2_0_3_3, + b0_2_0_3_4, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -784,82 +965,130 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts(b0_2_0, b0_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts( + b0_2_0, + b0_2_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts(b0_2_0_3, b0_2_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts( + b0_2_0_3, + b0_2_0_4, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3_0.toISOString())}_${ts(b0_2_0_3_0, b0_2_0_3_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_0.toISOString())}_${ts( + b0_2_0_3_0, + b0_2_0_3_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_1.toISOString())}_${ts(b0_2_0_3_1, b0_2_0_3_2)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_1.toISOString())}_${ts( + b0_2_0_3_1, + b0_2_0_3_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2.toISOString())}_${ts(b0_2_0_3_2, b0_2_0_3_3)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2.toISOString())}_${ts( + b0_2_0_3_2, + b0_2_0_3_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts(b0_2_0_3_3, b0_2_0_3_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts( + b0_2_0_3_3, + b0_2_0_3_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_0.toISOString())}_${ts(b0_2_0_3_2_0, b0_2_0_3_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_0.toISOString())}_${ts( + b0_2_0_3_2_0, + b0_2_0_3_2_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_1.toISOString())}_${ts(b0_2_0_3_2_1, b0_2_0_3_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_1.toISOString())}_${ts( + b0_2_0_3_2_1, + b0_2_0_3_2_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_2.toISOString())}_${ts(b0_2_0_3_2_2, b0_2_0_3_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_2.toISOString())}_${ts( + b0_2_0_3_2_2, + b0_2_0_3_2_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_3.toISOString())}_${ts(b0_2_0_3_2_3, b0_2_0_3_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_3.toISOString())}_${ts( + b0_2_0_3_2_3, + b0_2_0_3_2_4, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_2_0.toISOString())}_${ts(b0_2_0_3_2_2_0, b0_2_0_3_2_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_2_0.toISOString())}_${ts( + b0_2_0_3_2_2_0, + b0_2_0_3_2_2_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_2_1.toISOString())}_${ts(b0_2_0_3_2_2_1, b0_2_0_3_2_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_2_1.toISOString())}_${ts( + b0_2_0_3_2_2_1, + b0_2_0_3_2_2_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_2_2.toISOString())}_${ts(b0_2_0_3_2_2_2, b0_2_0_3_2_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_2_2.toISOString())}_${ts( + b0_2_0_3_2_2_2, + b0_2_0_3_2_2_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts(b0_2_0_3_2_2_3, b0_2_0_3_2_2_4)}_1`, + id: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( + b0_2_0_3_2_2_3, + b0_2_0_3_2_2_4, + )}_1`, immutable: true, relations: 0, }, @@ -867,7 +1096,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rb1", - bucket: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts(b0_2_0_3_3, b0_2_0_3_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts( + b0_2_0_3_3, + b0_2_0_3_4, + )}_0`, }, ], ); @@ -880,7 +1112,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts(b0_2_0_3_3, b0_2_0_3_4)}_0`, + `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts( + b0_2_0_3_3, + b0_2_0_3_4, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -890,22 +1125,34 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts(b0_2_0, b0_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts( + b0_2_0, + b0_2_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts(b0_2_0_3, b0_2_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts( + b0_2_0_3, + b0_2_0_4, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts(b0_2_0_3_3, b0_2_0_3_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts( + b0_2_0_3_3, + b0_2_0_3_4, + )}_0`, immutable: false, relations: 0, }, @@ -913,7 +1160,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `rb${i + 1}`, - bucket: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts(b0_2_0_3_3, b0_2_0_3_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts( + b0_2_0_3_3, + b0_2_0_3_4, + )}_0`, }, ], ); @@ -944,10 +1194,19 @@ ex:Fragmentation a tree:TimebasedFragmentation ; // Expected new page testOutput( output, - `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_1`, + `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_1`, [ - `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts(b0_2_0_3_3, b0_2_0_3_4)}_0`, - `root/${encodeURIComponent(b0_2_0_3_3_1.toISOString())}_${ts(b0_2_0_3_3_1, b0_2_0_3_3_2)}_0`, + `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts( + b0_2_0_3_3, + b0_2_0_3_4, + )}_0`, + `root/${encodeURIComponent(b0_2_0_3_3_1.toISOString())}_${ts( + b0_2_0_3_3_1, + b0_2_0_3_3_2, + )}_0`, ], [ { id: "root", immutable: false, relations: 2 }, @@ -957,67 +1216,106 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts(b0_2_0, b0_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts( + b0_2_0, + b0_2_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts(b0_2_0_3, b0_2_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts( + b0_2_0_3, + b0_2_0_4, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts(b0_2_0_3_3, b0_2_0_3_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts( + b0_2_0_3_3, + b0_2_0_3_4, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_0.toISOString())}_${ts(b0_2_0_3_3_0, b0_2_0_3_3_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_0.toISOString())}_${ts( + b0_2_0_3_3_0, + b0_2_0_3_3_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_1.toISOString())}_${ts(b0_2_0_3_3_1, b0_2_0_3_3_2)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_1.toISOString())}_${ts( + b0_2_0_3_3_1, + b0_2_0_3_3_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_2.toISOString())}_${ts(b0_2_0_3_3_2, b0_2_0_3_3_3)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_2.toISOString())}_${ts( + b0_2_0_3_3_2, + b0_2_0_3_3_3, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_3.toISOString())}_${ts(b0_2_0_3_3_3, b0_2_0_3_3_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_3.toISOString())}_${ts( + b0_2_0_3_3_3, + b0_2_0_3_3_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_1_0.toISOString())}_${ts(b0_2_0_3_3_1_0, b0_2_0_3_3_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_1_0.toISOString())}_${ts( + b0_2_0_3_3_1_0, + b0_2_0_3_3_1_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_1_1.toISOString())}_${ts(b0_2_0_3_3_1_1, b0_2_0_3_3_1_2)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_1_1.toISOString())}_${ts( + b0_2_0_3_3_1_1, + b0_2_0_3_3_1_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_0`, immutable: true, relations: 1, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_1`, + id: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_1`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_1_3.toISOString())}_${ts(b0_2_0_3_3_1_3, b0_2_0_3_3_1_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_1_3.toISOString())}_${ts( + b0_2_0_3_3_1_3, + b0_2_0_3_3_1_4, + )}_0`, immutable: false, relations: 0, }, @@ -1025,47 +1323,80 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rb1", - bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_0`, }, { id: "rb2", - bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_0`, }, { id: "rb3", - bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_0`, }, { id: "rb4", - bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_0`, }, { id: "rb5", - bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_0`, }, { id: "rb6", - bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_0`, }, { id: "rb7", - bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_0`, }, { id: "rb8", - bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_0`, }, { id: "rb9", - bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_0`, }, { id: "rb10", - bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_0`, }, { id: "rb11", - bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_1`, + bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_1`, }, ], ); @@ -1078,7 +1409,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_1`, + `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_1`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -1088,37 +1422,58 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts(b0_2_0, b0_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts( + b0_2_0, + b0_2_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts(b0_2_0_3, b0_2_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts( + b0_2_0_3, + b0_2_0_4, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts(b0_2_0_3_3, b0_2_0_3_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts( + b0_2_0_3_3, + b0_2_0_3_4, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_1.toISOString())}_${ts(b0_2_0_3_3_1, b0_2_0_3_3_2)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_1.toISOString())}_${ts( + b0_2_0_3_3_1, + b0_2_0_3_3_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_0`, immutable: true, relations: 1, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_1`, + id: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_1`, immutable: false, relations: 0, }, @@ -1126,7 +1481,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `rb${i + 1}`, - bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_1`, + bucket: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_1`, }, ], ); @@ -1139,7 +1497,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -1149,112 +1510,178 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts(b0_2_0, b0_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts( + b0_2_0, + b0_2_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_2.toISOString())}_${ts(b0_2_2, b0_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_2.toISOString())}_${ts( + b0_2_2, + b0_2_3, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_3.toISOString())}_${ts(b0_2_3, b0_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_3.toISOString())}_${ts( + b0_2_3, + b0_2_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_0.toISOString())}_${ts(b0_2_0_0, b0_2_0_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0_0.toISOString())}_${ts( + b0_2_0_0, + b0_2_0_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_1.toISOString())}_${ts(b0_2_0_1, b0_2_0_2)}_0`, + id: `root/${encodeURIComponent(b0_2_0_1.toISOString())}_${ts( + b0_2_0_1, + b0_2_0_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_2.toISOString())}_${ts(b0_2_0_2, b0_2_0_3)}_0`, + id: `root/${encodeURIComponent(b0_2_0_2.toISOString())}_${ts( + b0_2_0_2, + b0_2_0_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts(b0_2_0_3, b0_2_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts( + b0_2_0_3, + b0_2_0_4, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_0.toISOString())}_${ts(b0_2_0_3_0, b0_2_0_3_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_0.toISOString())}_${ts( + b0_2_0_3_0, + b0_2_0_3_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_1.toISOString())}_${ts(b0_2_0_3_1, b0_2_0_3_2)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_1.toISOString())}_${ts( + b0_2_0_3_1, + b0_2_0_3_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_2.toISOString())}_${ts(b0_2_0_3_2, b0_2_0_3_3)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_2.toISOString())}_${ts( + b0_2_0_3_2, + b0_2_0_3_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts(b0_2_0_3_3, b0_2_0_3_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts( + b0_2_0_3_3, + b0_2_0_3_4, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_0.toISOString())}_${ts(b0_2_0_3_3_0, b0_2_0_3_3_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_0.toISOString())}_${ts( + b0_2_0_3_3_0, + b0_2_0_3_3_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_1.toISOString())}_${ts(b0_2_0_3_3_1, b0_2_0_3_3_2)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_1.toISOString())}_${ts( + b0_2_0_3_3_1, + b0_2_0_3_3_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_2.toISOString())}_${ts(b0_2_0_3_3_2, b0_2_0_3_3_3)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_2.toISOString())}_${ts( + b0_2_0_3_3_2, + b0_2_0_3_3_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_3.toISOString())}_${ts(b0_2_0_3_3_3, b0_2_0_3_3_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_3.toISOString())}_${ts( + b0_2_0_3_3_3, + b0_2_0_3_3_4, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_1_0.toISOString())}_${ts(b0_2_0_3_3_1_0, b0_2_0_3_3_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_1_0.toISOString())}_${ts( + b0_2_0_3_3_1_0, + b0_2_0_3_3_1_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_1_1.toISOString())}_${ts(b0_2_0_3_3_1_1, b0_2_0_3_3_1_2)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_1_1.toISOString())}_${ts( + b0_2_0_3_3_1_1, + b0_2_0_3_3_1_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts(b0_2_0_3_3_1_2, b0_2_0_3_3_1_3)}_1`, + id: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( + b0_2_0_3_3_1_2, + b0_2_0_3_3_1_3, + )}_1`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_0_3_3_1_3.toISOString())}_${ts(b0_2_0_3_3_1_3, b0_2_0_3_3_1_4)}_0`, + id: `root/${encodeURIComponent(b0_2_0_3_3_1_3.toISOString())}_${ts( + b0_2_0_3_3_1_3, + b0_2_0_3_3_1_4, + )}_0`, immutable: true, relations: 0, }, @@ -1262,7 +1689,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rc1", - bucket: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, }, ], ); @@ -1275,7 +1705,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -1285,12 +1718,18 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 0, }, @@ -1298,7 +1737,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `rc${i + 1}`, - bucket: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, }, ], ); @@ -1333,12 +1775,27 @@ ex:Fragmentation a tree:TimebasedFragmentation ; // Expected new page testOutput( output, - `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_1`, + `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_1`, [ - `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, - `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts(b0_2_1_0, b0_2_1_1)}_0`, - `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts(b0_2_1_0_0, b0_2_1_0_1)}_0`, - `root/${encodeURIComponent(b0_2_1_0_0_0.toISOString())}_${ts(b0_2_1_0_0_0, b0_2_1_0_0_1)}_0`, + `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, + `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( + b0_2_1_0, + b0_2_1_1, + )}_0`, + `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts( + b0_2_1_0_0, + b0_2_1_0_1, + )}_0`, + `root/${encodeURIComponent(b0_2_1_0_0_0.toISOString())}_${ts( + b0_2_1_0_0_0, + b0_2_1_0_0_1, + )}_0`, ], [ { id: "root", immutable: false, relations: 2 }, @@ -1348,97 +1805,154 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts(b0_2_1_0, b0_2_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( + b0_2_1_0, + b0_2_1_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts(b0_2_1_0_0, b0_2_1_0_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts( + b0_2_1_0_0, + b0_2_1_0_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts(b0_2_1_0_1, b0_2_1_0_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts( + b0_2_1_0_1, + b0_2_1_0_2, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts(b0_2_1_0_2, b0_2_1_0_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts( + b0_2_1_0_2, + b0_2_1_0_3, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_3.toISOString())}_${ts(b0_2_1_0_3, b0_2_1_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_3.toISOString())}_${ts( + b0_2_1_0_3, + b0_2_1_0_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_0.toISOString())}_${ts(b0_2_1_0_0_0, b0_2_1_0_0_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_0.toISOString())}_${ts( + b0_2_1_0_0_0, + b0_2_1_0_0_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_1.toISOString())}_${ts(b0_2_1_0_0_1, b0_2_1_0_0_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_1, + b0_2_1_0_0_2, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_2.toISOString())}_${ts(b0_2_1_0_0_2, b0_2_1_0_0_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_2.toISOString())}_${ts( + b0_2_1_0_0_2, + b0_2_1_0_0_3, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_3.toISOString())}_${ts(b0_2_1_0_0_3, b0_2_1_0_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_3.toISOString())}_${ts( + b0_2_1_0_0_3, + b0_2_1_0_0_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_0_0.toISOString())}_${ts(b0_2_1_0_0_0_0, b0_2_1_0_0_0_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_0_0.toISOString())}_${ts( + b0_2_1_0_0_0_0, + b0_2_1_0_0_0_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_0`, immutable: true, relations: 1, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_1`, + id: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_1`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_0_2.toISOString())}_${ts(b0_2_1_0_0_0_2, b0_2_1_0_0_0_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_0_2.toISOString())}_${ts( + b0_2_1_0_0_0_2, + b0_2_1_0_0_0_3, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_0_3.toISOString())}_${ts(b0_2_1_0_0_0_3, b0_2_1_0_0_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_0_3.toISOString())}_${ts( + b0_2_1_0_0_0_3, + b0_2_1_0_0_0_4, + )}_0`, immutable: false, relations: 0, }, @@ -1446,47 +1960,80 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rc1", - bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_0`, }, { id: "rc2", - bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_0`, }, { id: "rc3", - bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_0`, }, { id: "rc4", - bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_0`, }, { id: "rc5", - bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_0`, }, { id: "rc6", - bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_0`, }, { id: "rc7", - bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_0`, }, { id: "rc8", - bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_0`, }, { id: "rc9", - bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_0`, }, { id: "rc10", - bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_0`, }, { id: "rc11", - bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_1`, + bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_1`, }, ], ); @@ -1499,7 +2046,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_1`, + `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_1`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -1509,37 +2059,58 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts(b0_2_1_0, b0_2_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( + b0_2_1_0, + b0_2_1_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts(b0_2_1_0_0, b0_2_1_0_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts( + b0_2_1_0_0, + b0_2_1_0_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_0.toISOString())}_${ts(b0_2_1_0_0_0, b0_2_1_0_0_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_0.toISOString())}_${ts( + b0_2_1_0_0_0, + b0_2_1_0_0_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_0`, immutable: true, relations: 1, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_1`, + id: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_1`, immutable: false, relations: 0, }, @@ -1547,7 +2118,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `rc${i + 1}`, - bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_1`, + bucket: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_1`, }, ], ); @@ -1560,7 +2134,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_0_0_3.toISOString())}_${ts(b0_2_1_0_0_3, b0_2_1_0_0_4)}_0`, + `root/${encodeURIComponent(b0_2_1_0_0_3.toISOString())}_${ts( + b0_2_1_0_0_3, + b0_2_1_0_0_4, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -1570,67 +2147,106 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts(b0_2_1_0, b0_2_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( + b0_2_1_0, + b0_2_1_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts(b0_2_1_0_0, b0_2_1_0_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts( + b0_2_1_0_0, + b0_2_1_0_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_0.toISOString())}_${ts(b0_2_1_0_0_0, b0_2_1_0_0_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_0.toISOString())}_${ts( + b0_2_1_0_0_0, + b0_2_1_0_0_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_1.toISOString())}_${ts(b0_2_1_0_0_1, b0_2_1_0_0_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_1, + b0_2_1_0_0_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_2.toISOString())}_${ts(b0_2_1_0_0_2, b0_2_1_0_0_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_2.toISOString())}_${ts( + b0_2_1_0_0_2, + b0_2_1_0_0_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_3.toISOString())}_${ts(b0_2_1_0_0_3, b0_2_1_0_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_3.toISOString())}_${ts( + b0_2_1_0_0_3, + b0_2_1_0_0_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_0_0.toISOString())}_${ts(b0_2_1_0_0_0_0, b0_2_1_0_0_0_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_0_0.toISOString())}_${ts( + b0_2_1_0_0_0_0, + b0_2_1_0_0_0_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts(b0_2_1_0_0_0_1, b0_2_1_0_0_0_2)}_1`, + id: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_0_1, + b0_2_1_0_0_0_2, + )}_1`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_0_2.toISOString())}_${ts(b0_2_1_0_0_0_2, b0_2_1_0_0_0_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_0_2.toISOString())}_${ts( + b0_2_1_0_0_0_2, + b0_2_1_0_0_0_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_0_3.toISOString())}_${ts(b0_2_1_0_0_0_3, b0_2_1_0_0_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_0_3.toISOString())}_${ts( + b0_2_1_0_0_0_3, + b0_2_1_0_0_0_4, + )}_0`, immutable: true, relations: 0, }, @@ -1638,7 +2254,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rd1", - bucket: `root/${encodeURIComponent(b0_2_1_0_0_3.toISOString())}_${ts(b0_2_1_0_0_3, b0_2_1_0_0_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_0_3.toISOString())}_${ts( + b0_2_1_0_0_3, + b0_2_1_0_0_4, + )}_0`, }, ], ); @@ -1651,7 +2270,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_0_0_3.toISOString())}_${ts(b0_2_1_0_0_3, b0_2_1_0_0_4)}_0`, + `root/${encodeURIComponent(b0_2_1_0_0_3.toISOString())}_${ts( + b0_2_1_0_0_3, + b0_2_1_0_0_4, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -1661,27 +2283,42 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts(b0_2_1_0, b0_2_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( + b0_2_1_0, + b0_2_1_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts(b0_2_1_0_0, b0_2_1_0_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts( + b0_2_1_0_0, + b0_2_1_0_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_3.toISOString())}_${ts(b0_2_1_0_0_3, b0_2_1_0_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_3.toISOString())}_${ts( + b0_2_1_0_0_3, + b0_2_1_0_0_4, + )}_0`, immutable: false, relations: 0, }, @@ -1689,7 +2326,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `rd${i + 1}`, - bucket: `root/${encodeURIComponent(b0_2_1_0_0_3.toISOString())}_${ts(b0_2_1_0_0_3, b0_2_1_0_0_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_0_3.toISOString())}_${ts( + b0_2_1_0_0_3, + b0_2_1_0_0_4, + )}_0`, }, ], ); @@ -1704,7 +2344,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts(b0_2_1_0_1, b0_2_1_0_2)}_0`, + `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts( + b0_2_1_0_1, + b0_2_1_0_2, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -1714,57 +2357,90 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts(b0_2_1_0, b0_2_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( + b0_2_1_0, + b0_2_1_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts(b0_2_1_0_0, b0_2_1_0_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts( + b0_2_1_0_0, + b0_2_1_0_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts(b0_2_1_0_1, b0_2_1_0_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts( + b0_2_1_0_1, + b0_2_1_0_2, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts(b0_2_1_0_2, b0_2_1_0_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts( + b0_2_1_0_2, + b0_2_1_0_3, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_3.toISOString())}_${ts(b0_2_1_0_3, b0_2_1_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_3.toISOString())}_${ts( + b0_2_1_0_3, + b0_2_1_0_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_0.toISOString())}_${ts(b0_2_1_0_0_0, b0_2_1_0_0_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_0.toISOString())}_${ts( + b0_2_1_0_0_0, + b0_2_1_0_0_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_1.toISOString())}_${ts(b0_2_1_0_0_1, b0_2_1_0_0_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_1.toISOString())}_${ts( + b0_2_1_0_0_1, + b0_2_1_0_0_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_2.toISOString())}_${ts(b0_2_1_0_0_2, b0_2_1_0_0_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_2.toISOString())}_${ts( + b0_2_1_0_0_2, + b0_2_1_0_0_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0_3.toISOString())}_${ts(b0_2_1_0_0_3, b0_2_1_0_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0_3.toISOString())}_${ts( + b0_2_1_0_0_3, + b0_2_1_0_0_4, + )}_0`, immutable: true, relations: 0, }, @@ -1772,7 +2448,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "re1", - bucket: `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts(b0_2_1_0_1, b0_2_1_0_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts( + b0_2_1_0_1, + b0_2_1_0_2, + )}_0`, }, ], ); @@ -1785,7 +2464,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts(b0_2_1_0_1, b0_2_1_0_2)}_0`, + `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts( + b0_2_1_0_1, + b0_2_1_0_2, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -1795,22 +2477,34 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts(b0_2_1_0, b0_2_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( + b0_2_1_0, + b0_2_1_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts(b0_2_1_0_1, b0_2_1_0_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts( + b0_2_1_0_1, + b0_2_1_0_2, + )}_0`, immutable: false, relations: 0, }, @@ -1818,7 +2512,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `re${i + 1}`, - bucket: `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts(b0_2_1_0_1, b0_2_1_0_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts( + b0_2_1_0_1, + b0_2_1_0_2, + )}_0`, }, ], ); @@ -1833,7 +2530,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts(b0_2_1_0_2, b0_2_1_0_3)}_0`, + `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts( + b0_2_1_0_2, + b0_2_1_0_3, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -1843,37 +2543,58 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts(b0_2_1_0, b0_2_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( + b0_2_1_0, + b0_2_1_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts(b0_2_1_0_0, b0_2_1_0_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts( + b0_2_1_0_0, + b0_2_1_0_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts(b0_2_1_0_1, b0_2_1_0_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts( + b0_2_1_0_1, + b0_2_1_0_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts(b0_2_1_0_2, b0_2_1_0_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts( + b0_2_1_0_2, + b0_2_1_0_3, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_3.toISOString())}_${ts(b0_2_1_0_3, b0_2_1_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_3.toISOString())}_${ts( + b0_2_1_0_3, + b0_2_1_0_4, + )}_0`, immutable: false, relations: 0, }, @@ -1881,7 +2602,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rf1", - bucket: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts(b0_2_1_0_2, b0_2_1_0_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts( + b0_2_1_0_2, + b0_2_1_0_3, + )}_0`, }, ], ); @@ -1894,7 +2618,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts(b0_2_1_0_2, b0_2_1_0_3)}_0`, + `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts( + b0_2_1_0_2, + b0_2_1_0_3, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -1904,22 +2631,34 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts(b0_2_1_0, b0_2_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( + b0_2_1_0, + b0_2_1_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts(b0_2_1_0_2, b0_2_1_0_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts( + b0_2_1_0_2, + b0_2_1_0_3, + )}_0`, immutable: false, relations: 0, }, @@ -1927,7 +2666,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `rf${i + 1}`, - bucket: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts(b0_2_1_0_2, b0_2_1_0_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts( + b0_2_1_0_2, + b0_2_1_0_3, + )}_0`, }, ], ); @@ -1952,9 +2694,15 @@ ex:Fragmentation a tree:TimebasedFragmentation ; testOutput( output, - `root/${encodeURIComponent(b0_2_1_0_2_3.toISOString())}_${ts(b0_2_1_0_2_3, b0_2_1_0_2_4)}_0`, + `root/${encodeURIComponent(b0_2_1_0_2_3.toISOString())}_${ts( + b0_2_1_0_2_3, + b0_2_1_0_2_4, + )}_0`, [ - `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts(b0_2_1_0_2, b0_2_1_0_3)}_0`, + `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts( + b0_2_1_0_2, + b0_2_1_0_3, + )}_0`, ], [ { id: "root", immutable: false, relations: 2 }, @@ -1964,42 +2712,66 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts(b0_2_1_0, b0_2_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( + b0_2_1_0, + b0_2_1_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts(b0_2_1_0_2, b0_2_1_0_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts( + b0_2_1_0_2, + b0_2_1_0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts(b0_2_1_0_2_0, b0_2_1_0_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts( + b0_2_1_0_2_0, + b0_2_1_0_2_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_2_1.toISOString())}_${ts(b0_2_1_0_2_1, b0_2_1_0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_2_1.toISOString())}_${ts( + b0_2_1_0_2_1, + b0_2_1_0_2_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_2_2.toISOString())}_${ts(b0_2_1_0_2_2, b0_2_1_0_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_2_2.toISOString())}_${ts( + b0_2_1_0_2_2, + b0_2_1_0_2_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_2_3.toISOString())}_${ts(b0_2_1_0_2_3, b0_2_1_0_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_2_3.toISOString())}_${ts( + b0_2_1_0_2_3, + b0_2_1_0_2_4, + )}_0`, immutable: false, relations: 0, }, @@ -2007,47 +2779,80 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rf1", - bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts(b0_2_1_0_2_0, b0_2_1_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts( + b0_2_1_0_2_0, + b0_2_1_0_2_1, + )}_0`, }, { id: "rf2", - bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts(b0_2_1_0_2_0, b0_2_1_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts( + b0_2_1_0_2_0, + b0_2_1_0_2_1, + )}_0`, }, { id: "rf3", - bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts(b0_2_1_0_2_0, b0_2_1_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts( + b0_2_1_0_2_0, + b0_2_1_0_2_1, + )}_0`, }, { id: "rf4", - bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts(b0_2_1_0_2_0, b0_2_1_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts( + b0_2_1_0_2_0, + b0_2_1_0_2_1, + )}_0`, }, { id: "rf5", - bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts(b0_2_1_0_2_0, b0_2_1_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts( + b0_2_1_0_2_0, + b0_2_1_0_2_1, + )}_0`, }, { id: "rf6", - bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts(b0_2_1_0_2_0, b0_2_1_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts( + b0_2_1_0_2_0, + b0_2_1_0_2_1, + )}_0`, }, { id: "rf7", - bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts(b0_2_1_0_2_0, b0_2_1_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts( + b0_2_1_0_2_0, + b0_2_1_0_2_1, + )}_0`, }, { id: "rf8", - bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts(b0_2_1_0_2_0, b0_2_1_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts( + b0_2_1_0_2_0, + b0_2_1_0_2_1, + )}_0`, }, { id: "rf9", - bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts(b0_2_1_0_2_0, b0_2_1_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts( + b0_2_1_0_2_0, + b0_2_1_0_2_1, + )}_0`, }, { id: "rf10", - bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts(b0_2_1_0_2_0, b0_2_1_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts( + b0_2_1_0_2_0, + b0_2_1_0_2_1, + )}_0`, }, { id: "rg1", - bucket: `root/${encodeURIComponent(b0_2_1_0_2_3.toISOString())}_${ts(b0_2_1_0_2_3, b0_2_1_0_2_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_2_3.toISOString())}_${ts( + b0_2_1_0_2_3, + b0_2_1_0_2_4, + )}_0`, }, ], ); @@ -2060,7 +2865,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_0_2_3.toISOString())}_${ts(b0_2_1_0_2_3, b0_2_1_0_2_4)}_0`, + `root/${encodeURIComponent(b0_2_1_0_2_3.toISOString())}_${ts( + b0_2_1_0_2_3, + b0_2_1_0_2_4, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -2070,27 +2878,42 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts(b0_2_1_0, b0_2_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( + b0_2_1_0, + b0_2_1_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts(b0_2_1_0_2, b0_2_1_0_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts( + b0_2_1_0_2, + b0_2_1_0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0_2_3.toISOString())}_${ts(b0_2_1_0_2_3, b0_2_1_0_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_2_3.toISOString())}_${ts( + b0_2_1_0_2_3, + b0_2_1_0_2_4, + )}_0`, immutable: false, relations: 0, }, @@ -2098,7 +2921,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `rg${i + 1}`, - bucket: `root/${encodeURIComponent(b0_2_1_0_2_3.toISOString())}_${ts(b0_2_1_0_2_3, b0_2_1_0_2_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_0_2_3.toISOString())}_${ts( + b0_2_1_0_2_3, + b0_2_1_0_2_4, + )}_0`, }, ], ); @@ -2115,7 +2941,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -2125,72 +2954,114 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts(b0_2_1_0, b0_2_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( + b0_2_1_0, + b0_2_1_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts(b0_2_1_0_0, b0_2_1_0_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts( + b0_2_1_0_0, + b0_2_1_0_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts(b0_2_1_0_1, b0_2_1_0_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts( + b0_2_1_0_1, + b0_2_1_0_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts(b0_2_1_0_2, b0_2_1_0_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts( + b0_2_1_0_2, + b0_2_1_0_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_3.toISOString())}_${ts(b0_2_1_0_3, b0_2_1_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_3.toISOString())}_${ts( + b0_2_1_0_3, + b0_2_1_0_4, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts(b0_2_1_0_2_0, b0_2_1_0_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_2_0.toISOString())}_${ts( + b0_2_1_0_2_0, + b0_2_1_0_2_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_2_1.toISOString())}_${ts(b0_2_1_0_2_1, b0_2_1_0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_2_1.toISOString())}_${ts( + b0_2_1_0_2_1, + b0_2_1_0_2_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_2_2.toISOString())}_${ts(b0_2_1_0_2_2, b0_2_1_0_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_2_2.toISOString())}_${ts( + b0_2_1_0_2_2, + b0_2_1_0_2_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0_2_3.toISOString())}_${ts(b0_2_1_0_2_3, b0_2_1_0_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0_2_3.toISOString())}_${ts( + b0_2_1_0_2_3, + b0_2_1_0_2_4, + )}_0`, immutable: true, relations: 0, }, @@ -2198,7 +3069,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rh1", - bucket: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, }, ], ); @@ -2211,7 +3085,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -2221,17 +3098,26 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, immutable: false, relations: 0, }, @@ -2239,7 +3125,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `rh${i + 1}`, - bucket: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, }, ], ); @@ -2252,7 +3141,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -2262,17 +3154,26 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, immutable: false, relations: 0, }, @@ -2280,7 +3181,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "ri1", - bucket: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, }, ], ); @@ -2292,7 +3196,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -2302,17 +3209,26 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, immutable: false, relations: 0, }, @@ -2320,7 +3236,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rj1", - bucket: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, }, ], ); @@ -2332,7 +3251,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -2342,17 +3264,26 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, immutable: false, relations: 0, }, @@ -2360,7 +3291,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rk1", - bucket: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, }, ], ); @@ -2372,7 +3306,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -2382,17 +3319,26 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, immutable: false, relations: 0, }, @@ -2400,7 +3346,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rl1", - bucket: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, }, ], ); @@ -2412,7 +3361,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -2422,17 +3374,26 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, immutable: false, relations: 0, }, @@ -2440,7 +3401,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rm1", - bucket: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, }, ], ); @@ -2452,7 +3416,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -2462,32 +3429,50 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts(b0_2_1_0, b0_2_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( + b0_2_1_0, + b0_2_1_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, immutable: false, relations: 0, }, @@ -2495,7 +3480,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rn1", - bucket: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, }, ], ); @@ -2508,7 +3496,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -2518,17 +3509,26 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, immutable: false, relations: 0, }, @@ -2536,7 +3536,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `rn${i + 1}`, - bucket: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, }, ], ); @@ -2568,11 +3571,23 @@ ex:Fragmentation a tree:TimebasedFragmentation ; testOutput( output, - `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_1`, + `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_1`, [ - `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, - `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts(b0_2_1_2_0, b0_2_1_2_1)}_0`, - `root/${encodeURIComponent(b0_2_1_2_0_2.toISOString())}_${ts(b0_2_1_2_0_2, b0_2_1_2_0_3)}_0`, + `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, + `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts( + b0_2_1_2_0, + b0_2_1_2_1, + )}_0`, + `root/${encodeURIComponent(b0_2_1_2_0_2.toISOString())}_${ts( + b0_2_1_2_0_2, + b0_2_1_2_0_3, + )}_0`, ], [ { id: "root", immutable: false, relations: 2 }, @@ -2582,82 +3597,130 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts(b0_2_1_2_0, b0_2_1_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts( + b0_2_1_2_0, + b0_2_1_2_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts(b0_2_1_2_1, b0_2_1_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts( + b0_2_1_2_1, + b0_2_1_2_2, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts(b0_2_1_2_2, b0_2_1_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts( + b0_2_1_2_2, + b0_2_1_2_3, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts(b0_2_1_2_3, b0_2_1_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts( + b0_2_1_2_3, + b0_2_1_2_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_0.toISOString())}_${ts(b0_2_1_2_0_0, b0_2_1_2_0_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_0.toISOString())}_${ts( + b0_2_1_2_0_0, + b0_2_1_2_0_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_1.toISOString())}_${ts(b0_2_1_2_0_1, b0_2_1_2_0_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_1.toISOString())}_${ts( + b0_2_1_2_0_1, + b0_2_1_2_0_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_2.toISOString())}_${ts(b0_2_1_2_0_2, b0_2_1_2_0_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_2.toISOString())}_${ts( + b0_2_1_2_0_2, + b0_2_1_2_0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_3.toISOString())}_${ts(b0_2_1_2_0_3, b0_2_1_2_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_3.toISOString())}_${ts( + b0_2_1_2_0_3, + b0_2_1_2_0_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_0`, immutable: true, relations: 1, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_1`, + id: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_1`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_2_1.toISOString())}_${ts(b0_2_1_2_0_2_1, b0_2_1_2_0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_2_1.toISOString())}_${ts( + b0_2_1_2_0_2_1, + b0_2_1_2_0_2_2, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_2_2.toISOString())}_${ts(b0_2_1_2_0_2_2, b0_2_1_2_0_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_2_2.toISOString())}_${ts( + b0_2_1_2_0_2_2, + b0_2_1_2_0_2_3, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_2_3.toISOString())}_${ts(b0_2_1_2_0_2_3, b0_2_1_2_0_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_2_3.toISOString())}_${ts( + b0_2_1_2_0_2_3, + b0_2_1_2_0_2_4, + )}_0`, immutable: false, relations: 0, }, @@ -2665,47 +3728,80 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rn1", - bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_0`, }, { id: "rn2", - bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_0`, }, { id: "rn3", - bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_0`, }, { id: "rn4", - bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_0`, }, { id: "rn5", - bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_0`, }, { id: "rn6", - bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_0`, }, { id: "rn7", - bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_0`, }, { id: "rn8", - bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_0`, }, { id: "rn9", - bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_0`, }, { id: "rn10", - bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_0`, }, { id: "rn11", - bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_1`, + bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_1`, }, ], ); @@ -2718,7 +3814,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_1`, + `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_1`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -2728,37 +3827,58 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts(b0_2_1_2_0, b0_2_1_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts( + b0_2_1_2_0, + b0_2_1_2_1, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_2.toISOString())}_${ts(b0_2_1_2_0_2, b0_2_1_2_0_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_2.toISOString())}_${ts( + b0_2_1_2_0_2, + b0_2_1_2_0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_0`, immutable: true, relations: 1, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_1`, + id: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_1`, immutable: false, relations: 0, }, @@ -2766,7 +3886,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `rn${i + 11}`, - bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_1`, + bucket: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_1`, }, ], ); @@ -2779,7 +3902,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts(b0_2_1_2_1, b0_2_1_2_2)}_0`, + `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts( + b0_2_1_2_1, + b0_2_1_2_2, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -2789,82 +3915,130 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts(b0_2_1_2_0, b0_2_1_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts( + b0_2_1_2_0, + b0_2_1_2_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts(b0_2_1_2_1, b0_2_1_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts( + b0_2_1_2_1, + b0_2_1_2_2, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts(b0_2_1_2_2, b0_2_1_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts( + b0_2_1_2_2, + b0_2_1_2_3, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts(b0_2_1_2_3, b0_2_1_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts( + b0_2_1_2_3, + b0_2_1_2_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_0.toISOString())}_${ts(b0_2_1_2_0_0, b0_2_1_2_0_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_0.toISOString())}_${ts( + b0_2_1_2_0_0, + b0_2_1_2_0_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_1.toISOString())}_${ts(b0_2_1_2_0_1, b0_2_1_2_0_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_1.toISOString())}_${ts( + b0_2_1_2_0_1, + b0_2_1_2_0_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_2.toISOString())}_${ts(b0_2_1_2_0_2, b0_2_1_2_0_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_2.toISOString())}_${ts( + b0_2_1_2_0_2, + b0_2_1_2_0_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_3.toISOString())}_${ts(b0_2_1_2_0_3, b0_2_1_2_0_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_3.toISOString())}_${ts( + b0_2_1_2_0_3, + b0_2_1_2_0_4, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts(b0_2_1_2_0_2_0, b0_2_1_2_0_2_1)}_1`, + id: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( + b0_2_1_2_0_2_0, + b0_2_1_2_0_2_1, + )}_1`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_2_1.toISOString())}_${ts(b0_2_1_2_0_2_1, b0_2_1_2_0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_2_1.toISOString())}_${ts( + b0_2_1_2_0_2_1, + b0_2_1_2_0_2_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_2_2.toISOString())}_${ts(b0_2_1_2_0_2_2, b0_2_1_2_0_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_2_2.toISOString())}_${ts( + b0_2_1_2_0_2_2, + b0_2_1_2_0_2_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0_2_3.toISOString())}_${ts(b0_2_1_2_0_2_3, b0_2_1_2_0_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0_2_3.toISOString())}_${ts( + b0_2_1_2_0_2_3, + b0_2_1_2_0_2_4, + )}_0`, immutable: true, relations: 0, }, @@ -2872,7 +4046,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "ro1", - bucket: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts(b0_2_1_2_1, b0_2_1_2_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts( + b0_2_1_2_1, + b0_2_1_2_2, + )}_0`, }, ], ); @@ -2885,7 +4062,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts(b0_2_1_2_1, b0_2_1_2_2)}_0`, + `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts( + b0_2_1_2_1, + b0_2_1_2_2, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -2895,22 +4075,34 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts(b0_2_1_2_1, b0_2_1_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts( + b0_2_1_2_1, + b0_2_1_2_2, + )}_0`, immutable: false, relations: 0, }, @@ -2918,7 +4110,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `ro${i + 1}`, - bucket: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts(b0_2_1_2_1, b0_2_1_2_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts( + b0_2_1_2_1, + b0_2_1_2_2, + )}_0`, }, ], ); @@ -2943,9 +4138,15 @@ ex:Fragmentation a tree:TimebasedFragmentation ; testOutput( output, - `root/${encodeURIComponent(b0_2_1_2_1_3.toISOString())}_${ts(b0_2_1_2_1_3, b0_2_1_2_1_4)}_0`, + `root/${encodeURIComponent(b0_2_1_2_1_3.toISOString())}_${ts( + b0_2_1_2_1_3, + b0_2_1_2_1_4, + )}_0`, [ - `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts(b0_2_1_2_1, b0_2_1_2_2)}_0`, + `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts( + b0_2_1_2_1, + b0_2_1_2_2, + )}_0`, ], [ { id: "root", immutable: false, relations: 2 }, @@ -2955,42 +4156,66 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts(b0_2_1_2_1, b0_2_1_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts( + b0_2_1_2_1, + b0_2_1_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts(b0_2_1_2_1_0, b0_2_1_2_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts( + b0_2_1_2_1_0, + b0_2_1_2_1_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_1_1.toISOString())}_${ts(b0_2_1_2_1_1, b0_2_1_2_1_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_1_1.toISOString())}_${ts( + b0_2_1_2_1_1, + b0_2_1_2_1_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_1_2.toISOString())}_${ts(b0_2_1_2_1_2, b0_2_1_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_1_2.toISOString())}_${ts( + b0_2_1_2_1_2, + b0_2_1_2_1_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_1_3.toISOString())}_${ts(b0_2_1_2_1_3, b0_2_1_2_1_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_1_3.toISOString())}_${ts( + b0_2_1_2_1_3, + b0_2_1_2_1_4, + )}_0`, immutable: false, relations: 0, }, @@ -2998,47 +4223,80 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "ro1", - bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts(b0_2_1_2_1_0, b0_2_1_2_1_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts( + b0_2_1_2_1_0, + b0_2_1_2_1_1, + )}_0`, }, { id: "ro2", - bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts(b0_2_1_2_1_0, b0_2_1_2_1_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts( + b0_2_1_2_1_0, + b0_2_1_2_1_1, + )}_0`, }, { id: "ro3", - bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts(b0_2_1_2_1_0, b0_2_1_2_1_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts( + b0_2_1_2_1_0, + b0_2_1_2_1_1, + )}_0`, }, { id: "ro4", - bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts(b0_2_1_2_1_0, b0_2_1_2_1_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts( + b0_2_1_2_1_0, + b0_2_1_2_1_1, + )}_0`, }, { id: "ro5", - bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts(b0_2_1_2_1_0, b0_2_1_2_1_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts( + b0_2_1_2_1_0, + b0_2_1_2_1_1, + )}_0`, }, { id: "ro6", - bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts(b0_2_1_2_1_0, b0_2_1_2_1_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts( + b0_2_1_2_1_0, + b0_2_1_2_1_1, + )}_0`, }, { id: "ro7", - bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts(b0_2_1_2_1_0, b0_2_1_2_1_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts( + b0_2_1_2_1_0, + b0_2_1_2_1_1, + )}_0`, }, { id: "ro8", - bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts(b0_2_1_2_1_0, b0_2_1_2_1_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts( + b0_2_1_2_1_0, + b0_2_1_2_1_1, + )}_0`, }, { id: "ro9", - bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts(b0_2_1_2_1_0, b0_2_1_2_1_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts( + b0_2_1_2_1_0, + b0_2_1_2_1_1, + )}_0`, }, { id: "ro10", - bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts(b0_2_1_2_1_0, b0_2_1_2_1_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts( + b0_2_1_2_1_0, + b0_2_1_2_1_1, + )}_0`, }, { id: "rp1", - bucket: `root/${encodeURIComponent(b0_2_1_2_1_3.toISOString())}_${ts(b0_2_1_2_1_3, b0_2_1_2_1_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_1_3.toISOString())}_${ts( + b0_2_1_2_1_3, + b0_2_1_2_1_4, + )}_0`, }, ], ); @@ -3051,7 +4309,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_2_1_3.toISOString())}_${ts(b0_2_1_2_1_3, b0_2_1_2_1_4)}_0`, + `root/${encodeURIComponent(b0_2_1_2_1_3.toISOString())}_${ts( + b0_2_1_2_1_3, + b0_2_1_2_1_4, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -3061,27 +4322,42 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts(b0_2_1_2_1, b0_2_1_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts( + b0_2_1_2_1, + b0_2_1_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2_1_3.toISOString())}_${ts(b0_2_1_2_1_3, b0_2_1_2_1_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_1_3.toISOString())}_${ts( + b0_2_1_2_1_3, + b0_2_1_2_1_4, + )}_0`, immutable: false, relations: 0, }, @@ -3089,7 +4365,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `rp${i + 1}`, - bucket: `root/${encodeURIComponent(b0_2_1_2_1_3.toISOString())}_${ts(b0_2_1_2_1_3, b0_2_1_2_1_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_1_3.toISOString())}_${ts( + b0_2_1_2_1_3, + b0_2_1_2_1_4, + )}_0`, }, ], ); @@ -3104,7 +4383,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts(b0_2_1_2_2, b0_2_1_2_3)}_0`, + `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts( + b0_2_1_2_2, + b0_2_1_2_3, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -3114,57 +4396,90 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts(b0_2_1_2_0, b0_2_1_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts( + b0_2_1_2_0, + b0_2_1_2_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts(b0_2_1_2_1, b0_2_1_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts( + b0_2_1_2_1, + b0_2_1_2_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts(b0_2_1_2_2, b0_2_1_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts( + b0_2_1_2_2, + b0_2_1_2_3, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts(b0_2_1_2_3, b0_2_1_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts( + b0_2_1_2_3, + b0_2_1_2_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts(b0_2_1_2_1_0, b0_2_1_2_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_1_0.toISOString())}_${ts( + b0_2_1_2_1_0, + b0_2_1_2_1_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_1_1.toISOString())}_${ts(b0_2_1_2_1_1, b0_2_1_2_1_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_1_1.toISOString())}_${ts( + b0_2_1_2_1_1, + b0_2_1_2_1_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_1_2.toISOString())}_${ts(b0_2_1_2_1_2, b0_2_1_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_1_2.toISOString())}_${ts( + b0_2_1_2_1_2, + b0_2_1_2_1_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_1_3.toISOString())}_${ts(b0_2_1_2_1_3, b0_2_1_2_1_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_1_3.toISOString())}_${ts( + b0_2_1_2_1_3, + b0_2_1_2_1_4, + )}_0`, immutable: true, relations: 0, }, @@ -3172,7 +4487,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rq1", - bucket: `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts(b0_2_1_2_2, b0_2_1_2_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts( + b0_2_1_2_2, + b0_2_1_2_3, + )}_0`, }, ], ); @@ -3185,7 +4503,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts(b0_2_1_2_2, b0_2_1_2_3)}_0`, + `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts( + b0_2_1_2_2, + b0_2_1_2_3, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -3195,22 +4516,34 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts(b0_2_1_2_2, b0_2_1_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts( + b0_2_1_2_2, + b0_2_1_2_3, + )}_0`, immutable: false, relations: 0, }, @@ -3218,7 +4551,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `rq${i + 1}`, - bucket: `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts(b0_2_1_2_2, b0_2_1_2_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts( + b0_2_1_2_2, + b0_2_1_2_3, + )}_0`, }, ], ); @@ -3233,7 +4569,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts(b0_2_1_2_3, b0_2_1_2_4)}_0`, + `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts( + b0_2_1_2_3, + b0_2_1_2_4, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -3243,37 +4582,58 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts(b0_2_1_2_0, b0_2_1_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts( + b0_2_1_2_0, + b0_2_1_2_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts(b0_2_1_2_1, b0_2_1_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts( + b0_2_1_2_1, + b0_2_1_2_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts(b0_2_1_2_2, b0_2_1_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts( + b0_2_1_2_2, + b0_2_1_2_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts(b0_2_1_2_3, b0_2_1_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts( + b0_2_1_2_3, + b0_2_1_2_4, + )}_0`, immutable: false, relations: 0, }, @@ -3281,7 +4641,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rr1", - bucket: `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts(b0_2_1_2_3, b0_2_1_2_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts( + b0_2_1_2_3, + b0_2_1_2_4, + )}_0`, }, ], ); @@ -3294,7 +4657,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts(b0_2_1_2_3, b0_2_1_2_4)}_0`, + `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts( + b0_2_1_2_3, + b0_2_1_2_4, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -3304,22 +4670,34 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts(b0_2_1_2_3, b0_2_1_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts( + b0_2_1_2_3, + b0_2_1_2_4, + )}_0`, immutable: false, relations: 0, }, @@ -3327,7 +4705,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `rr${i + 1}`, - bucket: `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts(b0_2_1_2_3, b0_2_1_2_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts( + b0_2_1_2_3, + b0_2_1_2_4, + )}_0`, }, ], ); @@ -3342,7 +4723,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -3352,52 +4736,82 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts(b0_2_1_0, b0_2_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( + b0_2_1_0, + b0_2_1_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts(b0_2_1_2_0, b0_2_1_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts( + b0_2_1_2_0, + b0_2_1_2_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts(b0_2_1_2_1, b0_2_1_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts( + b0_2_1_2_1, + b0_2_1_2_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts(b0_2_1_2_2, b0_2_1_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts( + b0_2_1_2_2, + b0_2_1_2_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts(b0_2_1_2_3, b0_2_1_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts( + b0_2_1_2_3, + b0_2_1_2_4, + )}_0`, immutable: true, relations: 0, }, @@ -3405,7 +4819,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rs1", - bucket: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, }, ], ); @@ -3419,7 +4836,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -3429,17 +4849,26 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, immutable: false, relations: 0, }, @@ -3447,7 +4876,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rt1", - bucket: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, }, ], ); @@ -3461,7 +4893,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -3471,17 +4906,26 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, immutable: false, relations: 0, }, @@ -3489,7 +4933,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "ru1", - bucket: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, }, ], ); @@ -3503,7 +4950,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -3513,17 +4963,26 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, immutable: false, relations: 0, }, @@ -3531,7 +4990,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rv1", - bucket: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, }, ], ); @@ -3545,7 +5007,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -3555,17 +5020,26 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, immutable: false, relations: 0, }, @@ -3573,7 +5047,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rw1", - bucket: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, }, ], ); @@ -3588,7 +5065,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -3598,17 +5078,26 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, immutable: false, relations: 0, }, @@ -3616,7 +5105,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `rx${i}`, - bucket: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, }, ], ); @@ -3634,9 +5126,15 @@ ex:Fragmentation a tree:TimebasedFragmentation ; testOutput( output, - `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts(b0_2_1_3_3, b0_2_1_3_4)}_0`, + `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts( + b0_2_1_3_3, + b0_2_1_3_4, + )}_0`, [ - `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, ], [ { id: "root", immutable: false, relations: 2 }, @@ -3646,37 +5144,58 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_3_0.toISOString())}_${ts(b0_2_1_3_0, b0_2_1_3_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3_0.toISOString())}_${ts( + b0_2_1_3_0, + b0_2_1_3_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_3_1.toISOString())}_${ts(b0_2_1_3_1, b0_2_1_3_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3_1.toISOString())}_${ts( + b0_2_1_3_1, + b0_2_1_3_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_3_2.toISOString())}_${ts(b0_2_1_3_2, b0_2_1_3_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3_2.toISOString())}_${ts( + b0_2_1_3_2, + b0_2_1_3_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts(b0_2_1_3_3, b0_2_1_3_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts( + b0_2_1_3_3, + b0_2_1_3_4, + )}_0`, immutable: false, relations: 0, }, @@ -3684,47 +5203,80 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "rs1", - bucket: `root/${encodeURIComponent(b0_2_1_3_0.toISOString())}_${ts(b0_2_1_3_0, b0_2_1_3_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3_0.toISOString())}_${ts( + b0_2_1_3_0, + b0_2_1_3_1, + )}_0`, }, { id: "rt1", - bucket: `root/${encodeURIComponent(b0_2_1_3_0.toISOString())}_${ts(b0_2_1_3_0, b0_2_1_3_1)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3_0.toISOString())}_${ts( + b0_2_1_3_0, + b0_2_1_3_1, + )}_0`, }, { id: "ru1", - bucket: `root/${encodeURIComponent(b0_2_1_3_1.toISOString())}_${ts(b0_2_1_3_1, b0_2_1_3_2)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3_1.toISOString())}_${ts( + b0_2_1_3_1, + b0_2_1_3_2, + )}_0`, }, { id: "rv1", - bucket: `root/${encodeURIComponent(b0_2_1_3_2.toISOString())}_${ts(b0_2_1_3_2, b0_2_1_3_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3_2.toISOString())}_${ts( + b0_2_1_3_2, + b0_2_1_3_3, + )}_0`, }, { id: "rw1", - bucket: `root/${encodeURIComponent(b0_2_1_3_2.toISOString())}_${ts(b0_2_1_3_2, b0_2_1_3_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3_2.toISOString())}_${ts( + b0_2_1_3_2, + b0_2_1_3_3, + )}_0`, }, { id: "rx1", - bucket: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts(b0_2_1_3_3, b0_2_1_3_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts( + b0_2_1_3_3, + b0_2_1_3_4, + )}_0`, }, { id: "rx2", - bucket: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts(b0_2_1_3_3, b0_2_1_3_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts( + b0_2_1_3_3, + b0_2_1_3_4, + )}_0`, }, { id: "rx3", - bucket: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts(b0_2_1_3_3, b0_2_1_3_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts( + b0_2_1_3_3, + b0_2_1_3_4, + )}_0`, }, { id: "rx4", - bucket: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts(b0_2_1_3_3, b0_2_1_3_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts( + b0_2_1_3_3, + b0_2_1_3_4, + )}_0`, }, { id: "rx5", - bucket: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts(b0_2_1_3_3, b0_2_1_3_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts( + b0_2_1_3_3, + b0_2_1_3_4, + )}_0`, }, { id: "rx6", - bucket: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts(b0_2_1_3_3, b0_2_1_3_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts( + b0_2_1_3_3, + b0_2_1_3_4, + )}_0`, }, ], ); @@ -3737,7 +5289,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts(b0_2_1_3_3, b0_2_1_3_4)}_0`, + `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts( + b0_2_1_3_3, + b0_2_1_3_4, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -3747,22 +5302,34 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts(b0_2_1_3_3, b0_2_1_3_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts( + b0_2_1_3_3, + b0_2_1_3_4, + )}_0`, immutable: false, relations: 0, }, @@ -3770,7 +5337,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: `rx${i + 1}`, - bucket: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts(b0_2_1_3_3, b0_2_1_3_4)}_0`, + bucket: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts( + b0_2_1_3_3, + b0_2_1_3_4, + )}_0`, }, ], ); @@ -3785,7 +5355,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; await outputPromise; testOutput( output, - `root/${encodeURIComponent(b0_2_2.toISOString())}_${ts(b0_2_2, b0_2_3)}_0`, + `root/${encodeURIComponent(b0_2_2.toISOString())}_${ts( + b0_2_2, + b0_2_3, + )}_0`, [], [ { id: "root", immutable: false, relations: 2 }, @@ -3795,67 +5368,106 @@ ex:Fragmentation a tree:TimebasedFragmentation ; relations: 8, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts(b0_2, b0_3)}_0`, + id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( + b0_2, + b0_3, + )}_0`, immutable: false, relations: 8, }, { - id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts(b0_2_0, b0_2_1)}_0`, + id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts( + b0_2_0, + b0_2_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts(b0_2_1, b0_2_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( + b0_2_1, + b0_2_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_2.toISOString())}_${ts(b0_2_2, b0_2_3)}_0`, + id: `root/${encodeURIComponent(b0_2_2.toISOString())}_${ts( + b0_2_2, + b0_2_3, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_3.toISOString())}_${ts(b0_2_3, b0_2_4)}_0`, + id: `root/${encodeURIComponent(b0_2_3.toISOString())}_${ts( + b0_2_3, + b0_2_4, + )}_0`, immutable: false, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts(b0_2_1_0, b0_2_1_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( + b0_2_1_0, + b0_2_1_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts(b0_2_1_1, b0_2_1_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( + b0_2_1_1, + b0_2_1_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts(b0_2_1_2, b0_2_1_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( + b0_2_1_2, + b0_2_1_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts(b0_2_1_3, b0_2_1_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( + b0_2_1_3, + b0_2_1_4, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_3_0.toISOString())}_${ts(b0_2_1_3_0, b0_2_1_3_1)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3_0.toISOString())}_${ts( + b0_2_1_3_0, + b0_2_1_3_1, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_3_1.toISOString())}_${ts(b0_2_1_3_1, b0_2_1_3_2)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3_1.toISOString())}_${ts( + b0_2_1_3_1, + b0_2_1_3_2, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_3_2.toISOString())}_${ts(b0_2_1_3_2, b0_2_1_3_3)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3_2.toISOString())}_${ts( + b0_2_1_3_2, + b0_2_1_3_3, + )}_0`, immutable: true, relations: 0, }, { - id: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts(b0_2_1_3_3, b0_2_1_3_4)}_0`, + id: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts( + b0_2_1_3_3, + b0_2_1_3_4, + )}_0`, immutable: true, relations: 0, }, @@ -3863,7 +5475,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; [ { id: "ry1", - bucket: `root/${encodeURIComponent(b0_2_2.toISOString())}_${ts(b0_2_2, b0_2_3)}_0`, + bucket: `root/${encodeURIComponent(b0_2_2.toISOString())}_${ts( + b0_2_2, + b0_2_3, + )}_0`, }, ], ); From 95d66e3be3fa3d4d0b21409d90f019c6233f3c19 Mon Sep 17 00:00:00 2001 From: ajuvercr Date: Fri, 23 Aug 2024 13:12:18 +0200 Subject: [PATCH 2/7] feat: add type to sds:Relation objects --- src/bucketizers.ts | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/bucketizers.ts b/src/bucketizers.ts index 42e4482..c8df05d 100644 --- a/src/bucketizers.ts +++ b/src/bucketizers.ts @@ -140,11 +140,7 @@ function record_to_quads( return out; } -function bucket_to_quads( - bucket: Bucket, - includeRelations: boolean = true, - stream?: Term, -): Quad[] { +function bucket_to_quads(bucket: Bucket, stream?: Term): Quad[] { const out: Quad[] = [ df.quad( bucket.id, @@ -209,6 +205,12 @@ function relationToQuads(bucket: Bucket, rel: BucketRelation): Quad[] { id, SDS.terms.custom("DataDescription"), ), + df.quad( + id, + RDF.terms.type, + SDS.terms.custom("Relation"), + SDS.terms.custom("DataDescription"), + ), df.quad( id, SDS.terms.relationType, @@ -386,18 +388,15 @@ export async function bucketize( // Only write the requested buckets that are not included in the output yet for (const requestedBucket of requestedBuckets) { outputQuads.push( - ...bucket_to_quads( - buckets[requestedBucket], - false, - resultingStream, - ), + ...bucket_to_quads(buckets[requestedBucket], resultingStream), ); } - for (const { origin, relation } of newRelations) { outputQuads.push(...relationToQuads(origin, relation)); } + // await prettyPrintQuads(outputQuads); + await channels.dataOutput.push( new N3Writer().quadsToString(outputQuads), ); From aad1c54c884290f3ab3264ace9762f298e5129cc Mon Sep 17 00:00:00 2001 From: ajuvercr Date: Mon, 26 Aug 2024 09:51:45 +0200 Subject: [PATCH 3/7] bump --- src/bucketizers/index.ts | 2 + src/bucketizers/timebasedBucketizer.ts | 17 ++- test/timebasedBucketizer.test.ts | 161 ++++++++++++++----------- 3 files changed, 106 insertions(+), 74 deletions(-) diff --git a/src/bucketizers/index.ts b/src/bucketizers/index.ts index 0faf897..40460d6 100644 --- a/src/bucketizers/index.ts +++ b/src/bucketizers/index.ts @@ -123,6 +123,7 @@ export class BucketizerOrchestrator { value?: Term, path?: RdfThing, ) => { + console.log("Adding relation", origin.id, target.id, type.value); const relation = { type, value, @@ -147,6 +148,7 @@ export class BucketizerOrchestrator { const bucketizer = this.getBucketizer(i, prefix); const getBucket = (value: string, root?: boolean) => { + console.log("Getting bucket", decodeURIComponent(value)); const terms = value.split("/"); const key = encodeURIComponent( decodeURIComponent(terms[terms.length - 1]), diff --git a/src/bucketizers/timebasedBucketizer.ts b/src/bucketizers/timebasedBucketizer.ts index 6b9ed4c..9febca7 100644 --- a/src/bucketizers/timebasedBucketizer.ts +++ b/src/bucketizers/timebasedBucketizer.ts @@ -49,6 +49,7 @@ export default class TimebasedBucketizer implements Bucketizer { .filter( (x, i, arr) => arr.findIndex((y) => x.value === y.value) == i, ); + console.log("Values", values, this.mutableLeafBucketKeys); const out: Bucket[] = []; console.log( @@ -67,6 +68,7 @@ export default class TimebasedBucketizer implements Bucketizer { let bucketKey = this.mutableLeafBucketKeys[0]; while (!candidateBucket) { if (!bucketKey) { + console.log("No candidate bucket and no bucket key"); // No more leaf buckets to check. We need to generate a new year bucket. const root = getBucket("root", true); const newBucketTimestamp = new Date(timestamp); @@ -121,6 +123,7 @@ export default class TimebasedBucketizer implements Bucketizer { recordTimestamp.getTime() >= bucketTimestamp.getTime() + bucketSpan ) { + console.log("Make this bucket immutable"); // The record timestamp is after the current bucket span. We need to check the next leaf bucket. // Make this bucket immutable as a record with a later timestamp arrived. bucket.immutable = true; @@ -143,6 +146,7 @@ export default class TimebasedBucketizer implements Bucketizer { // Is there still space in the bucket? while (this.members.length >= this.maxSize) { + console.log("No space, need to split"); // The bucket is full. We need to split it. const bucketNames = candidateBucket.id.value.split("/"); const bucketProperties = decodeURIComponent( @@ -279,6 +283,7 @@ export default class TimebasedBucketizer implements Bucketizer { ); } } + // Add the record to the bucket. this.members.push({ id: JSON.parse(JSON.stringify(record.data.id.value)), @@ -338,13 +343,17 @@ export default class TimebasedBucketizer implements Bucketizer { getBucket: (key: string, root?: boolean) => Bucket, ) { const parent = bucket.parent; + console.log("makeParentImmutableIfNoMutableChildren", !!parent); if (parent && !parent.root) { // Check if all its children are immutable. - const children = parent.links.map((link) => - getBucket(link.target.value), - ); - if (children.find((child) => !child.immutable) === undefined) { + const children = parent.links.map((link) => { + console.log("link", link.type.value); + return getBucket(link.target.value); + }); + const mutableChild = children.find((child) => !child.immutable); + if (mutableChild === undefined) { parent.immutable = true; + console.log("Making parent immutable", parent.id.value); this.logger.debug( `Making parent bucket '${parent.id.value}' immutable.`, ); diff --git a/test/timebasedBucketizer.test.ts b/test/timebasedBucketizer.test.ts index 073782b..10698d0 100644 --- a/test/timebasedBucketizer.test.ts +++ b/test/timebasedBucketizer.test.ts @@ -484,18 +484,26 @@ ex:Fragmentation a tree:TimebasedFragmentation ; const outputPromise = outputListener(outgoing, output); await incoming.push(createInput(`ra${i + 1}`, dates[0][i])); await outputPromise; + + const expected = [ + { + id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, + immutable: false, + relations: 0, + }, + ]; + if (i == 0) { + expected.unshift({ + id: "root", + immutable: false, + relations: 2, + }); + } testOutput( output, `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, [], - [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 0, - }, - ], + expected, [ { id: `ra${i + 1}`, @@ -568,7 +576,7 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, ], [ - { id: "root", immutable: false, relations: 2 }, + // { id: "root", immutable: false, relations: 2 }, { id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, immutable: false, @@ -870,60 +878,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_1`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts( - b0_2_0, - b0_2_1, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts( - b0_2_0_3, - b0_2_0_4, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_0_3_2.toISOString())}_${ts( - b0_2_0_3_2, - b0_2_0_3_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_0_3_2_2.toISOString())}_${ts( - b0_2_0_3_2_2, - b0_2_0_3_2_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( - b0_2_0_3_2_2_3, - b0_2_0_3_2_2_4, - )}_0`, - immutable: true, - relations: 1, - }, { id: `root/${encodeURIComponent(b0_2_0_3_2_2_3.toISOString())}_${ts( b0_2_0_3_2_2_3, @@ -946,10 +900,12 @@ ex:Fragmentation a tree:TimebasedFragmentation ; } // Next day (2024-07-24), Rb1 should be added, making previous buckets immutable. + console.log("============ beforeer -----------"); output = []; outputPromise = outputListener(outgoing, output); await incoming.push(createInput("rb1", dates[1][0])); await outputPromise; + testOutput( output, `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts( @@ -1104,6 +1060,7 @@ ex:Fragmentation a tree:TimebasedFragmentation ; ], ); + console.log("============ futheer -----------"); // Rb2 - Rb10 should just be added. for (let i = 1; i < 10; i++) { output = []; @@ -5531,9 +5488,11 @@ ex:Fragmentation a tree:TimebasedFragmentation ; q.object.value === SDS.terms.custom("Bucket").value, ) .map((q) => q.subject.value); + const relatedBuckets: { id: string; immutable: boolean; + empty: boolean; relations: number; }[] = []; relatedBucketsIds.forEach((bucket) => { @@ -5544,12 +5503,18 @@ ex:Fragmentation a tree:TimebasedFragmentation ; q.predicate.value === SDS.terms.custom("immutable").value, )?.object.value === "true"; + const empty = + quads.find( + (q) => + q.subject.value === bucket && + q.predicate.value === SDS.terms.custom("empty").value, + )?.object.value === "true"; const relations = quads.filter( (q) => q.subject.value === bucket && q.predicate.value === SDS.terms.relation.value, ).length; - relatedBuckets.push({ id: bucket, immutable, relations }); + relatedBuckets.push({ id: bucket, immutable, relations, empty }); }); const membersIds = quads @@ -5600,15 +5565,65 @@ ex:Fragmentation a tree:TimebasedFragmentation ; expect(bucket).toBe(expectedBucket); // Check the empty buckets - console.log("emptyBuckets", emptyBuckets); + console.log( + "Empty buckets expected", + expectedEmptyBuckets.length, + "found", + emptyBuckets.length, + ); + if (emptyBuckets.length !== expectedEmptyBuckets.length) { + // console.log( + // "== Empty buckets", + // emptyBuckets.length, + // "!=", + // expectedEmptyBuckets.length, + // ); + // console.log("Found"); + // emptyBuckets.forEach((relatedBucket) => { + // console.log(relatedBucket); + // }); + // console.log("Expected"); + // expectedEmptyBuckets.forEach((relatedBucket) => { + // console.log(relatedBucket); + // }); + + console.log( + "== Related Buckets", + relatedBuckets.length, + "!=", + expectedRelatedBuckets.length, + ); + // console.log("Found"); + // relatedBuckets.forEach((relatedBucket) => { + // console.log(relatedBucket); + // }); + // console.log("Expected"); + // expectedRelatedBuckets.forEach((relatedBucket) => { + // console.log(relatedBucket); + // }); + } + // console.log("emptyBuckets", emptyBuckets); expect(emptyBuckets.length).toBe(expectedEmptyBuckets.length); expect(emptyBuckets).toEqual(expectedEmptyBuckets); // Check the related buckets - console.log(relatedBuckets.length, expectedRelatedBuckets.length); - relatedBuckets.forEach((relatedBucket) => { - console.log(relatedBucket); - }); + console.log( + "Related buckets expected", + expectedRelatedBuckets.length, + "found", + relatedBuckets.length, + ); + // console.log(relatedBuckets.length, expectedRelatedBuckets.length); + if (expectedRelatedBuckets.length !== relatedBuckets.length) { + console.log("Found"); + relatedBuckets.forEach((relatedBucket) => { + console.log(relatedBucket); + }); + console.log("Expected"); + expectedRelatedBuckets.forEach((relatedBucket) => { + console.log(relatedBucket); + }); + } expect(relatedBuckets.length).toBe(expectedRelatedBuckets.length); relatedBuckets.forEach((relatedBucket) => { const expected = expectedRelatedBuckets.find( @@ -5620,9 +5635,15 @@ ex:Fragmentation a tree:TimebasedFragmentation ; }); // Check the members + console.log( + "Members expected", + expectedMembers.length, + "found", + members.length, + ); expect(members.length).toBe(expectedMembers.length); members.forEach((member) => { - console.log("member", member); + // console.log("member", member); const expected = expectedMembers.find( (m) => `http://example.org/${m.id}` === member.id, ); From 983031f338ef963ef9002fba0b898c34d060d67a Mon Sep 17 00:00:00 2001 From: ajuvercr Date: Mon, 26 Aug 2024 11:17:03 +0200 Subject: [PATCH 4/7] feat: make timebased bucketizer tests happy: only relevant buckets are sent --- src/bucketizers.ts | 1 + src/bucketizers/index.ts | 2 - src/bucketizers/timebasedBucketizer.ts | 17 - test/timebasedBucketizer.test.ts | 1321 +----------------------- 4 files changed, 19 insertions(+), 1322 deletions(-) diff --git a/src/bucketizers.ts b/src/bucketizers.ts index c8df05d..14d4269 100644 --- a/src/bucketizers.ts +++ b/src/bucketizers.ts @@ -179,6 +179,7 @@ function bucket_to_quads(bucket: Bucket, stream?: Term): Quad[] { SDS.terms.custom("DataDescription"), ), ); + bucket.empty = false; } if (stream) { diff --git a/src/bucketizers/index.ts b/src/bucketizers/index.ts index 40460d6..0faf897 100644 --- a/src/bucketizers/index.ts +++ b/src/bucketizers/index.ts @@ -123,7 +123,6 @@ export class BucketizerOrchestrator { value?: Term, path?: RdfThing, ) => { - console.log("Adding relation", origin.id, target.id, type.value); const relation = { type, value, @@ -148,7 +147,6 @@ export class BucketizerOrchestrator { const bucketizer = this.getBucketizer(i, prefix); const getBucket = (value: string, root?: boolean) => { - console.log("Getting bucket", decodeURIComponent(value)); const terms = value.split("/"); const key = encodeURIComponent( decodeURIComponent(terms[terms.length - 1]), diff --git a/src/bucketizers/timebasedBucketizer.ts b/src/bucketizers/timebasedBucketizer.ts index 9febca7..73e6535 100644 --- a/src/bucketizers/timebasedBucketizer.ts +++ b/src/bucketizers/timebasedBucketizer.ts @@ -20,9 +20,6 @@ export default class TimebasedBucketizer implements Bucketizer { private members: Array = []; constructor(config: TimebasedFragmentation, save?: string) { - console.log("============================="); - console.log("CREATING TIMEBASED BUCKETIZER"); - console.log("============================"); this.path = config.path.mapAll((x) => ({ value: x.id.value, literal: x.id, @@ -49,14 +46,8 @@ export default class TimebasedBucketizer implements Bucketizer { .filter( (x, i, arr) => arr.findIndex((y) => x.value === y.value) == i, ); - console.log("Values", values, this.mutableLeafBucketKeys); const out: Bucket[] = []; - console.log( - `Bucketizer: Adding record ${record.data.id.value} to buckets ${values.map( - (x) => x.value, - )}`, - ); for (const value of values) { if (value.literal) { @@ -68,7 +59,6 @@ export default class TimebasedBucketizer implements Bucketizer { let bucketKey = this.mutableLeafBucketKeys[0]; while (!candidateBucket) { if (!bucketKey) { - console.log("No candidate bucket and no bucket key"); // No more leaf buckets to check. We need to generate a new year bucket. const root = getBucket("root", true); const newBucketTimestamp = new Date(timestamp); @@ -123,7 +113,6 @@ export default class TimebasedBucketizer implements Bucketizer { recordTimestamp.getTime() >= bucketTimestamp.getTime() + bucketSpan ) { - console.log("Make this bucket immutable"); // The record timestamp is after the current bucket span. We need to check the next leaf bucket. // Make this bucket immutable as a record with a later timestamp arrived. bucket.immutable = true; @@ -146,7 +135,6 @@ export default class TimebasedBucketizer implements Bucketizer { // Is there still space in the bucket? while (this.members.length >= this.maxSize) { - console.log("No space, need to split"); // The bucket is full. We need to split it. const bucketNames = candidateBucket.id.value.split("/"); const bucketProperties = decodeURIComponent( @@ -158,7 +146,6 @@ export default class TimebasedBucketizer implements Bucketizer { parseInt(bucketProperties[1]) / this.k < this.minBucketSpan ) { - console.log("We need to make a new page"); // We need to make a new page. const newBucket = getBucket( `${bucketProperties[0]}_${bucketProperties[1]}_${ @@ -183,7 +170,6 @@ export default class TimebasedBucketizer implements Bucketizer { // The record belongs in this newBucket, so make newBucket the candidateBucket. candidateBucket = newBucket; } else { - console.log("We need to split the bucket"); // We need to split the bucket. const newBucketSpan = Math.round( parseInt(bucketProperties[1]) / this.k, @@ -343,17 +329,14 @@ export default class TimebasedBucketizer implements Bucketizer { getBucket: (key: string, root?: boolean) => Bucket, ) { const parent = bucket.parent; - console.log("makeParentImmutableIfNoMutableChildren", !!parent); if (parent && !parent.root) { // Check if all its children are immutable. const children = parent.links.map((link) => { - console.log("link", link.type.value); return getBucket(link.target.value); }); const mutableChild = children.find((child) => !child.immutable); if (mutableChild === undefined) { parent.immutable = true; - console.log("Making parent immutable", parent.id.value); this.logger.debug( `Making parent bucket '${parent.id.value}' immutable.`, ); diff --git a/test/timebasedBucketizer.test.ts b/test/timebasedBucketizer.test.ts index 10698d0..21b78ac 100644 --- a/test/timebasedBucketizer.test.ts +++ b/test/timebasedBucketizer.test.ts @@ -914,36 +914,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts( - b0_2_0, - b0_2_1, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts( - b0_2_0_3, - b0_2_0_4, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_0_3_0.toISOString())}_${ts( b0_2_0_3_0, @@ -1075,36 +1045,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts( - b0_2_0, - b0_2_1, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts( - b0_2_0_3, - b0_2_0_4, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts( b0_2_0_3_3, @@ -1166,36 +1106,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, ], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts( - b0_2_0, - b0_2_1, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts( - b0_2_0_3, - b0_2_0_4, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts( b0_2_0_3_3, @@ -1372,60 +1282,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_1`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts( - b0_2_0, - b0_2_1, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_0_3.toISOString())}_${ts( - b0_2_0_3, - b0_2_0_4, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_0_3_3.toISOString())}_${ts( - b0_2_0_3_3, - b0_2_0_3_4, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_0_3_3_1.toISOString())}_${ts( - b0_2_0_3_3_1, - b0_2_0_3_3_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( - b0_2_0_3_3_1_2, - b0_2_0_3_3_1_3, - )}_0`, - immutable: true, - relations: 1, - }, { id: `root/${encodeURIComponent(b0_2_0_3_3_1_2.toISOString())}_${ts( b0_2_0_3_3_1_2, @@ -1460,20 +1316,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts( b0_2_0, @@ -1668,20 +1510,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( b0_2_1, @@ -1755,20 +1583,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, ], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( b0_2_1, @@ -2009,60 +1823,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_1`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( - b0_2_1_0, - b0_2_1_1, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts( - b0_2_1_0_0, - b0_2_1_0_1, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_0_0_0.toISOString())}_${ts( - b0_2_1_0_0_0, - b0_2_1_0_0_1, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( - b0_2_1_0_0_0_1, - b0_2_1_0_0_0_2, - )}_0`, - immutable: true, - relations: 1, - }, { id: `root/${encodeURIComponent(b0_2_1_0_0_0_1.toISOString())}_${ts( b0_2_1_0_0_0_1, @@ -2097,44 +1857,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( - b0_2_1_0, - b0_2_1_1, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts( - b0_2_1_0_0, - b0_2_1_0_1, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_0_0_0.toISOString())}_${ts( b0_2_1_0_0_0, @@ -2233,44 +1955,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( - b0_2_1_0, - b0_2_1_1, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts( - b0_2_1_0_0, - b0_2_1_0_1, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_0_0_3.toISOString())}_${ts( b0_2_1_0_0_3, @@ -2307,51 +1991,21 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, + id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts( + b0_2_1_0_0, + b0_2_1_0_1, + )}_0`, + immutable: true, + relations: 0, }, { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, + id: `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts( + b0_2_1_0_1, + b0_2_1_0_2, )}_0`, immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( - b0_2_1_0, - b0_2_1_1, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts( - b0_2_1_0_0, - b0_2_1_0_1, - )}_0`, - immutable: true, - relations: 0, - }, - { - id: `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts( - b0_2_1_0_1, - b0_2_1_0_2, - )}_0`, - immutable: false, - relations: 0, + relations: 0, }, { id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts( @@ -2427,36 +2081,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( - b0_2_1_0, - b0_2_1_1, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_0_1.toISOString())}_${ts( b0_2_1_0_1, @@ -2493,36 +2117,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( - b0_2_1_0, - b0_2_1_1, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_0_0.toISOString())}_${ts( b0_2_1_0_0, @@ -2581,36 +2175,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( - b0_2_1_0, - b0_2_1_1, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts( b0_2_1_0_2, @@ -2662,36 +2226,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, ], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( - b0_2_1_0, - b0_2_1_1, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts( b0_2_1_0_2, @@ -2828,44 +2362,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( - b0_2_1_0, - b0_2_1_1, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_0_2.toISOString())}_${ts( - b0_2_1_0_2, - b0_2_1_0_3, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_0_2_3.toISOString())}_${ts( b0_2_1_0_2_3, @@ -2904,28 +2400,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( b0_2_1_0, @@ -3048,28 +2522,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( b0_2_1_1, @@ -3104,28 +2556,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( b0_2_1_1, @@ -3159,28 +2589,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( b0_2_1_1, @@ -3214,28 +2622,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( b0_2_1_1, @@ -3265,32 +2651,10 @@ ex:Fragmentation a tree:TimebasedFragmentation ; output, `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( b0_2_1_1, - b0_2_1_2, - )}_0`, - [], - [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, + b0_2_1_2, + )}_0`, + [], + [ { id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( b0_2_1_1, @@ -3324,28 +2688,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_1.toISOString())}_${ts( b0_2_1_1, @@ -3379,28 +2721,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( b0_2_1_0, @@ -3459,28 +2779,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( b0_2_1_2, @@ -3547,28 +2845,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, ], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( b0_2_1_2, @@ -3777,60 +3053,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_1`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( - b0_2_1_2, - b0_2_1_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts( - b0_2_1_2_0, - b0_2_1_2_1, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_2_0_2.toISOString())}_${ts( - b0_2_1_2_0_2, - b0_2_1_2_0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( - b0_2_1_2_0_2_0, - b0_2_1_2_0_2_1, - )}_0`, - immutable: true, - relations: 1, - }, { id: `root/${encodeURIComponent(b0_2_1_2_0_2_0.toISOString())}_${ts( b0_2_1_2_0_2_0, @@ -3865,36 +3087,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( - b0_2_1_2, - b0_2_1_3, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts( b0_2_1_2_0, @@ -4025,36 +3217,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( - b0_2_1_2, - b0_2_1_3, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts( b0_2_1_2_1, @@ -4106,36 +3268,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, ], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( - b0_2_1_2, - b0_2_1_3, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts( b0_2_1_2_1, @@ -4272,44 +3404,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( - b0_2_1_2, - b0_2_1_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_2_1.toISOString())}_${ts( - b0_2_1_2_1, - b0_2_1_2_2, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_2_1_3.toISOString())}_${ts( b0_2_1_2_1_3, @@ -4343,39 +3437,9 @@ ex:Fragmentation a tree:TimebasedFragmentation ; `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts( b0_2_1_2_2, b0_2_1_2_3, - )}_0`, - [], - [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( - b0_2_1_2, - b0_2_1_3, - )}_0`, - immutable: false, - relations: 8, - }, + )}_0`, + [], + [ { id: `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts( b0_2_1_2_0, @@ -4466,36 +3530,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( - b0_2_1_2, - b0_2_1_3, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_2_2.toISOString())}_${ts( b0_2_1_2_2, @@ -4532,36 +3566,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( - b0_2_1_2, - b0_2_1_3, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_2_0.toISOString())}_${ts( b0_2_1_2_0, @@ -4620,36 +3624,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_2.toISOString())}_${ts( - b0_2_1_2, - b0_2_1_3, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_2_3.toISOString())}_${ts( b0_2_1_2_3, @@ -4686,28 +3660,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_0.toISOString())}_${ts( b0_2_1_0, @@ -4799,28 +3751,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( b0_2_1_3, @@ -4856,28 +3786,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( b0_2_1_3, @@ -4913,28 +3821,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( b0_2_1_3, @@ -4970,28 +3856,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( b0_2_1_3, @@ -5028,28 +3892,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( b0_2_1_3, @@ -5094,28 +3936,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, ], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( b0_2_1_3, @@ -5252,36 +4072,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1.toISOString())}_${ts( - b0_2_1, - b0_2_2, - )}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2_1_3.toISOString())}_${ts( - b0_2_1_3, - b0_2_1_4, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_1_3_3.toISOString())}_${ts( b0_2_1_3_3, @@ -5318,20 +4108,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; )}_0`, [], [ - { id: "root", immutable: false, relations: 2 }, - { - id: `root/${encodeURIComponent(b0.toISOString())}_${ts(b0, b1)}_0`, - immutable: false, - relations: 8, - }, - { - id: `root/${encodeURIComponent(b0_2.toISOString())}_${ts( - b0_2, - b0_3, - )}_0`, - immutable: false, - relations: 8, - }, { id: `root/${encodeURIComponent(b0_2_0.toISOString())}_${ts( b0_2_0, @@ -5564,66 +4340,11 @@ ex:Fragmentation a tree:TimebasedFragmentation ; // Check the bucket expect(bucket).toBe(expectedBucket); - // Check the empty buckets - console.log( - "Empty buckets expected", - expectedEmptyBuckets.length, - "found", - emptyBuckets.length, - ); - if (emptyBuckets.length !== expectedEmptyBuckets.length) { - // console.log( - // "== Empty buckets", - // emptyBuckets.length, - // "!=", - // expectedEmptyBuckets.length, - // ); - // console.log("Found"); - // emptyBuckets.forEach((relatedBucket) => { - // console.log(relatedBucket); - // }); - // console.log("Expected"); - // expectedEmptyBuckets.forEach((relatedBucket) => { - // console.log(relatedBucket); - // }); - - console.log( - "== Related Buckets", - relatedBuckets.length, - "!=", - expectedRelatedBuckets.length, - ); - // console.log("Found"); - // relatedBuckets.forEach((relatedBucket) => { - // console.log(relatedBucket); - // }); - // console.log("Expected"); - // expectedRelatedBuckets.forEach((relatedBucket) => { - // console.log(relatedBucket); - // }); - } // console.log("emptyBuckets", emptyBuckets); expect(emptyBuckets.length).toBe(expectedEmptyBuckets.length); expect(emptyBuckets).toEqual(expectedEmptyBuckets); // Check the related buckets - console.log( - "Related buckets expected", - expectedRelatedBuckets.length, - "found", - relatedBuckets.length, - ); - // console.log(relatedBuckets.length, expectedRelatedBuckets.length); - if (expectedRelatedBuckets.length !== relatedBuckets.length) { - console.log("Found"); - relatedBuckets.forEach((relatedBucket) => { - console.log(relatedBucket); - }); - console.log("Expected"); - expectedRelatedBuckets.forEach((relatedBucket) => { - console.log(relatedBucket); - }); - } expect(relatedBuckets.length).toBe(expectedRelatedBuckets.length); relatedBuckets.forEach((relatedBucket) => { const expected = expectedRelatedBuckets.find( @@ -5635,12 +4356,6 @@ ex:Fragmentation a tree:TimebasedFragmentation ; }); // Check the members - console.log( - "Members expected", - expectedMembers.length, - "found", - members.length, - ); expect(members.length).toBe(expectedMembers.length); members.forEach((member) => { // console.log("member", member); @@ -5656,7 +4371,7 @@ ex:Fragmentation a tree:TimebasedFragmentation ; } function splitTimespan(start: Date, end: Date, split: number): Date[] { - const timespans = []; + const timespans: Date[] = []; const step = Math.round((end.getTime() - start.getTime()) / split); for (let i = 0; i < split + 1; i++) { const next = new Date(start.getTime() + i * step); From 74deef9e675a4779bae447c6756203d6e42a2339 Mon Sep 17 00:00:00 2001 From: smessie Date: Thu, 1 Aug 2024 12:47:34 +0200 Subject: [PATCH 5/7] chore: Add logging with Winston --- package-lock.json | 246 +++++++++++++++++++++++-- package.json | 6 +- src/bucketizers/pagedBucketizer.ts | 4 + src/bucketizers/subjectBucketizer.ts | 5 +- src/bucketizers/timebasedBucketizer.ts | 38 ++-- src/exitHandler.ts | 8 +- src/generator.ts | 16 +- src/sdsify.ts | 15 +- src/utils/logUtil.ts | 67 +++++++ 9 files changed, 364 insertions(+), 41 deletions(-) create mode 100644 src/utils/logUtil.ts diff --git a/package-lock.json b/package-lock.json index b214e9e..6186bb1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,10 +14,10 @@ "extract-cbd-shape": "^0.1.8", "jsonld": "^8.3.2", "n3": "^1.17.3", - "rdf-canonize": "^4.0.1", "rdf-data-factory": "^1.1.2", "rdf-lens": "^1.2.8", - "rdf-stores": "^1.0.0" + "rdf-stores": "^1.0.0", + "winston": "^3.13.1" }, "devDependencies": { "@rdfc/js-runner": "^0.2.1", @@ -141,6 +141,14 @@ "buffer": "^6.0.3" } }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@comunica/actor-abstract-mediatyped": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/@comunica/actor-abstract-mediatyped/-/actor-abstract-mediatyped-2.10.0.tgz", @@ -508,6 +516,16 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "node_modules/@digitalbazaar/http-client": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-3.4.1.tgz", @@ -1430,6 +1448,11 @@ "@rdfjs/types": ">=1.0.0" } }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + }, "node_modules/@types/yargs": { "version": "17.0.32", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", @@ -1893,6 +1916,11 @@ "node": "*" } }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, "node_modules/asynciterator": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/asynciterator/-/asynciterator-3.9.0.tgz", @@ -2130,6 +2158,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2146,11 +2183,42 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2490,6 +2558,11 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -2831,6 +2904,11 @@ "reusify": "^1.0.4" } }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, "node_modules/fetch-blob": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", @@ -2920,6 +2998,11 @@ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -3272,6 +3355,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -3595,6 +3683,11 @@ "json-buffer": "3.0.1" } }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, "node_modules/ky": { "version": "0.33.3", "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", @@ -3835,6 +3928,22 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/logform": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.1.tgz", + "integrity": "sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA==", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/loglevel": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", @@ -4164,6 +4273,14 @@ "wrappy": "1" } }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, "node_modules/onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", @@ -4468,18 +4585,6 @@ } ] }, - "node_modules/rdf-canonize": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-4.0.1.tgz", - "integrity": "sha512-B5ynHt4sasbUafzrvYI2GFARgeFcD8Sx9yXPbg7gEyT2EH76rlCv84kyO6tnxzVbxUN/uJDbK1S/MXh+DsnuTA==", - "license": "BSD-3-Clause", - "dependencies": { - "setimmediate": "^1.0.5" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/rdf-data-factory": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/rdf-data-factory/-/rdf-data-factory-1.1.2.tgz", @@ -4850,6 +4955,14 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -4926,6 +5039,14 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -5001,6 +5122,14 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -5245,6 +5374,11 @@ "node": "*" } }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -5315,6 +5449,14 @@ "node": ">=18" } }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -5508,6 +5650,11 @@ "requires-port": "^1.0.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -5767,6 +5914,77 @@ "node": ">=8" } }, + "node_modules/winston": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.1.tgz", + "integrity": "sha512-SvZit7VFNvXRzbqGHsv5KSmgbEYR5EiQfDAL9gxYkRqa934Hnk++zze0wANKtMHcy/gI4W/3xmSDwlhf865WGw==", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.6.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.7.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.1.tgz", + "integrity": "sha512-wQCXXVgfv/wUPOfb2x0ruxzwkcZfxcktz6JIMUaPLmcNhO4bZTwA/WtDWK74xV3F2dKu8YadrFv0qhwYjVEwhA==", + "dependencies": { + "logform": "^2.6.1", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/winston/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/winston/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", diff --git a/package.json b/package.json index 7f85ace..1b079ef 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ }, "author": "Arthur Vercruysse", "contributors": [ - "Julián Rojas" + "Julián Rojas", + "Ieben Smessaert" ], "license": "MIT", "dependencies": { @@ -31,7 +32,8 @@ "n3": "^1.17.3", "rdf-data-factory": "^1.1.2", "rdf-lens": "^1.2.8", - "rdf-stores": "^1.0.0" + "rdf-stores": "^1.0.0", + "winston": "^3.13.1" }, "devDependencies": { "@rdfc/js-runner": "^0.2.1", diff --git a/src/bucketizers/pagedBucketizer.ts b/src/bucketizers/pagedBucketizer.ts index d4634f0..f48bcde 100644 --- a/src/bucketizers/pagedBucketizer.ts +++ b/src/bucketizers/pagedBucketizer.ts @@ -1,8 +1,11 @@ import { AddRelation, Bucketizer, PageFragmentation } from "./index"; import { Bucket, Record } from "../utils"; import { TREE } from "@treecg/types"; +import { getLoggerFor } from "../utils/logUtil"; export default class PagedBucketizer implements Bucketizer { + protected readonly logger = getLoggerFor(this); + private readonly pageSize: number; private count: number = 0; @@ -27,6 +30,7 @@ export default class PagedBucketizer implements Bucketizer { const oldBucket = getBucket("page-" + (index - 1), index - 1 == 0); oldBucket.immutable = true; addRelation(oldBucket, currentbucket, TREE.terms.Relation); + this.logger.info(`Created new page bucket ${index}`); } return [currentbucket]; diff --git a/src/bucketizers/subjectBucketizer.ts b/src/bucketizers/subjectBucketizer.ts index 947ced3..78d98aa 100644 --- a/src/bucketizers/subjectBucketizer.ts +++ b/src/bucketizers/subjectBucketizer.ts @@ -3,8 +3,11 @@ import { BasicLensM, Cont } from "rdf-lens"; import { Term } from "@rdfjs/types"; import { Bucket, RdfThing, Record } from "../utils"; import { TREE } from "@treecg/types"; +import { getLoggerFor } from "../utils/logUtil"; export default class SubjectBucketizer implements Bucketizer { + protected readonly logger = getLoggerFor(this); + private readonly path: BasicLensM; private readonly pathQuads: RdfThing; private readonly namePath?: BasicLensM; @@ -46,7 +49,7 @@ export default class SubjectBucketizer implements Bucketizer { } if (values.length === 0) { - console.error( + this.logger.error( "Didn't find bucket, and default name is not set, sadness :(", ); } diff --git a/src/bucketizers/timebasedBucketizer.ts b/src/bucketizers/timebasedBucketizer.ts index 73e6535..0c04c88 100644 --- a/src/bucketizers/timebasedBucketizer.ts +++ b/src/bucketizers/timebasedBucketizer.ts @@ -2,20 +2,21 @@ import { AddRelation, Bucketizer, TimebasedFragmentation } from "./index"; import { Bucket, Member, RdfThing, Record } from "../utils"; import { BasicLensM, Cont } from "rdf-lens"; import { Term } from "@rdfjs/types"; -import { getLogger, TREE, XSD } from "@treecg/types"; +import { TREE, XSD } from "@treecg/types"; import { DataFactory } from "n3"; import literal = DataFactory.literal; import namedNode = DataFactory.namedNode; +import { getLoggerFor } from "../utils/logUtil"; export default class TimebasedBucketizer implements Bucketizer { + protected readonly logger = getLoggerFor(this); + private readonly path: BasicLensM; private readonly pathQuads: RdfThing; private readonly maxSize: number = 100; private readonly k: number = 4; private readonly minBucketSpan: number = 300000; - private readonly logger = getLogger("TimebasedBucketizer"); - private mutableLeafBucketKeys: Array = []; private members: Array = []; @@ -74,6 +75,11 @@ export default class TimebasedBucketizer implements Bucketizer { ).getDate() === 29 ? 31622400000 : 31536000000; + + this.logger.info( + `Creating new year bucket with timestamp ${newBucketTimestamp.toISOString()} and timespan ${yearTimespan}.`, + ); + const yearBucket = getBucket( `${newBucketTimestamp.toISOString()}_${yearTimespan}_0`, false, @@ -106,9 +112,10 @@ export default class TimebasedBucketizer implements Bucketizer { const recordTimestamp = new Date(timestamp); if (recordTimestamp.getTime() < bucketTimestamp.getTime()) { // This should not happen! The record timestamp is before the bucket timestamp of the smallest leaf bucket. - throw new Error( - "This should not happen! Record timestamp is before the smallest mutable bucket timestamp. Are your records out of order?", + this.logger.error( + `Record timestamp is before the smallest mutable bucket timestamp. Are your records out of order? Ignoring record '${record.data.id.value}'.`, ); + return []; } else if ( recordTimestamp.getTime() >= bucketTimestamp.getTime() + bucketSpan @@ -117,6 +124,10 @@ export default class TimebasedBucketizer implements Bucketizer { // Make this bucket immutable as a record with a later timestamp arrived. bucket.immutable = true; + this.logger.debug( + `Record timestamp is after the current bucket span. Making bucket '${bucket.id.value}' immutable.`, + ); + // Remove the current bucket from the list of leaf buckets. this.mutableLeafBucketKeys.shift(); this.members = []; @@ -146,6 +157,7 @@ export default class TimebasedBucketizer implements Bucketizer { parseInt(bucketProperties[1]) / this.k < this.minBucketSpan ) { + this.logger.debug("We need to make a new page"); // We need to make a new page. const newBucket = getBucket( `${bucketProperties[0]}_${bucketProperties[1]}_${ @@ -170,6 +182,7 @@ export default class TimebasedBucketizer implements Bucketizer { // The record belongs in this newBucket, so make newBucket the candidateBucket. candidateBucket = newBucket; } else { + this.logger.debug("We need to split the bucket"); // We need to split the bucket. const newBucketSpan = Math.round( parseInt(bucketProperties[1]) / this.k, @@ -226,9 +239,10 @@ export default class TimebasedBucketizer implements Bucketizer { ].timestamp; if (recordTime < lastTimestamp) { // The record is out of order. This should not happen. - throw new Error( - "This should not happen! Record timestamp is before the last record timestamp in the new split bucket. Are your records out of order?", + this.logger.error( + `Record timestamp is before the last record timestamp in the new split bucket. Are your records out of order? Ignoring record '${record.data.id.value}'.`, ); + return []; } } @@ -264,9 +278,10 @@ export default class TimebasedBucketizer implements Bucketizer { this.members[this.members.length - 1].timestamp; if (new Date(timestamp).getTime() < lastTimestamp) { // The record is out of order. This should not happen. - throw new Error( - "This should not happen! Record timestamp is before the last record timestamp. Are your records out of order?", + this.logger.error( + `Record timestamp is before the last record timestamp. Are your records out of order? Ignoring record '${record.data.id.value}'.`, ); + return []; } } @@ -280,9 +295,8 @@ export default class TimebasedBucketizer implements Bucketizer { out.push(candidateBucket); } else { // The record does not have a timestamp value. - // TODO: Handle this case: we want to ignore and warn. - throw new Error( - "The TimebasedBucketizer received records without timestamp values. This is not supported.", + this.logger.warn( + `Received records without timestamp values. Ignoring record '${record.data.id.value}'.`, ); } } diff --git a/src/exitHandler.ts b/src/exitHandler.ts index d82f98d..1b9f209 100644 --- a/src/exitHandler.ts +++ b/src/exitHandler.ts @@ -1,5 +1,9 @@ +import { getLoggerFor } from "./utils/logUtil"; + function noOp() {} +const logger = getLoggerFor("ExitHandler"); + export function Cleanup(callback: () => void | Promise) { // attach user callback to the process event emitter // if no callback, it will still exit gracefully on Ctrl-C @@ -10,12 +14,12 @@ export function Cleanup(callback: () => void | Promise) { const fn = async function (event: string, code?: number) { if (!callbackCalled) { callbackCalled = true; - console.log( + logger.debug( `[Cleanup] Callback called on '${event}' with code '${code}'.`, ); await callback(); } else { - console.log( + logger.debug( `[Cleanup] Callback has already been called. Ignoring '${event}' with code '${code}'.`, ); } diff --git a/src/generator.ts b/src/generator.ts index 8fcc06d..a9d0178 100644 --- a/src/generator.ts +++ b/src/generator.ts @@ -3,6 +3,9 @@ import { randomInt } from "crypto"; import { DataFactory } from "rdf-data-factory"; import { Writer as N3Writer } from "n3"; import { Term, Quad_Predicate } from "@rdfjs/types"; +import { getLoggerFor } from "./utils/logUtil"; + +const logger = getLoggerFor("Generator"); const df = new DataFactory(); const NS = "http://time.is/ns#"; @@ -19,7 +22,8 @@ const types = [ function generateMember(i: number, timestampPath?: Term) { const id = df.namedNode(NS + i); - const q = (p: string, o: string) => df.quad(id, df.namedNode(p), df.literal(o)); + const q = (p: string, o: string) => + df.quad(id, df.namedNode(p), df.literal(o)); const { x, y } = types[i % types.length]; @@ -31,7 +35,11 @@ function generateMember(i: number, timestampPath?: Term) { if (timestampPath) { quads.push( - df.quad(id, timestampPath, df.literal(Date.now() + "")), + df.quad( + id, + timestampPath, + df.literal(Date.now() + ""), + ), ); } @@ -48,10 +56,10 @@ export async function generate( const wait = mWait ?? 50.0; return async function () { - console.log("generate starting"); + logger.debug("generate starting"); for (let i = 0; i < count; i++) { - console.log(`${i}/${count}`); + logger.debug(`${i}/${count}`); await writer.push(generateMember(i, timestampPath)); await new Promise((res) => setTimeout(res, wait)); } diff --git a/src/sdsify.ts b/src/sdsify.ts index 5d93a98..33d9a06 100644 --- a/src/sdsify.ts +++ b/src/sdsify.ts @@ -7,6 +7,9 @@ import { Parser, Writer as NWriter } from "n3"; import { CBDShapeExtractor } from "extract-cbd-shape"; import { RdfStore } from "rdf-stores"; import { createHash } from "crypto"; +import { getLoggerFor } from "./utils/logUtil"; + +const logger = getLoggerFor("sdsify"); const df = new DataFactory(); @@ -101,7 +104,7 @@ export function sdsify( input.data(async (input) => { const dataStore = RdfStore.createDefault(); maybeParse(input).forEach((x) => dataStore.addQuad(x)); - console.log("[sdsify] Got input with", dataStore.size, "quads"); + logger.debug(`Got input with ${dataStore.size} quads`); const members: { [id: string]: SDSMember } = {}; const t0 = new Date(); @@ -145,8 +148,8 @@ export function sdsify( }), ); - console.log( - `[sdsify] Members extracted in ${new Date().getTime() - t0.getTime()} ms`, + logger.debug( + `Members extracted in ${new Date().getTime() - t0.getTime()} ms`, ); // Sort members based on the given timestamp value (if any) to avoid out of order writing issues downstream @@ -212,13 +215,13 @@ export function sdsify( membersCount += 1; } - console.log( - `[sdsify] successfully pushed ${membersCount} members in ${new Date().getTime() - t0.getTime()} ms`, + logger.debug( + `Successfully pushed ${membersCount} members in ${new Date().getTime() - t0.getTime()} ms`, ); }); input.on("end", async () => { - console.log("[sdsify] input channel was closed down"); + logger.info("Input channel was closed down"); await output.end(); }); } diff --git a/src/utils/logUtil.ts b/src/utils/logUtil.ts new file mode 100644 index 0000000..543c6bb --- /dev/null +++ b/src/utils/logUtil.ts @@ -0,0 +1,67 @@ +import winston, { format, Logger } from "winston"; + +const PROCESSOR_NAME = "sds-processors-ts"; + +const consoleTransport = new winston.transports.Console(); +consoleTransport.level = + process.env.LOG_LEVEL || + process.env.DEBUG?.includes(PROCESSOR_NAME) || + process.env.DEBUG === "*" + ? "debug" + : "info"; + +const classLoggers = new WeakMap(); + +export function getLoggerFor(loggable: string | Instance): Logger { + let logger: Logger; + if (typeof loggable === "string") { + logger = createLogger(loggable); + } else { + const { constructor } = loggable; + if (classLoggers.has(loggable)) { + logger = classLoggers.get(loggable)!; + } else { + logger = createLogger(constructor.name); + classLoggers.set(loggable, logger); + } + } + return logger; +} + +function createLogger(label: string): Logger { + return winston.createLogger({ + format: format.combine( + format.label({ label }), + format.colorize(), + format.timestamp(), + format.metadata({ + fillExcept: ["level", "timestamp", "label", "message"], + }), + format.printf( + ({ + level: levelInner, + message, + label: labelInner, + timestamp, + metadata: meta, + }): string => + `${timestamp} {${PROCESSOR_NAME}} [${labelInner}] ${levelInner}: ${message}`, + ), + ), + transports: [consoleTransport], + }); +} + +/** + * Any class constructor. + */ +interface Constructor { + name: string; +} + +/** + * Any class instance. + */ +interface Instance { + constructor: Constructor; +} From 0eacde23401ae9c38fae9d17db57508f06eada8b Mon Sep 17 00:00:00 2001 From: smessie Date: Fri, 2 Aug 2024 17:36:06 +0200 Subject: [PATCH 6/7] chore: Add extra debug logs --- src/bucketizers/timebasedBucketizer.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/bucketizers/timebasedBucketizer.ts b/src/bucketizers/timebasedBucketizer.ts index 0c04c88..7139e2f 100644 --- a/src/bucketizers/timebasedBucketizer.ts +++ b/src/bucketizers/timebasedBucketizer.ts @@ -157,7 +157,9 @@ export default class TimebasedBucketizer implements Bucketizer { parseInt(bucketProperties[1]) / this.k < this.minBucketSpan ) { - this.logger.debug("We need to make a new page"); + this.logger.debug( + `We need to make a new page. Bucket '${candidateBucket.id.value}' is full.`, + ); // We need to make a new page. const newBucket = getBucket( `${bucketProperties[0]}_${bucketProperties[1]}_${ @@ -182,7 +184,9 @@ export default class TimebasedBucketizer implements Bucketizer { // The record belongs in this newBucket, so make newBucket the candidateBucket. candidateBucket = newBucket; } else { - this.logger.debug("We need to split the bucket"); + this.logger.debug( + `We need to split the bucket '${candidateBucket.id.value}'.`, + ); // We need to split the bucket. const newBucketSpan = Math.round( parseInt(bucketProperties[1]) / this.k, @@ -200,6 +204,9 @@ export default class TimebasedBucketizer implements Bucketizer { const newBucket = getBucket( `${newTimestamp.toISOString()}_${newBucketSpan}_0`, ); + this.logger.debug( + `Creating new bucket '${newBucket.id.value}' with timespan ${newBucketSpan}.`, + ); // Add the members that belong to the new bucket. this.members @@ -252,6 +259,9 @@ export default class TimebasedBucketizer implements Bucketizer { } else { // Otherwise, make the bucket immutable. newBucket.immutable = true; + this.logger.debug( + `Making bucket '${newBucket.id.value}' immutable.`, + ); } // Add the relations for the new bucket. @@ -293,6 +303,9 @@ export default class TimebasedBucketizer implements Bucketizer { // The record belongs in this candidateBucket, so return it. out.push(candidateBucket); + this.logger.debug( + `Added record '${record.data.id.value}' to bucket '${candidateBucket.id.value}'.`, + ); } else { // The record does not have a timestamp value. this.logger.warn( From 030deeca6c2b67467947f5dd996b50e2b21de773 Mon Sep 17 00:00:00 2001 From: ajuvercr Date: Tue, 27 Aug 2024 15:35:55 +0200 Subject: [PATCH 7/7] chore: remove unused function --- src/bucketizers.ts | 38 -------------------------------------- 1 file changed, 38 deletions(-) diff --git a/src/bucketizers.ts b/src/bucketizers.ts index 14d4269..ee7ce58 100644 --- a/src/bucketizers.ts +++ b/src/bucketizers.ts @@ -22,44 +22,6 @@ async function writeState( } } -/* tslint:disable:no-unused-variable */ -async function prettyPrintQuads(quads: Quad[]): Promise { - quads.sort((a, b) => - a.subject.value == b.subject.value - ? 0 - : a.subject.value > b.subject.value - ? 1 - : -1, - ); - quads.sort((a, b) => - a.graph.value == b.graph.value - ? 0 - : a.graph.value > b.graph.value - ? 1 - : -1, - ); - - const writer = new N3Writer({ - prefixes: { - uk: "http://mumo.be/data/unknown/", - sds: "https://w3id.org/sds#", - data: "http://mumo.be/data/", - ob: "http://def.isotc211.org/iso19156/2011/Observation#", - xsd: "http://www.w3.org/2001/XMLSchema#", - sosa: "http://www.w3.org/ns/sosa/", - }, - format: "application/trig", - }); - writer.addQuads(quads); - - return new Promise((res) => { - writer.end((_error, result) => { - console.log(result); - res(); - }); - }); -} - function addProcess( id: Term | undefined, store: RdfStore,