UNPKG

@decaf-ts/for-couchdb

Version:
128 lines 15.5 kB
import { PersistenceKeys, Repository, } from "@decaf-ts/core"; import { CouchDBKeys } from "./../constants.js"; import { DefaultSeparator } from "@decaf-ts/db-decorators"; import { CouchDBOperator } from "./../query/constants.js"; /** * @description Generates a name for a CouchDB index * @summary Creates a standardized name for a CouchDB index by combining name parts, compositions, and direction * @param {string[]} name - Array of name parts for the index * @param {OrderDirection} [direction] - Optional sort direction for the index * @param {string[]} [compositions] - Optional additional attributes to include in the index name * @param {string} [separator=DefaultSeparator] - The separator to use between parts of the index name * @return {string} The generated index name * @memberOf module:for-couchdb */ function generateIndexName(name, direction, compositions, separator = DefaultSeparator) { return [ ...name.map((n) => (n === CouchDBKeys.TABLE ? "table" : n)), ...(compositions || []), ...(direction ? [direction] : []), CouchDBKeys.INDEX, ].join(separator); } /** * @description Generates CouchDB index configurations for models * @summary Creates a set of CouchDB index configurations based on the metadata of the provided models * @template M - The model type that extends Model * @param models - Array of model constructors to generate indexes for * @return {CreateIndexRequest[]} Array of CouchDB index configurations * @function generateIndexes * @memberOf module:for-couchdb * @mermaid * sequenceDiagram * participant Caller * participant generateIndexes * participant generateIndexName * participant Repository * * Caller->>generateIndexes: models * * Note over generateIndexes: Create base table index * generateIndexes->>generateIndexName: [CouchDBKeys.TABLE] * generateIndexName-->>generateIndexes: tableName * generateIndexes->>generateIndexes: Create table index config * * loop For each model * generateIndexes->>Repository: Get indexes metadata * Repository-->>generateIndexes: index metadata * * loop For each index in metadata * Note over generateIndexes: Extract index properties * generateIndexes->>Repository: Get table name * Repository-->>generateIndexes: tableName * * Note over generateIndexes: Define nested generate function * * generateIndexes->>generateIndexes: Call generate() for default order * Note over generateIndexes: Create index name and config * * alt Has directions * loop For each direction * generateIndexes->>generateIndexes: Call generate(direction) * Note over generateIndexes: Create ordered index config * end * end * end * end * * generateIndexes-->>Caller: Array of index configurations */ export function generateIndexes(models) { const tableName = generateIndexName([CouchDBKeys.TABLE]); const indexes = {}; indexes[tableName] = { index: { fields: [CouchDBKeys.TABLE], }, name: tableName, ddoc: tableName, type: "json", }; models.forEach((m) => { const ind = Repository.indexes(m); Object.entries(ind).forEach(([key, value]) => { const k = Object.keys(value)[0]; // eslint-disable-next-line prefer-const let { directions, compositions } = value[k]; const tableName = Repository.table(m); compositions = compositions || []; function generate(sort) { const name = [ tableName, key, ...compositions, PersistenceKeys.INDEX, ].join(DefaultSeparator); indexes[name] = { index: { fields: [key, ...compositions, CouchDBKeys.TABLE].reduce((accum, el) => { if (sort) { const res = {}; res[el] = sort; accum.push(res); } else { accum.push(el); } return accum; }, []), }, name: name, ddoc: name, type: "json", }; if (!sort) { const tableFilter = {}; tableFilter[CouchDBKeys.TABLE] = {}; tableFilter[CouchDBKeys.TABLE][CouchDBOperator.EQUAL] = tableName; indexes[name].index.partial_filter_selector = tableFilter; } } generate(); if (directions) directions.forEach((d) => generate(d)); }); }); return Object.values(indexes); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2luZGV4ZXMvZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxlQUFlLEVBQ2YsVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFdBQVcsRUFBRSwwQkFBcUI7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQ0FBMkI7QUFHckQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FDeEIsSUFBYyxFQUNkLFNBQTBCLEVBQzFCLFlBQXVCLEVBQ3ZCLFNBQVMsR0FBRyxnQkFBZ0I7SUFFNUIsT0FBTztRQUNMLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRCxHQUFHLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUN2QixHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakMsV0FBVyxDQUFDLEtBQUs7S0FDbEIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOENHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsTUFBd0I7SUFFeEIsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN6RCxNQUFNLE9BQU8sR0FBdUMsRUFBRSxDQUFDO0lBQ3ZELE9B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LFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlcG9zaXRvcnksXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZWZhdWx0U2VwYXJhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb3VjaERCT3BlcmF0b3IgfSBmcm9tIFwiLi4vcXVlcnkvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDcmVhdGVJbmRleFJlcXVlc3QgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgbmFtZSBmb3IgYSBDb3VjaERCIGluZGV4XG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIG5hbWUgZm9yIGEgQ291Y2hEQiBpbmRleCBieSBjb21iaW5pbmcgbmFtZSBwYXJ0cywgY29tcG9zaXRpb25zLCBhbmQgZGlyZWN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lIC0gQXJyYXkgb2YgbmFtZSBwYXJ0cyBmb3IgdGhlIGluZGV4XG4gKiBAcGFyYW0ge09yZGVyRGlyZWN0aW9ufSBbZGlyZWN0aW9uXSAtIE9wdGlvbmFsIHNvcnQgZGlyZWN0aW9uIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjb21wb3NpdGlvbnNdIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRvIGluY2x1ZGUgaW4gdGhlIGluZGV4IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPURlZmF1bHRTZXBhcmF0b3JdIC0gVGhlIHNlcGFyYXRvciB0byB1c2UgYmV0d2VlbiBwYXJ0cyBvZiB0aGUgaW5kZXggbmFtZVxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGluZGV4IG5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWNvdWNoZGJcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVJbmRleE5hbWUoXG4gIG5hbWU6IHN0cmluZ1tdLFxuICBkaXJlY3Rpb24/OiBPcmRlckRpcmVjdGlvbixcbiAgY29tcG9zaXRpb25zPzogc3RyaW5nW10sXG4gIHNlcGFyYXRvciA9IERlZmF1bHRTZXBhcmF0b3Jcbikge1xuICByZXR1cm4gW1xuICAgIC4uLm5hbWUubWFwKChuKSA9PiAobiA9PT0gQ291Y2hEQktleXMuVEFCTEUgPyBcInRhYmxlXCIgOiBuKSksXG4gICAgLi4uKGNvbXBvc2l0aW9ucyB8fCBbXSksXG4gICAgLi4uKGRpcmVjdGlvbiA/IFtkaXJlY3Rpb25dIDogW10pLFxuICAgIENvdWNoREJLZXlzLklOREVYLFxuICBdLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIENvdWNoREIgaW5kZXggY29uZmlndXJhdGlvbnMgZm9yIG1vZGVsc1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHNldCBvZiBDb3VjaERCIGluZGV4IGNvbmZpZ3VyYXRpb25zIGJhc2VkIG9uIHRoZSBtZXRhZGF0YSBvZiB0aGUgcHJvdmlkZWQgbW9kZWxzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIG1vZGVscyAtIEFycmF5IG9mIG1vZGVsIGNvbnN0cnVjdG9ycyB0byBnZW5lcmF0ZSBpbmRleGVzIGZvclxuICogQHJldHVybiB7Q3JlYXRlSW5kZXhSZXF1ZXN0W119IEFycmF5IG9mIENvdWNoREIgaW5kZXggY29uZmlndXJhdGlvbnNcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4ZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWNvdWNoZGJcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IGdlbmVyYXRlSW5kZXhlc1xuICogICBwYXJ0aWNpcGFudCBnZW5lcmF0ZUluZGV4TmFtZVxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKlxuICogICBDYWxsZXItPj5nZW5lcmF0ZUluZGV4ZXM6IG1vZGVsc1xuICpcbiAqICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIGJhc2UgdGFibGUgaW5kZXhcbiAqICAgZ2VuZXJhdGVJbmRleGVzLT4+Z2VuZXJhdGVJbmRleE5hbWU6IFtDb3VjaERCS2V5cy5UQUJMRV1cbiAqICAgZ2VuZXJhdGVJbmRleE5hbWUtLT4+Z2VuZXJhdGVJbmRleGVzOiB0YWJsZU5hbWVcbiAqICAgZ2VuZXJhdGVJbmRleGVzLT4+Z2VuZXJhdGVJbmRleGVzOiBDcmVhdGUgdGFibGUgaW5kZXggY29uZmlnXG4gKlxuICogICBsb29wIEZvciBlYWNoIG1vZGVsXG4gKiAgICAgZ2VuZXJhdGVJbmRleGVzLT4+UmVwb3NpdG9yeTogR2V0IGluZGV4ZXMgbWV0YWRhdGFcbiAqICAgICBSZXBvc2l0b3J5LS0+PmdlbmVyYXRlSW5kZXhlczogaW5kZXggbWV0YWRhdGFcbiAqXG4gKiAgICAgbG9vcCBGb3IgZWFjaCBpbmRleCBpbiBtZXRhZGF0YVxuICogICAgICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogRXh0cmFjdCBpbmRleCBwcm9wZXJ0aWVzXG4gKiAgICAgICBnZW5lcmF0ZUluZGV4ZXMtPj5SZXBvc2l0b3J5OiBHZXQgdGFibGUgbmFtZVxuICogICAgICAgUmVwb3NpdG9yeS0tPj5nZW5lcmF0ZUluZGV4ZXM6IHRhYmxlTmFtZVxuICpcbiAqICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IERlZmluZSBuZXN0ZWQgZ2VuZXJhdGUgZnVuY3Rpb25cbiAqXG4gKiAgICAgICBnZW5lcmF0ZUluZGV4ZXMtPj5nZW5lcmF0ZUluZGV4ZXM6IENhbGwgZ2VuZXJhdGUoKSBmb3IgZGVmYXVsdCBvcmRlclxuICogICAgICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIGluZGV4IG5hbWUgYW5kIGNvbmZpZ1xuICpcbiAqICAgICAgIGFsdCBIYXMgZGlyZWN0aW9uc1xuICogICAgICAgICBsb29wIEZvciBlYWNoIGRpcmVjdGlvblxuICogICAgICAgICAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhlczogQ2FsbCBnZW5lcmF0ZShkaXJlY3Rpb24pXG4gKiAgICAgICAgICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIG9yZGVyZWQgaW5kZXggY29uZmlnXG4gKiAgICAgICAgIGVuZFxuICogICAgICAgZW5kXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICpcbiAqICAgZ2VuZXJhdGVJbmRleGVzLS0+PkNhbGxlcjogQXJyYXkgb2YgaW5kZXggY29uZmlndXJhdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSW5kZXhlczxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbHM6IENvbnN0cnVjdG9yPE0+W11cbik6IENyZWF0ZUluZGV4UmVxdWVzdFtdIHtcbiAgY29uc3QgdGFibGVOYW1lID0gZ2VuZXJhdGVJbmRleE5hbWUoW0NvdWNoREJLZXlzLlRBQkxFXSk7XG4gIGNvbnN0IGluZGV4ZXM6IFJlY29yZDxzdHJpbmcsIENyZWF0ZUluZGV4UmVxdWVzdD4gPSB7fTtcbiAgaW5kZXhlc1t0YWJsZU5hbWVdID0ge1xuICAgIGluZGV4OiB7XG4gICAgICBmaWVsZHM6IFtDb3VjaERCS2V5cy5UQUJMRV0sXG4gICAgfSxcbiAgICBuYW1lOiB0YWJsZU5hbWUsXG4gICAgZGRvYzogdGFibGVOYW1lLFxuICAgIHR5cGU6IFwianNvblwiLFxuICB9O1xuXG4gIG1vZGVscy5mb3JFYWNoKChtKSA9PiB7XG4gICAgY29uc3QgaW5kOiBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPiA9IFJlcG9zaXRvcnkuaW5kZXhlcyhtKTtcbiAgICBPYmplY3QuZW50cmllcyhpbmQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgY29uc3QgayA9IE9iamVjdC5rZXlzKHZhbHVlKVswXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgIGxldCB7IGRpcmVjdGlvbnMsIGNvbXBvc2l0aW9ucyB9ID0gKHZhbHVlIGFzIGFueSlba107XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG0pO1xuICAgICAgY29tcG9zaXRpb25zID0gY29tcG9zaXRpb25zIHx8IFtdO1xuXG4gICAgICBmdW5jdGlvbiBnZW5lcmF0ZShzb3J0PzogT3JkZXJEaXJlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IFtcbiAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIC4uLihjb21wb3NpdGlvbnMgYXMgW10pLFxuICAgICAgICAgIFBlcnNpc3RlbmNlS2V5cy5JTkRFWCxcbiAgICAgICAgXS5qb2luKERlZmF1bHRTZXBhcmF0b3IpO1xuXG4gICAgICAgIGluZGV4ZXNbbmFtZV0gPSB7XG4gICAgICAgICAgaW5kZXg6IHtcbiAgICAgICAgICAgIGZpZWxkczogW2tleSwgLi4uKGNvbXBvc2l0aW9ucyBhcyBbXSksIENvdWNoREJLZXlzLlRBQkxFXS5yZWR1Y2UoXG4gICAgICAgICAgICAgIChhY2N1bTogYW55W10sIGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNvcnQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlczogYW55ID0ge307XG4gICAgICAgICAgICAgICAgICByZXNbZWxdID0gc29ydDtcbiAgICAgICAgICAgICAgICAgIGFjY3VtLnB1c2gocmVzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgYWNjdW0ucHVzaChlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgW11cbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIGRkb2M6IG5hbWUsXG4gICAgICAgICAgdHlwZTogXCJqc29uXCIsXG4gICAgICAgIH07XG4gICAgICAgIGlmICghc29ydCkge1xuICAgICAgICAgIGNvbnN0IHRhYmxlRmlsdGVyOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICAgICAgdGFibGVGaWx0ZXJbQ291Y2hEQktleXMuVEFCTEVdID0ge307XG4gICAgICAgICAgdGFibGVGaWx0ZXJbQ291Y2hEQktleXMuVEFCTEVdW0NvdWNoREJPcGVyYXRvci5FUVVBTF0gPSB0YWJsZU5hbWU7XG4gICAgICAgICAgaW5kZXhlc1tuYW1lXS5pbmRleC5wYXJ0aWFsX2ZpbHRlcl9zZWxlY3RvciA9IHRhYmxlRmlsdGVyO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGdlbmVyYXRlKCk7XG4gICAgICBpZiAoZGlyZWN0aW9ucylcbiAgICAgICAgKGRpcmVjdGlvbnMgYXMgdW5rbm93biBhcyBPcmRlckRpcmVjdGlvbltdKS5mb3JFYWNoKChkKSA9PiBnZW5lcmF0ZShkKSk7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhpbmRleGVzKTtcbn1cbiJdfQ==