npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

criteria-filters-pg

v1.0.14

Published

El objetivo principal de este paquete, es preparar los filtros para consultas SQL utilizadas para el motor de base de datos PostgreSQL. Las funcionalidades principales que provee esta utilidad son las siguientes:

Downloads

18

Readme

Criteria Filters Pg

El objetivo principal de este paquete, es preparar los filtros para consultas SQL utilizadas para el motor de base de datos PostgreSQL. Las funcionalidades principales que provee esta utilidad son las siguientes:

  1. Crear una búsqueda genérica por coincidencias según los campos especificados
  2. Crear búsquedas específicas sobre campos particulares
  3. Crear paginación de registros
  4. Crear ordenamiento de registros
  5. Utilización de binding de parámetros para evitar inyección SQL

Instalar dependencia

npm i criteria-filters-pg

Importar paquete en su proyecto

import { criteriaFilter } from "criteria-filters-pg/dist/criteriaPattern/criteriaFilter";

Si utilizas un gestor de alias para rutas como module-alias podrías crear una ruta de la siguiente manera:

import path from 'path'
import * as moduleAlias from 'module-alias';

moduleAlias.addAliases({
    "@criteriaPattern": path.resolve(__dirname, "../../node_modules/criteria-filters-pg/dist/criteriaPattern")
});

y luego importar el paquete tal como se muestra a continuación:

import { criteriaFilter } from '@criteriaPattern/criteriaFilter';

Creando una consulta con búsqueda general y específica

Consiste básicamente en la utilización del parámetro search y la definición de campos en donde debe buscar las coincidencias según el parámetro antes mencionado.

  1. Definición de query base
let query = `
            SELECT 
                names, 
                lastnames,
                rut,
                created_at,
                updated_at
            FROM
                users`;
  1. Definición de configuración inicial para query base
const configInitialQueryBase = { 
    query, 
    fieldsSearch: ["names", "lastnames", "rut", "created_at", "updated_at"] 
};

Propiedades del objeto configInitialQueryBase

| Propiedad | Descripcion | | :--- | :----: |
| query | Query base utilizada | | fieldsSearch | Campos por los cuáles se pueden realizar las búsquedas, requerido para las búsquedas generales por coincidencia | | params | En el caso de que la query base tenga una o más claúsulas where, esta propiedad debe definirse. Más adelante veremos un ejemplo utilizando esta propiedad |

  1. Definición de filtros mediante queryString

Si estás utilizando una Rest API, por lo general las queryString vienen en el objeto request y está definido como un objeto. Por ejemplo, si estas utilizando ExpressJS, puedes acceder al queryString usando req.query.

// Simulando un objeto queryString
const filtersQueryString = { 
    created_at: "2021-05-01,2021-05-31",
    page: 1,
    limit: 10,
    orderBy: "created_at",
    orderType: "DESC",
    search: "pedro"
};

Para este primer ejemplo de queryString, estan presentes los filtros típicos que son:

  • page y limit para la pagincación de registros,
  • orderBy y orderType para el ordenamiento de registros
  • search para la búsqueda por coincidencias en los campos definidos en el punto N° 2.

Propiedades adicionales:

  • created_at para aplicar un criterio de búsqueda adicional, permitiendo además filtrar por fecha de creación.

Propiedades del objeto filtersQueryString | Propiedad | Descripcion | Opcional | Por defecto | | :--- | :----: | :----: | :----: |
| page | Para paginación de registros | Sí | | limit | Límite de registros por página | Sí | 10 | search | Búsqueda general por coincidencias según campos definidos | Sí |
| orderBy | Ordenar por algún campo | Sí | | orderType | Orden ascendente o descendente | Sí | DESC | created_at | Campo especifico para buscar por fecha de creación | Sí |

  1. Utilizando la función criteriaFilter

La función será la encargada de entregarnos las partes o piezas necesarias para armar la query resultante. Dicha función recibe 2 argumentos que son:

  • configInitialQueryBase que corresponde al objeto definido en el punto N° 2.
  • filtersQueryString que corresponde al objeto definido anteriormente en el punto N° 3.
