json-fs-query 3.1.4 → 3.3.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/README.md +257 -15
- package/browser/jsonFsQuery.js +3884 -5057
- package/browser/jsonFsQuery.min.js +1 -1
- package/dist/data/introspect/alter.d.ts +12 -0
- package/dist/data/introspect/alter.js +304 -0
- package/dist/data/introspect/alter.min.js +1 -0
- package/dist/data/introspect/create.d.ts +10 -0
- package/dist/data/introspect/create.js +9 -23
- package/dist/data/introspect/create.min.js +1 -1
- package/dist/data/introspect/drop.js +7 -15
- package/dist/data/introspect/drop.min.js +1 -1
- package/dist/data/introspect/formatDatabase.d.ts +17 -0
- package/dist/data/introspect/formatDatabase.js +56 -0
- package/dist/data/introspect/formatDatabase.min.js +1 -0
- package/dist/data/introspect/index.d.ts +9 -0
- package/dist/data/introspect/index.js +18 -5
- package/dist/data/introspect/index.min.js +1 -1
- package/dist/data/introspect/packDatabase.d.ts +27 -0
- package/dist/data/introspect/packDatabase.js +113 -0
- package/dist/data/introspect/packDatabase.min.js +1 -0
- 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/databaseStatements.d.ts +31 -0
- package/dist/data/queries/databaseStatements.js +97 -0
- package/dist/data/queries/databaseStatements.min.js +1 -0
- package/dist/data/queries/deleteEntity.js +35 -19
- package/dist/data/queries/deleteEntity.min.js +1 -1
- package/dist/data/queries/insertEntity.d.ts +8 -0
- package/dist/data/queries/insertEntity.js +340 -43
- 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/query.d.ts +2 -1
- package/dist/data/queries/query.js +5 -2
- package/dist/data/queries/query.min.js +1 -1
- package/dist/data/queries/selectFields.d.ts +5 -4
- package/dist/data/queries/selectFields.js +25 -11
- package/dist/data/queries/selectFields.min.js +1 -1
- package/dist/data/queries/updateEntity.js +54 -15
- package/dist/data/queries/updateEntity.min.js +1 -1
- package/dist/data/storage/databases.d.ts +32 -0
- package/dist/data/storage/databases.js +93 -0
- package/dist/data/storage/databases.min.js +1 -0
- package/dist/data/storage/fileExists.d.ts +7 -0
- package/dist/data/storage/fileExists.js +25 -0
- package/dist/data/storage/fileExists.min.js +1 -0
- package/dist/data/storage/index.d.ts +19 -0
- package/dist/data/storage/index.js +124 -0
- package/dist/data/storage/index.min.js +1 -0
- package/dist/data/storage/listFiles.d.ts +8 -0
- package/dist/data/storage/listFiles.js +52 -0
- package/dist/data/storage/listFiles.min.js +1 -0
- package/dist/data/storage/makeDirectory.d.ts +7 -0
- package/dist/data/storage/makeDirectory.js +24 -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 +16 -0
- package/dist/data/storage/readJson.js +38 -0
- package/dist/data/storage/readJson.min.js +1 -0
- package/dist/data/storage/removeDirectory.d.ts +8 -0
- package/dist/data/storage/removeDirectory.js +30 -0
- package/dist/data/storage/removeDirectory.min.js +1 -0
- package/dist/data/storage/removeFile.d.ts +8 -0
- package/dist/data/storage/removeFile.js +31 -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 +17 -0
- package/dist/data/storage/writeJson.js +37 -0
- package/dist/data/storage/writeJson.min.js +1 -0
- package/dist/data/storage/writeSet.d.ts +64 -0
- package/dist/data/storage/writeSet.js +306 -0
- package/dist/data/storage/writeSet.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/config.d.ts +37 -0
- package/dist/data/utilities/config.js +77 -5
- package/dist/data/utilities/config.min.js +1 -1
- package/dist/data/utilities/databaseLock.d.ts +7 -0
- package/dist/data/utilities/databaseLock.js +19 -4
- 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/getConditionIndexedList.js +3 -4
- package/dist/data/utilities/getConditionIndexedList.min.js +1 -1
- package/dist/data/utilities/indexBuffer.d.ts +35 -0
- package/dist/data/utilities/indexBuffer.js +139 -0
- package/dist/data/utilities/indexBuffer.min.js +1 -0
- 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 +128 -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/knownFields.d.ts +26 -0
- package/dist/data/utilities/knownFields.js +128 -0
- package/dist/data/utilities/knownFields.min.js +1 -0
- package/dist/data/utilities/packedTable.d.ts +34 -0
- package/dist/data/utilities/packedTable.js +60 -0
- package/dist/data/utilities/packedTable.min.js +1 -0
- package/dist/data/utilities/parsers/findInsertValues.d.ts +3 -3
- package/dist/data/utilities/parsers/findInsertValues.js +28 -12
- package/dist/data/utilities/parsers/findInsertValues.min.js +1 -1
- package/dist/data/utilities/parsers/maskStrings.js +11 -2
- package/dist/data/utilities/parsers/maskStrings.min.js +1 -1
- package/dist/data/utilities/parsers/parseAlter.d.ts +33 -0
- package/dist/data/utilities/parsers/parseAlter.js +84 -0
- package/dist/data/utilities/parsers/parseAlter.min.js +1 -0
- package/dist/data/utilities/parsers/parseCreate.d.ts +14 -0
- package/dist/data/utilities/parsers/parseCreate.js +13 -5
- package/dist/data/utilities/parsers/parseCreate.min.js +1 -1
- package/dist/data/utilities/parsers/parseDatabaseStatement.d.ts +17 -0
- package/dist/data/utilities/parsers/parseDatabaseStatement.js +82 -0
- package/dist/data/utilities/parsers/parseDatabaseStatement.min.js +1 -0
- package/dist/data/utilities/parsers/parseQuery.d.ts +3 -0
- package/dist/data/utilities/parsers/parseQuery.js +24 -0
- package/dist/data/utilities/parsers/parseQuery.min.js +1 -1
- package/dist/data/utilities/parsers/startsQuery.js +1 -1
- package/dist/data/utilities/parsers/startsQuery.min.js +1 -1
- 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/retrieveFiles.d.ts +15 -0
- package/dist/data/utilities/retrieveFiles.js +48 -0
- package/dist/data/utilities/retrieveFiles.min.js +1 -0
- package/dist/data/utilities/retrieveRecord.d.ts +6 -0
- package/dist/data/utilities/retrieveRecord.js +24 -1
- package/dist/data/utilities/retrieveRecord.min.js +1 -1
- package/dist/data/utilities/retrieveRecords.d.ts +22 -0
- package/dist/data/utilities/retrieveRecords.js +60 -10
- package/dist/data/utilities/retrieveRecords.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 +28 -4
- 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/dist/index.d.ts +1 -1
- package/dist/index.js +24 -0
- package/dist/index.min.js +1 -1
- package/package.json +10 -4
- 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
|
@@ -4,31 +4,25 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.deregisterRecord = void 0;
|
|
7
|
-
require("core-js/modules/es.json.stringify.js");
|
|
8
7
|
require("core-js/modules/esnext.iterator.constructor.js");
|
|
9
8
|
require("core-js/modules/esnext.iterator.filter.js");
|
|
10
|
-
var
|
|
11
|
-
const {
|
|
12
|
-
readFile,
|
|
13
|
-
writeFile
|
|
14
|
-
} = require('fs/promises');
|
|
9
|
+
var _storage = require("../storage");
|
|
15
10
|
/**
|
|
16
11
|
* Remove a record's filename from the __RECORDS registry. A missing registry file is left
|
|
17
12
|
* untouched rather than created, since there's nothing to remove from it.
|
|
18
13
|
* @param recordName
|
|
19
14
|
*/
|
|
20
15
|
const deregisterRecord = async recordName => {
|
|
21
|
-
const
|
|
22
|
-
const registryPath = `${databasePath}__RECORDS.json`;
|
|
16
|
+
const registryPath = '__RECORDS.json';
|
|
23
17
|
let registry;
|
|
24
18
|
try {
|
|
25
|
-
registry =
|
|
19
|
+
registry = await (0, _storage.readJson)(registryPath);
|
|
26
20
|
} catch (err) {
|
|
27
21
|
return null;
|
|
28
22
|
}
|
|
29
23
|
const fileName = `${recordName}.json`;
|
|
30
24
|
registry.entries = registry.entries.filter(entry => entry !== fileName);
|
|
31
|
-
await
|
|
25
|
+
await (0, _storage.writeJson)(registryPath, registry);
|
|
32
26
|
return registry;
|
|
33
27
|
};
|
|
34
28
|
exports.deregisterRecord = deregisterRecord;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.deregisterRecord=void 0,require("core-js/modules/
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.deregisterRecord=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js");var _storage=require("../storage");const deregisterRecord=async e=>{const r="__RECORDS.json";let t;try{t=await(0,_storage.readJson)(r)}catch(e){return null}const s=`${e}.json`;return t.entries=t.entries.filter((e=>e!==s)),await(0,_storage.writeJson)(r,t),t};exports.deregisterRecord=deregisterRecord;
|
|
@@ -28,6 +28,7 @@ var _isEntityProperty = require("./parsers/isEntityProperty");
|
|
|
28
28
|
var _splitEntityProperty = require("./parsers/splitEntityProperty");
|
|
29
29
|
var _retrieveRecord = require("./retrieveRecord");
|
|
30
30
|
var _where = require("../queries/where");
|
|
31
|
+
var _retrieveRecords = require("./retrieveRecords");
|
|
31
32
|
var _retrieveFile = require("./retrieveFile");
|
|
32
33
|
var _retrieveIndexes = require("./retrieveIndexes");
|
|
33
34
|
var _isSingleFieldKey = require("./isSingleFieldKey");
|
|
@@ -149,10 +150,8 @@ const getConditionIndexedList = async (parsed, recordData, dataSet, resolved = n
|
|
|
149
150
|
}
|
|
150
151
|
for (const entity of Object.keys(matchedFiles)) {
|
|
151
152
|
resolved.add(entity);
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
dataSet[entity].push(await (0, _retrieveFile.retrieveFile)(`${entity}/${file}`));
|
|
155
|
-
}
|
|
153
|
+
const record = recordData[entity] || (await (0, _retrieveRecord.retrieveRecord)(entity));
|
|
154
|
+
dataSet[entity] = await (0, _retrieveRecords.retrieveEntryRows)(record, [...matchedFiles[entity]], _retrieveFile.retrieveFile);
|
|
156
155
|
}
|
|
157
156
|
return parsed;
|
|
158
157
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getConditionIndexedList=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.flat-map.js"),require("core-js/modules/esnext.iterator.for-each.js"),require("core-js/modules/esnext.iterator.some.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 _isEntityProperty=require("./parsers/isEntityProperty"),_splitEntityProperty=require("./parsers/splitEntityProperty"),_retrieveRecord=require("./retrieveRecord"),_where=require("../queries/where"),_retrieveFile=require("./retrieveFile"),_retrieveIndexes=require("./retrieveIndexes"),_isSingleFieldKey=require("./isSingleFieldKey"),_conditionTree=require("./conditionTree");const conditionField=(e,r)=>(0,_isEntityProperty.isEntityProperty)(e.property)?(0,_splitEntityProperty.splitEntityProperty)(e.property):{entity:r,property:e.property},indexedFiles=async(e,r,t,s
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getConditionIndexedList=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.flat-map.js"),require("core-js/modules/esnext.iterator.for-each.js"),require("core-js/modules/esnext.iterator.some.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 _isEntityProperty=require("./parsers/isEntityProperty"),_splitEntityProperty=require("./parsers/splitEntityProperty"),_retrieveRecord=require("./retrieveRecord"),_where=require("../queries/where"),_retrieveRecords=require("./retrieveRecords"),_retrieveFile=require("./retrieveFile"),_retrieveIndexes=require("./retrieveIndexes"),_isSingleFieldKey=require("./isSingleFieldKey"),_conditionTree=require("./conditionTree");const conditionField=(e,r)=>(0,_isEntityProperty.isEntityProperty)(e.property)?(0,_splitEntityProperty.splitEntityProperty)(e.property):{entity:r,property:e.property},indexedFiles=async(e,r,t,i,s)=>{if(Object.prototype.hasOwnProperty.call(i,e)||(i[e]=await(0,_retrieveRecord.retrieveRecord)(e)),i[e].keys.some((e=>(0,_isSingleFieldKey.isSingleFieldKey)(e,r))))return s[e]=s[e]||{},Object.prototype.hasOwnProperty.call(s[e],r)||(s[e][r]=(await(0,_retrieveIndexes.retrieveIndexes)(e,[r],i))[r]),new Set((0,_where.where)(s[e][r],{property:"value",comparator:t.comparator,value:t.value,type:t.type}).flatMap((e=>e.record)))},candidatesOf=async(e,r,t,i)=>{if((0,_conditionTree.isCondition)(e)){const{entity:s,property:o}=conditionField(e,r);return s===r?await indexedFiles(s,o,e,t,i):void 0}if("not"in e)return;if("or"in e){const s=new Set;for(const o of e.or){const e=await candidatesOf(o,r,t,i);if(void 0===e)return;e.forEach((e=>s.add(e)))}return s}let s;for(const o of e.and){const e=await candidatesOf(o,r,t,i);void 0!==e&&(s=void 0===s?e:new Set([...s].filter((r=>e.has(r)))))}return s},getConditionIndexedList=async(e,r,t,i=new Set)=>{const s={},o={};if(void 0!==e.where){const t=await candidatesOf(e.where,e.entity,r,o);void 0!==t&&(s[e.entity]=t)}for(const t of(0,_conditionTree.requiredConditions)(e.where)){const{entity:i,property:n}=conditionField(t,e.entity);if(i===e.entity)continue;const d=await indexedFiles(i,n,t,r,o);void 0!==d&&(s[i]=Object.prototype.hasOwnProperty.call(s,i)?new Set([...s[i]].filter((e=>d.has(e)))):d)}for(const e of Object.keys(s)){i.add(e);const o=r[e]||await(0,_retrieveRecord.retrieveRecord)(e);t[e]=await(0,_retrieveRecords.retrieveEntryRows)(o,[...s[e]],_retrieveFile.retrieveFile)}return e};exports.getConditionIndexedList=getConditionIndexedList;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { indexEntry } from './updateIndex';
|
|
2
|
+
/**
|
|
3
|
+
* One index file held in memory while a statement changes it many times: values are found through a Map instead of a
|
|
4
|
+
* search of the whole index each time, and the file is written once at the end (see insertEntity). It holds and
|
|
5
|
+
* changes the index exactly as updateIndex would, one row after another: a new value is added at the end, a file
|
|
6
|
+
* already listed for its value isn't listed twice.
|
|
7
|
+
*/
|
|
8
|
+
export declare class IndexBuffer {
|
|
9
|
+
readonly entries: indexEntry[];
|
|
10
|
+
private readonly type;
|
|
11
|
+
private readonly byKey;
|
|
12
|
+
private readonly listed;
|
|
13
|
+
/**
|
|
14
|
+
* @param entries - The index as read from its file ([] when there's none yet).
|
|
15
|
+
* @param type - The key's value type (see keyValueType).
|
|
16
|
+
*/
|
|
17
|
+
constructor(entries: indexEntry[], type: string | undefined);
|
|
18
|
+
/**
|
|
19
|
+
* The entry for `value`, as updateIndex finds it.
|
|
20
|
+
* @param value
|
|
21
|
+
*/
|
|
22
|
+
find(value: any): indexEntry | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Whether a row holds `value`, as indexHas answers it: an entry for it lists a file (never for null or undefined).
|
|
25
|
+
* @param value
|
|
26
|
+
*/
|
|
27
|
+
has(value: any): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* List `fileName` under `value`, as updateIndex does.
|
|
30
|
+
* @param value
|
|
31
|
+
* @param fileName
|
|
32
|
+
*/
|
|
33
|
+
add(value: any, fileName: string): void;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=indexBuffer.d.ts.map
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.IndexBuffer = void 0;
|
|
7
|
+
require("core-js/modules/es.array.includes.js");
|
|
8
|
+
require("core-js/modules/esnext.iterator.constructor.js");
|
|
9
|
+
require("core-js/modules/esnext.iterator.find.js");
|
|
10
|
+
require("core-js/modules/esnext.iterator.some.js");
|
|
11
|
+
require("core-js/modules/esnext.map.delete-all.js");
|
|
12
|
+
require("core-js/modules/esnext.map.every.js");
|
|
13
|
+
require("core-js/modules/esnext.map.filter.js");
|
|
14
|
+
require("core-js/modules/esnext.map.find.js");
|
|
15
|
+
require("core-js/modules/esnext.map.find-key.js");
|
|
16
|
+
require("core-js/modules/esnext.map.includes.js");
|
|
17
|
+
require("core-js/modules/esnext.map.key-of.js");
|
|
18
|
+
require("core-js/modules/esnext.map.map-keys.js");
|
|
19
|
+
require("core-js/modules/esnext.map.map-values.js");
|
|
20
|
+
require("core-js/modules/esnext.map.merge.js");
|
|
21
|
+
require("core-js/modules/esnext.map.reduce.js");
|
|
22
|
+
require("core-js/modules/esnext.map.some.js");
|
|
23
|
+
require("core-js/modules/esnext.map.update.js");
|
|
24
|
+
require("core-js/modules/esnext.set.add-all.js");
|
|
25
|
+
require("core-js/modules/esnext.set.delete-all.js");
|
|
26
|
+
require("core-js/modules/esnext.set.difference.js");
|
|
27
|
+
require("core-js/modules/esnext.set.every.js");
|
|
28
|
+
require("core-js/modules/esnext.set.filter.js");
|
|
29
|
+
require("core-js/modules/esnext.set.find.js");
|
|
30
|
+
require("core-js/modules/esnext.set.intersection.js");
|
|
31
|
+
require("core-js/modules/esnext.set.is-disjoint-from.js");
|
|
32
|
+
require("core-js/modules/esnext.set.is-subset-of.js");
|
|
33
|
+
require("core-js/modules/esnext.set.is-superset-of.js");
|
|
34
|
+
require("core-js/modules/esnext.set.join.js");
|
|
35
|
+
require("core-js/modules/esnext.set.map.js");
|
|
36
|
+
require("core-js/modules/esnext.set.reduce.js");
|
|
37
|
+
require("core-js/modules/esnext.set.some.js");
|
|
38
|
+
require("core-js/modules/esnext.set.symmetric-difference.js");
|
|
39
|
+
require("core-js/modules/esnext.set.union.js");
|
|
40
|
+
require("core-js/modules/esnext.weak-map.delete-all.js");
|
|
41
|
+
var _compareAs = require("./compareAs");
|
|
42
|
+
const unkeyed = Symbol('unkeyed');
|
|
43
|
+
/**
|
|
44
|
+
* The key a value is found by in a Map, so that two values share a key exactly when sameValue says they're the same:
|
|
45
|
+
* compareAs gives that for the comparable types (a Map compares keys like ===). Other types compare with ==, and a
|
|
46
|
+
* value compareAs leaves as an object compares by identity, so those are searched in turn instead.
|
|
47
|
+
* @param type
|
|
48
|
+
* @param value
|
|
49
|
+
*/
|
|
50
|
+
const keyOf = (type, value) => {
|
|
51
|
+
if (!_compareAs.comparableTypes.includes(type)) {
|
|
52
|
+
return unkeyed;
|
|
53
|
+
}
|
|
54
|
+
const key = (0, _compareAs.compareAs)(type, value);
|
|
55
|
+
return typeof key === 'object' && key !== null ? unkeyed : key;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* One index file held in memory while a statement changes it many times: values are found through a Map instead of a
|
|
59
|
+
* search of the whole index each time, and the file is written once at the end (see insertEntity). It holds and
|
|
60
|
+
* changes the index exactly as updateIndex would, one row after another: a new value is added at the end, a file
|
|
61
|
+
* already listed for its value isn't listed twice.
|
|
62
|
+
*/
|
|
63
|
+
class IndexBuffer {
|
|
64
|
+
/**
|
|
65
|
+
* @param entries - The index as read from its file ([] when there's none yet).
|
|
66
|
+
* @param type - The key's value type (see keyValueType).
|
|
67
|
+
*/
|
|
68
|
+
constructor(entries, type) {
|
|
69
|
+
this.byKey = new Map();
|
|
70
|
+
// The files each entry lists, built when a file is first added to it: a value shared by every row (a foreign key to
|
|
71
|
+
// one parent) would otherwise be searched once per row, which grows with the square of the rows
|
|
72
|
+
this.listed = new WeakMap();
|
|
73
|
+
this.entries = entries;
|
|
74
|
+
this.type = type;
|
|
75
|
+
for (const entry of entries) {
|
|
76
|
+
const key = keyOf(type, entry.value);
|
|
77
|
+
// The first entry for a value is the one updateIndex's find() would give
|
|
78
|
+
if (key !== unkeyed && !this.byKey.has(key)) {
|
|
79
|
+
this.byKey.set(key, entry);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The entry for `value`, as updateIndex finds it.
|
|
85
|
+
* @param value
|
|
86
|
+
*/
|
|
87
|
+
find(value) {
|
|
88
|
+
const key = keyOf(this.type, value);
|
|
89
|
+
return key === unkeyed ? this.entries.find(entry => (0, _compareAs.sameValue)(this.type, entry.value, value)) : this.byKey.get(key);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Whether a row holds `value`, as indexHas answers it: an entry for it lists a file (never for null or undefined).
|
|
93
|
+
* @param value
|
|
94
|
+
*/
|
|
95
|
+
has(value) {
|
|
96
|
+
// where's = never matches null or a missing value (an index entry for a row without the field has no value)
|
|
97
|
+
if (value === null || typeof value === 'undefined') {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
const listsFiles = entry => Boolean(entry && Array.isArray(entry.record) && entry.record.length);
|
|
101
|
+
const first = this.find(value);
|
|
102
|
+
if (!first || listsFiles(first)) {
|
|
103
|
+
// No entry at all for the value (the Map holds the first of each), or one that lists a file
|
|
104
|
+
return listsFiles(first);
|
|
105
|
+
}
|
|
106
|
+
// indexHas looks at every entry for the value; an index edited by hand can hold more than one
|
|
107
|
+
return this.entries.some(entry => (0, _compareAs.sameValue)(this.type, entry.value, value) && listsFiles(entry));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* List `fileName` under `value`, as updateIndex does.
|
|
111
|
+
* @param value
|
|
112
|
+
* @param fileName
|
|
113
|
+
*/
|
|
114
|
+
add(value, fileName) {
|
|
115
|
+
const existing = this.find(value);
|
|
116
|
+
if (existing) {
|
|
117
|
+
if (!this.listed.has(existing)) {
|
|
118
|
+
this.listed.set(existing, new Set(existing.record));
|
|
119
|
+
}
|
|
120
|
+
const files = this.listed.get(existing);
|
|
121
|
+
if (!files.has(fileName)) {
|
|
122
|
+
files.add(fileName);
|
|
123
|
+
existing.record.push(fileName);
|
|
124
|
+
}
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const entry = {
|
|
128
|
+
value,
|
|
129
|
+
record: [fileName]
|
|
130
|
+
};
|
|
131
|
+
this.entries.push(entry);
|
|
132
|
+
this.listed.set(entry, new Set(entry.record));
|
|
133
|
+
const key = keyOf(this.type, value);
|
|
134
|
+
if (key !== unkeyed) {
|
|
135
|
+
this.byKey.set(key, entry);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
exports.IndexBuffer = IndexBuffer;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.IndexBuffer=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"),require("core-js/modules/esnext.iterator.some.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"),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"),require("core-js/modules/esnext.weak-map.delete-all.js");var _compareAs=require("./compareAs");const unkeyed=Symbol("unkeyed"),keyOf=(e,s)=>{if(!_compareAs.comparableTypes.includes(e))return unkeyed;const r=(0,_compareAs.compareAs)(e,s);return"object"==typeof r&&null!==r?unkeyed:r};class IndexBuffer{constructor(e,s){this.byKey=new Map,this.listed=new WeakMap,this.entries=e,this.type=s;for(const r of e){const e=keyOf(s,r.value);e===unkeyed||this.byKey.has(e)||this.byKey.set(e,r)}}find(e){const s=keyOf(this.type,e);return s===unkeyed?this.entries.find((s=>(0,_compareAs.sameValue)(this.type,s.value,e))):this.byKey.get(s)}has(e){if(null==e)return!1;const s=e=>Boolean(e&&Array.isArray(e.record)&&e.record.length),r=this.find(e);return!r||s(r)?s(r):this.entries.some((r=>(0,_compareAs.sameValue)(this.type,r.value,e)&&s(r)))}add(e,s){const r=this.find(e);if(r){this.listed.has(r)||this.listed.set(r,new Set(r.record));const e=this.listed.get(r);return void(e.has(s)||(e.add(s),r.record.push(s)))}const t={value:e,record:[s]};this.entries.push(t),this.listed.set(t,new Set(t.record));const o=keyOf(this.type,e);o!==unkeyed&&this.byKey.set(o,t)}}exports.IndexBuffer=IndexBuffer;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether any row of `entity` has `property` = `value` (compared by the field's declared type, as where does: a null
|
|
3
|
+
* equals nothing), answered from the index of a single-field key on the field: one file instead of every row.
|
|
4
|
+
*
|
|
5
|
+
* Undefined when there is no such index, or its file can't be read or parsed (a key added to a record by hand, a file
|
|
6
|
+
* edited badly): the caller then reads the rows, which are the truth, as these checks always did. A record with no rows
|
|
7
|
+
* has none, whatever its index says.
|
|
8
|
+
* @param entity
|
|
9
|
+
* @param property
|
|
10
|
+
* @param value
|
|
11
|
+
*/
|
|
12
|
+
export declare const indexHas: (entity: string, property: string, value: any) => Promise<boolean | undefined>;
|
|
13
|
+
//# sourceMappingURL=indexHas.d.ts.map
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.indexHas = void 0;
|
|
7
|
+
require("core-js/modules/esnext.iterator.constructor.js");
|
|
8
|
+
require("core-js/modules/esnext.iterator.find.js");
|
|
9
|
+
require("core-js/modules/esnext.iterator.some.js");
|
|
10
|
+
var _storage = require("../storage");
|
|
11
|
+
var _where = require("../queries/where");
|
|
12
|
+
var _retrieveRecord = require("./retrieveRecord");
|
|
13
|
+
var _isSingleFieldKey = require("./isSingleFieldKey");
|
|
14
|
+
var _fieldType = require("./fieldType");
|
|
15
|
+
/**
|
|
16
|
+
* Whether any row of `entity` has `property` = `value` (compared by the field's declared type, as where does: a null
|
|
17
|
+
* equals nothing), answered from the index of a single-field key on the field: one file instead of every row.
|
|
18
|
+
*
|
|
19
|
+
* Undefined when there is no such index, or its file can't be read or parsed (a key added to a record by hand, a file
|
|
20
|
+
* edited badly): the caller then reads the rows, which are the truth, as these checks always did. A record with no rows
|
|
21
|
+
* has none, whatever its index says.
|
|
22
|
+
* @param entity
|
|
23
|
+
* @param property
|
|
24
|
+
* @param value
|
|
25
|
+
*/
|
|
26
|
+
const indexHas = async (entity, property, value) => {
|
|
27
|
+
const record = await (0, _retrieveRecord.retrieveRecord)(entity);
|
|
28
|
+
const key = record.keys.find(key => (0, _isSingleFieldKey.isSingleFieldKey)(key, property) && key.lookup);
|
|
29
|
+
if (!key) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
if (!(record.entries || []).length) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
let index;
|
|
36
|
+
try {
|
|
37
|
+
index = await (0, _storage.readJson)(`__indexes/${record.path}/${key.lookup}`);
|
|
38
|
+
} catch (err) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
return (0, _where.where)(index, {
|
|
42
|
+
property: 'value',
|
|
43
|
+
comparator: '=',
|
|
44
|
+
value,
|
|
45
|
+
type: (0, _fieldType.fieldType)(record, property)
|
|
46
|
+
}).some(entry => Array.isArray(entry.record) && entry.record.length > 0);
|
|
47
|
+
};
|
|
48
|
+
exports.indexHas = indexHas;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.indexHas=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.find.js"),require("core-js/modules/esnext.iterator.some.js");var _storage=require("../storage"),_where=require("../queries/where"),_retrieveRecord=require("./retrieveRecord"),_isSingleFieldKey=require("./isSingleFieldKey"),_fieldType=require("./fieldType");const indexHas=async(e,r,i)=>{const t=await(0,_retrieveRecord.retrieveRecord)(e),s=t.keys.find((e=>(0,_isSingleFieldKey.isSingleFieldKey)(e,r)&&e.lookup));if(!s)return;if(!(t.entries||[]).length)return!1;let o;try{o=await(0,_storage.readJson)(`__indexes/${t.path}/${s.lookup}`)}catch(e){return}return(0,_where.where)(o,{property:"value",comparator:"=",value:i,type:(0,_fieldType.fieldType)(t,r)}).some((e=>Array.isArray(e.record)&&e.record.length>0))};exports.indexHas=indexHas;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { JoinSide } from './semiJoin';
|
|
2
|
+
/**
|
|
3
|
+
* One `on` clause, with each side's record, field and the declared type it's compared by.
|
|
4
|
+
*/
|
|
5
|
+
export type JoinStep = {
|
|
6
|
+
entityA: string;
|
|
7
|
+
propertyA: string;
|
|
8
|
+
typeA: string | undefined;
|
|
9
|
+
comparator: string;
|
|
10
|
+
entityB: string;
|
|
11
|
+
propertyB: string;
|
|
12
|
+
typeB: string | undefined;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* The rows a join reads for each record in it, once for the whole join (every row's join then works from them):
|
|
16
|
+
* - the queried record: its rows (already read, or narrowed by the where clause)
|
|
17
|
+
* - the joined record when the where clause already narrowed it: those rows
|
|
18
|
+
* - a record joined by `=` to one already read, through an index on its field and with both fields of one type: only
|
|
19
|
+
* the rows whose value one of those rows has (the others can't match any row's join, and the order is the record's
|
|
20
|
+
* own, so the join's result is the same as from all of them)
|
|
21
|
+
* - any other: all its rows, kept on the query's data as before (merge reads them from there)
|
|
22
|
+
* @param entity
|
|
23
|
+
* @param joinEntity
|
|
24
|
+
* @param dataSets
|
|
25
|
+
* @param steps
|
|
26
|
+
* @param joinAlreadyResolved
|
|
27
|
+
*/
|
|
28
|
+
export declare const joinBases: (entity: string, joinEntity: string, dataSets: Object, steps: JoinStep[], joinAlreadyResolved: boolean) => Promise<Map<string, JoinSide>>;
|
|
29
|
+
//# sourceMappingURL=joinBases.d.ts.map
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.joinBases = void 0;
|
|
7
|
+
require("core-js/modules/esnext.iterator.constructor.js");
|
|
8
|
+
require("core-js/modules/esnext.iterator.filter.js");
|
|
9
|
+
require("core-js/modules/esnext.iterator.for-each.js");
|
|
10
|
+
require("core-js/modules/esnext.iterator.map.js");
|
|
11
|
+
require("core-js/modules/esnext.map.delete-all.js");
|
|
12
|
+
require("core-js/modules/esnext.map.every.js");
|
|
13
|
+
require("core-js/modules/esnext.map.filter.js");
|
|
14
|
+
require("core-js/modules/esnext.map.find.js");
|
|
15
|
+
require("core-js/modules/esnext.map.find-key.js");
|
|
16
|
+
require("core-js/modules/esnext.map.includes.js");
|
|
17
|
+
require("core-js/modules/esnext.map.key-of.js");
|
|
18
|
+
require("core-js/modules/esnext.map.map-keys.js");
|
|
19
|
+
require("core-js/modules/esnext.map.map-values.js");
|
|
20
|
+
require("core-js/modules/esnext.map.merge.js");
|
|
21
|
+
require("core-js/modules/esnext.map.reduce.js");
|
|
22
|
+
require("core-js/modules/esnext.map.some.js");
|
|
23
|
+
require("core-js/modules/esnext.map.update.js");
|
|
24
|
+
require("core-js/modules/esnext.set.add-all.js");
|
|
25
|
+
require("core-js/modules/esnext.set.delete-all.js");
|
|
26
|
+
require("core-js/modules/esnext.set.difference.js");
|
|
27
|
+
require("core-js/modules/esnext.set.every.js");
|
|
28
|
+
require("core-js/modules/esnext.set.filter.js");
|
|
29
|
+
require("core-js/modules/esnext.set.find.js");
|
|
30
|
+
require("core-js/modules/esnext.set.intersection.js");
|
|
31
|
+
require("core-js/modules/esnext.set.is-disjoint-from.js");
|
|
32
|
+
require("core-js/modules/esnext.set.is-subset-of.js");
|
|
33
|
+
require("core-js/modules/esnext.set.is-superset-of.js");
|
|
34
|
+
require("core-js/modules/esnext.set.join.js");
|
|
35
|
+
require("core-js/modules/esnext.set.map.js");
|
|
36
|
+
require("core-js/modules/esnext.set.reduce.js");
|
|
37
|
+
require("core-js/modules/esnext.set.some.js");
|
|
38
|
+
require("core-js/modules/esnext.set.symmetric-difference.js");
|
|
39
|
+
require("core-js/modules/esnext.set.union.js");
|
|
40
|
+
var _readEntity = require("../queries/readEntity");
|
|
41
|
+
var _retrieveRecord = require("./retrieveRecord");
|
|
42
|
+
var _retrieveRecords = require("./retrieveRecords");
|
|
43
|
+
var _retrieveIndexes = require("./retrieveIndexes");
|
|
44
|
+
var _joinKey = require("./joinKey");
|
|
45
|
+
var _rowLookup = require("./rowLookup");
|
|
46
|
+
/**
|
|
47
|
+
* The rows of `entity` whose `property` equals that field of at least one of `others`, found through the field's index
|
|
48
|
+
* (reading only those rows' files), or undefined when the field has no single-field index.
|
|
49
|
+
* @param entity
|
|
50
|
+
* @param property
|
|
51
|
+
* @param type
|
|
52
|
+
* @param others
|
|
53
|
+
* @param otherProperty
|
|
54
|
+
*/
|
|
55
|
+
const indexedRows = async (entity, property, type, others, otherProperty) => {
|
|
56
|
+
const index = (await (0, _retrieveIndexes.retrieveIndexes)(entity, [property], {}))[property];
|
|
57
|
+
if (!index) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
const wanted = new Set(others.map(row => (0, _joinKey.joinKey)(type, row[otherProperty])).filter(key => typeof key !== 'undefined'));
|
|
61
|
+
const files = new Set();
|
|
62
|
+
for (const entry of index) {
|
|
63
|
+
if (wanted.has((0, _joinKey.joinKey)(type, entry.value))) {
|
|
64
|
+
entry.record.forEach(file => files.add(file));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// In the record's own order, as a full read gives them
|
|
68
|
+
const record = await (0, _retrieveRecord.retrieveRecord)(entity);
|
|
69
|
+
return (0, _retrieveRecords.retrieveEntryRows)(record, record.entries.filter(entry => files.has(entry)));
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* The rows a join reads for each record in it, once for the whole join (every row's join then works from them):
|
|
73
|
+
* - the queried record: its rows (already read, or narrowed by the where clause)
|
|
74
|
+
* - the joined record when the where clause already narrowed it: those rows
|
|
75
|
+
* - a record joined by `=` to one already read, through an index on its field and with both fields of one type: only
|
|
76
|
+
* the rows whose value one of those rows has (the others can't match any row's join, and the order is the record's
|
|
77
|
+
* own, so the join's result is the same as from all of them)
|
|
78
|
+
* - any other: all its rows, kept on the query's data as before (merge reads them from there)
|
|
79
|
+
* @param entity
|
|
80
|
+
* @param joinEntity
|
|
81
|
+
* @param dataSets
|
|
82
|
+
* @param steps
|
|
83
|
+
* @param joinAlreadyResolved
|
|
84
|
+
*/
|
|
85
|
+
const joinBases = async (entity, joinEntity, dataSets, steps, joinAlreadyResolved) => {
|
|
86
|
+
const bases = new Map();
|
|
87
|
+
const keep = (name, rows) => bases.set(name, {
|
|
88
|
+
rows,
|
|
89
|
+
lookups: new _rowLookup.RowLookups(rows)
|
|
90
|
+
});
|
|
91
|
+
keep(entity, dataSets[entity]);
|
|
92
|
+
if (joinAlreadyResolved) {
|
|
93
|
+
keep(joinEntity, dataSets[joinEntity]);
|
|
94
|
+
}
|
|
95
|
+
const allRows = async name => (await (0, _readEntity.readEntity)(name, dataSets))[name];
|
|
96
|
+
for (const step of steps) {
|
|
97
|
+
const sides = [{
|
|
98
|
+
name: step.entityA,
|
|
99
|
+
property: step.propertyA,
|
|
100
|
+
other: step.entityB,
|
|
101
|
+
otherProperty: step.propertyB
|
|
102
|
+
}, {
|
|
103
|
+
name: step.entityB,
|
|
104
|
+
property: step.propertyB,
|
|
105
|
+
other: step.entityA,
|
|
106
|
+
otherProperty: step.propertyA
|
|
107
|
+
}];
|
|
108
|
+
for (const {
|
|
109
|
+
name,
|
|
110
|
+
property,
|
|
111
|
+
other,
|
|
112
|
+
otherProperty
|
|
113
|
+
} of sides) {
|
|
114
|
+
if (bases.has(name)) {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
// Fields of two types could disagree on which rows match (each side compares by its own), so only one type
|
|
118
|
+
const narrowable = step.comparator === '=' && step.typeA === step.typeB && (0, _joinKey.isKeyedType)(step.typeA) && bases.has(other);
|
|
119
|
+
const rows = narrowable ? await indexedRows(name, property, step.typeA, bases.get(other).rows, otherProperty) : undefined;
|
|
120
|
+
keep(name, rows ?? (await allRows(name)));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (!bases.has(joinEntity)) {
|
|
124
|
+
keep(joinEntity, await allRows(joinEntity));
|
|
125
|
+
}
|
|
126
|
+
return bases;
|
|
127
|
+
};
|
|
128
|
+
exports.joinBases = joinBases;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.joinBases=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js"),require("core-js/modules/esnext.iterator.for-each.js"),require("core-js/modules/esnext.iterator.map.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"),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 _readEntity=require("../queries/readEntity"),_retrieveRecord=require("./retrieveRecord"),_retrieveRecords=require("./retrieveRecords"),_retrieveIndexes=require("./retrieveIndexes"),_joinKey=require("./joinKey"),_rowLookup=require("./rowLookup");const indexedRows=async(e,r,s,o,t)=>{const i=(await(0,_retrieveIndexes.retrieveIndexes)(e,[r],{}))[r];if(!i)return;const n=new Set(o.map((e=>(0,_joinKey.joinKey)(s,e[t]))).filter((e=>void 0!==e))),u=new Set;for(const e of i)n.has((0,_joinKey.joinKey)(s,e.value))&&e.record.forEach((e=>u.add(e)));const j=await(0,_retrieveRecord.retrieveRecord)(e);return(0,_retrieveRecords.retrieveEntryRows)(j,j.entries.filter((e=>u.has(e))))},joinBases=async(e,r,s,o,t)=>{const i=new Map,n=(e,r)=>i.set(e,{rows:r,lookups:new _rowLookup.RowLookups(r)});n(e,s[e]),t&&n(r,s[r]);const u=async e=>(await(0,_readEntity.readEntity)(e,s))[e];for(const e of o){const r=[{name:e.entityA,property:e.propertyA,other:e.entityB,otherProperty:e.propertyB},{name:e.entityB,property:e.propertyB,other:e.entityA,otherProperty:e.propertyA}];for(const{name:s,property:o,other:t,otherProperty:j}of r){if(i.has(s))continue;n(s,("="===e.comparator&&e.typeA===e.typeB&&(0,_joinKey.isKeyedType)(e.typeA)&&i.has(t)?await indexedRows(s,o,e.typeA,i.get(t).rows,j):void 0)??await u(s))}}return i.has(r)||n(r,await u(r)),i};exports.joinBases=joinBases;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The key a value is looked up by when joining on `=` for a field of the given declared type: two values are equal for
|
|
3
|
+
* that field (sameValue) exactly when their keys are the same Map key. Undefined for a null or missing value, which
|
|
4
|
+
* equals nothing (as in where).
|
|
5
|
+
*
|
|
6
|
+
* Only for the types sameValue normalizes (see isKeyedType); any other type compares loosely (`==`), which no Map key
|
|
7
|
+
* can express, so those joins keep comparing row by row.
|
|
8
|
+
* @param type
|
|
9
|
+
* @param value
|
|
10
|
+
*/
|
|
11
|
+
export declare const joinKey: (type: string | undefined, value: any) => any;
|
|
12
|
+
/**
|
|
13
|
+
* Whether `=` on a field of this declared type can be answered by joinKey lookups.
|
|
14
|
+
* @param type
|
|
15
|
+
*/
|
|
16
|
+
export declare const isKeyedType: (type: string | undefined) => boolean;
|
|
17
|
+
//# sourceMappingURL=joinKey.d.ts.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.joinKey = exports.isKeyedType = void 0;
|
|
7
|
+
require("core-js/modules/es.array.includes.js");
|
|
8
|
+
var _compareAs = require("./compareAs");
|
|
9
|
+
/**
|
|
10
|
+
* The key a value is looked up by when joining on `=` for a field of the given declared type: two values are equal for
|
|
11
|
+
* that field (sameValue) exactly when their keys are the same Map key. Undefined for a null or missing value, which
|
|
12
|
+
* equals nothing (as in where).
|
|
13
|
+
*
|
|
14
|
+
* Only for the types sameValue normalizes (see isKeyedType); any other type compares loosely (`==`), which no Map key
|
|
15
|
+
* can express, so those joins keep comparing row by row.
|
|
16
|
+
* @param type
|
|
17
|
+
* @param value
|
|
18
|
+
*/
|
|
19
|
+
const joinKey = (type, value) => {
|
|
20
|
+
if (value === null || typeof value === 'undefined') {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
return (0, _compareAs.compareAs)(type, value);
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Whether `=` on a field of this declared type can be answered by joinKey lookups.
|
|
27
|
+
* @param type
|
|
28
|
+
*/
|
|
29
|
+
exports.joinKey = joinKey;
|
|
30
|
+
const isKeyedType = type => _compareAs.comparableTypes.includes(type);
|
|
31
|
+
exports.isKeyedType = isKeyedType;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.joinKey=exports.isKeyedType=void 0,require("core-js/modules/es.array.includes.js");var _compareAs=require("./compareAs");const joinKey=(e,s)=>{if(null!=s)return(0,_compareAs.compareAs)(e,s)};exports.joinKey=joinKey;const isKeyedType=e=>_compareAs.comparableTypes.includes(e);exports.isKeyedType=isKeyedType;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { recordDefinition } from '../introspect/definitions/record';
|
|
2
|
+
import { keyDefinition } from '../introspect/definitions/key';
|
|
3
|
+
/**
|
|
4
|
+
* The entry files a key's index lists for the values `matches` accepts, in the record's own order (the order its rows
|
|
5
|
+
* are read in). A composite key's index holds its combined value (see computeKeyValue), so `matches` is given that.
|
|
6
|
+
*
|
|
7
|
+
* Undefined when the key has no index, or its file can't be read or parsed: the caller then looks through every row.
|
|
8
|
+
* The files are candidates: callers read each one and check its value, and look through the rows for any value the
|
|
9
|
+
* index didn't lead to, so an index that's out of step with the rows costs time, not a wrong result (for primary
|
|
10
|
+
* key values, which inserts and updates keep unique; see removeMatchingEntries for a hand-edited exception).
|
|
11
|
+
* @param record
|
|
12
|
+
* @param key
|
|
13
|
+
* @param matches
|
|
14
|
+
*/
|
|
15
|
+
export declare const keyIndexFiles: (record: recordDefinition, key: keyDefinition, matches: (value: any) => boolean) => Promise<string[] | undefined>;
|
|
16
|
+
//# sourceMappingURL=keyIndexFiles.d.ts.map
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.keyIndexFiles = void 0;
|
|
7
|
+
require("core-js/modules/esnext.iterator.constructor.js");
|
|
8
|
+
require("core-js/modules/esnext.iterator.filter.js");
|
|
9
|
+
require("core-js/modules/esnext.iterator.for-each.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 _storage = require("../storage");
|
|
27
|
+
/**
|
|
28
|
+
* The entry files a key's index lists for the values `matches` accepts, in the record's own order (the order its rows
|
|
29
|
+
* are read in). A composite key's index holds its combined value (see computeKeyValue), so `matches` is given that.
|
|
30
|
+
*
|
|
31
|
+
* Undefined when the key has no index, or its file can't be read or parsed: the caller then looks through every row.
|
|
32
|
+
* The files are candidates: callers read each one and check its value, and look through the rows for any value the
|
|
33
|
+
* index didn't lead to, so an index that's out of step with the rows costs time, not a wrong result (for primary
|
|
34
|
+
* key values, which inserts and updates keep unique; see removeMatchingEntries for a hand-edited exception).
|
|
35
|
+
* @param record
|
|
36
|
+
* @param key
|
|
37
|
+
* @param matches
|
|
38
|
+
*/
|
|
39
|
+
const keyIndexFiles = async (record, key, matches) => {
|
|
40
|
+
if (!key.lookup) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
if (!(record.entries || []).length) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
let index;
|
|
47
|
+
try {
|
|
48
|
+
index = await (0, _storage.readJson)(`__indexes/${record.path}/${key.lookup}`);
|
|
49
|
+
} catch (err) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
const files = new Set();
|
|
53
|
+
for (const entry of Array.isArray(index) ? index : []) {
|
|
54
|
+
if (Array.isArray(entry.record) && matches(entry.value)) {
|
|
55
|
+
entry.record.forEach(file => files.add(file));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return record.entries.filter(file => files.has(file));
|
|
59
|
+
};
|
|
60
|
+
exports.keyIndexFiles = keyIndexFiles;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.keyIndexFiles=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js"),require("core-js/modules/esnext.iterator.for-each.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 _storage=require("../storage");const keyIndexFiles=async(e,s,r)=>{if(!s.lookup)return;if(!(e.entries||[]).length)return[];let t;try{t=await(0,_storage.readJson)(`__indexes/${e.path}/${s.lookup}`)}catch(e){return}const o=new Set;for(const e of Array.isArray(t)?t:[])Array.isArray(e.record)&&r(e.value)&&e.record.forEach((e=>o.add(e)));return e.entries.filter((e=>o.has(e)))};exports.keyIndexFiles=keyIndexFiles;
|