@decaf-ts/core
Version:
Core persistence module for the decaf framework
83 lines • 3.46 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.RamPaginator = void 0;
const query_1 = require("./../query/index.cjs");
/**
* @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);
* ```
*/
class RamPaginator extends query_1.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, ...args) {
const { ctx, ctxArgs } = this.adapter["logCtx"](args, this.page);
if (this.isPreparedStatement()) {
return this.pagePrepared(page, ...ctxArgs);
}
const statement = this.prepare(this.statement);
let results;
if (!this._recordCount || !this._totalPages) {
this._totalPages = this._recordCount = 0;
results = await this.adapter.raw({ ...statement, limit: undefined }, false, ctx);
this._recordCount = results.count || results.data.length;
if (this._recordCount > 0) {
const size = statement?.limit || this.size;
this._totalPages = Math.ceil(this._recordCount / size);
}
}
else {
page = this.validatePage(page);
statement.skip = (page - 1) * this.size;
results = await this.adapter.raw(statement, true, ...args, ctx);
}
this._currentPage = page;
return results.data || results;
}
}
exports.RamPaginator = RamPaginator;
//# sourceMappingURL=RamPaginator.js.map