json-fs-query 3.1.3 → 3.2.0
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/browser/jsonFsQuery.js +2172 -5301
- package/browser/jsonFsQuery.min.js +1 -1
- package/dist/data/introspect/create.js +7 -22
- package/dist/data/introspect/create.min.js +1 -1
- package/dist/data/introspect/drop.js +5 -15
- package/dist/data/introspect/drop.min.js +1 -1
- package/dist/data/introspect/policies/foreignKeyExists.d.ts +2 -0
- package/dist/data/introspect/policies/foreignKeyExists.js +9 -3
- package/dist/data/introspect/policies/foreignKeyExists.min.js +1 -1
- package/dist/data/introspect/policies/hasDependents.d.ts +3 -3
- package/dist/data/introspect/policies/hasDependents.js +11 -3
- package/dist/data/introspect/policies/hasDependents.min.js +1 -1
- package/dist/data/introspect/policies/keyUnique.d.ts +3 -0
- package/dist/data/introspect/policies/keyUnique.js +10 -0
- package/dist/data/introspect/policies/keyUnique.min.js +1 -1
- package/dist/data/queries/deleteEntity.js +29 -18
- package/dist/data/queries/deleteEntity.min.js +1 -1
- package/dist/data/queries/insertEntity.js +6 -8
- package/dist/data/queries/insertEntity.min.js +1 -1
- package/dist/data/queries/joinEntity.d.ts +15 -0
- package/dist/data/queries/joinEntity.js +91 -15
- package/dist/data/queries/joinEntity.min.js +1 -1
- package/dist/data/queries/updateEntity.js +15 -10
- package/dist/data/queries/updateEntity.min.js +1 -1
- package/dist/data/storage/fileExists.d.ts +6 -0
- package/dist/data/storage/fileExists.js +18 -0
- package/dist/data/storage/fileExists.min.js +1 -0
- package/dist/data/storage/index.d.ts +16 -0
- package/dist/data/storage/index.js +61 -0
- package/dist/data/storage/index.min.js +1 -0
- package/dist/data/storage/makeDirectory.d.ts +6 -0
- package/dist/data/storage/makeDirectory.js +18 -0
- package/dist/data/storage/makeDirectory.min.js +1 -0
- package/dist/data/storage/nodeFiles.d.ts +6 -0
- package/dist/data/storage/nodeFiles.js +12 -0
- package/dist/data/storage/nodeFiles.min.js +1 -0
- package/dist/data/storage/readCache.d.ts +37 -0
- package/dist/data/storage/readCache.js +117 -0
- package/dist/data/storage/readCache.min.js +1 -0
- package/dist/data/storage/readJson.d.ts +8 -0
- package/dist/data/storage/readJson.js +25 -0
- package/dist/data/storage/readJson.min.js +1 -0
- package/dist/data/storage/removeDirectory.d.ts +6 -0
- package/dist/data/storage/removeDirectory.js +24 -0
- package/dist/data/storage/removeDirectory.min.js +1 -0
- package/dist/data/storage/removeFile.d.ts +7 -0
- package/dist/data/storage/removeFile.js +22 -0
- package/dist/data/storage/removeFile.min.js +1 -0
- package/dist/data/storage/storagePath.d.ts +11 -0
- package/dist/data/storage/storagePath.js +25 -0
- package/dist/data/storage/storagePath.min.js +1 -0
- package/dist/data/storage/writeJson.d.ts +8 -0
- package/dist/data/storage/writeJson.js +23 -0
- package/dist/data/storage/writeJson.min.js +1 -0
- package/dist/data/utilities/compareAs.d.ts +1 -0
- package/dist/data/utilities/compareAs.js +2 -2
- package/dist/data/utilities/compareAs.min.js +1 -1
- package/dist/data/utilities/databaseLock.d.ts +2 -0
- package/dist/data/utilities/databaseLock.js +5 -2
- package/dist/data/utilities/databaseLock.min.js +1 -1
- package/dist/data/utilities/deregisterRecord.js +4 -10
- package/dist/data/utilities/deregisterRecord.min.js +1 -1
- package/dist/data/utilities/indexHas.d.ts +13 -0
- package/dist/data/utilities/indexHas.js +48 -0
- package/dist/data/utilities/indexHas.min.js +1 -0
- package/dist/data/utilities/joinBases.d.ts +29 -0
- package/dist/data/utilities/joinBases.js +136 -0
- package/dist/data/utilities/joinBases.min.js +1 -0
- package/dist/data/utilities/joinKey.d.ts +17 -0
- package/dist/data/utilities/joinKey.js +31 -0
- package/dist/data/utilities/joinKey.min.js +1 -0
- package/dist/data/utilities/keyIndexFiles.d.ts +16 -0
- package/dist/data/utilities/keyIndexFiles.js +60 -0
- package/dist/data/utilities/keyIndexFiles.min.js +1 -0
- package/dist/data/utilities/recordExists.js +2 -7
- package/dist/data/utilities/recordExists.min.js +1 -1
- package/dist/data/utilities/registerRecord.js +4 -10
- package/dist/data/utilities/registerRecord.min.js +1 -1
- package/dist/data/utilities/removeFromIndex.js +4 -10
- package/dist/data/utilities/removeFromIndex.min.js +1 -1
- package/dist/data/utilities/retrieveFile.d.ts +5 -0
- package/dist/data/utilities/retrieveFile.js +7 -16
- package/dist/data/utilities/retrieveFile.min.js +1 -1
- package/dist/data/utilities/rowLookup.d.ts +38 -0
- package/dist/data/utilities/rowLookup.js +99 -0
- package/dist/data/utilities/rowLookup.min.js +1 -0
- package/dist/data/utilities/runQuery.js +1 -2
- package/dist/data/utilities/runQuery.min.js +1 -1
- package/dist/data/utilities/semiJoin.d.ts +27 -0
- package/dist/data/utilities/semiJoin.js +97 -0
- package/dist/data/utilities/semiJoin.min.js +1 -0
- package/dist/data/utilities/updateIndex.js +5 -14
- package/dist/data/utilities/updateIndex.min.js +1 -1
- package/package.json +4 -2
- package/dist/data/utilities/getJoinIndexedList.d.ts +0 -3
- package/dist/data/utilities/getJoinIndexedList.js +0 -76
- package/dist/data/utilities/getJoinIndexedList.min.js +0 -1
- package/dist/data/utilities/getMatchingIndexes.d.ts +0 -2
- package/dist/data/utilities/getMatchingIndexes.js +0 -28
- package/dist/data/utilities/getMatchingIndexes.min.js +0 -1
- package/dist/data/utilities/matchIndexedJoins.d.ts +0 -2
- package/dist/data/utilities/matchIndexedJoins.js +0 -63
- package/dist/data/utilities/matchIndexedJoins.min.js +0 -1
- package/dist/data/utilities/restrictIndexedList.d.ts +0 -2
- package/dist/data/utilities/restrictIndexedList.js +0 -45
- package/dist/data/utilities/restrictIndexedList.min.js +0 -1
- package/dist/data/utilities/useJoinClause.d.ts +0 -6
- package/dist/data/utilities/useJoinClause.js +0 -57
- package/dist/data/utilities/useJoinClause.min.js +0 -1
|
@@ -1,26 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
require("core-js/modules/esnext.weak-map.delete-all.js");
|
|
4
3
|
Object.defineProperty(exports, "__esModule", {
|
|
5
4
|
value: true
|
|
6
5
|
});
|
|
7
6
|
exports.retrieveFile = void 0;
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
var _storage = require("../storage");
|
|
8
|
+
/**
|
|
9
|
+
* Read one JSON file of the database (see readJson), logging the underlying error and throwing one that names the file.
|
|
10
|
+
* @param path - A path inside the database, such as `users.json`.
|
|
11
|
+
* @throws {Error} `Could not read <path>` when the file can't be read.
|
|
12
|
+
*/
|
|
12
13
|
const retrieveFile = async path => {
|
|
13
|
-
|
|
14
|
-
const relativePath = jsEnv.isBrowser ? (0, _config.getSetting)('relativePath', '') : '';
|
|
15
|
-
if (jsEnv.isNode) {
|
|
16
|
-
const {
|
|
17
|
-
readFile
|
|
18
|
-
} = require('fs/promises');
|
|
19
|
-
retrieveFn = url => readFile(url).then(res => JSON.parse(res));
|
|
20
|
-
}
|
|
21
|
-
const databasePath = (0, _config.getSetting)('databasePath', 'database/');
|
|
22
|
-
const fetchUrl = `${relativePath}${databasePath}${path}`;
|
|
23
|
-
const recordInfo = await retrieveFn(fetchUrl).catch(err => console.error(err));
|
|
14
|
+
const recordInfo = await (0, _storage.readJson)(path).catch(err => console.error(err));
|
|
24
15
|
if (!recordInfo) {
|
|
25
16
|
throw new Error(`Could not read ${path}`);
|
|
26
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.retrieveFile=void 0;var _storage=require("../storage");const retrieveFile=async e=>{const r=await(0,_storage.readJson)(e).catch((e=>console.error(e)));if(!r)throw new Error(`Could not read ${e}`);return r};exports.retrieveFile=retrieveFile;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rows grouped by their join key on one field (see joinKey), each group in the rows' order. Rows whose field is null or
|
|
3
|
+
* missing are left out: they equal nothing.
|
|
4
|
+
* @param rows
|
|
5
|
+
* @param property
|
|
6
|
+
* @param type - The declared type the field is compared by.
|
|
7
|
+
*/
|
|
8
|
+
export declare const groupRows: (rows: any[], property: string, type: string | undefined) => Map<any, any[]>;
|
|
9
|
+
/**
|
|
10
|
+
* The position of the first row with each join key on one field (see groupRows).
|
|
11
|
+
* @param rows
|
|
12
|
+
* @param property
|
|
13
|
+
* @param type - The declared type the field is compared by.
|
|
14
|
+
*/
|
|
15
|
+
export declare const firstPositions: (rows: any[], property: string, type: string | undefined) => Map<any, number>;
|
|
16
|
+
/**
|
|
17
|
+
* Lookups over one list of rows, built once and kept for as long as the list (a join's rows of a record), so a join
|
|
18
|
+
* builds each lookup once rather than once per row joined.
|
|
19
|
+
*/
|
|
20
|
+
export declare class RowLookups {
|
|
21
|
+
readonly rows: any[];
|
|
22
|
+
private groups;
|
|
23
|
+
private positions;
|
|
24
|
+
constructor(rows: any[]);
|
|
25
|
+
/**
|
|
26
|
+
* See groupRows.
|
|
27
|
+
* @param property
|
|
28
|
+
* @param type
|
|
29
|
+
*/
|
|
30
|
+
groupsBy(property: string, type: string | undefined): Map<any, any[]>;
|
|
31
|
+
/**
|
|
32
|
+
* See firstPositions.
|
|
33
|
+
* @param property
|
|
34
|
+
* @param type
|
|
35
|
+
*/
|
|
36
|
+
positionsBy(property: string, type: string | undefined): Map<any, number>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=rowLookup.d.ts.map
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.groupRows = exports.firstPositions = exports.RowLookups = void 0;
|
|
7
|
+
require("core-js/modules/esnext.iterator.constructor.js");
|
|
8
|
+
require("core-js/modules/esnext.iterator.for-each.js");
|
|
9
|
+
require("core-js/modules/esnext.map.delete-all.js");
|
|
10
|
+
require("core-js/modules/esnext.map.every.js");
|
|
11
|
+
require("core-js/modules/esnext.map.filter.js");
|
|
12
|
+
require("core-js/modules/esnext.map.find.js");
|
|
13
|
+
require("core-js/modules/esnext.map.find-key.js");
|
|
14
|
+
require("core-js/modules/esnext.map.includes.js");
|
|
15
|
+
require("core-js/modules/esnext.map.key-of.js");
|
|
16
|
+
require("core-js/modules/esnext.map.map-keys.js");
|
|
17
|
+
require("core-js/modules/esnext.map.map-values.js");
|
|
18
|
+
require("core-js/modules/esnext.map.merge.js");
|
|
19
|
+
require("core-js/modules/esnext.map.reduce.js");
|
|
20
|
+
require("core-js/modules/esnext.map.some.js");
|
|
21
|
+
require("core-js/modules/esnext.map.update.js");
|
|
22
|
+
var _joinKey = require("./joinKey");
|
|
23
|
+
/**
|
|
24
|
+
* Rows grouped by their join key on one field (see joinKey), each group in the rows' order. Rows whose field is null or
|
|
25
|
+
* missing are left out: they equal nothing.
|
|
26
|
+
* @param rows
|
|
27
|
+
* @param property
|
|
28
|
+
* @param type - The declared type the field is compared by.
|
|
29
|
+
*/
|
|
30
|
+
const groupRows = (rows, property, type) => {
|
|
31
|
+
const groups = new Map();
|
|
32
|
+
for (const row of rows) {
|
|
33
|
+
const key = (0, _joinKey.joinKey)(type, row[property]);
|
|
34
|
+
if (typeof key === 'undefined') {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const group = groups.get(key);
|
|
38
|
+
if (group) {
|
|
39
|
+
group.push(row);
|
|
40
|
+
} else {
|
|
41
|
+
groups.set(key, [row]);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return groups;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* The position of the first row with each join key on one field (see groupRows).
|
|
48
|
+
* @param rows
|
|
49
|
+
* @param property
|
|
50
|
+
* @param type - The declared type the field is compared by.
|
|
51
|
+
*/
|
|
52
|
+
exports.groupRows = groupRows;
|
|
53
|
+
const firstPositions = (rows, property, type) => {
|
|
54
|
+
const positions = new Map();
|
|
55
|
+
rows.forEach((row, position) => {
|
|
56
|
+
const key = (0, _joinKey.joinKey)(type, row[property]);
|
|
57
|
+
if (typeof key !== 'undefined' && !positions.has(key)) {
|
|
58
|
+
positions.set(key, position);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
return positions;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Lookups over one list of rows, built once and kept for as long as the list (a join's rows of a record), so a join
|
|
65
|
+
* builds each lookup once rather than once per row joined.
|
|
66
|
+
*/
|
|
67
|
+
exports.firstPositions = firstPositions;
|
|
68
|
+
class RowLookups {
|
|
69
|
+
constructor(rows) {
|
|
70
|
+
this.rows = rows;
|
|
71
|
+
this.groups = new Map();
|
|
72
|
+
this.positions = new Map();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* See groupRows.
|
|
76
|
+
* @param property
|
|
77
|
+
* @param type
|
|
78
|
+
*/
|
|
79
|
+
groupsBy(property, type) {
|
|
80
|
+
const name = `${property}\u0000${type}`;
|
|
81
|
+
if (!this.groups.has(name)) {
|
|
82
|
+
this.groups.set(name, groupRows(this.rows, property, type));
|
|
83
|
+
}
|
|
84
|
+
return this.groups.get(name);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* See firstPositions.
|
|
88
|
+
* @param property
|
|
89
|
+
* @param type
|
|
90
|
+
*/
|
|
91
|
+
positionsBy(property, type) {
|
|
92
|
+
const name = `${property}\u0000${type}`;
|
|
93
|
+
if (!this.positions.has(name)) {
|
|
94
|
+
this.positions.set(name, firstPositions(this.rows, property, type));
|
|
95
|
+
}
|
|
96
|
+
return this.positions.get(name);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.RowLookups = RowLookups;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.groupRows=exports.firstPositions=exports.RowLookups=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.for-each.js"),require("core-js/modules/esnext.map.delete-all.js"),require("core-js/modules/esnext.map.every.js"),require("core-js/modules/esnext.map.filter.js"),require("core-js/modules/esnext.map.find.js"),require("core-js/modules/esnext.map.find-key.js"),require("core-js/modules/esnext.map.includes.js"),require("core-js/modules/esnext.map.key-of.js"),require("core-js/modules/esnext.map.map-keys.js"),require("core-js/modules/esnext.map.map-values.js"),require("core-js/modules/esnext.map.merge.js"),require("core-js/modules/esnext.map.reduce.js"),require("core-js/modules/esnext.map.some.js"),require("core-js/modules/esnext.map.update.js");var _joinKey=require("./joinKey");const groupRows=(e,s,o)=>{const r=new Map;for(const t of e){const e=(0,_joinKey.joinKey)(o,t[s]);if(void 0===e)continue;const i=r.get(e);i?i.push(t):r.set(e,[t])}return r};exports.groupRows=groupRows;const firstPositions=(e,s,o)=>{const r=new Map;return e.forEach(((e,t)=>{const i=(0,_joinKey.joinKey)(o,e[s]);void 0===i||r.has(i)||r.set(i,t)})),r};exports.firstPositions=firstPositions;class RowLookups{constructor(e){this.rows=e,this.groups=new Map,this.positions=new Map}groupsBy(e,s){const o=`${e}\0${s}`;return this.groups.has(o)||this.groups.set(o,groupRows(this.rows,e,s)),this.groups.get(o)}positionsBy(e,s){const o=`${e}\0${s}`;return this.positions.has(o)||this.positions.set(o,firstPositions(this.rows,e,s)),this.positions.get(o)}}exports.RowLookups=RowLookups;
|
|
@@ -38,7 +38,6 @@ var _limitOffset = require("../queries/limitOffset");
|
|
|
38
38
|
var _selectFields = require("../queries/selectFields");
|
|
39
39
|
var _retrieveRecord = require("./retrieveRecord");
|
|
40
40
|
var _getConditionIndexedList = require("./getConditionIndexedList");
|
|
41
|
-
var _getJoinIndexedList = require("./getJoinIndexedList");
|
|
42
41
|
var _isEntityProperty = require("./parsers/isEntityProperty");
|
|
43
42
|
var _splitEntityProperty = require("./parsers/splitEntityProperty");
|
|
44
43
|
var _fieldType = require("./fieldType");
|
|
@@ -112,7 +111,7 @@ const runQuery = async parsed => {
|
|
|
112
111
|
const resolved = new Set();
|
|
113
112
|
parsed = await (0, _getConditionIndexedList.getConditionIndexedList)(parsed, recordData, dataSet, resolved);
|
|
114
113
|
const entityResolved = resolved.has(parsed.entity);
|
|
115
|
-
|
|
114
|
+
// The join is joinEntity's (below), for rows an index narrowed too
|
|
116
115
|
// delete/update act on whatever is already in dataSet[entity] - unlike read, which loads
|
|
117
116
|
// everything and lets the where-reduce below narrow it down afterward, they never get a second
|
|
118
117
|
// pass. So every condition is applied to the candidates (all rows, or the ones the indexes picked)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.runQuery=void 0,require("core-js/modules/es.array.includes.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js");var _deleteEntity=require("../queries/deleteEntity"),_insertEntity=require("../queries/insertEntity"),_readEntity=require("../queries/readEntity"),_updateEntity=require("../queries/updateEntity"),_createRecord=require("../queries/createRecord"),_dropRecord=require("../queries/dropRecord"),_describeRecord=require("../queries/describeRecord"),_showRecords=require("../queries/showRecords"),_joinEntity=require("../queries/joinEntity"),_mergeJoins=require("../queries/mergeJoins"),_where=require("../queries/where"),_sortBy=require("../queries/sortBy"),_groupBy=require("../queries/groupBy"),_limitOffset=require("../queries/limitOffset"),_selectFields=require("../queries/selectFields"),_retrieveRecord=require("./retrieveRecord"),_getConditionIndexedList=require("./getConditionIndexedList"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.runQuery=void 0,require("core-js/modules/es.array.includes.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js");var _deleteEntity=require("../queries/deleteEntity"),_insertEntity=require("../queries/insertEntity"),_readEntity=require("../queries/readEntity"),_updateEntity=require("../queries/updateEntity"),_createRecord=require("../queries/createRecord"),_dropRecord=require("../queries/dropRecord"),_describeRecord=require("../queries/describeRecord"),_showRecords=require("../queries/showRecords"),_joinEntity=require("../queries/joinEntity"),_mergeJoins=require("../queries/mergeJoins"),_where=require("../queries/where"),_sortBy=require("../queries/sortBy"),_groupBy=require("../queries/groupBy"),_limitOffset=require("../queries/limitOffset"),_selectFields=require("../queries/selectFields"),_retrieveRecord=require("./retrieveRecord"),_getConditionIndexedList=require("./getConditionIndexedList"),_isEntityProperty=require("./parsers/isEntityProperty"),_splitEntityProperty=require("./parsers/splitEntityProperty"),_fieldType=require("./fieldType"),_conditionTree=require("./conditionTree"),_conditionEntities=require("./conditionEntities"),_requireNode=require("./requireNode");const typeClauses=async(e,t)=>{for(const r of[...(0,_conditionTree.conditionsOf)(e.where),...e.sortClauses]){let i=e.entity,s=r.property;(0,_isEntityProperty.isEntityProperty)(s)&&({entity:i,property:s}=(0,_splitEntityProperty.splitEntityProperty)(s)),Object.prototype.hasOwnProperty.call(t,i)||(t[i]=await(0,_retrieveRecord.retrieveRecord)(i)),r.type=(0,_fieldType.fieldType)(t[i],s)}},runQuery=async e=>{const t=void 0!==e.where&&(0,_conditionEntities.conditionEntities)(e);switch(["insert","update","delete","create","drop"].includes(e.command)&&(0,_requireNode.requireNode)(`"${e.command}"`),e.command){case"create":return{[e.entity]:await(0,_createRecord.createRecord)(e.entity,e.create)};case"drop":return{[e.entity]:await(0,_dropRecord.dropRecord)(e.entity,e.ifExists)};case"describe":return{[e.entity]:await(0,_describeRecord.describeRecord)(e.entity)};case"show":return{[e.entity]:await(0,_showRecords.showRecords)()}}const r={[e.entity]:await(0,_retrieveRecord.retrieveRecord)(e.entity)};void 0!==e.joinEntity&&(r[e.joinEntity]=await(0,_retrieveRecord.retrieveRecord)(e.joinEntity)),await typeClauses(e,r);let i={[e.entity]:[]};const s=new Set;e=await(0,_getConditionIndexedList.getConditionIndexedList)(e,r,i,s);const n=s.has(e.entity);switch("delete"!==e.command&&"update"!==e.command||(n||(i=await(0,_readEntity.readEntity)(e.entity,i)),i[e.entity]=(0,_where.whereTree)(i[e.entity],e.where)),e.command){case"delete":i=await(0,_deleteEntity.deleteEntity)(e.entity,i);break;case"insert":i=await(0,_insertEntity.insertEntity)(e.entity,e.insertValues,i);break;case"read":n||(i=await(0,_readEntity.readEntity)(e.entity,i));break;case"update":i=await(0,_updateEntity.updateEntity)(e.entity,e.updateValues,i);break;default:throw new Error(`Unknown command: ${e.command}`)}return i=await(0,_joinEntity.joinEntity)(e.entity,e.joinEntity,i,e.joinClauses,n,s.has(e.joinEntity)),i=await(0,_mergeJoins.mergeJoins)(i,e.mergeJoins),"delete"!==e.command&&"update"!==e.command&&(i[e.entity]=(0,_where.whereTree)(i[e.entity],e.where,t?e.joinEntity:void 0)),i[e.entity]=(0,_sortBy.sortBy)(i[e.entity],e.sortClauses),i[e.entity]=(0,_groupBy.groupBy)(i[e.entity],e.groupBy),i[e.entity]=(0,_limitOffset.limitOffset)(i[e.entity],e.offset,e.limit),i[e.entity]=(0,_selectFields.selectFields)(i[e.entity],e.selectClauses,Boolean(e.groupBy?.length)),i};exports.runQuery=runQuery;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { RowLookups } from './rowLookup';
|
|
2
|
+
/**
|
|
3
|
+
* Rows of one record in a join: either all the rows the join read for it (with their lookups, built once and reused
|
|
4
|
+
* for every row joined) or a narrower list for one row's join.
|
|
5
|
+
*/
|
|
6
|
+
export type JoinSide = {
|
|
7
|
+
rows: any[];
|
|
8
|
+
lookups?: RowLookups;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* One step of a join, `target.targetProperty <comparator> source.sourceProperty`: the target rows that match at least
|
|
12
|
+
* one source row, compared by `type` (the target field's declared type).
|
|
13
|
+
*
|
|
14
|
+
* The order is the one the join has always produced: through the source rows in order, each adding the target rows it
|
|
15
|
+
* matches (in their order) that aren't in yet. For `=` on a keyed type (see isKeyedType) that's computed from lookups
|
|
16
|
+
* instead of comparing every pair: by going through the source rows and taking each key's group of target rows once,
|
|
17
|
+
* or, when the source is all of its record's rows and the target is smaller, by placing each target row at its key's
|
|
18
|
+
* first source row. Other comparators, and types compared loosely, compare row by row as before.
|
|
19
|
+
* @param target
|
|
20
|
+
* @param source
|
|
21
|
+
* @param targetProperty
|
|
22
|
+
* @param sourceProperty
|
|
23
|
+
* @param comparator
|
|
24
|
+
* @param type
|
|
25
|
+
*/
|
|
26
|
+
export declare const semiJoin: (target: JoinSide, source: JoinSide, targetProperty: string, sourceProperty: string, comparator: string, type: string | undefined) => any[];
|
|
27
|
+
//# sourceMappingURL=semiJoin.d.ts.map
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.semiJoin = void 0;
|
|
7
|
+
require("core-js/modules/esnext.iterator.constructor.js");
|
|
8
|
+
require("core-js/modules/esnext.iterator.for-each.js");
|
|
9
|
+
require("core-js/modules/esnext.iterator.map.js");
|
|
10
|
+
require("core-js/modules/esnext.set.add-all.js");
|
|
11
|
+
require("core-js/modules/esnext.set.delete-all.js");
|
|
12
|
+
require("core-js/modules/esnext.set.difference.js");
|
|
13
|
+
require("core-js/modules/esnext.set.every.js");
|
|
14
|
+
require("core-js/modules/esnext.set.filter.js");
|
|
15
|
+
require("core-js/modules/esnext.set.find.js");
|
|
16
|
+
require("core-js/modules/esnext.set.intersection.js");
|
|
17
|
+
require("core-js/modules/esnext.set.is-disjoint-from.js");
|
|
18
|
+
require("core-js/modules/esnext.set.is-subset-of.js");
|
|
19
|
+
require("core-js/modules/esnext.set.is-superset-of.js");
|
|
20
|
+
require("core-js/modules/esnext.set.join.js");
|
|
21
|
+
require("core-js/modules/esnext.set.map.js");
|
|
22
|
+
require("core-js/modules/esnext.set.reduce.js");
|
|
23
|
+
require("core-js/modules/esnext.set.some.js");
|
|
24
|
+
require("core-js/modules/esnext.set.symmetric-difference.js");
|
|
25
|
+
require("core-js/modules/esnext.set.union.js");
|
|
26
|
+
var _where = require("../queries/where");
|
|
27
|
+
var _joinKey = require("./joinKey");
|
|
28
|
+
var _rowLookup = require("./rowLookup");
|
|
29
|
+
/**
|
|
30
|
+
* One step of a join, `target.targetProperty <comparator> source.sourceProperty`: the target rows that match at least
|
|
31
|
+
* one source row, compared by `type` (the target field's declared type).
|
|
32
|
+
*
|
|
33
|
+
* The order is the one the join has always produced: through the source rows in order, each adding the target rows it
|
|
34
|
+
* matches (in their order) that aren't in yet. For `=` on a keyed type (see isKeyedType) that's computed from lookups
|
|
35
|
+
* instead of comparing every pair: by going through the source rows and taking each key's group of target rows once,
|
|
36
|
+
* or, when the source is all of its record's rows and the target is smaller, by placing each target row at its key's
|
|
37
|
+
* first source row. Other comparators, and types compared loosely, compare row by row as before.
|
|
38
|
+
* @param target
|
|
39
|
+
* @param source
|
|
40
|
+
* @param targetProperty
|
|
41
|
+
* @param sourceProperty
|
|
42
|
+
* @param comparator
|
|
43
|
+
* @param type
|
|
44
|
+
*/
|
|
45
|
+
const semiJoin = (target, source, targetProperty, sourceProperty, comparator, type) => {
|
|
46
|
+
if (comparator === '=' && (0, _joinKey.isKeyedType)(type)) {
|
|
47
|
+
if (source.lookups && target.rows.length < source.rows.length) {
|
|
48
|
+
const positions = source.lookups.positionsBy(sourceProperty, type);
|
|
49
|
+
const placed = [];
|
|
50
|
+
target.rows.forEach((row, index) => {
|
|
51
|
+
const position = positions.get((0, _joinKey.joinKey)(type, row[targetProperty]));
|
|
52
|
+
if (typeof position !== 'undefined') {
|
|
53
|
+
placed.push({
|
|
54
|
+
row,
|
|
55
|
+
position,
|
|
56
|
+
index
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return placed.sort((a, b) => a.position - b.position || a.index - b.index).map(({
|
|
61
|
+
row
|
|
62
|
+
}) => row);
|
|
63
|
+
}
|
|
64
|
+
const groups = target.lookups ? target.lookups.groupsBy(targetProperty, type) : (0, _rowLookup.groupRows)(target.rows, targetProperty, type);
|
|
65
|
+
const matched = [];
|
|
66
|
+
const taken = new Set();
|
|
67
|
+
for (const row of source.rows) {
|
|
68
|
+
const key = (0, _joinKey.joinKey)(type, row[sourceProperty]);
|
|
69
|
+
if (typeof key === 'undefined' || taken.has(key)) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
taken.add(key);
|
|
73
|
+
const group = groups.get(key);
|
|
74
|
+
if (group) {
|
|
75
|
+
matched.push(...group);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return matched;
|
|
79
|
+
}
|
|
80
|
+
const matched = [];
|
|
81
|
+
const kept = new Set();
|
|
82
|
+
for (const row of source.rows) {
|
|
83
|
+
for (const match of (0, _where.where)(target.rows, {
|
|
84
|
+
property: targetProperty,
|
|
85
|
+
comparator,
|
|
86
|
+
value: row[sourceProperty],
|
|
87
|
+
type
|
|
88
|
+
})) {
|
|
89
|
+
if (!kept.has(match)) {
|
|
90
|
+
kept.add(match);
|
|
91
|
+
matched.push(match);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return matched;
|
|
96
|
+
};
|
|
97
|
+
exports.semiJoin = semiJoin;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.semiJoin=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.for-each.js"),require("core-js/modules/esnext.iterator.map.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js");var _where=require("../queries/where"),_joinKey=require("./joinKey"),_rowLookup=require("./rowLookup");const semiJoin=(e,s,o,r,t,i)=>{if("="===t&&(0,_joinKey.isKeyedType)(i)){if(s.lookups&&e.rows.length<s.rows.length){const t=s.lookups.positionsBy(r,i),n=[];return e.rows.forEach(((e,s)=>{const r=t.get((0,_joinKey.joinKey)(i,e[o]));void 0!==r&&n.push({row:e,position:r,index:s})})),n.sort(((e,s)=>e.position-s.position||e.index-s.index)).map((({row:e})=>e))}const t=e.lookups?e.lookups.groupsBy(o,i):(0,_rowLookup.groupRows)(e.rows,o,i),n=[],u=new Set;for(const e of s.rows){const s=(0,_joinKey.joinKey)(i,e[r]);if(void 0===s||u.has(s))continue;u.add(s);const o=t.get(s);o&&n.push(...o)}return n}const n=[],u=new Set;for(const j of s.rows)for(const s of(0,_where.where)(e.rows,{property:o,comparator:t,value:j[r],type:i}))u.has(s)||(u.add(s),n.push(s));return n};exports.semiJoin=semiJoin;
|
|
@@ -5,16 +5,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.updateIndex = void 0;
|
|
7
7
|
require("core-js/modules/es.array.includes.js");
|
|
8
|
-
require("core-js/modules/es.json.stringify.js");
|
|
9
8
|
require("core-js/modules/esnext.iterator.constructor.js");
|
|
10
9
|
require("core-js/modules/esnext.iterator.find.js");
|
|
11
|
-
var _config = require("./config");
|
|
12
10
|
var _compareAs = require("./compareAs");
|
|
13
|
-
|
|
14
|
-
readFile,
|
|
15
|
-
writeFile,
|
|
16
|
-
mkdir
|
|
17
|
-
} = require('fs/promises');
|
|
11
|
+
var _storage = require("../storage");
|
|
18
12
|
/**
|
|
19
13
|
* Add a single entry file to the index that backs one of a record's keys, creating the index
|
|
20
14
|
* file (and its __indexes/{record} directory) the first time a value is indexed. Keys with no
|
|
@@ -29,12 +23,11 @@ const updateIndex = async (path = '', key = null, value = undefined, fileName =
|
|
|
29
23
|
if (!key || !key.lookup) {
|
|
30
24
|
return null;
|
|
31
25
|
}
|
|
32
|
-
const
|
|
33
|
-
const indexDir = `${databasePath}__indexes/${path}`;
|
|
26
|
+
const indexDir = `__indexes/${path}`;
|
|
34
27
|
const indexPath = `${indexDir}/${key.lookup}`;
|
|
35
28
|
let index = [];
|
|
36
29
|
try {
|
|
37
|
-
index =
|
|
30
|
+
index = await (0, _storage.readJson)(indexPath);
|
|
38
31
|
} catch (err) {
|
|
39
32
|
index = [];
|
|
40
33
|
}
|
|
@@ -49,10 +42,8 @@ const updateIndex = async (path = '', key = null, value = undefined, fileName =
|
|
|
49
42
|
record: [fileName]
|
|
50
43
|
});
|
|
51
44
|
}
|
|
52
|
-
await
|
|
53
|
-
|
|
54
|
-
});
|
|
55
|
-
await writeFile(indexPath, JSON.stringify(index, null, 2));
|
|
45
|
+
await (0, _storage.makeDirectory)(indexDir);
|
|
46
|
+
await (0, _storage.writeJson)(indexPath, index);
|
|
56
47
|
return index;
|
|
57
48
|
};
|
|
58
49
|
exports.updateIndex = updateIndex;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.updateIndex=void 0,require("core-js/modules/es.array.includes.js"),require("core-js/modules/
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.updateIndex=void 0,require("core-js/modules/es.array.includes.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.find.js");var _compareAs=require("./compareAs"),_storage=require("../storage");const updateIndex=async(e="",r=null,o=void 0,s="",t=void 0)=>{if(!r||!r.lookup)return null;const a=`__indexes/${e}`,u=`${a}/${r.lookup}`;let d=[];try{d=await(0,_storage.readJson)(u)}catch(e){d=[]}const i=d.find((e=>(0,_compareAs.sameValue)(t,e.value,o)));return i?i.record.includes(s)||i.record.push(s):d.push({value:o,record:[s]}),await(0,_storage.makeDirectory)(a),await(0,_storage.writeJson)(u,d),d};exports.updateIndex=updateIndex;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "json-fs-query",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"description": "Use json files to manage and read data.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -24,7 +24,8 @@
|
|
|
24
24
|
"watch": "gulp watchFull",
|
|
25
25
|
"watch:test": "gulp watchTest",
|
|
26
26
|
"lint": "gulp lint",
|
|
27
|
-
"prepublishOnly": "npm run build"
|
|
27
|
+
"prepublishOnly": "npm run build",
|
|
28
|
+
"benchmark": "node scripts/benchmark.cjs"
|
|
28
29
|
},
|
|
29
30
|
"repository": {
|
|
30
31
|
"type": "git",
|
|
@@ -46,6 +47,7 @@
|
|
|
46
47
|
"@babel/core": "^8.1.0",
|
|
47
48
|
"gulp": "^5.0.1",
|
|
48
49
|
"js-build-tools": "^8.0.0",
|
|
50
|
+
"playwright": "~1.64.1",
|
|
49
51
|
"release-it": "^21.1.1",
|
|
50
52
|
"test-filesystem": "^2.0.2",
|
|
51
53
|
"typedoc": "^0.28.20"
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.getJoinIndexedList = void 0;
|
|
7
|
-
var _siFunciona = _interopRequireDefault(require("si-funciona"));
|
|
8
|
-
var _splitEntityProperty = require("./parsers/splitEntityProperty");
|
|
9
|
-
var _retrieveRecord = require("./retrieveRecord");
|
|
10
|
-
var _getMatchingIndexes = require("./getMatchingIndexes");
|
|
11
|
-
var _matchIndexedJoins = require("./matchIndexedJoins");
|
|
12
|
-
var _restrictIndexedList = require("./restrictIndexedList");
|
|
13
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
-
const getJoinIndexedList = async (parsed, recordData, dataSets) => {
|
|
15
|
-
const reducedJoins = [];
|
|
16
|
-
const indexed = {};
|
|
17
|
-
let firstIteration = true;
|
|
18
|
-
const entity = parsed.entity;
|
|
19
|
-
const joinEntity = parsed.joinEntity;
|
|
20
|
-
const joinClauses = parsed.joinClauses;
|
|
21
|
-
if (!dataSets[entity].length) {
|
|
22
|
-
// Nothing indexed entity's own rows yet (no WHERE condition narrowed them down ahead of this -
|
|
23
|
-
// that only happens via getConditionIndexedList, called just before this). The loop below can't
|
|
24
|
-
// pre-resolve anything against zero rows, so leave parsed.joinClauses exactly as parsed: the
|
|
25
|
-
// later, unconditional joinEntity() call (once this command's own read actually runs) still
|
|
26
|
-
// needs the real clauses to do the join itself. Previously this fell through to the loop,
|
|
27
|
-
// which never ran, leaving reducedJoins (and so parsed.joinClauses) empty regardless of what
|
|
28
|
-
// was actually parsed - silently discarding every join clause whenever the query had no WHERE.
|
|
29
|
-
return parsed;
|
|
30
|
-
}
|
|
31
|
-
if (!joinClauses.length) {
|
|
32
|
-
// A WHERE condition DID index entity's own rows above, but this query has no join at all -
|
|
33
|
-
// joinEntity is undefined. The loop below writes dataSets[entity][anEntity][joinEntity]
|
|
34
|
-
// unconditionally; left unguarded, that assigns a literal "undefined" key (object[undefined]
|
|
35
|
-
// coerces to the string "undefined") onto every row, since there's no join to actually attach.
|
|
36
|
-
return parsed;
|
|
37
|
-
}
|
|
38
|
-
for (const anEntity in dataSets[entity]) {
|
|
39
|
-
const currentEntity = dataSets[entity][anEntity];
|
|
40
|
-
// Loop over each of the main entities
|
|
41
|
-
const filterJoins = {};
|
|
42
|
-
filterJoins[entity] = [_siFunciona.default.cloneObject(currentEntity)];
|
|
43
|
-
for (const joinClause of joinClauses) {
|
|
44
|
-
let indexedClone = _siFunciona.default.cloneObject(indexed);
|
|
45
|
-
const {
|
|
46
|
-
entity: entityA,
|
|
47
|
-
property: propertyA
|
|
48
|
-
} = (0, _splitEntityProperty.splitEntityProperty)(joinClause.propertyA);
|
|
49
|
-
const {
|
|
50
|
-
entity: entityB,
|
|
51
|
-
property: propertyB
|
|
52
|
-
} = (0, _splitEntityProperty.splitEntityProperty)(joinClause.propertyB);
|
|
53
|
-
// Get the record for the entities A and B, store on the recordData
|
|
54
|
-
if (!Object.prototype.hasOwnProperty.call(recordData, entityA)) {
|
|
55
|
-
recordData[entityA] = await (0, _retrieveRecord.retrieveRecord)(entityA);
|
|
56
|
-
}
|
|
57
|
-
if (!Object.prototype.hasOwnProperty.call(recordData, entityB)) {
|
|
58
|
-
recordData[entityB] = await (0, _retrieveRecord.retrieveRecord)(entityB);
|
|
59
|
-
}
|
|
60
|
-
indexedClone = (0, _restrictIndexedList.restrictIndexedList)(joinClause, filterJoins, indexedClone);
|
|
61
|
-
const retrieveMatchedFiles = (0, _matchIndexedJoins.matchIndexedJoins)(entity, indexedClone, dataSets);
|
|
62
|
-
// Check if there are matching keys for the join condition
|
|
63
|
-
const matchAResult = await (0, _getMatchingIndexes.getMatchingIndexes)(entityA, propertyA, recordData, joinClause, filterJoins, indexed);
|
|
64
|
-
const matchBResult = await (0, _getMatchingIndexes.getMatchingIndexes)(entityB, propertyB, recordData, joinClause, filterJoins, indexed, retrieveMatchedFiles);
|
|
65
|
-
const isIndexed = matchAResult || matchBResult;
|
|
66
|
-
if (!isIndexed && firstIteration) {
|
|
67
|
-
reducedJoins.push(joinClause);
|
|
68
|
-
firstIteration = false;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
dataSets[entity][anEntity][joinEntity] = filterJoins[joinEntity];
|
|
72
|
-
}
|
|
73
|
-
parsed.joinClauses = reducedJoins;
|
|
74
|
-
return parsed;
|
|
75
|
-
};
|
|
76
|
-
exports.getJoinIndexedList = getJoinIndexedList;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getJoinIndexedList=void 0;var _siFunciona=_interopRequireDefault(require("si-funciona")),_splitEntityProperty=require("./parsers/splitEntityProperty"),_retrieveRecord=require("./retrieveRecord"),_getMatchingIndexes=require("./getMatchingIndexes"),_matchIndexedJoins=require("./matchIndexedJoins"),_restrictIndexedList=require("./restrictIndexedList");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const getJoinIndexedList=async(e,t,r)=>{const i=[],n={};let o=!0;const s=e.entity,c=e.joinEntity,d=e.joinClauses;if(!r[s].length)return e;if(!d.length)return e;for(const e in r[s]){const a=r[s][e],p={};p[s]=[_siFunciona.default.cloneObject(a)];for(const e of d){let c=_siFunciona.default.cloneObject(n);const{entity:d,property:a}=(0,_splitEntityProperty.splitEntityProperty)(e.propertyA),{entity:u,property:l}=(0,_splitEntityProperty.splitEntityProperty)(e.propertyB);Object.prototype.hasOwnProperty.call(t,d)||(t[d]=await(0,_retrieveRecord.retrieveRecord)(d)),Object.prototype.hasOwnProperty.call(t,u)||(t[u]=await(0,_retrieveRecord.retrieveRecord)(u)),c=(0,_restrictIndexedList.restrictIndexedList)(e,p,c);const y=(0,_matchIndexedJoins.matchIndexedJoins)(s,c,r),_=await(0,_getMatchingIndexes.getMatchingIndexes)(d,a,t,e,p,n),x=await(0,_getMatchingIndexes.getMatchingIndexes)(u,l,t,e,p,n,y);!(_||x)&&o&&(i.push(e),o=!1)}r[s][e][c]=p[c]}return e.joinClauses=i,e};exports.getJoinIndexedList=getJoinIndexedList;
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.getMatchingIndexes = void 0;
|
|
7
|
-
var _retrieveIndexes = require("./retrieveIndexes");
|
|
8
|
-
var _isSingleFieldKey = require("./isSingleFieldKey");
|
|
9
|
-
const getMatchingIndexes = async (entity, property, recordData, clause, dataSet, indexed, cb = null) => {
|
|
10
|
-
let isIndexed = false;
|
|
11
|
-
for (const key of recordData[entity].keys) {
|
|
12
|
-
if ((0, _isSingleFieldKey.isSingleFieldKey)(key, property)) {
|
|
13
|
-
dataSet[entity] = [];
|
|
14
|
-
if (!Object.prototype.hasOwnProperty.call(indexed, entity)) {
|
|
15
|
-
indexed[entity] = {};
|
|
16
|
-
}
|
|
17
|
-
if (!Object.prototype.hasOwnProperty.call(indexed[entity], property)) {
|
|
18
|
-
indexed[entity][property] = (await (0, _retrieveIndexes.retrieveIndexes)(entity, [property], recordData))[property];
|
|
19
|
-
}
|
|
20
|
-
if (typeof cb === 'function') {
|
|
21
|
-
await cb(entity, property, recordData, clause, dataSet, indexed);
|
|
22
|
-
}
|
|
23
|
-
isIndexed = true;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return isIndexed;
|
|
27
|
-
};
|
|
28
|
-
exports.getMatchingIndexes = getMatchingIndexes;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getMatchingIndexes=void 0;var _retrieveIndexes=require("./retrieveIndexes"),_isSingleFieldKey=require("./isSingleFieldKey");const getMatchingIndexes=async(e,t,i,r,n,s,o=null)=>{let l=!1;for(const a of i[e].keys)(0,_isSingleFieldKey.isSingleFieldKey)(a,t)&&(n[e]=[],Object.prototype.hasOwnProperty.call(s,e)||(s[e]={}),Object.prototype.hasOwnProperty.call(s[e],t)||(s[e][t]=(await(0,_retrieveIndexes.retrieveIndexes)(e,[t],i))[t]),"function"==typeof o&&await o(e,t,i,r,n,s),l=!0);return l};exports.getMatchingIndexes=getMatchingIndexes;
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.matchIndexedJoins = void 0;
|
|
7
|
-
require("core-js/modules/esnext.iterator.constructor.js");
|
|
8
|
-
require("core-js/modules/esnext.iterator.reduce.js");
|
|
9
|
-
var _siFunciona = _interopRequireDefault(require("si-funciona"));
|
|
10
|
-
var _where = require("../queries/where");
|
|
11
|
-
var _retrieveFile = require("./retrieveFile");
|
|
12
|
-
var _splitEntityProperty = require("./parsers/splitEntityProperty");
|
|
13
|
-
var _fieldType = require("./fieldType");
|
|
14
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
|
-
const matchIndexedJoins = (entity, indexedClone, dataSets) => async (focusEntity, property, recordData, joinClause, filterJoins, indexed) => {
|
|
16
|
-
const {
|
|
17
|
-
entity: entityA,
|
|
18
|
-
property: propertyA
|
|
19
|
-
} = (0, _splitEntityProperty.splitEntityProperty)(joinClause.propertyA);
|
|
20
|
-
const {
|
|
21
|
-
entity: entityB,
|
|
22
|
-
property: propertyB
|
|
23
|
-
} = (0, _splitEntityProperty.splitEntityProperty)(joinClause.propertyB);
|
|
24
|
-
const properties = [{
|
|
25
|
-
entityFirst: entityA,
|
|
26
|
-
propertyFirst: propertyA,
|
|
27
|
-
entitySecond: entityB,
|
|
28
|
-
propertySecond: propertyB
|
|
29
|
-
}, {
|
|
30
|
-
entityFirst: entityB,
|
|
31
|
-
propertyFirst: propertyB,
|
|
32
|
-
entitySecond: entityA,
|
|
33
|
-
propertySecond: propertyA
|
|
34
|
-
}];
|
|
35
|
-
for (const checkProp of properties) {
|
|
36
|
-
if (!Object.prototype.hasOwnProperty.call(indexedClone, checkProp.entitySecond)) {
|
|
37
|
-
indexedClone[checkProp.entitySecond] = _siFunciona.default.cloneObject(indexed[checkProp.entitySecond]);
|
|
38
|
-
}
|
|
39
|
-
const matchedRecords = indexedClone[checkProp.entitySecond][checkProp.propertySecond].reduce((dataA, dataB) => _siFunciona.default.mergeArrays(dataA, (0, _where.where)(indexedClone[checkProp.entityFirst][checkProp.propertyFirst], {
|
|
40
|
-
property: 'value',
|
|
41
|
-
comparator: joinClause.comparator,
|
|
42
|
-
value: dataB.value,
|
|
43
|
-
type: (0, _fieldType.fieldType)(recordData[checkProp.entityFirst], checkProp.propertyFirst)
|
|
44
|
-
})), []);
|
|
45
|
-
const skipPush = checkProp.entityFirst === entity;
|
|
46
|
-
if (!Object.prototype.hasOwnProperty.call(dataSets, checkProp.entityFirst)) {
|
|
47
|
-
dataSets[checkProp.entityFirst] = [];
|
|
48
|
-
}
|
|
49
|
-
for (const matchedRecord of matchedRecords) {
|
|
50
|
-
for (const file of matchedRecord.record) {
|
|
51
|
-
let entityRecord = file;
|
|
52
|
-
if (typeof file === 'string') {
|
|
53
|
-
entityRecord = await (0, _retrieveFile.retrieveFile)(`${checkProp.entityFirst}/${file}`);
|
|
54
|
-
}
|
|
55
|
-
if (!skipPush) {
|
|
56
|
-
dataSets[checkProp.entityFirst].push(entityRecord);
|
|
57
|
-
}
|
|
58
|
-
filterJoins[checkProp.entityFirst].push(entityRecord);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
exports.matchIndexedJoins = matchIndexedJoins;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.matchIndexedJoins=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.reduce.js");var _siFunciona=_interopRequireDefault(require("si-funciona")),_where=require("../queries/where"),_retrieveFile=require("./retrieveFile"),_splitEntityProperty=require("./parsers/splitEntityProperty"),_fieldType=require("./fieldType");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const matchIndexedJoins=(e,t,r)=>async(i,o,n,s,p,y)=>{const{entity:c,property:u}=(0,_splitEntityProperty.splitEntityProperty)(s.propertyA),{entity:a,property:d}=(0,_splitEntityProperty.splitEntityProperty)(s.propertyB),l=[{entityFirst:c,propertyFirst:u,entitySecond:a,propertySecond:d},{entityFirst:a,propertyFirst:d,entitySecond:c,propertySecond:u}];for(const i of l){Object.prototype.hasOwnProperty.call(t,i.entitySecond)||(t[i.entitySecond]=_siFunciona.default.cloneObject(y[i.entitySecond]));const o=t[i.entitySecond][i.propertySecond].reduce(((e,r)=>_siFunciona.default.mergeArrays(e,(0,_where.where)(t[i.entityFirst][i.propertyFirst],{property:"value",comparator:s.comparator,value:r.value,type:(0,_fieldType.fieldType)(n[i.entityFirst],i.propertyFirst)}))),[]),c=i.entityFirst===e;Object.prototype.hasOwnProperty.call(r,i.entityFirst)||(r[i.entityFirst]=[]);for(const e of o)for(const t of e.record){let e=t;"string"==typeof t&&(e=await(0,_retrieveFile.retrieveFile)(`${i.entityFirst}/${t}`)),c||r[i.entityFirst].push(e),p[i.entityFirst].push(e)}}};exports.matchIndexedJoins=matchIndexedJoins;
|