@rljson/db 0.0.9 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/connector/connector.d.ts +30 -0
- package/dist/controller/base-controller.d.ts +49 -0
- package/dist/controller/cake-controller.d.ts +30 -0
- package/dist/controller/component-controller.d.ts +68 -0
- package/dist/controller/controller.d.ts +48 -0
- package/dist/controller/layer-controller.d.ts +26 -0
- package/dist/controller/slice-id-controller.d.ts +22 -0
- package/dist/db.d.ts +15 -0
- package/dist/db.js +2171 -11
- package/dist/db.js.map +1 -0
- package/dist/edit/edit-action.d.ts +53 -0
- package/dist/edit/edit.d.ts +23 -0
- package/dist/edit/multi-edit-manager.d.ts +30 -0
- package/dist/edit/multi-edit-processor.d.ts +75 -0
- package/dist/example-static/example-static.d.ts +45 -0
- package/dist/index.d.ts +7 -1
- package/dist/join/filter/boolean-filter-processor.d.ts +13 -0
- package/dist/join/filter/boolean-filter.d.ts +15 -0
- package/dist/join/filter/column-filter-processor.d.ts +9 -0
- package/dist/join/filter/column-filter.d.ts +18 -0
- package/dist/join/filter/number-filter-processor.d.ts +16 -0
- package/dist/join/filter/number-filter.d.ts +7 -0
- package/dist/join/filter/row-filter-processor.d.ts +19 -0
- package/dist/join/filter/row-filter.d.ts +19 -0
- package/dist/join/filter/string-filter-processor.d.ts +15 -0
- package/dist/join/filter/string-filter.d.ts +8 -0
- package/dist/join/join.d.ts +141 -0
- package/dist/join/selection/column-selection.d.ts +48 -0
- package/dist/join/set-value/set-value.d.ts +11 -0
- package/dist/join/sort/row-sort.d.ts +18 -0
- package/dist/notify.d.ts +5 -0
- package/dist/tools/inject.d.ts +1 -0
- package/dist/tools/isolate.d.ts +1 -0
- package/dist/tools/make-unique.d.ts +4 -0
- package/dist/tools/merge-trees.d.ts +5 -0
- package/package.json +11 -11
package/dist/db.js
CHANGED
|
@@ -1,9 +1,93 @@
|
|
|
1
|
+
import { timeId, createInsertHistoryTableCfg, Validate, BaseValidator, Route, isTimeId, getTimeIdTimestamp, createSliceIdsTableCfg, createLayerTableCfg, createCakeTableCfg, createHeadsTableCfg } from "@rljson/rljson";
|
|
1
2
|
import { rmhsh, hsh, Hash, hip } from "@rljson/hash";
|
|
2
3
|
import { equals, merge } from "@rljson/json";
|
|
3
|
-
import { timeId, createInsertHistoryTableCfg, Validate, BaseValidator, Route, isTimeId } from "@rljson/rljson";
|
|
4
4
|
import { IoMem } from "@rljson/io";
|
|
5
5
|
import { traverse } from "object-traversal";
|
|
6
6
|
import { compileExpression } from "filtrex";
|
|
7
|
+
class Connector {
|
|
8
|
+
constructor(_db, _route, _socket) {
|
|
9
|
+
this._db = _db;
|
|
10
|
+
this._route = _route;
|
|
11
|
+
this._socket = _socket;
|
|
12
|
+
this._origin = timeId();
|
|
13
|
+
this._init();
|
|
14
|
+
}
|
|
15
|
+
_origin;
|
|
16
|
+
_callbacks = [];
|
|
17
|
+
_isListening = false;
|
|
18
|
+
_sentRefs = /* @__PURE__ */ new Set();
|
|
19
|
+
_receivedRefs = /* @__PURE__ */ new Set();
|
|
20
|
+
send(ref) {
|
|
21
|
+
if (this._sentRefs.has(ref) || this._receivedRefs.has(ref)) return;
|
|
22
|
+
this._sentRefs.add(ref);
|
|
23
|
+
this.socket.emit(this.route.flat, {
|
|
24
|
+
o: this._origin,
|
|
25
|
+
r: ref
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
listen(callback) {
|
|
29
|
+
this._socket.on(this._route.flat, async (payload) => {
|
|
30
|
+
try {
|
|
31
|
+
await callback(payload.r);
|
|
32
|
+
} catch (error) {
|
|
33
|
+
console.error("Error in connector listener callback:", error);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
_init() {
|
|
38
|
+
this._registerSocketObserver();
|
|
39
|
+
this._registerDbObserver();
|
|
40
|
+
this._isListening = true;
|
|
41
|
+
}
|
|
42
|
+
teardown() {
|
|
43
|
+
this._socket.removeAllListeners(this._route.flat);
|
|
44
|
+
this._db.unregisterAllObservers(this._route);
|
|
45
|
+
this._isListening = false;
|
|
46
|
+
}
|
|
47
|
+
_notifyCallbacks(ref) {
|
|
48
|
+
Promise.all(this._callbacks.map((cb) => cb(ref))).catch((err) => {
|
|
49
|
+
console.error(`Error notifying connector callbacks for ref ${ref}:`, err);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
_registerSocketObserver() {
|
|
53
|
+
this.socket.on(this.route.flat, (p) => {
|
|
54
|
+
if (p.o === this._origin) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const ref = p.r;
|
|
58
|
+
if (this._receivedRefs.has(ref)) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this._receivedRefs.add(p.r);
|
|
62
|
+
this._notifyCallbacks(p.r);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
_registerDbObserver() {
|
|
66
|
+
this._db.registerObserver(this._route, (ins) => {
|
|
67
|
+
return new Promise((resolve) => {
|
|
68
|
+
const ref = ins[this.route.root.tableKey + "Ref"];
|
|
69
|
+
if (this._sentRefs.has(ref)) {
|
|
70
|
+
resolve();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
this.send(ref);
|
|
74
|
+
resolve();
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
get socket() {
|
|
79
|
+
return this._socket;
|
|
80
|
+
}
|
|
81
|
+
get route() {
|
|
82
|
+
return this._route;
|
|
83
|
+
}
|
|
84
|
+
get origin() {
|
|
85
|
+
return this._origin;
|
|
86
|
+
}
|
|
87
|
+
get isListening() {
|
|
88
|
+
return this._isListening;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
7
91
|
class BaseController {
|
|
8
92
|
constructor(_core, _tableKey) {
|
|
9
93
|
this._core = _core;
|
|
@@ -952,8 +1036,8 @@ class Core {
|
|
|
952
1036
|
* @returns a dump of a table.
|
|
953
1037
|
* @throws when table name does not exist
|
|
954
1038
|
*/
|
|
955
|
-
dumpTable(table) {
|
|
956
|
-
return this._io.dumpTable({ table });
|
|
1039
|
+
async dumpTable(table) {
|
|
1040
|
+
return await this._io.dumpTable({ table });
|
|
957
1041
|
}
|
|
958
1042
|
// ...........................................................................
|
|
959
1043
|
/**
|
|
@@ -982,8 +1066,7 @@ class Core {
|
|
|
982
1066
|
}
|
|
983
1067
|
// ...........................................................................
|
|
984
1068
|
async contentType(table) {
|
|
985
|
-
const
|
|
986
|
-
const contentType = t[table]?._type;
|
|
1069
|
+
const contentType = await this._io.contentType({ table });
|
|
987
1070
|
return contentType;
|
|
988
1071
|
}
|
|
989
1072
|
// ...........................................................................
|
|
@@ -1003,12 +1086,12 @@ class Core {
|
|
|
1003
1086
|
}
|
|
1004
1087
|
// ...........................................................................
|
|
1005
1088
|
/** Reads a specific row from a database table */
|
|
1006
|
-
readRow(table, rowHash) {
|
|
1007
|
-
return this._io.readRows({ table, where: { _hash: rowHash } });
|
|
1089
|
+
async readRow(table, rowHash) {
|
|
1090
|
+
return await this._io.readRows({ table, where: { _hash: rowHash } });
|
|
1008
1091
|
}
|
|
1009
1092
|
// ...........................................................................
|
|
1010
|
-
readRows(table, where) {
|
|
1011
|
-
return this._io.readRows({ table, where });
|
|
1093
|
+
async readRows(table, where) {
|
|
1094
|
+
return await this._io.readRows({ table, where });
|
|
1012
1095
|
}
|
|
1013
1096
|
}
|
|
1014
1097
|
const inject = (tree, path, value) => {
|
|
@@ -2558,6 +2641,14 @@ class Notify {
|
|
|
2558
2641
|
}
|
|
2559
2642
|
}
|
|
2560
2643
|
// ...........................................................................
|
|
2644
|
+
/**
|
|
2645
|
+
* Unregisters all callbacks for a specific route.
|
|
2646
|
+
* @param route The route to unregister all callbacks from.
|
|
2647
|
+
*/
|
|
2648
|
+
unregisterAll(route) {
|
|
2649
|
+
this._callbacks.delete(route.flat);
|
|
2650
|
+
}
|
|
2651
|
+
// ...........................................................................
|
|
2561
2652
|
/**
|
|
2562
2653
|
* Notifies all registered callbacks for a specific route with the provided edit protocol row.
|
|
2563
2654
|
* @param route The route to notify callbacks for.
|
|
@@ -3400,6 +3491,13 @@ class Db {
|
|
|
3400
3491
|
this.notify.unregister(route, callback);
|
|
3401
3492
|
}
|
|
3402
3493
|
// ...........................................................................
|
|
3494
|
+
/**
|
|
3495
|
+
* Unregisters all observers from all routes
|
|
3496
|
+
*/
|
|
3497
|
+
unregisterAllObservers(route) {
|
|
3498
|
+
this.notify.unregisterAll(route);
|
|
3499
|
+
}
|
|
3500
|
+
// ...........................................................................
|
|
3403
3501
|
/**
|
|
3404
3502
|
* Get a controller for a specific table
|
|
3405
3503
|
* @param tableKey - The key of the table to get the controller for
|
|
@@ -3553,7 +3651,9 @@ class Db {
|
|
|
3553
3651
|
cakeKey + "EditHistory"
|
|
3554
3652
|
);
|
|
3555
3653
|
const { [cakeKey + "EditHistory"]: result } = await editHistoryController.get(where);
|
|
3556
|
-
return result._data
|
|
3654
|
+
return result._data.sort(
|
|
3655
|
+
(h1, h2) => getTimeIdTimestamp(h2.timeId) - getTimeIdTimestamp(h1.timeId)
|
|
3656
|
+
);
|
|
3557
3657
|
}
|
|
3558
3658
|
// ...........................................................................
|
|
3559
3659
|
/**
|
|
@@ -3702,13 +3802,2073 @@ class Db {
|
|
|
3702
3802
|
return result;
|
|
3703
3803
|
}
|
|
3704
3804
|
// ...........................................................................
|
|
3805
|
+
/**
|
|
3806
|
+
* Clone the Db instance with a new Io instance
|
|
3807
|
+
* @param io - The new Io instance
|
|
3808
|
+
* @returns A new Db instance with the same cache as the current instance
|
|
3809
|
+
*/
|
|
3810
|
+
clone(io) {
|
|
3811
|
+
const newDb = new Db(io);
|
|
3812
|
+
newDb.setCache(new Map(this._cache));
|
|
3813
|
+
return newDb;
|
|
3814
|
+
}
|
|
3815
|
+
// ...........................................................................
|
|
3705
3816
|
/**
|
|
3706
3817
|
* Get the current cache of the Db instance
|
|
3707
3818
|
*/
|
|
3708
3819
|
get cache() {
|
|
3709
3820
|
return this._cache;
|
|
3710
3821
|
}
|
|
3822
|
+
// ...........................................................................
|
|
3823
|
+
/**
|
|
3824
|
+
* Set the cache of the Db instance
|
|
3825
|
+
* @param cache - The new cache to set
|
|
3826
|
+
*/
|
|
3827
|
+
setCache(cache) {
|
|
3828
|
+
this._cache = cache;
|
|
3829
|
+
}
|
|
3830
|
+
}
|
|
3831
|
+
const exampleEditActionColumnSelection = () => ({
|
|
3832
|
+
name: "Car Selection",
|
|
3833
|
+
type: "selection",
|
|
3834
|
+
data: {
|
|
3835
|
+
columns: ColumnSelection.exampleCarsColumnSelection().columns
|
|
3836
|
+
},
|
|
3837
|
+
_hash: ""
|
|
3838
|
+
});
|
|
3839
|
+
const exampleEditActionColumnSelectionOnlySomeColumns = () => ({
|
|
3840
|
+
name: "Car Selection - Some Columns",
|
|
3841
|
+
type: "selection",
|
|
3842
|
+
data: {
|
|
3843
|
+
columns: ColumnSelection.exampleCarsColumnSelectionOnlySomeColumns().columns
|
|
3844
|
+
},
|
|
3845
|
+
_hash: ""
|
|
3846
|
+
});
|
|
3847
|
+
const exampleEditActionRowFilter = () => ({
|
|
3848
|
+
name: "Electric Cars Filter",
|
|
3849
|
+
type: "filter",
|
|
3850
|
+
data: {
|
|
3851
|
+
columnFilters: [
|
|
3852
|
+
{
|
|
3853
|
+
type: "boolean",
|
|
3854
|
+
column: "carCake/carGeneralLayer/carGeneral/isElectric",
|
|
3855
|
+
operator: "equals",
|
|
3856
|
+
search: true,
|
|
3857
|
+
_hash: ""
|
|
3858
|
+
},
|
|
3859
|
+
{
|
|
3860
|
+
type: "number",
|
|
3861
|
+
column: "carCake/carTechnicalLayer/carTechnical/carDimensions/length",
|
|
3862
|
+
operator: "greaterThan",
|
|
3863
|
+
search: 4e3,
|
|
3864
|
+
_hash: ""
|
|
3865
|
+
}
|
|
3866
|
+
],
|
|
3867
|
+
operator: "and",
|
|
3868
|
+
value: true,
|
|
3869
|
+
_hash: ""
|
|
3870
|
+
},
|
|
3871
|
+
_hash: ""
|
|
3872
|
+
});
|
|
3873
|
+
const exampleEditActionSetValue = () => ({
|
|
3874
|
+
name: "Set: Service Intervals to [15000, 30000, 45000, 60000]",
|
|
3875
|
+
type: "setValue",
|
|
3876
|
+
data: {
|
|
3877
|
+
route: "carCake/carGeneralLayer/carGeneral/serviceIntervals",
|
|
3878
|
+
value: [15e3, 3e4, 45e3, 6e4],
|
|
3879
|
+
_hash: ""
|
|
3880
|
+
},
|
|
3881
|
+
_hash: ""
|
|
3882
|
+
});
|
|
3883
|
+
const exampleEditSetValueReferenced = () => ({
|
|
3884
|
+
name: "Set: Length to 4200",
|
|
3885
|
+
type: "setValue",
|
|
3886
|
+
data: {
|
|
3887
|
+
route: "carCake/carTechnicalLayer/carTechnical/carDimensions/length",
|
|
3888
|
+
value: 4800,
|
|
3889
|
+
_hash: ""
|
|
3890
|
+
},
|
|
3891
|
+
_hash: ""
|
|
3892
|
+
});
|
|
3893
|
+
const exampleEditActionRowSort = () => ({
|
|
3894
|
+
name: "Sort By Brand Edit",
|
|
3895
|
+
type: "sort",
|
|
3896
|
+
data: {
|
|
3897
|
+
["carCake/carGeneralLayer/carGeneral/brand"]: "asc"
|
|
3898
|
+
},
|
|
3899
|
+
_hash: ""
|
|
3900
|
+
});
|
|
3901
|
+
class RowSort {
|
|
3902
|
+
constructor(columnSorts) {
|
|
3903
|
+
this._columnSorts = this._initColumnSorts(columnSorts);
|
|
3904
|
+
}
|
|
3905
|
+
// ...........................................................................
|
|
3906
|
+
/**
|
|
3907
|
+
* Sorts the rows of a join according to the sort configuration.
|
|
3908
|
+
* @param join - The join to be sorted
|
|
3909
|
+
* @returns Returns the row indices in a sorted manner
|
|
3910
|
+
*/
|
|
3911
|
+
applyTo(join) {
|
|
3912
|
+
if (join.rowCount === 0) {
|
|
3913
|
+
return join.rowIndices;
|
|
3914
|
+
}
|
|
3915
|
+
this._throwOnWrongRoutes(join);
|
|
3916
|
+
const routeHashes = join.columnSelection.routeHashes;
|
|
3917
|
+
const sortIndices = [];
|
|
3918
|
+
const sortOrders = [];
|
|
3919
|
+
let hasSorts = false;
|
|
3920
|
+
for (const item of this._columnSorts) {
|
|
3921
|
+
const index = routeHashes.indexOf(item.routeHash);
|
|
3922
|
+
sortIndices.push(index);
|
|
3923
|
+
sortOrders.push(item.order);
|
|
3924
|
+
hasSorts = true;
|
|
3925
|
+
}
|
|
3926
|
+
if (!hasSorts) {
|
|
3927
|
+
return join.rowIndices;
|
|
3928
|
+
}
|
|
3929
|
+
return this._sortRows(join, sortIndices, sortOrders);
|
|
3930
|
+
}
|
|
3931
|
+
// ...........................................................................
|
|
3932
|
+
/* v8 ignore next -- @preserve */
|
|
3933
|
+
get columnSorts() {
|
|
3934
|
+
const result = {};
|
|
3935
|
+
for (const sort of this._columnSorts) {
|
|
3936
|
+
result[sort.route] = sort.order;
|
|
3937
|
+
}
|
|
3938
|
+
return result;
|
|
3939
|
+
}
|
|
3940
|
+
// ######################
|
|
3941
|
+
// Private
|
|
3942
|
+
// ######################
|
|
3943
|
+
_columnSorts;
|
|
3944
|
+
// ...........................................................................
|
|
3945
|
+
_initColumnSorts(columnSorts) {
|
|
3946
|
+
const result = [];
|
|
3947
|
+
const columns = Object.keys(columnSorts);
|
|
3948
|
+
const columnSelection = ColumnSelection.fromRoutes(
|
|
3949
|
+
columns.map((c) => Route.fromFlat(c))
|
|
3950
|
+
);
|
|
3951
|
+
const routes = columnSelection.routes;
|
|
3952
|
+
const routeHashes = columnSelection.routeHashes;
|
|
3953
|
+
for (let i = 0; i < routes.length; i++) {
|
|
3954
|
+
const route = routes[i];
|
|
3955
|
+
const routeHash = routeHashes[i];
|
|
3956
|
+
result.push({
|
|
3957
|
+
route,
|
|
3958
|
+
routeHash,
|
|
3959
|
+
order: columnSorts[route]
|
|
3960
|
+
});
|
|
3961
|
+
}
|
|
3962
|
+
return result;
|
|
3963
|
+
}
|
|
3964
|
+
// ...........................................................................
|
|
3965
|
+
_sortRows(join, sortIndices, sortOrders) {
|
|
3966
|
+
const result = [...join.rowIndices];
|
|
3967
|
+
return result.sort((a, b) => {
|
|
3968
|
+
const rowA = join.row(a);
|
|
3969
|
+
const rowB = join.row(b);
|
|
3970
|
+
let i = 0;
|
|
3971
|
+
for (const index of sortIndices) {
|
|
3972
|
+
const sort = sortOrders[i++];
|
|
3973
|
+
const rowAInsertValues = rowA[index].inserts ? Array.isArray(rowA[index].inserts[0].cell[0].value) ? rowA[index].inserts[0].cell[0].value : [rowA[index].inserts[0].cell[0].value] : null;
|
|
3974
|
+
const rowAValue = rowA[index].value.cell[0].value ? Array.isArray(rowA[index].value?.cell[0].value) ? rowA[index].value.cell[0].value : [rowA[index].value.cell[0].value] : null;
|
|
3975
|
+
const rowBInsertValues = rowB[index].inserts ? Array.isArray(rowB[index].inserts[0].cell[0].value) ? rowB[index].inserts[0].cell[0].value : [rowB[index].inserts[0].cell[0].value] : null;
|
|
3976
|
+
const rowBValue = rowB[index].value.cell[0].value ? Array.isArray(rowB[index].value?.cell[0].value) ? rowB[index].value.cell[0].value : [rowB[index].value.cell[0].value] : null;
|
|
3977
|
+
const vA = rowAInsertValues && rowAInsertValues[0] ? rowAInsertValues[0] : rowAValue ? rowAValue[0] : null;
|
|
3978
|
+
const vB = rowBInsertValues && rowBInsertValues[0] ? rowBInsertValues[0] : rowBValue ? rowBValue[0] : null;
|
|
3979
|
+
if (vA === vB) {
|
|
3980
|
+
continue;
|
|
3981
|
+
}
|
|
3982
|
+
if (sort === "asc") {
|
|
3983
|
+
return vA < vB ? -1 : 1;
|
|
3984
|
+
} else {
|
|
3985
|
+
return vA < vB ? 1 : -1;
|
|
3986
|
+
}
|
|
3987
|
+
}
|
|
3988
|
+
return 0;
|
|
3989
|
+
});
|
|
3990
|
+
}
|
|
3991
|
+
// ...........................................................................
|
|
3992
|
+
_throwOnWrongRoutes(join) {
|
|
3993
|
+
const availableRoutes = join.columnSelection.routes;
|
|
3994
|
+
for (const item of Object.values(this._columnSorts)) {
|
|
3995
|
+
const route = item.route;
|
|
3996
|
+
if (availableRoutes.includes(route) === false) {
|
|
3997
|
+
throw new Error(
|
|
3998
|
+
`RowFilterProcessor: Error while applying sort to join: There is a sort entry for route "${route}", but the join does not have a column with this route.
|
|
3999
|
+
|
|
4000
|
+
Available routes:
|
|
4001
|
+
${availableRoutes.map((a) => `- ${a}`).join("\n")}`
|
|
4002
|
+
);
|
|
4003
|
+
}
|
|
4004
|
+
}
|
|
4005
|
+
}
|
|
4006
|
+
}
|
|
4007
|
+
class MultiEditProcessor {
|
|
4008
|
+
constructor(_db, _cakeKey, _cakeRef) {
|
|
4009
|
+
this._db = _db;
|
|
4010
|
+
this._cakeKey = _cakeKey;
|
|
4011
|
+
this._cakeRef = _cakeRef;
|
|
4012
|
+
}
|
|
4013
|
+
_multiEdit = null;
|
|
4014
|
+
_edits = [];
|
|
4015
|
+
_join = null;
|
|
4016
|
+
//...........................................................................
|
|
4017
|
+
/**
|
|
4018
|
+
* Create MultiEditProcessor from EditHistory
|
|
4019
|
+
* @param db - Db instance
|
|
4020
|
+
* @param cakeKey - Cake key
|
|
4021
|
+
* @param editHistory - EditHistory
|
|
4022
|
+
* @returns MultiEditProcessor
|
|
4023
|
+
*/
|
|
4024
|
+
static async fromEditHistory(db, cakeKey, editHistory) {
|
|
4025
|
+
if (!editHistory || !editHistory.multiEditRef) {
|
|
4026
|
+
throw new Error("MultiEditProcessor: Invalid EditHistory provided.");
|
|
4027
|
+
}
|
|
4028
|
+
const cakeRef = editHistory.dataRef;
|
|
4029
|
+
const multiEdits = await db.getMultiEdits(
|
|
4030
|
+
cakeKey,
|
|
4031
|
+
editHistory.multiEditRef
|
|
4032
|
+
);
|
|
4033
|
+
if (!multiEdits || multiEdits.length === 0) {
|
|
4034
|
+
throw new Error(
|
|
4035
|
+
`MultiEditProcessor: MultiEdit not found for ref ${editHistory.multiEditRef}`
|
|
4036
|
+
);
|
|
4037
|
+
}
|
|
4038
|
+
if (multiEdits.length > 1) {
|
|
4039
|
+
throw new Error(
|
|
4040
|
+
`MultiEditProcessor: Multiple MultiEdits found for ref ${editHistory.multiEditRef}`
|
|
4041
|
+
);
|
|
4042
|
+
}
|
|
4043
|
+
const multiEdit = multiEdits[0];
|
|
4044
|
+
return MultiEditProcessor.fromMultiEdit(db, cakeKey, cakeRef, multiEdit);
|
|
4045
|
+
}
|
|
4046
|
+
//...........................................................................
|
|
4047
|
+
/**
|
|
4048
|
+
* Create MultiEditProcessor from MultiEdit
|
|
4049
|
+
* @param db - Db instance
|
|
4050
|
+
* @param cakeKey - Cake key
|
|
4051
|
+
* @param cakeRef - Cake ref
|
|
4052
|
+
* @param multiEdit - MultiEdit
|
|
4053
|
+
* @returns MultiEditProcessor
|
|
4054
|
+
*/
|
|
4055
|
+
static async fromMultiEdit(db, cakeKey, cakeRef, multiEdit) {
|
|
4056
|
+
const processor = new MultiEditProcessor(db, cakeKey, cakeRef);
|
|
4057
|
+
await processor._resolve(multiEdit);
|
|
4058
|
+
await processor._processAll();
|
|
4059
|
+
return processor;
|
|
4060
|
+
}
|
|
4061
|
+
get join() {
|
|
4062
|
+
if (!this._join) {
|
|
4063
|
+
throw new Error("MultiEditProcessor: Join not processed yet.");
|
|
4064
|
+
}
|
|
4065
|
+
return this._join;
|
|
4066
|
+
}
|
|
4067
|
+
get multiEdit() {
|
|
4068
|
+
if (!this._multiEdit) {
|
|
4069
|
+
throw new Error("MultiEditProcessor: MultiEdit not resolved yet.");
|
|
4070
|
+
}
|
|
4071
|
+
return this._multiEdit;
|
|
4072
|
+
}
|
|
4073
|
+
get cakeRef() {
|
|
4074
|
+
return this._cakeRef;
|
|
4075
|
+
}
|
|
4076
|
+
//...........................................................................
|
|
4077
|
+
/**
|
|
4078
|
+
* Apply an Edit to the MultiEditProcessor
|
|
4079
|
+
* @param edit - Edit to apply
|
|
4080
|
+
* @returns MultiEditProcessor
|
|
4081
|
+
*/
|
|
4082
|
+
async edit(edit) {
|
|
4083
|
+
this._edits.push(edit);
|
|
4084
|
+
this._join = await this._process(edit);
|
|
4085
|
+
this._multiEdit = hip({
|
|
4086
|
+
_hash: "",
|
|
4087
|
+
edit: edit._hash,
|
|
4088
|
+
previous: this.multiEdit ? this.multiEdit._hash : null
|
|
4089
|
+
});
|
|
4090
|
+
return this;
|
|
4091
|
+
}
|
|
4092
|
+
async applyEditHistory(editHistory) {
|
|
4093
|
+
if (!editHistory || !editHistory.multiEditRef) {
|
|
4094
|
+
throw new Error("MultiEditProcessor: Invalid EditHistory provided.");
|
|
4095
|
+
}
|
|
4096
|
+
const multiEdits = await this._db.getMultiEdits(
|
|
4097
|
+
this._cakeKey,
|
|
4098
|
+
editHistory.multiEditRef
|
|
4099
|
+
);
|
|
4100
|
+
if (!multiEdits || multiEdits.length === 0) {
|
|
4101
|
+
throw new Error(
|
|
4102
|
+
`MultiEditProcessor: MultiEdit not found for ref ${editHistory.multiEditRef}`
|
|
4103
|
+
);
|
|
4104
|
+
}
|
|
4105
|
+
if (multiEdits.length > 1) {
|
|
4106
|
+
throw new Error(
|
|
4107
|
+
`MultiEditProcessor: Multiple MultiEdits found for ref ${editHistory.multiEditRef}`
|
|
4108
|
+
);
|
|
4109
|
+
}
|
|
4110
|
+
const multiEdit = multiEdits[0];
|
|
4111
|
+
await this._resolve(multiEdit);
|
|
4112
|
+
await this._processAll();
|
|
4113
|
+
return this;
|
|
4114
|
+
}
|
|
4115
|
+
//...........................................................................
|
|
4116
|
+
/**
|
|
4117
|
+
* Publish the MultiEditProcessor. Inserts the resulting Join as new data,
|
|
4118
|
+
* updates the head revision, and saves the resulting MultiEdit.
|
|
4119
|
+
* @param options - Publish options
|
|
4120
|
+
* @returns MultiEditProcessor
|
|
4121
|
+
*/
|
|
4122
|
+
async publish(options) {
|
|
4123
|
+
const inserts = this.join.insert();
|
|
4124
|
+
if (inserts.length === 0) {
|
|
4125
|
+
throw new Error("MultiEditProcessor: No inserts to publish.");
|
|
4126
|
+
}
|
|
4127
|
+
if (inserts.length > 1) {
|
|
4128
|
+
throw new Error(
|
|
4129
|
+
"MultiEditProcessor: Multiple inserts not supported yet."
|
|
4130
|
+
);
|
|
4131
|
+
}
|
|
4132
|
+
const insert = inserts[0];
|
|
4133
|
+
const inserteds = await this._db.insert(insert.route, insert.tree);
|
|
4134
|
+
if (inserteds.length === 0) {
|
|
4135
|
+
throw new Error("MultiEditProcessor: No rows inserted.");
|
|
4136
|
+
}
|
|
4137
|
+
if (inserteds.length > 1) {
|
|
4138
|
+
throw new Error(
|
|
4139
|
+
"MultiEditProcessor: Multiple inserted rows not supported yet."
|
|
4140
|
+
);
|
|
4141
|
+
}
|
|
4142
|
+
const inserted = inserteds[0];
|
|
4143
|
+
const writtenCakeRef = inserted[this._cakeKey + "Ref"];
|
|
4144
|
+
if (!options?.skipHeadUpdate) {
|
|
4145
|
+
await this._db.addHeadRevision(this._cakeKey, writtenCakeRef);
|
|
4146
|
+
}
|
|
4147
|
+
if (!options?.skipSaveMultiEdit) {
|
|
4148
|
+
await this._db.addMultiEdit(this._cakeKey, this._multiEdit);
|
|
4149
|
+
}
|
|
4150
|
+
return new MultiEditProcessor(this._db, this._cakeKey, writtenCakeRef);
|
|
4151
|
+
}
|
|
4152
|
+
//...........................................................................
|
|
4153
|
+
/**
|
|
4154
|
+
* Clone the MultiEditProcessor
|
|
4155
|
+
* @returns Cloned MultiEditProcessor
|
|
4156
|
+
*/
|
|
4157
|
+
clone() {
|
|
4158
|
+
const clone = new MultiEditProcessor(
|
|
4159
|
+
this._db,
|
|
4160
|
+
this._cakeKey,
|
|
4161
|
+
this._cakeRef
|
|
4162
|
+
);
|
|
4163
|
+
clone._multiEdit = this._multiEdit;
|
|
4164
|
+
clone._edits = [...this._edits];
|
|
4165
|
+
clone._join = this._join;
|
|
4166
|
+
return clone;
|
|
4167
|
+
}
|
|
4168
|
+
//...........................................................................
|
|
4169
|
+
/**
|
|
4170
|
+
* Resolve MultiEdit chain recursively
|
|
4171
|
+
* @param multiEdit - MultiEdit to resolve
|
|
4172
|
+
* @returns Promise<void>
|
|
4173
|
+
*/
|
|
4174
|
+
async _resolve(multiEdit) {
|
|
4175
|
+
this._multiEdit = multiEdit;
|
|
4176
|
+
const edits = await this._db.getEdits(this._cakeKey, multiEdit.edit);
|
|
4177
|
+
if (edits.length === 0) {
|
|
4178
|
+
throw new Error(
|
|
4179
|
+
`MultiEditProcessor: Edit not found for ref ${multiEdit.edit}`
|
|
4180
|
+
);
|
|
4181
|
+
}
|
|
4182
|
+
if (edits.length > 1) {
|
|
4183
|
+
throw new Error(
|
|
4184
|
+
`MultiEditProcessor: Multiple Edits found for ref ${multiEdit.edit}`
|
|
4185
|
+
);
|
|
4186
|
+
}
|
|
4187
|
+
const edit = edits[0];
|
|
4188
|
+
this._edits.push(edit);
|
|
4189
|
+
if (multiEdit.previous) {
|
|
4190
|
+
const previousMultiEdits = await this._db.getMultiEdits(
|
|
4191
|
+
this._cakeKey,
|
|
4192
|
+
multiEdit.previous
|
|
4193
|
+
);
|
|
4194
|
+
const previousMultiEdit = previousMultiEdits[0];
|
|
4195
|
+
return this._resolve(previousMultiEdit);
|
|
4196
|
+
}
|
|
4197
|
+
}
|
|
4198
|
+
//...........................................................................
|
|
4199
|
+
/**
|
|
4200
|
+
* Process all Edits in the MultiEditProcessor
|
|
4201
|
+
* @returns Resulting Join
|
|
4202
|
+
*/
|
|
4203
|
+
async _processAll() {
|
|
4204
|
+
for (let i = this._edits.length - 1; i >= 0; i--) {
|
|
4205
|
+
const edit = this._edits[i];
|
|
4206
|
+
this._join = await this._process(edit);
|
|
4207
|
+
}
|
|
4208
|
+
return this._join;
|
|
4209
|
+
}
|
|
4210
|
+
//...........................................................................
|
|
4211
|
+
/**
|
|
4212
|
+
* Process a single Edit and update the Join
|
|
4213
|
+
* @param edit - Edit to process
|
|
4214
|
+
* @returns Resulting Join
|
|
4215
|
+
*/
|
|
4216
|
+
async _process(edit) {
|
|
4217
|
+
const action = edit.action;
|
|
4218
|
+
if (!this._join) {
|
|
4219
|
+
switch (action.type) {
|
|
4220
|
+
case "selection":
|
|
4221
|
+
const editColInfos = edit.action.data.columns;
|
|
4222
|
+
const editColSelection = new ColumnSelection(editColInfos);
|
|
4223
|
+
this._join = await this._db.join(
|
|
4224
|
+
editColSelection,
|
|
4225
|
+
this._cakeKey,
|
|
4226
|
+
this._cakeRef
|
|
4227
|
+
);
|
|
4228
|
+
break;
|
|
4229
|
+
case "setValue":
|
|
4230
|
+
const editSetValue = edit.action.data;
|
|
4231
|
+
const editSetValueKey = Route.fromFlat(editSetValue.route).segment().tableKey;
|
|
4232
|
+
const editSetValueColumnInfo = {
|
|
4233
|
+
key: editSetValueKey,
|
|
4234
|
+
route: editSetValue.route,
|
|
4235
|
+
alias: editSetValueKey,
|
|
4236
|
+
titleLong: "",
|
|
4237
|
+
titleShort: "",
|
|
4238
|
+
type: "jsonValue",
|
|
4239
|
+
_hash: ""
|
|
4240
|
+
};
|
|
4241
|
+
const editSetValueColSelection = new ColumnSelection([
|
|
4242
|
+
editSetValueColumnInfo
|
|
4243
|
+
]);
|
|
4244
|
+
this._join = (await this._db.join(
|
|
4245
|
+
editSetValueColSelection,
|
|
4246
|
+
this._cakeKey,
|
|
4247
|
+
this._cakeRef
|
|
4248
|
+
)).setValue(editSetValue);
|
|
4249
|
+
break;
|
|
4250
|
+
case "sort":
|
|
4251
|
+
const editRowSort = rmhsh(edit).action.data;
|
|
4252
|
+
const editRowSortColumnInfos = [];
|
|
4253
|
+
for (const routeStr of Object.keys(editRowSort)) {
|
|
4254
|
+
const route = Route.fromFlat(routeStr);
|
|
4255
|
+
const tableKey = route.segment().tableKey;
|
|
4256
|
+
const columnInfo = {
|
|
4257
|
+
key: tableKey,
|
|
4258
|
+
route: routeStr,
|
|
4259
|
+
alias: tableKey,
|
|
4260
|
+
titleLong: "",
|
|
4261
|
+
titleShort: "",
|
|
4262
|
+
type: "jsonValue",
|
|
4263
|
+
_hash: ""
|
|
4264
|
+
};
|
|
4265
|
+
editRowSortColumnInfos.push(columnInfo);
|
|
4266
|
+
}
|
|
4267
|
+
const editRowSortColSelection = new ColumnSelection(
|
|
4268
|
+
editRowSortColumnInfos
|
|
4269
|
+
);
|
|
4270
|
+
this._join = (await this._db.join(
|
|
4271
|
+
editRowSortColSelection,
|
|
4272
|
+
this._cakeKey,
|
|
4273
|
+
this._cakeRef
|
|
4274
|
+
)).sort(new RowSort(editRowSort));
|
|
4275
|
+
break;
|
|
4276
|
+
case "filter":
|
|
4277
|
+
const editRowFilter = edit.action.data;
|
|
4278
|
+
const editRowFilterColumnInfos = [];
|
|
4279
|
+
for (const colFilter of editRowFilter.columnFilters) {
|
|
4280
|
+
const route = Route.fromFlat(colFilter.column);
|
|
4281
|
+
const tableKey = route.segment().tableKey;
|
|
4282
|
+
const columnInfo = {
|
|
4283
|
+
key: tableKey,
|
|
4284
|
+
route: colFilter.column,
|
|
4285
|
+
alias: tableKey,
|
|
4286
|
+
titleLong: "",
|
|
4287
|
+
titleShort: "",
|
|
4288
|
+
type: "jsonValue",
|
|
4289
|
+
_hash: ""
|
|
4290
|
+
};
|
|
4291
|
+
editRowFilterColumnInfos.push(columnInfo);
|
|
4292
|
+
}
|
|
4293
|
+
const editRowFilterColSelection = new ColumnSelection(
|
|
4294
|
+
editRowFilterColumnInfos
|
|
4295
|
+
);
|
|
4296
|
+
this._join = (await this._db.join(
|
|
4297
|
+
editRowFilterColSelection,
|
|
4298
|
+
this._cakeKey,
|
|
4299
|
+
this._cakeRef
|
|
4300
|
+
)).filter(editRowFilter);
|
|
4301
|
+
break;
|
|
4302
|
+
}
|
|
4303
|
+
} else {
|
|
4304
|
+
switch (action.type) {
|
|
4305
|
+
case "selection":
|
|
4306
|
+
const editColInfos = edit.action.data.columns;
|
|
4307
|
+
const editColSelection = new ColumnSelection(editColInfos);
|
|
4308
|
+
this._join = this._join.select(editColSelection);
|
|
4309
|
+
break;
|
|
4310
|
+
case "setValue":
|
|
4311
|
+
const editSetValue = rmhsh(
|
|
4312
|
+
edit.action.data
|
|
4313
|
+
);
|
|
4314
|
+
this._join = this._join.setValue(editSetValue);
|
|
4315
|
+
break;
|
|
4316
|
+
case "sort":
|
|
4317
|
+
const editRowSort = rmhsh(
|
|
4318
|
+
edit.action.data
|
|
4319
|
+
);
|
|
4320
|
+
this._join = this._join.sort(new RowSort(editRowSort));
|
|
4321
|
+
break;
|
|
4322
|
+
case "filter":
|
|
4323
|
+
const editRowFilter = rmhsh(
|
|
4324
|
+
edit.action.data
|
|
4325
|
+
);
|
|
4326
|
+
this._join = this._join.filter(editRowFilter);
|
|
4327
|
+
break;
|
|
4328
|
+
}
|
|
4329
|
+
}
|
|
4330
|
+
return this._join;
|
|
4331
|
+
}
|
|
4332
|
+
}
|
|
4333
|
+
class MultiEditManager {
|
|
4334
|
+
constructor(_cakeKey, _db) {
|
|
4335
|
+
this._cakeKey = _cakeKey;
|
|
4336
|
+
this._db = _db;
|
|
4337
|
+
}
|
|
4338
|
+
_head = null;
|
|
4339
|
+
_headListener = [];
|
|
4340
|
+
_processors = /* @__PURE__ */ new Map();
|
|
4341
|
+
_isListening = false;
|
|
4342
|
+
init() {
|
|
4343
|
+
const editHistoryKey = `${this._cakeKey}EditHistory`;
|
|
4344
|
+
this._db.registerObserver(
|
|
4345
|
+
Route.fromFlat(editHistoryKey),
|
|
4346
|
+
(ins) => {
|
|
4347
|
+
const editHistoryRef = ins[editHistoryKey + "Ref"];
|
|
4348
|
+
return this.editHistoryRef(editHistoryRef);
|
|
4349
|
+
}
|
|
4350
|
+
);
|
|
4351
|
+
this._isListening = true;
|
|
4352
|
+
}
|
|
4353
|
+
tearDown() {
|
|
4354
|
+
const editHistoryKey = `${this._cakeKey}EditHistory`;
|
|
4355
|
+
this._db.unregisterAllObservers(Route.fromFlat(editHistoryKey));
|
|
4356
|
+
this._isListening = false;
|
|
4357
|
+
}
|
|
4358
|
+
async edit(edit, cakeRef) {
|
|
4359
|
+
if (!this.head && !cakeRef) {
|
|
4360
|
+
throw new Error(
|
|
4361
|
+
"No head MultiEditProcessor available. Provide a cakeRef."
|
|
4362
|
+
);
|
|
4363
|
+
}
|
|
4364
|
+
if (this.head && cakeRef) {
|
|
4365
|
+
throw new Error(
|
|
4366
|
+
"Head MultiEditProcessor already exists. Do not provide a cakeRef."
|
|
4367
|
+
);
|
|
4368
|
+
}
|
|
4369
|
+
await this._persistEdit(edit);
|
|
4370
|
+
let multiEditProc;
|
|
4371
|
+
if (!this.head) {
|
|
4372
|
+
const multiEdit = {
|
|
4373
|
+
_hash: "",
|
|
4374
|
+
edit: hsh(edit)._hash,
|
|
4375
|
+
previous: null
|
|
4376
|
+
};
|
|
4377
|
+
await this._persistMultiEdit(multiEdit);
|
|
4378
|
+
multiEditProc = await MultiEditProcessor.fromMultiEdit(
|
|
4379
|
+
this._db,
|
|
4380
|
+
this._cakeKey,
|
|
4381
|
+
cakeRef,
|
|
4382
|
+
multiEdit
|
|
4383
|
+
);
|
|
4384
|
+
} else {
|
|
4385
|
+
multiEditProc = await this.head.processor.edit(edit);
|
|
4386
|
+
}
|
|
4387
|
+
const multiEditRef = await this._persistMultiEdit(multiEditProc.multiEdit);
|
|
4388
|
+
const editHistoryRef = await this._persistEditHistory({
|
|
4389
|
+
_hash: "",
|
|
4390
|
+
dataRef: multiEditProc.cakeRef,
|
|
4391
|
+
multiEditRef: await multiEditRef,
|
|
4392
|
+
timeId: timeId(),
|
|
4393
|
+
previous: !!this.head && this.head.editHistoryRef ? [this.head.editHistoryRef] : null
|
|
4394
|
+
});
|
|
4395
|
+
this._processors.set(editHistoryRef, multiEditProc);
|
|
4396
|
+
this._head = {
|
|
4397
|
+
editHistoryRef,
|
|
4398
|
+
processor: multiEditProc
|
|
4399
|
+
};
|
|
4400
|
+
await this._notifyHeadListener(editHistoryRef);
|
|
4401
|
+
}
|
|
4402
|
+
async publish() {
|
|
4403
|
+
if (!this.head) {
|
|
4404
|
+
throw new Error("No head MultiEditProcessor available.");
|
|
4405
|
+
}
|
|
4406
|
+
return await this.head.processor.publish();
|
|
4407
|
+
}
|
|
4408
|
+
listenToHeadChanges(callback) {
|
|
4409
|
+
this._headListener.push(callback);
|
|
4410
|
+
}
|
|
4411
|
+
_notifyHeadListener(editHistoryRef) {
|
|
4412
|
+
return Promise.all(
|
|
4413
|
+
this._headListener.map((cb) => cb(editHistoryRef))
|
|
4414
|
+
).catch((err) => {
|
|
4415
|
+
console.error(
|
|
4416
|
+
`Error notifying head observers for editHistoryRef ${editHistoryRef}:`,
|
|
4417
|
+
err
|
|
4418
|
+
);
|
|
4419
|
+
});
|
|
4420
|
+
}
|
|
4421
|
+
async editHistoryRef(editHistoryRef) {
|
|
4422
|
+
const editHistories = await this._db.getEditHistories(
|
|
4423
|
+
this._cakeKey,
|
|
4424
|
+
editHistoryRef
|
|
4425
|
+
);
|
|
4426
|
+
if (editHistories.length === 0) {
|
|
4427
|
+
throw new Error(`EditHistory with ref ${editHistoryRef} not found.`);
|
|
4428
|
+
}
|
|
4429
|
+
if (editHistories.length > 1) {
|
|
4430
|
+
throw new Error(
|
|
4431
|
+
`Multiple EditHistories with ref ${editHistoryRef} found.`
|
|
4432
|
+
);
|
|
4433
|
+
}
|
|
4434
|
+
const editHistory = editHistories[0];
|
|
4435
|
+
if (this._processors.has(editHistoryRef)) {
|
|
4436
|
+
const processor2 = this._processors.get(editHistoryRef);
|
|
4437
|
+
this._head = {
|
|
4438
|
+
editHistoryRef,
|
|
4439
|
+
processor: processor2
|
|
4440
|
+
};
|
|
4441
|
+
await this._notifyHeadListener(editHistoryRef);
|
|
4442
|
+
return processor2;
|
|
4443
|
+
}
|
|
4444
|
+
if (editHistory.previous && editHistory.previous.length > 0) {
|
|
4445
|
+
if (editHistory.previous.length > 1) {
|
|
4446
|
+
throw new Error(
|
|
4447
|
+
`EditHistory with ref ${editHistoryRef} has multiple previous refs. Not supported.`
|
|
4448
|
+
);
|
|
4449
|
+
}
|
|
4450
|
+
const previousEditHistoryRef = editHistory.previous[0];
|
|
4451
|
+
const previousProcessor = await this.editHistoryRef(
|
|
4452
|
+
previousEditHistoryRef
|
|
4453
|
+
);
|
|
4454
|
+
const previousProcessorCloned = previousProcessor.clone();
|
|
4455
|
+
const processor2 = await previousProcessorCloned.applyEditHistory(
|
|
4456
|
+
editHistory
|
|
4457
|
+
);
|
|
4458
|
+
this._processors.set(editHistoryRef, processor2);
|
|
4459
|
+
this._head = {
|
|
4460
|
+
editHistoryRef,
|
|
4461
|
+
processor: processor2
|
|
4462
|
+
};
|
|
4463
|
+
await this._notifyHeadListener(editHistoryRef);
|
|
4464
|
+
return processor2;
|
|
4465
|
+
}
|
|
4466
|
+
const processor = await MultiEditProcessor.fromEditHistory(
|
|
4467
|
+
this._db,
|
|
4468
|
+
this._cakeKey,
|
|
4469
|
+
editHistory
|
|
4470
|
+
);
|
|
4471
|
+
this._processors.set(editHistoryRef, processor);
|
|
4472
|
+
this._head = {
|
|
4473
|
+
editHistoryRef,
|
|
4474
|
+
processor
|
|
4475
|
+
};
|
|
4476
|
+
await this._notifyHeadListener(editHistoryRef);
|
|
4477
|
+
return processor;
|
|
4478
|
+
}
|
|
4479
|
+
async _persistEdit(edit) {
|
|
4480
|
+
const { [this._cakeKey + "EditsRef"]: editRef } = (await this._db.addEdit(this._cakeKey, edit))[0];
|
|
4481
|
+
if (!editRef) {
|
|
4482
|
+
throw new Error("MultiEditManager: Failed to create EditRef.");
|
|
4483
|
+
}
|
|
4484
|
+
return editRef;
|
|
4485
|
+
}
|
|
4486
|
+
async _persistMultiEdit(multiEdit) {
|
|
4487
|
+
const { [this._cakeKey + "MultiEditsRef"]: multiEditRef } = (await this._db.addMultiEdit(this._cakeKey, multiEdit))[0];
|
|
4488
|
+
if (!multiEditRef) {
|
|
4489
|
+
throw new Error("MultiEditManager: Failed to create MultiEditRef.");
|
|
4490
|
+
}
|
|
4491
|
+
return multiEditRef;
|
|
4492
|
+
}
|
|
4493
|
+
async _persistEditHistory(editHistory) {
|
|
4494
|
+
const { [this._cakeKey + "EditHistoryRef"]: editHistoryRef } = (await this._db.addEditHistory(this._cakeKey, editHistory))[0];
|
|
4495
|
+
if (!editHistoryRef) {
|
|
4496
|
+
throw new Error("MultiEditManager: Failed to create EditHistoryRef.");
|
|
4497
|
+
}
|
|
4498
|
+
return editHistoryRef;
|
|
4499
|
+
}
|
|
4500
|
+
get processors() {
|
|
4501
|
+
return this._processors;
|
|
4502
|
+
}
|
|
4503
|
+
get head() {
|
|
4504
|
+
return this._head;
|
|
4505
|
+
}
|
|
4506
|
+
get join() {
|
|
4507
|
+
if (!this.head) {
|
|
4508
|
+
throw new Error("No head MultiEditProcessor available.");
|
|
4509
|
+
}
|
|
4510
|
+
return this.head.processor.join;
|
|
4511
|
+
}
|
|
4512
|
+
get isListening() {
|
|
4513
|
+
return this._isListening;
|
|
4514
|
+
}
|
|
3711
4515
|
}
|
|
4516
|
+
const chainLayers = (layers) => {
|
|
4517
|
+
const chainedLayers = [];
|
|
4518
|
+
for (let i = 0; i < layers.length; i++) {
|
|
4519
|
+
const newLayer = { ...rmhsh(layers[i]) };
|
|
4520
|
+
if (i == 0) {
|
|
4521
|
+
chainedLayers.push(hsh(newLayer));
|
|
4522
|
+
continue;
|
|
4523
|
+
}
|
|
4524
|
+
if (chainedLayers[i - 1]._hash) {
|
|
4525
|
+
newLayer.base = chainedLayers[i - 1]._hash;
|
|
4526
|
+
}
|
|
4527
|
+
chainedLayers.push(hsh(newLayer));
|
|
4528
|
+
}
|
|
4529
|
+
return chainedLayers;
|
|
4530
|
+
};
|
|
4531
|
+
const chainSliceIds = (sliceIds) => {
|
|
4532
|
+
const chainedSliceIds = [];
|
|
4533
|
+
for (let i = 0; i < sliceIds.length; i++) {
|
|
4534
|
+
const newSliceIds = { ...rmhsh(sliceIds[i]) };
|
|
4535
|
+
if (i == 0) {
|
|
4536
|
+
chainedSliceIds.push(hsh(newSliceIds));
|
|
4537
|
+
continue;
|
|
4538
|
+
}
|
|
4539
|
+
if (chainedSliceIds[i - 1]._hash) {
|
|
4540
|
+
newSliceIds.base = chainedSliceIds[i - 1]._hash;
|
|
4541
|
+
}
|
|
4542
|
+
chainedSliceIds.push(hsh(newSliceIds));
|
|
4543
|
+
}
|
|
4544
|
+
return chainedSliceIds;
|
|
4545
|
+
};
|
|
4546
|
+
const staticExample = () => {
|
|
4547
|
+
const carSliceIdTableCfg = hip(
|
|
4548
|
+
createSliceIdsTableCfg("carSliceId")
|
|
4549
|
+
);
|
|
4550
|
+
const carSliceIdData = [
|
|
4551
|
+
{
|
|
4552
|
+
add: ["VIN1", "VIN2", "VIN3", "VIN4", "VIN5", "VIN6", "VIN7", "VIN8"],
|
|
4553
|
+
_hash: ""
|
|
4554
|
+
},
|
|
4555
|
+
{
|
|
4556
|
+
add: ["VIN9", "VIN10"],
|
|
4557
|
+
_hash: ""
|
|
4558
|
+
},
|
|
4559
|
+
{
|
|
4560
|
+
add: ["VIN11", "VIN12"],
|
|
4561
|
+
_hash: ""
|
|
4562
|
+
}
|
|
4563
|
+
].map((sliceIds) => hsh(sliceIds));
|
|
4564
|
+
const carSliceId = hip({
|
|
4565
|
+
_tableCfg: carSliceIdTableCfg._hash,
|
|
4566
|
+
_type: "sliceIds",
|
|
4567
|
+
_data: chainSliceIds(carSliceIdData),
|
|
4568
|
+
_hash: ""
|
|
4569
|
+
});
|
|
4570
|
+
const carGeneralTableCfg = hip({
|
|
4571
|
+
key: "carGeneral",
|
|
4572
|
+
type: "components",
|
|
4573
|
+
columns: [
|
|
4574
|
+
{ key: "_hash", type: "string", titleLong: "Hash", titleShort: "Hash" },
|
|
4575
|
+
{ key: "brand", type: "string", titleLong: "Brand", titleShort: "Brand" },
|
|
4576
|
+
{ key: "type", type: "string", titleLong: "Type", titleShort: "Type" },
|
|
4577
|
+
{ key: "doors", type: "number", titleLong: "Doors", titleShort: "Doors" },
|
|
4578
|
+
{
|
|
4579
|
+
key: "energyConsumption",
|
|
4580
|
+
type: "number",
|
|
4581
|
+
titleLong: "Energy Consumption",
|
|
4582
|
+
titleShort: "Energy"
|
|
4583
|
+
},
|
|
4584
|
+
{
|
|
4585
|
+
key: "units",
|
|
4586
|
+
type: "json",
|
|
4587
|
+
titleLong: "Energy Unit",
|
|
4588
|
+
titleShort: "Unit"
|
|
4589
|
+
},
|
|
4590
|
+
{
|
|
4591
|
+
key: "serviceIntervals",
|
|
4592
|
+
type: "jsonArray",
|
|
4593
|
+
titleLong: "Service Intervals",
|
|
4594
|
+
titleShort: "Intervals"
|
|
4595
|
+
},
|
|
4596
|
+
{
|
|
4597
|
+
key: "isElectric",
|
|
4598
|
+
type: "boolean",
|
|
4599
|
+
titleLong: "Is Electric",
|
|
4600
|
+
titleShort: "Electric"
|
|
4601
|
+
},
|
|
4602
|
+
{
|
|
4603
|
+
key: "meta",
|
|
4604
|
+
type: "jsonValue",
|
|
4605
|
+
titleLong: "Meta Information",
|
|
4606
|
+
titleShort: "Meta"
|
|
4607
|
+
}
|
|
4608
|
+
],
|
|
4609
|
+
isHead: false,
|
|
4610
|
+
isRoot: false,
|
|
4611
|
+
isShared: true
|
|
4612
|
+
});
|
|
4613
|
+
const carGeneral = hip({
|
|
4614
|
+
_tableCfg: carGeneralTableCfg._hash,
|
|
4615
|
+
_type: "components",
|
|
4616
|
+
_data: [
|
|
4617
|
+
{
|
|
4618
|
+
brand: "Volkswagen",
|
|
4619
|
+
type: "Polo",
|
|
4620
|
+
doors: 5,
|
|
4621
|
+
energyConsumption: 7.4,
|
|
4622
|
+
units: {
|
|
4623
|
+
energy: "l/100km",
|
|
4624
|
+
_hash: ""
|
|
4625
|
+
},
|
|
4626
|
+
serviceIntervals: [15e3, 3e4, 45e3],
|
|
4627
|
+
isElectric: false,
|
|
4628
|
+
meta: {
|
|
4629
|
+
pressText: "A popular compact car.",
|
|
4630
|
+
_hash: ""
|
|
4631
|
+
},
|
|
4632
|
+
_hash: ""
|
|
4633
|
+
},
|
|
4634
|
+
{
|
|
4635
|
+
brand: "Volkswagen",
|
|
4636
|
+
type: "Golf",
|
|
4637
|
+
doors: 3,
|
|
4638
|
+
energyConsumption: 6.2,
|
|
4639
|
+
units: {
|
|
4640
|
+
energy: "l/100km",
|
|
4641
|
+
_hash: ""
|
|
4642
|
+
},
|
|
4643
|
+
serviceIntervals: [15e3, 3e4, 45e3],
|
|
4644
|
+
isElectric: false,
|
|
4645
|
+
meta: {
|
|
4646
|
+
pressText: "A well-known hatchback.",
|
|
4647
|
+
_hash: ""
|
|
4648
|
+
},
|
|
4649
|
+
_hash: ""
|
|
4650
|
+
},
|
|
4651
|
+
{
|
|
4652
|
+
brand: "Audi",
|
|
4653
|
+
type: "Q4 E-tron",
|
|
4654
|
+
doors: 5,
|
|
4655
|
+
energyConsumption: 18,
|
|
4656
|
+
units: {
|
|
4657
|
+
energy: "kWh/100km",
|
|
4658
|
+
_hash: ""
|
|
4659
|
+
},
|
|
4660
|
+
serviceIntervals: [2e4, 4e4, 6e4],
|
|
4661
|
+
isElectric: true,
|
|
4662
|
+
meta: [
|
|
4663
|
+
{
|
|
4664
|
+
pressText: "A stylish electric SUV.",
|
|
4665
|
+
_hash: ""
|
|
4666
|
+
},
|
|
4667
|
+
{
|
|
4668
|
+
pressText: "Combines performance with sustainability.",
|
|
4669
|
+
_hash: ""
|
|
4670
|
+
}
|
|
4671
|
+
],
|
|
4672
|
+
_hash: ""
|
|
4673
|
+
},
|
|
4674
|
+
{
|
|
4675
|
+
brand: "Audi",
|
|
4676
|
+
type: "Q6 E-tron",
|
|
4677
|
+
doors: 5,
|
|
4678
|
+
energyConsumption: 16,
|
|
4679
|
+
units: {
|
|
4680
|
+
energy: "kWh/100km",
|
|
4681
|
+
_hash: ""
|
|
4682
|
+
},
|
|
4683
|
+
serviceIntervals: [2e4, 4e4, 6e4],
|
|
4684
|
+
isElectric: true,
|
|
4685
|
+
meta: [
|
|
4686
|
+
{
|
|
4687
|
+
pressText: "A premium electric SUV with advanced features.",
|
|
4688
|
+
_hash: ""
|
|
4689
|
+
},
|
|
4690
|
+
{
|
|
4691
|
+
pressText: "Offers a blend of luxury and eco-friendliness.",
|
|
4692
|
+
_hash: ""
|
|
4693
|
+
}
|
|
4694
|
+
],
|
|
4695
|
+
_hash: ""
|
|
4696
|
+
},
|
|
4697
|
+
{
|
|
4698
|
+
brand: "BMW",
|
|
4699
|
+
type: "i4",
|
|
4700
|
+
doors: 5,
|
|
4701
|
+
energyConsumption: 19.5,
|
|
4702
|
+
units: {
|
|
4703
|
+
energy: "kWh/100km",
|
|
4704
|
+
_hash: ""
|
|
4705
|
+
},
|
|
4706
|
+
serviceIntervals: [2e4, 4e4, 6e4],
|
|
4707
|
+
isElectric: true,
|
|
4708
|
+
meta: [
|
|
4709
|
+
{
|
|
4710
|
+
pressText: "A sporty electric sedan.",
|
|
4711
|
+
_hash: ""
|
|
4712
|
+
},
|
|
4713
|
+
{
|
|
4714
|
+
pressText: "Delivers dynamic performance with zero emissions.",
|
|
4715
|
+
_hash: ""
|
|
4716
|
+
}
|
|
4717
|
+
],
|
|
4718
|
+
_hash: ""
|
|
4719
|
+
},
|
|
4720
|
+
{
|
|
4721
|
+
brand: "BMW",
|
|
4722
|
+
type: "3 Series",
|
|
4723
|
+
doors: 4,
|
|
4724
|
+
energyConsumption: 5.8,
|
|
4725
|
+
units: {
|
|
4726
|
+
energy: "l/100km",
|
|
4727
|
+
_hash: ""
|
|
4728
|
+
},
|
|
4729
|
+
serviceIntervals: [15e3, 3e4, 45e3],
|
|
4730
|
+
isElectric: false,
|
|
4731
|
+
meta: {
|
|
4732
|
+
pressText: "A classic executive car.",
|
|
4733
|
+
_hash: ""
|
|
4734
|
+
},
|
|
4735
|
+
_hash: ""
|
|
4736
|
+
},
|
|
4737
|
+
{
|
|
4738
|
+
brand: "Tesla",
|
|
4739
|
+
type: "Model 3",
|
|
4740
|
+
doors: 4,
|
|
4741
|
+
energyConsumption: 15,
|
|
4742
|
+
units: {
|
|
4743
|
+
energy: "kWh/100km",
|
|
4744
|
+
_hash: ""
|
|
4745
|
+
},
|
|
4746
|
+
serviceIntervals: [25e3, 5e4, 75e3],
|
|
4747
|
+
isElectric: true,
|
|
4748
|
+
meta: {
|
|
4749
|
+
pressText: "A revolutionary electric sedan.",
|
|
4750
|
+
_hash: ""
|
|
4751
|
+
},
|
|
4752
|
+
_hash: ""
|
|
4753
|
+
},
|
|
4754
|
+
{
|
|
4755
|
+
brand: "Tesla",
|
|
4756
|
+
type: "Model Y",
|
|
4757
|
+
doors: 5,
|
|
4758
|
+
energyConsumption: 16.5,
|
|
4759
|
+
units: {
|
|
4760
|
+
energy: "kWh/100km",
|
|
4761
|
+
_hash: ""
|
|
4762
|
+
},
|
|
4763
|
+
serviceIntervals: [25e3, 5e4, 75e3],
|
|
4764
|
+
isElectric: true,
|
|
4765
|
+
meta: {
|
|
4766
|
+
pressText: "A versatile electric SUV.",
|
|
4767
|
+
_hash: ""
|
|
4768
|
+
},
|
|
4769
|
+
_hash: ""
|
|
4770
|
+
},
|
|
4771
|
+
{
|
|
4772
|
+
brand: "Ford",
|
|
4773
|
+
type: "Mustang Mach-E",
|
|
4774
|
+
doors: 5,
|
|
4775
|
+
energyConsumption: 17,
|
|
4776
|
+
units: {
|
|
4777
|
+
energy: "kWh/100km",
|
|
4778
|
+
_hash: ""
|
|
4779
|
+
},
|
|
4780
|
+
serviceIntervals: [2e4, 4e4, 6e4],
|
|
4781
|
+
isElectric: true,
|
|
4782
|
+
meta: {
|
|
4783
|
+
pressText: "An electric SUV with Mustang heritage.",
|
|
4784
|
+
_hash: ""
|
|
4785
|
+
},
|
|
4786
|
+
_hash: ""
|
|
4787
|
+
},
|
|
4788
|
+
{
|
|
4789
|
+
brand: "Chevrolet",
|
|
4790
|
+
type: "Bolt EV",
|
|
4791
|
+
doors: 5,
|
|
4792
|
+
energyConsumption: 14,
|
|
4793
|
+
units: {
|
|
4794
|
+
energy: "kWh/100km",
|
|
4795
|
+
_hash: ""
|
|
4796
|
+
},
|
|
4797
|
+
serviceIntervals: [2e4, 4e4, 6e4],
|
|
4798
|
+
isElectric: true,
|
|
4799
|
+
meta: {
|
|
4800
|
+
pressText: "An affordable electric hatchback.",
|
|
4801
|
+
_hash: ""
|
|
4802
|
+
},
|
|
4803
|
+
_hash: ""
|
|
4804
|
+
},
|
|
4805
|
+
{
|
|
4806
|
+
brand: "Nissan",
|
|
4807
|
+
type: "Leaf",
|
|
4808
|
+
doors: 5,
|
|
4809
|
+
energyConsumption: 15.5,
|
|
4810
|
+
units: {
|
|
4811
|
+
energy: "kWh/100km",
|
|
4812
|
+
_hash: ""
|
|
4813
|
+
},
|
|
4814
|
+
serviceIntervals: [2e4, 4e4, 6e4],
|
|
4815
|
+
isElectric: true,
|
|
4816
|
+
meta: {
|
|
4817
|
+
pressText: "A pioneering electric vehicle.",
|
|
4818
|
+
_hash: ""
|
|
4819
|
+
},
|
|
4820
|
+
_hash: ""
|
|
4821
|
+
},
|
|
4822
|
+
{
|
|
4823
|
+
brand: "Hyundai",
|
|
4824
|
+
type: "Kona Electric",
|
|
4825
|
+
doors: 5,
|
|
4826
|
+
energyConsumption: 14.5,
|
|
4827
|
+
units: {
|
|
4828
|
+
energy: "kWh/100km",
|
|
4829
|
+
_hash: ""
|
|
4830
|
+
},
|
|
4831
|
+
serviceIntervals: [2e4, 4e4, 6e4],
|
|
4832
|
+
isElectric: true,
|
|
4833
|
+
meta: {
|
|
4834
|
+
pressText: "A compact electric SUV.",
|
|
4835
|
+
_hash: ""
|
|
4836
|
+
},
|
|
4837
|
+
_hash: ""
|
|
4838
|
+
}
|
|
4839
|
+
],
|
|
4840
|
+
_hash: ""
|
|
4841
|
+
});
|
|
4842
|
+
const carDimensionsTableCfg = hip({
|
|
4843
|
+
key: "carDimensions",
|
|
4844
|
+
type: "components",
|
|
4845
|
+
columns: [
|
|
4846
|
+
{ key: "_hash", type: "string" },
|
|
4847
|
+
{ key: "height", type: "number" },
|
|
4848
|
+
{ key: "width", type: "number" },
|
|
4849
|
+
{ key: "length", type: "number" }
|
|
4850
|
+
],
|
|
4851
|
+
isHead: false,
|
|
4852
|
+
isRoot: false,
|
|
4853
|
+
isShared: true
|
|
4854
|
+
});
|
|
4855
|
+
const carDimensions = hip({
|
|
4856
|
+
_tableCfg: carDimensionsTableCfg._hash,
|
|
4857
|
+
_type: "components",
|
|
4858
|
+
_data: [
|
|
4859
|
+
{
|
|
4860
|
+
height: 1400,
|
|
4861
|
+
width: 1800,
|
|
4862
|
+
length: 4e3,
|
|
4863
|
+
_hash: ""
|
|
4864
|
+
},
|
|
4865
|
+
{
|
|
4866
|
+
height: 1450,
|
|
4867
|
+
width: 1850,
|
|
4868
|
+
length: 4100,
|
|
4869
|
+
_hash: ""
|
|
4870
|
+
},
|
|
4871
|
+
{
|
|
4872
|
+
height: 1600,
|
|
4873
|
+
width: 1900,
|
|
4874
|
+
length: 4500,
|
|
4875
|
+
_hash: ""
|
|
4876
|
+
},
|
|
4877
|
+
{
|
|
4878
|
+
height: 1650,
|
|
4879
|
+
width: 1950,
|
|
4880
|
+
length: 4700,
|
|
4881
|
+
_hash: ""
|
|
4882
|
+
},
|
|
4883
|
+
{
|
|
4884
|
+
height: 1500,
|
|
4885
|
+
width: 1820,
|
|
4886
|
+
length: 4200,
|
|
4887
|
+
_hash: ""
|
|
4888
|
+
},
|
|
4889
|
+
{
|
|
4890
|
+
height: 1550,
|
|
4891
|
+
width: 1880,
|
|
4892
|
+
length: 4300,
|
|
4893
|
+
_hash: ""
|
|
4894
|
+
},
|
|
4895
|
+
{
|
|
4896
|
+
height: 1450,
|
|
4897
|
+
width: 1830,
|
|
4898
|
+
length: 4150,
|
|
4899
|
+
_hash: ""
|
|
4900
|
+
},
|
|
4901
|
+
{
|
|
4902
|
+
height: 1700,
|
|
4903
|
+
width: 2e3,
|
|
4904
|
+
length: 4800,
|
|
4905
|
+
_hash: ""
|
|
4906
|
+
},
|
|
4907
|
+
{
|
|
4908
|
+
height: 1350,
|
|
4909
|
+
width: 1750,
|
|
4910
|
+
length: 3900,
|
|
4911
|
+
_hash: ""
|
|
4912
|
+
},
|
|
4913
|
+
{
|
|
4914
|
+
height: 1750,
|
|
4915
|
+
width: 2050,
|
|
4916
|
+
length: 4900,
|
|
4917
|
+
_hash: ""
|
|
4918
|
+
},
|
|
4919
|
+
{
|
|
4920
|
+
height: 1600,
|
|
4921
|
+
width: 1920,
|
|
4922
|
+
length: 4600,
|
|
4923
|
+
_hash: ""
|
|
4924
|
+
}
|
|
4925
|
+
],
|
|
4926
|
+
_hash: ""
|
|
4927
|
+
});
|
|
4928
|
+
const carTechnicalTableCfg = hip({
|
|
4929
|
+
key: "carTechnical",
|
|
4930
|
+
type: "components",
|
|
4931
|
+
columns: [
|
|
4932
|
+
{ key: "_hash", type: "string" },
|
|
4933
|
+
{ key: "engine", type: "string" },
|
|
4934
|
+
{ key: "transmission", type: "string" },
|
|
4935
|
+
{ key: "gears", type: "number" },
|
|
4936
|
+
{
|
|
4937
|
+
key: "dimensions",
|
|
4938
|
+
type: "jsonValue",
|
|
4939
|
+
ref: {
|
|
4940
|
+
tableKey: "carDimensions",
|
|
4941
|
+
type: "components"
|
|
4942
|
+
}
|
|
4943
|
+
},
|
|
4944
|
+
{ key: "repairedByWorkshop", type: "string" }
|
|
4945
|
+
],
|
|
4946
|
+
isHead: false,
|
|
4947
|
+
isRoot: false,
|
|
4948
|
+
isShared: true
|
|
4949
|
+
});
|
|
4950
|
+
const carTechnical = hip({
|
|
4951
|
+
_tableCfg: carTechnicalTableCfg._hash,
|
|
4952
|
+
_type: "components",
|
|
4953
|
+
_data: [
|
|
4954
|
+
{
|
|
4955
|
+
engine: "Diesel",
|
|
4956
|
+
transmission: "Manual",
|
|
4957
|
+
gears: 6,
|
|
4958
|
+
dimensions: carDimensions._data[0]._hash,
|
|
4959
|
+
_hash: ""
|
|
4960
|
+
},
|
|
4961
|
+
{
|
|
4962
|
+
engine: "Petrol",
|
|
4963
|
+
transmission: "Automatic",
|
|
4964
|
+
gears: 7,
|
|
4965
|
+
dimensions: carDimensions._data[1]._hash,
|
|
4966
|
+
repairedByWorkshop: "Workshop A",
|
|
4967
|
+
_hash: ""
|
|
4968
|
+
},
|
|
4969
|
+
{
|
|
4970
|
+
engine: "Electric",
|
|
4971
|
+
transmission: "Single-Speed",
|
|
4972
|
+
gears: 1,
|
|
4973
|
+
dimensions: [
|
|
4974
|
+
carDimensions._data[1]._hash,
|
|
4975
|
+
carDimensions._data[2]._hash
|
|
4976
|
+
],
|
|
4977
|
+
_hash: ""
|
|
4978
|
+
},
|
|
4979
|
+
{
|
|
4980
|
+
engine: "Electric",
|
|
4981
|
+
transmission: "Single-Speed",
|
|
4982
|
+
gears: 1,
|
|
4983
|
+
dimensions: carDimensions._data[3]._hash,
|
|
4984
|
+
repairedByWorkshop: "Workshop B",
|
|
4985
|
+
_hash: ""
|
|
4986
|
+
},
|
|
4987
|
+
{
|
|
4988
|
+
engine: "Electric",
|
|
4989
|
+
transmission: "Single-Speed",
|
|
4990
|
+
gears: 1,
|
|
4991
|
+
dimensions: carDimensions._data[4]._hash,
|
|
4992
|
+
_hash: ""
|
|
4993
|
+
},
|
|
4994
|
+
{
|
|
4995
|
+
engine: "Petrol",
|
|
4996
|
+
transmission: "Manual",
|
|
4997
|
+
gears: 6,
|
|
4998
|
+
dimensions: carDimensions._data[5]._hash,
|
|
4999
|
+
repairedByWorkshop: "Workshop A",
|
|
5000
|
+
_hash: ""
|
|
5001
|
+
},
|
|
5002
|
+
{
|
|
5003
|
+
engine: "Electric",
|
|
5004
|
+
transmission: "Single-Speed",
|
|
5005
|
+
gears: 1,
|
|
5006
|
+
dimensions: carDimensions._data[6]._hash,
|
|
5007
|
+
_hash: ""
|
|
5008
|
+
},
|
|
5009
|
+
{
|
|
5010
|
+
engine: "Electric",
|
|
5011
|
+
transmission: "Single-Speed",
|
|
5012
|
+
gears: 1,
|
|
5013
|
+
dimensions: carDimensions._data[7]._hash,
|
|
5014
|
+
repairedByWorkshop: "Workshop C",
|
|
5015
|
+
_hash: ""
|
|
5016
|
+
},
|
|
5017
|
+
{
|
|
5018
|
+
engine: "Electric",
|
|
5019
|
+
transmission: "Single-Speed",
|
|
5020
|
+
gears: 1,
|
|
5021
|
+
dimensions: carDimensions._data[8]._hash,
|
|
5022
|
+
_hash: ""
|
|
5023
|
+
},
|
|
5024
|
+
{
|
|
5025
|
+
engine: "Electric",
|
|
5026
|
+
transmission: "Single-Speed",
|
|
5027
|
+
gears: 1,
|
|
5028
|
+
dimensions: carDimensions._data[9]._hash,
|
|
5029
|
+
repairedByWorkshop: "Workshop B",
|
|
5030
|
+
_hash: ""
|
|
5031
|
+
},
|
|
5032
|
+
{
|
|
5033
|
+
engine: "Electric",
|
|
5034
|
+
transmission: "Single-Speed",
|
|
5035
|
+
gears: 1,
|
|
5036
|
+
dimensions: carDimensions._data[10]._hash,
|
|
5037
|
+
_hash: ""
|
|
5038
|
+
}
|
|
5039
|
+
],
|
|
5040
|
+
_hash: ""
|
|
5041
|
+
});
|
|
5042
|
+
const carColorTableCfg = hip({
|
|
5043
|
+
key: "carColor",
|
|
5044
|
+
type: "components",
|
|
5045
|
+
columns: [
|
|
5046
|
+
{ key: "_hash", type: "string" },
|
|
5047
|
+
{ key: "sides", type: "string" },
|
|
5048
|
+
{ key: "roof", type: "string" },
|
|
5049
|
+
{ key: "highlights", type: "string" }
|
|
5050
|
+
],
|
|
5051
|
+
isHead: false,
|
|
5052
|
+
isRoot: false,
|
|
5053
|
+
isShared: true
|
|
5054
|
+
});
|
|
5055
|
+
const carColor = hip({
|
|
5056
|
+
_tableCfg: carColorTableCfg._hash,
|
|
5057
|
+
_type: "components",
|
|
5058
|
+
_data: [
|
|
5059
|
+
{
|
|
5060
|
+
sides: "green",
|
|
5061
|
+
roof: "white",
|
|
5062
|
+
highlights: "chrome",
|
|
5063
|
+
_hash: ""
|
|
5064
|
+
},
|
|
5065
|
+
{
|
|
5066
|
+
sides: "blue",
|
|
5067
|
+
roof: "black",
|
|
5068
|
+
highlights: "chrome",
|
|
5069
|
+
_hash: ""
|
|
5070
|
+
},
|
|
5071
|
+
{
|
|
5072
|
+
sides: "red",
|
|
5073
|
+
roof: "red",
|
|
5074
|
+
highlights: "black",
|
|
5075
|
+
_hash: ""
|
|
5076
|
+
},
|
|
5077
|
+
{
|
|
5078
|
+
sides: "silver",
|
|
5079
|
+
roof: "silver",
|
|
5080
|
+
highlights: "chrome",
|
|
5081
|
+
_hash: ""
|
|
5082
|
+
},
|
|
5083
|
+
{
|
|
5084
|
+
sides: "black",
|
|
5085
|
+
roof: "black",
|
|
5086
|
+
highlights: "black",
|
|
5087
|
+
_hash: ""
|
|
5088
|
+
},
|
|
5089
|
+
{
|
|
5090
|
+
sides: "white",
|
|
5091
|
+
roof: "white",
|
|
5092
|
+
highlights: "chrome",
|
|
5093
|
+
_hash: ""
|
|
5094
|
+
},
|
|
5095
|
+
{
|
|
5096
|
+
sides: "grey",
|
|
5097
|
+
roof: "black",
|
|
5098
|
+
highlights: "chrome",
|
|
5099
|
+
_hash: ""
|
|
5100
|
+
},
|
|
5101
|
+
{
|
|
5102
|
+
sides: "red",
|
|
5103
|
+
roof: "white",
|
|
5104
|
+
highlights: "black",
|
|
5105
|
+
_hash: ""
|
|
5106
|
+
}
|
|
5107
|
+
],
|
|
5108
|
+
_hash: ""
|
|
5109
|
+
});
|
|
5110
|
+
const carGeneralLayerTableCfg = hip(
|
|
5111
|
+
createLayerTableCfg("carGeneralLayer")
|
|
5112
|
+
);
|
|
5113
|
+
const carGeneralLayerData = [
|
|
5114
|
+
{
|
|
5115
|
+
add: {
|
|
5116
|
+
VIN1: carGeneral._data[0]._hash,
|
|
5117
|
+
VIN2: carGeneral._data[1]._hash,
|
|
5118
|
+
VIN3: carGeneral._data[2]._hash,
|
|
5119
|
+
VIN4: carGeneral._data[3]._hash,
|
|
5120
|
+
VIN5: carGeneral._data[4]._hash,
|
|
5121
|
+
VIN6: carGeneral._data[5]._hash,
|
|
5122
|
+
VIN7: carGeneral._data[6]._hash,
|
|
5123
|
+
VIN8: carGeneral._data[7]._hash,
|
|
5124
|
+
_hash: ""
|
|
5125
|
+
},
|
|
5126
|
+
sliceIdsTable: "carSliceId",
|
|
5127
|
+
sliceIdsTableRow: carSliceId._data[0]._hash,
|
|
5128
|
+
componentsTable: "carGeneral",
|
|
5129
|
+
_hash: ""
|
|
5130
|
+
},
|
|
5131
|
+
{
|
|
5132
|
+
add: {
|
|
5133
|
+
VIN9: carGeneral._data[8]._hash,
|
|
5134
|
+
VIN10: carGeneral._data[9]._hash,
|
|
5135
|
+
_hash: ""
|
|
5136
|
+
},
|
|
5137
|
+
sliceIdsTable: "carSliceId",
|
|
5138
|
+
sliceIdsTableRow: carSliceId._data[1]._hash,
|
|
5139
|
+
componentsTable: "carGeneral",
|
|
5140
|
+
_hash: ""
|
|
5141
|
+
},
|
|
5142
|
+
{
|
|
5143
|
+
add: {
|
|
5144
|
+
VIN11: carGeneral._data[10]._hash,
|
|
5145
|
+
VIN12: carGeneral._data[11]._hash,
|
|
5146
|
+
_hash: ""
|
|
5147
|
+
},
|
|
5148
|
+
sliceIdsTable: "carSliceId",
|
|
5149
|
+
sliceIdsTableRow: carSliceId._data[2]._hash,
|
|
5150
|
+
componentsTable: "carGeneral",
|
|
5151
|
+
_hash: ""
|
|
5152
|
+
}
|
|
5153
|
+
].map((layer) => hsh(layer));
|
|
5154
|
+
const carGeneralLayer = hip({
|
|
5155
|
+
_tableCfg: carGeneralLayerTableCfg._hash,
|
|
5156
|
+
_type: "layers",
|
|
5157
|
+
_data: chainLayers(carGeneralLayerData),
|
|
5158
|
+
_hash: ""
|
|
5159
|
+
});
|
|
5160
|
+
const carTechnicalLayerTableCfg = hip(
|
|
5161
|
+
createLayerTableCfg("carTechnicalLayer")
|
|
5162
|
+
);
|
|
5163
|
+
const carTechnicalLayerData = [
|
|
5164
|
+
{
|
|
5165
|
+
add: {
|
|
5166
|
+
VIN1: carTechnical._data[0]._hash,
|
|
5167
|
+
VIN2: carTechnical._data[1]._hash,
|
|
5168
|
+
VIN3: carTechnical._data[2]._hash,
|
|
5169
|
+
VIN4: carTechnical._data[2]._hash,
|
|
5170
|
+
VIN5: carTechnical._data[4]._hash,
|
|
5171
|
+
VIN6: carTechnical._data[5]._hash,
|
|
5172
|
+
VIN7: carTechnical._data[6]._hash,
|
|
5173
|
+
VIN8: carTechnical._data[2]._hash,
|
|
5174
|
+
_hash: ""
|
|
5175
|
+
},
|
|
5176
|
+
sliceIdsTable: "carSliceId",
|
|
5177
|
+
sliceIdsTableRow: carSliceId._data[0]._hash,
|
|
5178
|
+
componentsTable: "carTechnical",
|
|
5179
|
+
_hash: ""
|
|
5180
|
+
},
|
|
5181
|
+
{
|
|
5182
|
+
add: {
|
|
5183
|
+
VIN9: carTechnical._data[7]._hash,
|
|
5184
|
+
VIN10: carTechnical._data[8]._hash,
|
|
5185
|
+
_hash: ""
|
|
5186
|
+
},
|
|
5187
|
+
sliceIdsTable: "carSliceId",
|
|
5188
|
+
sliceIdsTableRow: carSliceId._data[1]._hash,
|
|
5189
|
+
componentsTable: "carTechnical",
|
|
5190
|
+
_hash: ""
|
|
5191
|
+
},
|
|
5192
|
+
{
|
|
5193
|
+
add: {
|
|
5194
|
+
VIN11: carTechnical._data[9]._hash,
|
|
5195
|
+
VIN12: carTechnical._data[10]._hash,
|
|
5196
|
+
_hash: ""
|
|
5197
|
+
},
|
|
5198
|
+
sliceIdsTable: "carSliceId",
|
|
5199
|
+
sliceIdsTableRow: carSliceId._data[2]._hash,
|
|
5200
|
+
componentsTable: "carTechnical",
|
|
5201
|
+
_hash: ""
|
|
5202
|
+
}
|
|
5203
|
+
].map((layer) => hsh(layer));
|
|
5204
|
+
const carTechnicalLayer = hip({
|
|
5205
|
+
_tableCfg: carTechnicalLayerTableCfg._hash,
|
|
5206
|
+
_type: "layers",
|
|
5207
|
+
_data: chainLayers(carTechnicalLayerData),
|
|
5208
|
+
_hash: ""
|
|
5209
|
+
});
|
|
5210
|
+
const carColorLayerTableCfg = hip(
|
|
5211
|
+
createLayerTableCfg("carColorLayer")
|
|
5212
|
+
);
|
|
5213
|
+
const carColorLayerData = [
|
|
5214
|
+
{
|
|
5215
|
+
add: {
|
|
5216
|
+
VIN1: carColor._data[0]._hash,
|
|
5217
|
+
VIN2: carColor._data[1]._hash,
|
|
5218
|
+
VIN3: carColor._data[2]._hash,
|
|
5219
|
+
VIN4: carColor._data[3]._hash,
|
|
5220
|
+
VIN5: carColor._data[4]._hash,
|
|
5221
|
+
VIN6: carColor._data[5]._hash,
|
|
5222
|
+
VIN7: carColor._data[6]._hash,
|
|
5223
|
+
VIN8: carColor._data[7]._hash,
|
|
5224
|
+
_hash: ""
|
|
5225
|
+
},
|
|
5226
|
+
sliceIdsTable: "carSliceId",
|
|
5227
|
+
sliceIdsTableRow: carSliceId._data[0]._hash,
|
|
5228
|
+
componentsTable: "carColor",
|
|
5229
|
+
_hash: ""
|
|
5230
|
+
},
|
|
5231
|
+
{
|
|
5232
|
+
add: {
|
|
5233
|
+
VIN9: carColor._data[3]._hash,
|
|
5234
|
+
VIN10: carColor._data[3]._hash,
|
|
5235
|
+
_hash: ""
|
|
5236
|
+
},
|
|
5237
|
+
sliceIdsTable: "carSliceId",
|
|
5238
|
+
sliceIdsTableRow: carSliceId._data[1]._hash,
|
|
5239
|
+
componentsTable: "carColor",
|
|
5240
|
+
_hash: ""
|
|
5241
|
+
},
|
|
5242
|
+
{
|
|
5243
|
+
add: {
|
|
5244
|
+
VIN11: carColor._data[7]._hash,
|
|
5245
|
+
VIN12: carColor._data[4]._hash,
|
|
5246
|
+
_hash: ""
|
|
5247
|
+
},
|
|
5248
|
+
sliceIdsTable: "carSliceId",
|
|
5249
|
+
sliceIdsTableRow: carSliceId._data[2]._hash,
|
|
5250
|
+
componentsTable: "carColor",
|
|
5251
|
+
_hash: ""
|
|
5252
|
+
}
|
|
5253
|
+
].map((layer) => hsh(layer));
|
|
5254
|
+
const carColorLayer = hip({
|
|
5255
|
+
_tableCfg: carColorLayerTableCfg._hash,
|
|
5256
|
+
_type: "layers",
|
|
5257
|
+
_data: chainLayers(carColorLayerData),
|
|
5258
|
+
_hash: ""
|
|
5259
|
+
});
|
|
5260
|
+
const carCakeTableCfg = hip(
|
|
5261
|
+
createCakeTableCfg("carCake")
|
|
5262
|
+
);
|
|
5263
|
+
const carCake = hip({
|
|
5264
|
+
_tableCfg: carCakeTableCfg._hash,
|
|
5265
|
+
_type: "cakes",
|
|
5266
|
+
_data: [
|
|
5267
|
+
{
|
|
5268
|
+
sliceIdsTable: "carSliceId",
|
|
5269
|
+
sliceIdsRow: carSliceId._data[0]._hash,
|
|
5270
|
+
layers: {
|
|
5271
|
+
carGeneralLayer: carGeneralLayer._data[0]._hash,
|
|
5272
|
+
carTechnicalLayer: carTechnicalLayer._data[0]._hash,
|
|
5273
|
+
carColorLayer: carColorLayer._data[0]._hash
|
|
5274
|
+
}
|
|
5275
|
+
},
|
|
5276
|
+
{
|
|
5277
|
+
sliceIdsTable: "carSliceId",
|
|
5278
|
+
sliceIdsRow: carSliceId._data[1]._hash,
|
|
5279
|
+
layers: {
|
|
5280
|
+
carGeneralLayer: carGeneralLayer._data[1]._hash,
|
|
5281
|
+
carTechnicalLayer: carTechnicalLayer._data[1]._hash,
|
|
5282
|
+
carColorLayer: carColorLayer._data[1]._hash
|
|
5283
|
+
}
|
|
5284
|
+
},
|
|
5285
|
+
{
|
|
5286
|
+
sliceIdsTable: "carSliceId",
|
|
5287
|
+
sliceIdsRow: carSliceId._data[2]._hash,
|
|
5288
|
+
layers: {
|
|
5289
|
+
carGeneralLayer: carGeneralLayer._data[2]._hash,
|
|
5290
|
+
carTechnicalLayer: carTechnicalLayer._data[2]._hash,
|
|
5291
|
+
carColorLayer: carColorLayer._data[2]._hash
|
|
5292
|
+
}
|
|
5293
|
+
}
|
|
5294
|
+
]
|
|
5295
|
+
});
|
|
5296
|
+
const carCakeHeadTableCfg = hip(
|
|
5297
|
+
createHeadsTableCfg("carCake")
|
|
5298
|
+
);
|
|
5299
|
+
const carCakeHeads = hip({
|
|
5300
|
+
_tableCfg: carCakeHeadTableCfg._hash,
|
|
5301
|
+
_type: "head",
|
|
5302
|
+
_data: [
|
|
5303
|
+
{
|
|
5304
|
+
timeId: "1764756756311:jkCG",
|
|
5305
|
+
cakeRef: carCake._data[0]._hash
|
|
5306
|
+
},
|
|
5307
|
+
{
|
|
5308
|
+
timeId: "1764756756312:1AGV",
|
|
5309
|
+
cakeRef: carCake._data[1]._hash
|
|
5310
|
+
},
|
|
5311
|
+
{
|
|
5312
|
+
timeId: "1764756756312:g8nh",
|
|
5313
|
+
cakeRef: carCake._data[2]._hash
|
|
5314
|
+
}
|
|
5315
|
+
]
|
|
5316
|
+
});
|
|
5317
|
+
const seriesSliceIdTableCfg = hip(
|
|
5318
|
+
createSliceIdsTableCfg("seriesSliceId")
|
|
5319
|
+
);
|
|
5320
|
+
const seriesSliceIdData = [
|
|
5321
|
+
{
|
|
5322
|
+
add: ["Serie0", "Serie1", "Serie2", "Serie3"],
|
|
5323
|
+
_hash: ""
|
|
5324
|
+
},
|
|
5325
|
+
{
|
|
5326
|
+
add: ["Serie4", "Serie5", "Serie6", "Serie7"],
|
|
5327
|
+
_hash: ""
|
|
5328
|
+
},
|
|
5329
|
+
{
|
|
5330
|
+
add: ["Serie8", "Serie9", "Serie10", "Serie11"],
|
|
5331
|
+
_hash: ""
|
|
5332
|
+
}
|
|
5333
|
+
].map((sliceIds) => hsh(sliceIds));
|
|
5334
|
+
const seriesSliceId = hip({
|
|
5335
|
+
_tableCfg: seriesSliceIdTableCfg._hash,
|
|
5336
|
+
_type: "sliceIds",
|
|
5337
|
+
_data: chainSliceIds(seriesSliceIdData),
|
|
5338
|
+
_hash: ""
|
|
5339
|
+
});
|
|
5340
|
+
const seriesGeneralTableCfg = hip({
|
|
5341
|
+
key: "seriesGeneral",
|
|
5342
|
+
type: "components",
|
|
5343
|
+
columns: [
|
|
5344
|
+
{ key: "_hash", type: "string", titleShort: "Hash", titleLong: "Hash" },
|
|
5345
|
+
{ key: "name", type: "string", titleShort: "Name", titleLong: "Name" }
|
|
5346
|
+
],
|
|
5347
|
+
isHead: false,
|
|
5348
|
+
isRoot: false,
|
|
5349
|
+
isShared: true
|
|
5350
|
+
});
|
|
5351
|
+
const seriesGeneral = hip({
|
|
5352
|
+
_tableCfg: seriesGeneralTableCfg._hash,
|
|
5353
|
+
_type: "components",
|
|
5354
|
+
_data: [
|
|
5355
|
+
{
|
|
5356
|
+
name: "Polo",
|
|
5357
|
+
_hash: ""
|
|
5358
|
+
},
|
|
5359
|
+
{
|
|
5360
|
+
name: "Golf",
|
|
5361
|
+
_hash: ""
|
|
5362
|
+
},
|
|
5363
|
+
{
|
|
5364
|
+
name: "Q4",
|
|
5365
|
+
_hash: ""
|
|
5366
|
+
},
|
|
5367
|
+
{
|
|
5368
|
+
name: "Q6",
|
|
5369
|
+
_hash: ""
|
|
5370
|
+
},
|
|
5371
|
+
{
|
|
5372
|
+
name: "i4",
|
|
5373
|
+
_hash: ""
|
|
5374
|
+
},
|
|
5375
|
+
{
|
|
5376
|
+
name: "3",
|
|
5377
|
+
_hash: ""
|
|
5378
|
+
},
|
|
5379
|
+
{
|
|
5380
|
+
name: "Model 3",
|
|
5381
|
+
_hash: ""
|
|
5382
|
+
},
|
|
5383
|
+
{
|
|
5384
|
+
name: "Model Y",
|
|
5385
|
+
_hash: ""
|
|
5386
|
+
},
|
|
5387
|
+
{
|
|
5388
|
+
name: "Mustang",
|
|
5389
|
+
_hash: ""
|
|
5390
|
+
},
|
|
5391
|
+
{
|
|
5392
|
+
name: "Bolt",
|
|
5393
|
+
_hash: ""
|
|
5394
|
+
},
|
|
5395
|
+
{
|
|
5396
|
+
name: "Leaf",
|
|
5397
|
+
_hash: ""
|
|
5398
|
+
},
|
|
5399
|
+
{
|
|
5400
|
+
name: "Kona",
|
|
5401
|
+
_hash: ""
|
|
5402
|
+
}
|
|
5403
|
+
],
|
|
5404
|
+
_hash: ""
|
|
5405
|
+
});
|
|
5406
|
+
const seriesCarsTableCfg = hip({
|
|
5407
|
+
key: "seriesCars",
|
|
5408
|
+
type: "components",
|
|
5409
|
+
columns: [
|
|
5410
|
+
{ key: "_hash", type: "string", titleShort: "Hash", titleLong: "Hash" },
|
|
5411
|
+
{
|
|
5412
|
+
key: "cars",
|
|
5413
|
+
type: "jsonArray",
|
|
5414
|
+
titleShort: "Cars",
|
|
5415
|
+
titleLong: "Cars References",
|
|
5416
|
+
ref: {
|
|
5417
|
+
tableKey: "carCake",
|
|
5418
|
+
type: "cakes"
|
|
5419
|
+
}
|
|
5420
|
+
}
|
|
5421
|
+
],
|
|
5422
|
+
isHead: false,
|
|
5423
|
+
isRoot: false,
|
|
5424
|
+
isShared: true
|
|
5425
|
+
});
|
|
5426
|
+
const seriesCars = hip({
|
|
5427
|
+
_tableCfg: seriesCarsTableCfg._hash,
|
|
5428
|
+
_type: "components",
|
|
5429
|
+
_data: [
|
|
5430
|
+
{
|
|
5431
|
+
cars: [
|
|
5432
|
+
{
|
|
5433
|
+
ref: carCake._data[2]._hash,
|
|
5434
|
+
sliceIds: ["VIN1"]
|
|
5435
|
+
}
|
|
5436
|
+
],
|
|
5437
|
+
_hash: ""
|
|
5438
|
+
},
|
|
5439
|
+
{
|
|
5440
|
+
cars: [
|
|
5441
|
+
{
|
|
5442
|
+
ref: carCake._data[2]._hash,
|
|
5443
|
+
sliceIds: ["VIN2"]
|
|
5444
|
+
}
|
|
5445
|
+
],
|
|
5446
|
+
_hash: ""
|
|
5447
|
+
},
|
|
5448
|
+
{
|
|
5449
|
+
cars: [
|
|
5450
|
+
{
|
|
5451
|
+
ref: carCake._data[0]._hash,
|
|
5452
|
+
sliceIds: ["VIN3"]
|
|
5453
|
+
}
|
|
5454
|
+
],
|
|
5455
|
+
_hash: ""
|
|
5456
|
+
},
|
|
5457
|
+
{
|
|
5458
|
+
cars: [
|
|
5459
|
+
{
|
|
5460
|
+
ref: carCake._data[0]._hash,
|
|
5461
|
+
sliceIds: ["VIN4"]
|
|
5462
|
+
}
|
|
5463
|
+
],
|
|
5464
|
+
_hash: ""
|
|
5465
|
+
},
|
|
5466
|
+
{
|
|
5467
|
+
cars: [
|
|
5468
|
+
{
|
|
5469
|
+
ref: carCake._data[1]._hash,
|
|
5470
|
+
sliceIds: ["VIN5"]
|
|
5471
|
+
}
|
|
5472
|
+
],
|
|
5473
|
+
_hash: ""
|
|
5474
|
+
},
|
|
5475
|
+
{
|
|
5476
|
+
cars: [
|
|
5477
|
+
{
|
|
5478
|
+
ref: carCake._data[1]._hash,
|
|
5479
|
+
sliceIds: ["VIN6"]
|
|
5480
|
+
}
|
|
5481
|
+
],
|
|
5482
|
+
_hash: ""
|
|
5483
|
+
},
|
|
5484
|
+
{
|
|
5485
|
+
cars: [
|
|
5486
|
+
{
|
|
5487
|
+
ref: carCake._data[2]._hash,
|
|
5488
|
+
sliceIds: ["VIN7"]
|
|
5489
|
+
}
|
|
5490
|
+
],
|
|
5491
|
+
_hash: ""
|
|
5492
|
+
},
|
|
5493
|
+
{
|
|
5494
|
+
cars: [
|
|
5495
|
+
{
|
|
5496
|
+
ref: carCake._data[2]._hash,
|
|
5497
|
+
sliceIds: ["VIN8"]
|
|
5498
|
+
}
|
|
5499
|
+
],
|
|
5500
|
+
_hash: ""
|
|
5501
|
+
},
|
|
5502
|
+
{
|
|
5503
|
+
cars: [
|
|
5504
|
+
{
|
|
5505
|
+
ref: carCake._data[2]._hash,
|
|
5506
|
+
sliceIds: ["VIN9"]
|
|
5507
|
+
}
|
|
5508
|
+
],
|
|
5509
|
+
_hash: ""
|
|
5510
|
+
},
|
|
5511
|
+
{
|
|
5512
|
+
cars: [
|
|
5513
|
+
{
|
|
5514
|
+
ref: carCake._data[2]._hash,
|
|
5515
|
+
sliceIds: ["VIN10"]
|
|
5516
|
+
}
|
|
5517
|
+
],
|
|
5518
|
+
_hash: ""
|
|
5519
|
+
},
|
|
5520
|
+
{
|
|
5521
|
+
cars: [
|
|
5522
|
+
{
|
|
5523
|
+
ref: carCake._data[2]._hash,
|
|
5524
|
+
sliceIds: ["VIN11"]
|
|
5525
|
+
}
|
|
5526
|
+
],
|
|
5527
|
+
_hash: ""
|
|
5528
|
+
},
|
|
5529
|
+
{
|
|
5530
|
+
cars: [
|
|
5531
|
+
{
|
|
5532
|
+
ref: carCake._data[2]._hash,
|
|
5533
|
+
sliceIds: ["VIN12"]
|
|
5534
|
+
}
|
|
5535
|
+
],
|
|
5536
|
+
_hash: ""
|
|
5537
|
+
}
|
|
5538
|
+
],
|
|
5539
|
+
_hash: ""
|
|
5540
|
+
});
|
|
5541
|
+
const seriesGeneralLayerTableCfg = hip(
|
|
5542
|
+
createLayerTableCfg("seriesGeneralLayer")
|
|
5543
|
+
);
|
|
5544
|
+
const seriesGeneralLayerData = [
|
|
5545
|
+
{
|
|
5546
|
+
add: {
|
|
5547
|
+
Serie0: seriesGeneral._data[0]._hash,
|
|
5548
|
+
Serie1: seriesGeneral._data[1]._hash,
|
|
5549
|
+
Serie2: seriesGeneral._data[2]._hash,
|
|
5550
|
+
Serie3: seriesGeneral._data[3]._hash,
|
|
5551
|
+
_hash: ""
|
|
5552
|
+
},
|
|
5553
|
+
sliceIdsTable: "seriesSliceId",
|
|
5554
|
+
sliceIdsTableRow: seriesSliceId._data[0]._hash,
|
|
5555
|
+
componentsTable: "seriesGeneral",
|
|
5556
|
+
_hash: ""
|
|
5557
|
+
},
|
|
5558
|
+
{
|
|
5559
|
+
add: {
|
|
5560
|
+
Serie4: seriesGeneral._data[4]._hash,
|
|
5561
|
+
Serie5: seriesGeneral._data[5]._hash,
|
|
5562
|
+
Serie6: seriesGeneral._data[6]._hash,
|
|
5563
|
+
Serie7: seriesGeneral._data[7]._hash,
|
|
5564
|
+
_hash: ""
|
|
5565
|
+
},
|
|
5566
|
+
sliceIdsTable: "seriesSliceId",
|
|
5567
|
+
sliceIdsTableRow: seriesSliceId._data[1]._hash,
|
|
5568
|
+
componentsTable: "seriesGeneral",
|
|
5569
|
+
_hash: ""
|
|
5570
|
+
},
|
|
5571
|
+
{
|
|
5572
|
+
add: {
|
|
5573
|
+
Serie8: seriesGeneral._data[8]._hash,
|
|
5574
|
+
Serie9: seriesGeneral._data[9]._hash,
|
|
5575
|
+
Serie10: seriesGeneral._data[10]._hash,
|
|
5576
|
+
Serie11: seriesGeneral._data[11]._hash,
|
|
5577
|
+
_hash: ""
|
|
5578
|
+
},
|
|
5579
|
+
sliceIdsTable: "seriesSliceId",
|
|
5580
|
+
sliceIdsTableRow: seriesSliceId._data[2]._hash,
|
|
5581
|
+
componentsTable: "seriesGeneral",
|
|
5582
|
+
_hash: ""
|
|
5583
|
+
}
|
|
5584
|
+
].map((layer) => hsh(layer));
|
|
5585
|
+
const seriesGeneralLayer = hip({
|
|
5586
|
+
_tableCfg: seriesGeneralLayerTableCfg._hash,
|
|
5587
|
+
_type: "layers",
|
|
5588
|
+
_data: chainLayers(seriesGeneralLayerData),
|
|
5589
|
+
_hash: ""
|
|
5590
|
+
});
|
|
5591
|
+
const seriesCarsLayerTableCfg = hip(
|
|
5592
|
+
createLayerTableCfg("seriesCarsLayer")
|
|
5593
|
+
);
|
|
5594
|
+
const seriesCarsLayerData = [
|
|
5595
|
+
{
|
|
5596
|
+
add: {
|
|
5597
|
+
Serie0: seriesCars._data[0]._hash,
|
|
5598
|
+
Serie1: seriesCars._data[1]._hash,
|
|
5599
|
+
Serie2: seriesCars._data[2]._hash,
|
|
5600
|
+
Serie3: seriesCars._data[3]._hash,
|
|
5601
|
+
_hash: ""
|
|
5602
|
+
},
|
|
5603
|
+
sliceIdsTable: "seriesSliceId",
|
|
5604
|
+
sliceIdsTableRow: seriesSliceId._data[0]._hash,
|
|
5605
|
+
componentsTable: "seriesCars",
|
|
5606
|
+
_hash: ""
|
|
5607
|
+
},
|
|
5608
|
+
{
|
|
5609
|
+
add: {
|
|
5610
|
+
Serie4: seriesCars._data[4]._hash,
|
|
5611
|
+
Serie5: seriesCars._data[5]._hash,
|
|
5612
|
+
Serie6: seriesCars._data[6]._hash,
|
|
5613
|
+
Serie7: seriesCars._data[7]._hash,
|
|
5614
|
+
_hash: ""
|
|
5615
|
+
},
|
|
5616
|
+
sliceIdsTable: "seriesSliceId",
|
|
5617
|
+
sliceIdsTableRow: seriesSliceId._data[1]._hash,
|
|
5618
|
+
componentsTable: "seriesCars",
|
|
5619
|
+
_hash: ""
|
|
5620
|
+
},
|
|
5621
|
+
{
|
|
5622
|
+
add: {
|
|
5623
|
+
Serie8: seriesCars._data[8]._hash,
|
|
5624
|
+
Serie9: seriesCars._data[9]._hash,
|
|
5625
|
+
Serie10: seriesCars._data[10]._hash,
|
|
5626
|
+
Serie11: seriesCars._data[11]._hash,
|
|
5627
|
+
_hash: ""
|
|
5628
|
+
},
|
|
5629
|
+
sliceIdsTable: "seriesSliceId",
|
|
5630
|
+
sliceIdsTableRow: seriesSliceId._data[2]._hash,
|
|
5631
|
+
componentsTable: "seriesCars",
|
|
5632
|
+
_hash: ""
|
|
5633
|
+
}
|
|
5634
|
+
].map((layer) => hsh(layer));
|
|
5635
|
+
const seriesCarsLayer = hip({
|
|
5636
|
+
_tableCfg: seriesCarsLayerTableCfg._hash,
|
|
5637
|
+
_type: "layers",
|
|
5638
|
+
_data: chainLayers(seriesCarsLayerData)
|
|
5639
|
+
});
|
|
5640
|
+
const seriesCakeTableCfg = hip(
|
|
5641
|
+
createCakeTableCfg("seriesCake")
|
|
5642
|
+
);
|
|
5643
|
+
const seriesCake = hip({
|
|
5644
|
+
_tableCfg: seriesCakeTableCfg._hash,
|
|
5645
|
+
_type: "cakes",
|
|
5646
|
+
_data: [
|
|
5647
|
+
{
|
|
5648
|
+
sliceIdsTable: "seriesSliceId",
|
|
5649
|
+
sliceIdsRow: seriesSliceId._data[0]._hash,
|
|
5650
|
+
layers: {
|
|
5651
|
+
seriesGeneralLayer: seriesGeneralLayer._data[0]._hash,
|
|
5652
|
+
seriesCarsLayer: seriesCarsLayer._data[0]._hash
|
|
5653
|
+
}
|
|
5654
|
+
},
|
|
5655
|
+
{
|
|
5656
|
+
sliceIdsTable: "seriesSliceId",
|
|
5657
|
+
sliceIdsRow: seriesSliceId._data[1]._hash,
|
|
5658
|
+
layers: {
|
|
5659
|
+
seriesGeneralLayer: seriesGeneralLayer._data[1]._hash,
|
|
5660
|
+
seriesCarsLayer: seriesCarsLayer._data[1]._hash
|
|
5661
|
+
}
|
|
5662
|
+
},
|
|
5663
|
+
{
|
|
5664
|
+
sliceIdsTable: "seriesSliceId",
|
|
5665
|
+
sliceIdsRow: seriesSliceId._data[2]._hash,
|
|
5666
|
+
layers: {
|
|
5667
|
+
seriesGeneralLayer: seriesGeneralLayer._data[2]._hash,
|
|
5668
|
+
seriesCarsLayer: seriesCarsLayer._data[2]._hash
|
|
5669
|
+
}
|
|
5670
|
+
}
|
|
5671
|
+
]
|
|
5672
|
+
});
|
|
5673
|
+
const seriesCakeHeadTableCfg = hip(
|
|
5674
|
+
createHeadsTableCfg("seriesCake")
|
|
5675
|
+
);
|
|
5676
|
+
const seriesCakeHeads = hip({
|
|
5677
|
+
_tableCfg: seriesCakeHeadTableCfg._hash,
|
|
5678
|
+
_type: "head",
|
|
5679
|
+
_data: [
|
|
5680
|
+
{
|
|
5681
|
+
timeId: "1764756756315:L14y",
|
|
5682
|
+
cakeRef: seriesCake._data[0]._hash
|
|
5683
|
+
},
|
|
5684
|
+
{
|
|
5685
|
+
timeId: "1764756756315:xCXT",
|
|
5686
|
+
cakeRef: seriesCake._data[1]._hash
|
|
5687
|
+
},
|
|
5688
|
+
{
|
|
5689
|
+
timeId: "1764756756315:fZwA",
|
|
5690
|
+
cakeRef: seriesCake._data[2]._hash
|
|
5691
|
+
}
|
|
5692
|
+
]
|
|
5693
|
+
});
|
|
5694
|
+
const catalogSliceIdTableCfg = hip(
|
|
5695
|
+
createSliceIdsTableCfg("catalogSliceId")
|
|
5696
|
+
);
|
|
5697
|
+
const catalogSliceIdData = [
|
|
5698
|
+
{
|
|
5699
|
+
add: ["Catalog0", "Catalog1"],
|
|
5700
|
+
_hash: ""
|
|
5701
|
+
}
|
|
5702
|
+
].map((sliceIds) => hsh(sliceIds));
|
|
5703
|
+
const catalogSliceId = hip({
|
|
5704
|
+
_tableCfg: catalogSliceIdTableCfg._hash,
|
|
5705
|
+
_type: "sliceIds",
|
|
5706
|
+
_data: chainSliceIds(catalogSliceIdData),
|
|
5707
|
+
_hash: ""
|
|
5708
|
+
});
|
|
5709
|
+
const catalogSeriesTableCfg = hip({
|
|
5710
|
+
key: "catalogSeries",
|
|
5711
|
+
type: "components",
|
|
5712
|
+
columns: [
|
|
5713
|
+
{ key: "_hash", type: "string", titleShort: "Hash", titleLong: "Hash" },
|
|
5714
|
+
{
|
|
5715
|
+
key: "series",
|
|
5716
|
+
type: "jsonArray",
|
|
5717
|
+
titleShort: "Series",
|
|
5718
|
+
titleLong: "Series References",
|
|
5719
|
+
ref: {
|
|
5720
|
+
tableKey: "seriesCake",
|
|
5721
|
+
type: "cakes"
|
|
5722
|
+
}
|
|
5723
|
+
}
|
|
5724
|
+
],
|
|
5725
|
+
isHead: false,
|
|
5726
|
+
isRoot: false,
|
|
5727
|
+
isShared: true
|
|
5728
|
+
});
|
|
5729
|
+
const catalogSeries = hip({
|
|
5730
|
+
_tableCfg: catalogSeriesTableCfg._hash,
|
|
5731
|
+
_type: "components",
|
|
5732
|
+
_data: [
|
|
5733
|
+
{
|
|
5734
|
+
series: [
|
|
5735
|
+
{
|
|
5736
|
+
ref: seriesCake._data[0]._hash,
|
|
5737
|
+
sliceIds: ["Serie0", "Serie1", "Serie2", "Serie3"]
|
|
5738
|
+
},
|
|
5739
|
+
{
|
|
5740
|
+
ref: seriesCake._data[1]._hash,
|
|
5741
|
+
sliceIds: ["Serie4", "Serie5", "Serie6", "Serie7"]
|
|
5742
|
+
}
|
|
5743
|
+
],
|
|
5744
|
+
_hash: ""
|
|
5745
|
+
},
|
|
5746
|
+
{
|
|
5747
|
+
series: [
|
|
5748
|
+
{
|
|
5749
|
+
ref: seriesCake._data[2]._hash
|
|
5750
|
+
}
|
|
5751
|
+
],
|
|
5752
|
+
_hash: ""
|
|
5753
|
+
}
|
|
5754
|
+
],
|
|
5755
|
+
_hash: ""
|
|
5756
|
+
});
|
|
5757
|
+
const catalogSeriesLayerTableCfg = hip(
|
|
5758
|
+
createLayerTableCfg("catalogSeriesLayer")
|
|
5759
|
+
);
|
|
5760
|
+
const catalogSeriesLayerData = [
|
|
5761
|
+
{
|
|
5762
|
+
add: {
|
|
5763
|
+
Catalog0: catalogSeries._data[0]._hash,
|
|
5764
|
+
Catalog1: catalogSeries._data[1]._hash,
|
|
5765
|
+
_hash: ""
|
|
5766
|
+
},
|
|
5767
|
+
sliceIdsTable: "catalogSliceId",
|
|
5768
|
+
sliceIdsTableRow: catalogSliceId._data[0]._hash,
|
|
5769
|
+
componentsTable: "catalogSeries",
|
|
5770
|
+
_hash: ""
|
|
5771
|
+
}
|
|
5772
|
+
].map((layer) => hsh(layer));
|
|
5773
|
+
const catalogSeriesLayer = hip({
|
|
5774
|
+
_tableCfg: catalogSeriesLayerTableCfg._hash,
|
|
5775
|
+
_type: "layers",
|
|
5776
|
+
_data: chainLayers(catalogSeriesLayerData),
|
|
5777
|
+
_hash: ""
|
|
5778
|
+
});
|
|
5779
|
+
const catalogCakeTableCfg = hip(
|
|
5780
|
+
createCakeTableCfg("catalogCake")
|
|
5781
|
+
);
|
|
5782
|
+
const catalogCake = hip({
|
|
5783
|
+
_tableCfg: catalogCakeTableCfg._hash,
|
|
5784
|
+
_type: "cakes",
|
|
5785
|
+
_data: [
|
|
5786
|
+
{
|
|
5787
|
+
sliceIdsTable: "catalogSliceId",
|
|
5788
|
+
sliceIdsRow: catalogSliceId._data[0]._hash,
|
|
5789
|
+
layers: {
|
|
5790
|
+
catalogSeriesLayer: catalogSeriesLayer._data[0]._hash
|
|
5791
|
+
}
|
|
5792
|
+
}
|
|
5793
|
+
]
|
|
5794
|
+
});
|
|
5795
|
+
const catalogCakeHeadTableCfg = hip(
|
|
5796
|
+
createHeadsTableCfg("catalogCake")
|
|
5797
|
+
);
|
|
5798
|
+
const catalogCakeHeads = hip({
|
|
5799
|
+
_tableCfg: catalogCakeHeadTableCfg._hash,
|
|
5800
|
+
_type: "head",
|
|
5801
|
+
_data: [
|
|
5802
|
+
{
|
|
5803
|
+
timeId: "1764756756317:5UTy",
|
|
5804
|
+
cakeRef: catalogCake._data[0]._hash
|
|
5805
|
+
}
|
|
5806
|
+
]
|
|
5807
|
+
});
|
|
5808
|
+
const tableCfgs = {
|
|
5809
|
+
_data: [
|
|
5810
|
+
carSliceIdTableCfg,
|
|
5811
|
+
carGeneralTableCfg,
|
|
5812
|
+
carDimensionsTableCfg,
|
|
5813
|
+
carTechnicalTableCfg,
|
|
5814
|
+
carColorTableCfg,
|
|
5815
|
+
carGeneralLayerTableCfg,
|
|
5816
|
+
carTechnicalLayerTableCfg,
|
|
5817
|
+
carColorLayerTableCfg,
|
|
5818
|
+
carCakeTableCfg,
|
|
5819
|
+
carCakeHeadTableCfg,
|
|
5820
|
+
seriesSliceIdTableCfg,
|
|
5821
|
+
seriesGeneralTableCfg,
|
|
5822
|
+
seriesCarsTableCfg,
|
|
5823
|
+
seriesGeneralLayerTableCfg,
|
|
5824
|
+
seriesCarsLayerTableCfg,
|
|
5825
|
+
seriesCakeTableCfg,
|
|
5826
|
+
seriesCakeHeadTableCfg,
|
|
5827
|
+
catalogSliceIdTableCfg,
|
|
5828
|
+
catalogSeriesTableCfg,
|
|
5829
|
+
catalogSeriesLayerTableCfg,
|
|
5830
|
+
catalogCakeTableCfg,
|
|
5831
|
+
catalogCakeHeadTableCfg
|
|
5832
|
+
]
|
|
5833
|
+
};
|
|
5834
|
+
const staticExample2 = {
|
|
5835
|
+
carSliceId,
|
|
5836
|
+
carGeneral,
|
|
5837
|
+
carDimensions,
|
|
5838
|
+
carTechnical,
|
|
5839
|
+
carColor,
|
|
5840
|
+
carGeneralLayer,
|
|
5841
|
+
carTechnicalLayer,
|
|
5842
|
+
carColorLayer,
|
|
5843
|
+
carCake,
|
|
5844
|
+
carCakeHeads,
|
|
5845
|
+
seriesSliceId,
|
|
5846
|
+
seriesGeneral,
|
|
5847
|
+
seriesCars,
|
|
5848
|
+
seriesGeneralLayer,
|
|
5849
|
+
seriesCarsLayer,
|
|
5850
|
+
seriesCake,
|
|
5851
|
+
seriesCakeHeads,
|
|
5852
|
+
catalogSliceId,
|
|
5853
|
+
catalogSeries,
|
|
5854
|
+
catalogSeriesLayer,
|
|
5855
|
+
catalogCake,
|
|
5856
|
+
catalogCakeHeads,
|
|
5857
|
+
tableCfgs
|
|
5858
|
+
};
|
|
5859
|
+
return staticExample2;
|
|
5860
|
+
};
|
|
3712
5861
|
export {
|
|
3713
|
-
|
|
5862
|
+
Connector,
|
|
5863
|
+
Db,
|
|
5864
|
+
Join,
|
|
5865
|
+
MultiEditManager,
|
|
5866
|
+
exampleEditActionColumnSelection,
|
|
5867
|
+
exampleEditActionColumnSelectionOnlySomeColumns,
|
|
5868
|
+
exampleEditActionRowFilter,
|
|
5869
|
+
exampleEditActionRowSort,
|
|
5870
|
+
exampleEditActionSetValue,
|
|
5871
|
+
exampleEditSetValueReferenced,
|
|
5872
|
+
staticExample
|
|
3714
5873
|
};
|
|
5874
|
+
//# sourceMappingURL=db.js.map
|