La paginación en DataSources permite manejar grandes conjuntos de datos de manera eficiente, mostrando solo una porción de los registros a la vez. Para implementar la paginación, se utilizan los parámetros @limit y @offset que son proporcionados automáticamente por Pragmatic.



Implementación según el tipo de DataSource

Caso SQL

El siguiente ejemplo muestra cómo utilizar los parámetros @limit y @offset en una consulta SQL para implementar paginación:

-- 1. Seleccionamos los campos necesarios
SELECT 
    id, 
    titulo, 
    fecha
FROM 
    eventos 
WHERE 
    -- 2. Aplicamos los filtros condicionales
    -- Si no se proporciona un título, se muestran todos los registros
    (@parameter.titulo IS NULL OR titulo LIKE CONCAT('%', @parameter.titulo, '%')) AND
    -- Si no se proporciona una fecha, se muestran todos los registros
    (@parameter.fecha IS NULL OR fecha <= @parameter.fecha)
-- 3. Aplicamos la paginación
LIMIT @limit  -- Número de registros por página
OFFSET @offset -- Registros a omitir

En este ejemplo:

  • @limit controla cuántos registros se devolverán por página
  • @offset determina desde qué registro comenzar, permitiendo navegar entre páginas
  • Los filtros @parameter.titulo y @parameter.fecha son ejemplos de filtros que son configurados desde un campo Prompt o Listado

Caso MongoDB

Para un datasource de tipo MongoDB, la paginación se implementa de la siguiente manera:

[
  // 1. Etapa de filtrado (match)
  {
    "$match": {
      "$expr": {
        "$and": [
          // 2. Filtro por título
          {
            "$or": [
              { "$eq": [ @parameter.titulo, null ] },  // Si no hay título, no filtra
              { "$eq": [ "$titulo", @parameter.titulo ] }  // Si hay título, filtra por igualdad
            ]
          },
          // 3. Filtro por fecha
          {
            "$or": [
              { "$eq": [ @parameter.fecha, null ] },  // Si no hay fecha, no filtra
              { "$lte": [ "$fecha", { "$dateFromString": { "dateString": @parameter.fecha } } ] }  // Si hay fecha, filtra por menor o igual
            ]
          }
        ]
      }
    }
  },
  // 4. Etapa de paginación
  { "$skip": @offset },  // Omite los registros según el offset
  { "$limit": @limit }   // Limita el número de registros por página
]

En este ejemplo:

  • @limit se utiliza en la etapa $limit para controlar el número de registros por página
  • @offset se utiliza en la etapa $skip para determinar desde qué registro comenzar
  • Los filtros @parameter.titulo y @parameter.fecha son ejemplos de filtros que son configurados desde un campo Prompt o Listado

Caso Función JavaScript

Para un datasource de tipo función JavaScript, la paginación se implementa de la siguiente manera:

// 1. Obtenemos los parámetros necesarios para la paginación
const busqueda = @parameter.busqueda
const registrosPorPagina = @limit
const registrosASaltar = @offset

// 2. Realizamos la petición a la API
return axios.get('https://api.ejemplo.com/productos', {
    params: {
        busqueda: busqueda,
        limit: registrosPorPagina,
        skip: registrosASaltar
    }
})
.then((response) => {
    // 3. Procesamos la respuesta
    const datos = response.data || {}
    
    // 4. Transformamos los datos al formato requerido
    const resultados = (datos.productos).map(producto => ({
        id: producto.id,
        nombre: producto.nombre,
        precio: producto.precio
    }))

    // 5. Retornamos el objeto con la estructura requerida para la paginación
    return {
        results: resultados,
        totalRecords: datos.total
    }
})
.catch((error) => {
    console.error('Error al obtener los productos:', error)
})

En este ejemplo:

  • @limit y @offset se utilizan como parámetros de paginación en la llamada a la API
  • Es obligatorio retornar la promesa de axios para que Pragmatic la procese correctamente
  • Dentro del then de axios, se debe retornar un objeto con la siguiente estructura:
    • results: Array de objetos con los datos obtenidos
    • totalRecords: Número total de registros (debe ser un entero positivo)
  • Si no se cumple con esta estructura de retorno, la paginación no funcionará correctamente