UNPKG

@decaf-ts/for-couchdb

Version:
124 lines (123 loc) 5.18 kB
import { Paginator } from "@decaf-ts/core"; import { MangoQuery } from "../types"; import { Constructor, Model } from "@decaf-ts/decorator-validation"; import { CouchDBAdapter } from "../adapter"; /** * @description Paginator for CouchDB query results * @summary Implements pagination for CouchDB queries using bookmarks for efficient navigation through result sets * @template M - The model type that extends Model * @template R - The result type * @param {CouchDBAdapter<any, any, any>} adapter - The CouchDB adapter * @param {MangoQuery} query - The Mango query to paginate * @param {number} size - The page size * @param {Constructor<M>} clazz - The model constructor * @class CouchDBPaginator * @example * // Example of using CouchDBPaginator * const adapter = new MyCouchDBAdapter(scope); * const query = { selector: { type: "user" } }; * const paginator = new CouchDBPaginator(adapter, query, 10, User); * * // Get the first page * const page1 = await paginator.page(1); * * // Get the next page * const page2 = await paginator.page(2); */ export declare class CouchDBPaginator<M extends Model, R> extends Paginator<M, R, MangoQuery> { /** * @description Bookmark for CouchDB pagination * @summary Stores the bookmark returned by CouchDB for continuing pagination */ private bookMark?; /** * @description Gets the total number of pages * @summary Not supported in CouchDB - throws an error when accessed * @return {number} Never returns as it throws an error * @throws {InternalError} Always throws as this functionality is not available in CouchDB */ get total(): number; /** * @description Gets the total record count * @summary Not supported in CouchDB - throws an error when accessed * @return {number} Never returns as it throws an error * @throws {InternalError} Always throws as this functionality is not available in CouchDB */ get count(): number; /** * @description Creates a new CouchDBPaginator instance * @summary Initializes a paginator for CouchDB query results * @param {CouchDBAdapter<any, any, any>} adapter - The CouchDB adapter * @param {MangoQuery} query - The Mango query to paginate * @param {number} size - The page size * @param {Constructor<M>} clazz - The model constructor */ constructor(adapter: CouchDBAdapter<any, any, any>, query: MangoQuery, size: number, clazz: Constructor<M>); /** * @description Prepares a query for pagination * @summary Modifies the raw query to include pagination parameters * @param {MangoQuery} rawStatement - The original Mango query * @return {MangoQuery} The prepared query with pagination parameters */ protected prepare(rawStatement: MangoQuery): MangoQuery; /** * @description Retrieves a specific page of results * @summary Executes the query with pagination and processes the results * @param {number} [page=1] - The page number to retrieve * @return {Promise<R[]>} A promise that resolves to an array of results * @throws {PagingError} If trying to access a page other than the first without a bookmark, or if no class is defined * @mermaid * sequenceDiagram * participant Client * participant CouchDBPaginator * participant Adapter * participant CouchDB * * Client->>CouchDBPaginator: page(pageNumber) * Note over CouchDBPaginator: Clone statement * CouchDBPaginator->>CouchDBPaginator: validatePage(page) * * alt page !== 1 * CouchDBPaginator->>CouchDBPaginator: Check bookmark * alt No bookmark * CouchDBPaginator-->>Client: Throw PagingError * else Has bookmark * CouchDBPaginator->>CouchDBPaginator: Add bookmark to statement * end * end * * CouchDBPaginator->>Adapter: raw(statement, false) * Adapter->>CouchDB: Execute query * CouchDB-->>Adapter: Return results * Adapter-->>CouchDBPaginator: Return MangoResponse * * Note over CouchDBPaginator: Process results * * alt Has warning * CouchDBPaginator->>CouchDBPaginator: Log warning * end * * CouchDBPaginator->>CouchDBPaginator: Check for clazz * * alt No clazz * CouchDBPaginator-->>Client: Throw PagingError * else Has clazz * CouchDBPaginator->>CouchDBPaginator: Find primary key * * alt Has fields in statement * CouchDBPaginator->>CouchDBPaginator: Use docs directly * else No fields * CouchDBPaginator->>CouchDBPaginator: Process each document * loop For each document * CouchDBPaginator->>CouchDBPaginator: Extract original ID * CouchDBPaginator->>Adapter: revert(doc, clazz, pkDef.id, parsedId) * end * end * * CouchDBPaginator->>CouchDBPaginator: Store bookmark * CouchDBPaginator->>CouchDBPaginator: Update currentPage * CouchDBPaginator-->>Client: Return results * end */ page(page?: number): Promise<R[]>; }