const {
    where,
    params,
    orderByString,
    paginationString,
    page,
    limit
} = criteriaFilter(configInitialQueryBase, filtersQueryString);

Qué retorna la función criteriaFilter:question: | Propiedad | Descripcion | Tipo | | :--- | :----: | :----: | | where | La claúsula where, según los campos de busqueda general por coincidencia y busquedas especificas por campos | String | | params | Lista de parámetros creados dinámicamente según las búsquedas aplicadas, a los cuales se les ha añadido binding para evitar inyección SQL | Array | | orderByString | Instrucción de ordenamiento de registros | String | | paginationString | Instrucción de paginación de registros | String | | page | Número de página | Number | | limit | Límite de registros por página | Number |

  1. Query resultante
query =
    `${query}
    ${where}
    ${orderByString}
    ${paginationString}`;

console.log(query);
/* ================= Resultado final =================
SELECT
    names,
    lastnames,
    rut,
    created_at,
    updated_at
FROM
    users
    WHERE 1=1 AND ("names"::text ILIKE '%' || $1 || '%'::text OR "lastnames"::text ILIKE '%' || $1 || '%'::text OR "rut"::text ILIKE '%' || $1 || '%'::text OR "created_at"::text ILIKE '%' || $1 || '%'::text OR "updated_at"::text ILIKE '%' || $1 || '%'::text) AND "created_at"::date BETWEEN $2 AND $3
    ORDER BY "created_at" DESC
    OFFSET 0
    LIMIT 10
*/

Otro ejemplo? :+1::+1::+1:

En esta ocasión tenemos una query base con una claúsula where predefinida, y también estaremos utilizando el filtrado de los campos según sus alias

  1. Query base
let query = `
SELECT 
    *
FROM
(
    SELECT 
        id AS "userId",
        nombres AS "userNames",
        apellidos AS "userLastnames",
        email AS "userEmail",
        fono AS "userPhone",
        rut AS "userRut",
        ciudad AS "cityName"
    FROM
        users
) AS t1
WHERE 
    "cityName" = $1
`;
  1. Configuración inicial query base
const configInitialQueryBase = { 
    query, 
    params: ["Concepción"],  
    fieldsSearch: ["userNames", "userEmail", "userPhone", "userRut", "cityName"] 
};

Para este caso la propiedad fieldsSearch tiene configurada las columnas de búsqueda según los alias establecidos en la query base y además se ha especificado la propiedad params, debido a que la query base tiene una condición en la claúsula where

  1. Filtros queryString
// Simulando un objeto queryString
const filtersQueryString = { 
    page: 1,
    limit: 10,
    orderBy: "userNames",
    orderType: "ASC",
    search: "criterio búsqueda general"
};
  1. Función criteriaFilter

Como se mencionó anteriormente, esta función recibe 2 argumentos los cuáles han sido definidos en los puntos N° 2 y N° 3 de la sección.

const {
    where,
    params,
    orderByString,
    paginationString,
    page,
    limit
} = criteriaFilter(configInitialQueryBase, filtersQueryString);
  1. Query resultante
query =
    `${query}
    ${where}
    ${orderByString}
    ${paginationString}`;

console.log(query);
/* ================= Resultado final =================
SELECT
    *
FROM
(
    SELECT
        id AS "userId",
        nombres AS "userNames",
        apellidos AS "userLastnames",
        email AS "userEmail",
        fono AS "userPhone",
        rut AS "userRut",
        ciudad AS "cityName"
    FROM
        users
) AS t1
WHERE
    "cityName" = $1
    AND ( "userNames"::text ILIKE '%' || $2 || '%'::text OR "userEmail"::text ILIKE '%' || $2 || '%'::text OR "userPhone"::text ILIKE '%' || $2 || '%'::text OR "userRut"::text ILIKE '%' || $2 || '%'::text OR "cityName"::text ILIKE '%' || $2 || '%'::text)
    ORDER BY "userNames" ASC
    OFFSET 0
    LIMIT 10

*/