@decaf-ts/for-postgres
Version:
template for ts projects
98 lines • 11.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateIndexes = generateIndexes;
const core_1 = require("@decaf-ts/core");
const constants_1 = require("./../constants.cjs");
const db_decorators_1 = require("@decaf-ts/db-decorators");
/**
* @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 = db_decorators_1.DefaultSeparator) {
return [
...name.map((n) => (n === constants_1.PostgresKeys.TABLE ? "table" : n)),
...(compositions || []),
...(direction ? [direction] : []),
constants_1.PostgresKeys.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 {PostgresQuery} 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
*/
function generateIndexes(models) {
const tableName = generateIndexName([constants_1.PostgresKeys.TABLE]);
const indexes = {};
indexes[tableName] = {
query: ``,
values: [],
};
models.forEach((m) => {
const ind = core_1.Repository.indexes(m);
Object.entries(ind).forEach(([key, value]) => {
const k = Object.keys(value)[0];
let { compositions } = value[k];
const tableName = core_1.Repository.table(m);
compositions = compositions || [];
function generate() {
const name = [key, ...compositions, core_1.PersistenceKeys.INDEX].join(db_decorators_1.DefaultSeparator);
indexes[name] = {
query: `CREATE INDEX $1 ON $2 ($3);`,
values: [name, tableName, key],
};
}
generate();
});
});
return Object.values(indexes);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2luZGV4ZXMvZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBa0ZBLDBDQWtDQztBQXBIRCx5Q0FLd0I7QUFDeEIsa0RBQTRDO0FBQzVDLDJEQUEyRDtBQUkzRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLGlCQUFpQixDQUN4QixJQUFjLEVBQ2QsU0FBMEIsRUFDMUIsWUFBdUIsRUFDdkIsU0FBUyxHQUFHLGdDQUFnQjtJQUU1QixPQUFPO1FBQ0wsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyx3QkFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxHQUFHLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUN2QixHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakMsd0JBQVksQ0FBQyxLQUFLO0tBQ25CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThDRztBQUNILFNBQWdCLGVBQWUsQ0FDN0IsTUFBd0I7SUFFeEIsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyx3QkFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDMUQsTUFBTSxPQUFPLEdBQWtDLEVBQUUsQ0FBQztJQUNsRCxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUc7UUFDbkIsS0FBSyxFQUFFLEVBQUU7UUFDVCxNQUFNLEVBQUUsRUFBRTtLQUNYLENBQUM7SUFFRixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDbkIsTUFBTSxHQUFHLEdBQWtDLGlCQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUMzQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRWhDLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBSSxLQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsTUFBTSxTQUFTLEdBQUcsaUJBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsWUFBWSxHQUFHLFlBQVksSUFBSSxFQUFFLENBQUM7WUFFbEMsU0FBUyxRQUFRO2dCQUNmLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUksWUFBbUIsRUFBRSxzQkFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FDckUsZ0NBQWdCLENBQ2pCLENBQUM7Z0JBRUYsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHO29CQUNkLEtBQUssRUFBRSw2QkFBNkI7b0JBQ3BDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDO2lCQUMvQixDQUFDO1lBQ0osQ0FBQztZQUVELFFBQVEsRUFBRSxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW5kZXhNZXRhZGF0YSxcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUmVwb3NpdG9yeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBQb3N0Z3Jlc0tleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZWZhdWx0U2VwYXJhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQb3N0Z3Jlc1F1ZXJ5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIG5hbWUgZm9yIGEgQ291Y2hEQiBpbmRleFxuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHN0YW5kYXJkaXplZCBuYW1lIGZvciBhIENvdWNoREIgaW5kZXggYnkgY29tYmluaW5nIG5hbWUgcGFydHMsIGNvbXBvc2l0aW9ucywgYW5kIGRpcmVjdGlvblxuICogQHBhcmFtIHtzdHJpbmdbXX0gbmFtZSAtIEFycmF5IG9mIG5hbWUgcGFydHMgZm9yIHRoZSBpbmRleFxuICogQHBhcmFtIHtPcmRlckRpcmVjdGlvbn0gW2RpcmVjdGlvbl0gLSBPcHRpb25hbCBzb3J0IGRpcmVjdGlvbiBmb3IgdGhlIGluZGV4XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbY29tcG9zaXRpb25zXSAtIE9wdGlvbmFsIGFkZGl0aW9uYWwgYXR0cmlidXRlcyB0byBpbmNsdWRlIGluIHRoZSBpbmRleCBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NlcGFyYXRvcj1EZWZhdWx0U2VwYXJhdG9yXSAtIFRoZSBzZXBhcmF0b3IgdG8gdXNlIGJldHdlZW4gcGFydHMgb2YgdGhlIGluZGV4IG5hbWVcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBpbmRleCBuYW1lXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1jb3VjaGRiXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlSW5kZXhOYW1lKFxuICBuYW1lOiBzdHJpbmdbXSxcbiAgZGlyZWN0aW9uPzogT3JkZXJEaXJlY3Rpb24sXG4gIGNvbXBvc2l0aW9ucz86IHN0cmluZ1tdLFxuICBzZXBhcmF0b3IgPSBEZWZhdWx0U2VwYXJhdG9yXG4pIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uYW1lLm1hcCgobikgPT4gKG4gPT09IFBvc3RncmVzS2V5cy5UQUJMRSA/IFwidGFibGVcIiA6IG4pKSxcbiAgICAuLi4oY29tcG9zaXRpb25zIHx8IFtdKSxcbiAgICAuLi4oZGlyZWN0aW9uID8gW2RpcmVjdGlvbl0gOiBbXSksXG4gICAgUG9zdGdyZXNLZXlzLklOREVYLFxuICBdLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIENvdWNoREIgaW5kZXggY29uZmlndXJhdGlvbnMgZm9yIG1vZGVsc1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHNldCBvZiBDb3VjaERCIGluZGV4IGNvbmZpZ3VyYXRpb25zIGJhc2VkIG9uIHRoZSBtZXRhZGF0YSBvZiB0aGUgcHJvdmlkZWQgbW9kZWxzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIG1vZGVscyAtIEFycmF5IG9mIG1vZGVsIGNvbnN0cnVjdG9ycyB0byBnZW5lcmF0ZSBpbmRleGVzIGZvclxuICogQHJldHVybiB7UG9zdGdyZXNRdWVyeX0gQXJyYXkgb2YgQ291Y2hEQiBpbmRleCBjb25maWd1cmF0aW9uc1xuICogQGZ1bmN0aW9uIGdlbmVyYXRlSW5kZXhlc1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItY291Y2hkYlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgZ2VuZXJhdGVJbmRleGVzXG4gKiAgIHBhcnRpY2lwYW50IGdlbmVyYXRlSW5kZXhOYW1lXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAqXG4gKiAgIENhbGxlci0+PmdlbmVyYXRlSW5kZXhlczogbW9kZWxzXG4gKlxuICogICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleGVzOiBDcmVhdGUgYmFzZSB0YWJsZSBpbmRleFxuICogICBnZW5lcmF0ZUluZGV4ZXMtPj5nZW5lcmF0ZUluZGV4TmFtZTogW0NvdWNoREJLZXlzLlRBQkxFXVxuICogICBnZW5lcmF0ZUluZGV4TmFtZS0tPj5nZW5lcmF0ZUluZGV4ZXM6IHRhYmxlTmFtZVxuICogICBnZW5lcmF0ZUluZGV4ZXMtPj5nZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSB0YWJsZSBpbmRleCBjb25maWdcbiAqXG4gKiAgIGxvb3AgRm9yIGVhY2ggbW9kZWxcbiAqICAgICBnZW5lcmF0ZUluZGV4ZXMtPj5SZXBvc2l0b3J5OiBHZXQgaW5kZXhlcyBtZXRhZGF0YVxuICogICAgIFJlcG9zaXRvcnktLT4+Z2VuZXJhdGVJbmRleGVzOiBpbmRleCBtZXRhZGF0YVxuICpcbiAqICAgICBsb29wIEZvciBlYWNoIGluZGV4IGluIG1ldGFkYXRhXG4gKiAgICAgICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleGVzOiBFeHRyYWN0IGluZGV4IHByb3BlcnRpZXNcbiAqICAgICAgIGdlbmVyYXRlSW5kZXhlcy0+PlJlcG9zaXRvcnk6IEdldCB0YWJsZSBuYW1lXG4gKiAgICAgICBSZXBvc2l0b3J5LS0+PmdlbmVyYXRlSW5kZXhlczogdGFibGVOYW1lXG4gKlxuICogICAgICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogRGVmaW5lIG5lc3RlZCBnZW5lcmF0ZSBmdW5jdGlvblxuICpcbiAqICAgICAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhlczogQ2FsbCBnZW5lcmF0ZSgpIGZvciBkZWZhdWx0IG9yZGVyXG4gKiAgICAgICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleGVzOiBDcmVhdGUgaW5kZXggbmFtZSBhbmQgY29uZmlnXG4gKlxuICogICAgICAgYWx0IEhhcyBkaXJlY3Rpb25zXG4gKiAgICAgICAgIGxvb3AgRm9yIGVhY2ggZGlyZWN0aW9uXG4gKiAgICAgICAgICAgZ2VuZXJhdGVJbmRleGVzLT4+Z2VuZXJhdGVJbmRleGVzOiBDYWxsIGdlbmVyYXRlKGRpcmVjdGlvbilcbiAqICAgICAgICAgICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleGVzOiBDcmVhdGUgb3JkZXJlZCBpbmRleCBjb25maWdcbiAqICAgICAgICAgZW5kXG4gKiAgICAgICBlbmRcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKlxuICogICBnZW5lcmF0ZUluZGV4ZXMtLT4+Q2FsbGVyOiBBcnJheSBvZiBpbmRleCBjb25maWd1cmF0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleGVzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsczogQ29uc3RydWN0b3I8TT5bXVxuKTogUG9zdGdyZXNRdWVyeVtdIHtcbiAgY29uc3QgdGFibGVOYW1lID0gZ2VuZXJhdGVJbmRleE5hbWUoW1Bvc3RncmVzS2V5cy5UQUJMRV0pO1xuICBjb25zdCBpbmRleGVzOiBSZWNvcmQ8c3RyaW5nLCBQb3N0Z3Jlc1F1ZXJ5PiA9IHt9O1xuICBpbmRleGVzW3RhYmxlTmFtZV0gPSB7XG4gICAgcXVlcnk6IGBgLFxuICAgIHZhbHVlczogW10sXG4gIH07XG5cbiAgbW9kZWxzLmZvckVhY2goKG0pID0+IHtcbiAgICBjb25zdCBpbmQ6IFJlY29yZDxzdHJpbmcsIEluZGV4TWV0YWRhdGE+ID0gUmVwb3NpdG9yeS5pbmRleGVzKG0pO1xuICAgIE9iamVjdC5lbnRyaWVzKGluZCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBjb25zdCBrID0gT2JqZWN0LmtleXModmFsdWUpWzBdO1xuXG4gICAgICBsZXQgeyBjb21wb3NpdGlvbnMgfSA9ICh2YWx1ZSBhcyBhbnkpW2tdO1xuICAgICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShtKTtcbiAgICAgIGNvbXBvc2l0aW9ucyA9IGNvbXBvc2l0aW9ucyB8fCBbXTtcblxuICAgICAgZnVuY3Rpb24gZ2VuZXJhdGUoKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBba2V5LCAuLi4oY29tcG9zaXRpb25zIGFzIFtdKSwgUGVyc2lzdGVuY2VLZXlzLklOREVYXS5qb2luKFxuICAgICAgICAgIERlZmF1bHRTZXBhcmF0b3JcbiAgICAgICAgKTtcblxuICAgICAgICBpbmRleGVzW25hbWVdID0ge1xuICAgICAgICAgIHF1ZXJ5OiBgQ1JFQVRFIElOREVYICQxIE9OICQyICgkMyk7YCxcbiAgICAgICAgICB2YWx1ZXM6IFtuYW1lLCB0YWJsZU5hbWUsIGtleV0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGdlbmVyYXRlKCk7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhpbmRleGVzKTtcbn1cbiJdfQ==