UNPKG

@decaf-ts/core

Version:

Core persistence module for the decaf framework

72 lines 9.38 kB
import { Paginator } from "./../query/index.js"; /** * @description RAM-specific paginator implementation * @summary Extends the base Paginator class to provide pagination functionality for RAM adapter queries. * This class handles the pagination of query results from the in-memory storage, allowing * for efficient retrieval of large result sets in smaller chunks. * @template M - The model type being paginated * @template R - The result type returned by the paginator * @class RamPaginator * @category Ram * @example * ```typescript * // Create a query for User model * const query: RawRamQuery<User> = { * select: undefined, // Select all fields * from: User, * where: (user) => user.active === true * }; * * // Create a paginator with page size of 10 * const paginator = new RamPaginator<User, User>(adapter, query, 10, User); * * // Get the first page of results * const firstPage = await paginator.page(1); * * // Get the next page * const secondPage = await paginator.page(2); * ``` */ export class RamPaginator extends Paginator { constructor(adapter, query, size, clazz) { super(adapter, query, size, clazz); } /** * @description Prepares a RAM query for pagination * @summary Modifies the raw query statement to include pagination parameters. * This protected method sets the limit parameter on the query to match the page size. * @param {RawRamQuery<M>} rawStatement - The original query statement * @return {RawRamQuery<M>} The modified query with pagination parameters */ prepare(rawStatement) { const query = Object.assign({}, rawStatement); query.limit = this.size; return query; } /** * @description Retrieves a specific page of results * @summary Executes the query with pagination parameters to retrieve a specific page of results. * This method calculates the appropriate skip value based on the page number and page size, * executes the query, and updates the current page tracking. * @param {number} [page=1] - The page number to retrieve (1-based) * @return {Promise<R[]>} A promise that resolves to an array of results for the requested page */ async page(page = 1) { const statement = this.prepare(this.statement); if (!this._recordCount || !this._totalPages) { this._totalPages = this._recordCount = 0; const results = await this.adapter.raw({ ...statement, limit: undefined }) || []; this._recordCount = results.length; if (this._recordCount > 0) { const size = statement?.limit || this.size; this._totalPages = Math.ceil(this._recordCount / size); } } page = this.validatePage(page); statement.skip = (page - 1) * this.size; const results = await this.adapter.raw(statement); this._currentPage = page; return results; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFtUGFnaW5hdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JhbS9SYW1QYWdpbmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSw0QkFBaUI7QUFJckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILE1BQU0sT0FBTyxZQUFpQyxTQUFRLFNBSXJEO0lBQ0MsWUFDRSxPQUErQyxFQUMvQyxLQUFxQixFQUNyQixJQUFZLEVBQ1osS0FBcUI7UUFFckIsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTyxPQUFPLENBQUMsWUFBNEI7UUFDNUMsTUFBTSxLQUFLLEdBQXFCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2hFLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN4QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFlLENBQUM7UUFDekIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztZQUN6QyxNQUFNLE9BQU8sR0FBUSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3RGLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUNuQyxJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sSUFBSSxHQUFHLFNBQVMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDM0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDM0QsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDeEMsTUFBTSxPQUFPLEdBQVUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSYXdSYW1RdWVyeSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBQYWdpbmF0b3IgfSBmcm9tIFwiLi4vcXVlcnlcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUkFNLXNwZWNpZmljIHBhZ2luYXRvciBpbXBsZW1lbnRhdGlvblxuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSBQYWdpbmF0b3IgY2xhc3MgdG8gcHJvdmlkZSBwYWdpbmF0aW9uIGZ1bmN0aW9uYWxpdHkgZm9yIFJBTSBhZGFwdGVyIHF1ZXJpZXMuXG4gKiBUaGlzIGNsYXNzIGhhbmRsZXMgdGhlIHBhZ2luYXRpb24gb2YgcXVlcnkgcmVzdWx0cyBmcm9tIHRoZSBpbi1tZW1vcnkgc3RvcmFnZSwgYWxsb3dpbmdcbiAqIGZvciBlZmZpY2llbnQgcmV0cmlldmFsIG9mIGxhcmdlIHJlc3VsdCBzZXRzIGluIHNtYWxsZXIgY2h1bmtzLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBiZWluZyBwYWdpbmF0ZWRcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlc3VsdCB0eXBlIHJldHVybmVkIGJ5IHRoZSBwYWdpbmF0b3JcbiAqIEBjbGFzcyBSYW1QYWdpbmF0b3JcbiAqIEBjYXRlZ29yeSBSYW1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBxdWVyeSBmb3IgVXNlciBtb2RlbFxuICogY29uc3QgcXVlcnk6IFJhd1JhbVF1ZXJ5PFVzZXI+ID0ge1xuICogICBzZWxlY3Q6IHVuZGVmaW5lZCwgLy8gU2VsZWN0IGFsbCBmaWVsZHNcbiAqICAgZnJvbTogVXNlcixcbiAqICAgd2hlcmU6ICh1c2VyKSA9PiB1c2VyLmFjdGl2ZSA9PT0gdHJ1ZVxuICogfTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBwYWdpbmF0b3Igd2l0aCBwYWdlIHNpemUgb2YgMTBcbiAqIGNvbnN0IHBhZ2luYXRvciA9IG5ldyBSYW1QYWdpbmF0b3I8VXNlciwgVXNlcj4oYWRhcHRlciwgcXVlcnksIDEwLCBVc2VyKTtcbiAqXG4gKiAvLyBHZXQgdGhlIGZpcnN0IHBhZ2Ugb2YgcmVzdWx0c1xuICogY29uc3QgZmlyc3RQYWdlID0gYXdhaXQgcGFnaW5hdG9yLnBhZ2UoMSk7XG4gKlxuICogLy8gR2V0IHRoZSBuZXh0IHBhZ2VcbiAqIGNvbnN0IHNlY29uZFBhZ2UgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgyKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUmFtUGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBQYWdpbmF0b3I8XG4gIE0sXG4gIFIsXG4gIFJhd1JhbVF1ZXJ5PE0+XG4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgYWRhcHRlcjogQWRhcHRlcjxhbnksIFJhd1JhbVF1ZXJ5PE0+LCBhbnksIGFueT4sXG4gICAgcXVlcnk6IFJhd1JhbVF1ZXJ5PE0+LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBSQU0gcXVlcnkgZm9yIHBhZ2luYXRpb25cbiAgICogQHN1bW1hcnkgTW9kaWZpZXMgdGhlIHJhdyBxdWVyeSBzdGF0ZW1lbnQgdG8gaW5jbHVkZSBwYWdpbmF0aW9uIHBhcmFtZXRlcnMuXG4gICAqIFRoaXMgcHJvdGVjdGVkIG1ldGhvZCBzZXRzIHRoZSBsaW1pdCBwYXJhbWV0ZXIgb24gdGhlIHF1ZXJ5IHRvIG1hdGNoIHRoZSBwYWdlIHNpemUuXG4gICAqIEBwYXJhbSB7UmF3UmFtUXVlcnk8TT59IHJhd1N0YXRlbWVudCAtIFRoZSBvcmlnaW5hbCBxdWVyeSBzdGF0ZW1lbnRcbiAgICogQHJldHVybiB7UmF3UmFtUXVlcnk8TT59IFRoZSBtb2RpZmllZCBxdWVyeSB3aXRoIHBhZ2luYXRpb24gcGFyYW1ldGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBSYXdSYW1RdWVyeTxNPik6IFJhd1JhbVF1ZXJ5PE0+IHtcbiAgICBjb25zdCBxdWVyeTogUmF3UmFtUXVlcnk8YW55PiA9IE9iamVjdC5hc3NpZ24oe30sIHJhd1N0YXRlbWVudCk7XG4gICAgcXVlcnkubGltaXQgPSB0aGlzLnNpemU7XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBzcGVjaWZpYyBwYWdlIG9mIHJlc3VsdHNcbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgdGhlIHF1ZXJ5IHdpdGggcGFnaW5hdGlvbiBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIGEgc3BlY2lmaWMgcGFnZSBvZiByZXN1bHRzLlxuICAgKiBUaGlzIG1ldGhvZCBjYWxjdWxhdGVzIHRoZSBhcHByb3ByaWF0ZSBza2lwIHZhbHVlIGJhc2VkIG9uIHRoZSBwYWdlIG51bWJlciBhbmQgcGFnZSBzaXplLFxuICAgKiBleGVjdXRlcyB0aGUgcXVlcnksIGFuZCB1cGRhdGVzIHRoZSBjdXJyZW50IHBhZ2UgdHJhY2tpbmcuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFnZT0xXSAtIFRoZSBwYWdlIG51bWJlciB0byByZXRyaWV2ZSAoMS1iYXNlZClcbiAgICogQHJldHVybiB7UHJvbWlzZTxSW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiByZXN1bHRzIGZvciB0aGUgcmVxdWVzdGVkIHBhZ2VcbiAgICovXG4gIGFzeW5jIHBhZ2UocGFnZTogbnVtYmVyID0gMSk6IFByb21pc2U8UltdPiB7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gdGhpcy5wcmVwYXJlKHRoaXMuc3RhdGVtZW50KTtcbiAgICBpZiAoIXRoaXMuX3JlY29yZENvdW50IHx8ICF0aGlzLl90b3RhbFBhZ2VzKSB7XG4gICAgICAgIHRoaXMuX3RvdGFsUGFnZXMgPSB0aGlzLl9yZWNvcmRDb3VudCA9IDA7XG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IFJbXSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoeyAuLi5zdGF0ZW1lbnQsIGxpbWl0OiB1bmRlZmluZWQgfSkgfHwgW107XG4gICAgICAgIHRoaXMuX3JlY29yZENvdW50ID0gcmVzdWx0cy5sZW5ndGg7XG4gICAgICAgIGlmICh0aGlzLl9yZWNvcmRDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBzdGF0ZW1lbnQ/LmxpbWl0IHx8IHRoaXMuc2l6ZTtcbiAgICAgICAgICAgIHRoaXMuX3RvdGFsUGFnZXMgPSBNYXRoLmNlaWwodGhpcy5fcmVjb3JkQ291bnQgLyBzaXplKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhZ2UgPSB0aGlzLnZhbGlkYXRlUGFnZShwYWdlKTtcbiAgICBzdGF0ZW1lbnQuc2tpcCA9IChwYWdlIC0gMSkgKiB0aGlzLnNpemU7XG4gICAgY29uc3QgcmVzdWx0czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KHN0YXRlbWVudCk7XG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG4iXX0=