mirror of
https://github.com/catdevnull/preciazo.git
synced 2024-11-22 06:16:18 +00:00
optimize search query + fix sentry
This commit is contained in:
parent
9fced663ff
commit
841a1412a1
1 changed files with 19 additions and 91 deletions
|
@ -1,22 +1,10 @@
|
|||
import { db } from '$lib/server/db';
|
||||
import * as schema from '$lib/server/db/schema';
|
||||
import { sql } from 'drizzle-orm';
|
||||
import type { PageServerLoad } from './$types';
|
||||
import * as Sentry from '@sentry/sveltekit';
|
||||
|
||||
export const load: PageServerLoad = async ({ params, setHeaders }) => {
|
||||
// const latestDatasetsSq = db.$with('latest_datasets').as(
|
||||
// db.select({
|
||||
// id: datasets.id,
|
||||
// }).from(datasets)
|
||||
// .innerJoin(
|
||||
// db.select({
|
||||
// id_comercio: datasets.id_comercio,
|
||||
// max_date: max(datasets.date),
|
||||
// }).from(d2).groupBy(datasets.id_comercio),
|
||||
// and(eq(datasets.id_comercio, d2.id_comercio), eq(datasets.date, d2.max_date))
|
||||
// // 'datasets.id_comercio = latest_datasets.id_comercio AND datasets.date = latest_datasets.max_date'
|
||||
// ))
|
||||
|
||||
const query = params.query
|
||||
.replaceAll(/á/giu, 'a')
|
||||
.replaceAll(/é/giu, 'e')
|
||||
|
@ -24,8 +12,12 @@ export const load: PageServerLoad = async ({ params, setHeaders }) => {
|
|||
.replaceAll(/ó/giu, 'o')
|
||||
.replaceAll(/ú/giu, 'u')
|
||||
.replaceAll(/ñ/giu, 'n');
|
||||
const productosQuery = sql`
|
||||
SELECT id_producto, productos_descripcion, productos_marca,
|
||||
const productosQuery = db
|
||||
.select({
|
||||
id_producto: schema.productos_descripcion_index.id_producto,
|
||||
productos_descripcion: schema.productos_descripcion_index.productos_descripcion,
|
||||
productos_marca: schema.productos_descripcion_index.productos_marca,
|
||||
in_datasets_count: sql<number>`
|
||||
(WITH latest_datasets AS (
|
||||
SELECT d1.id
|
||||
FROM datasets d1
|
||||
|
@ -37,32 +29,26 @@ export const load: PageServerLoad = async ({ params, setHeaders }) => {
|
|||
)SELECT COUNT(DISTINCT p.id_dataset) as dataset_count
|
||||
FROM precios p
|
||||
JOIN latest_datasets ld ON p.id_dataset = ld.id
|
||||
WHERE p.id_producto = index.id_producto) as in_datasets_count
|
||||
FROM productos_descripcion_index index
|
||||
WHERE productos_descripcion ILIKE ${`%${query}%`}
|
||||
ORDER BY in_datasets_count desc
|
||||
LIMIT 100
|
||||
`;
|
||||
WHERE p.id_producto = productos_descripcion_index.id_producto)`.as('in_datasets_count')
|
||||
})
|
||||
.from(schema.productos_descripcion_index)
|
||||
.where(sql`productos_descripcion ILIKE ${`%${query}%`}`)
|
||||
.orderBy(sql`in_datasets_count desc`)
|
||||
.limit(100);
|
||||
const productos = await Sentry.startSpan(
|
||||
{
|
||||
op: 'db.query',
|
||||
name: productosQuery,
|
||||
name: productosQuery.toSQL().sql,
|
||||
data: { 'db.system': 'postgresql' }
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
} as any,
|
||||
() =>
|
||||
db.execute<{
|
||||
id_producto: string;
|
||||
productos_descripcion: string;
|
||||
productos_marca: string | null;
|
||||
in_datasets_count: number;
|
||||
}>(productosQuery)
|
||||
() => productosQuery
|
||||
);
|
||||
const collapsedProductos = productos.reduce(
|
||||
(acc, producto) => {
|
||||
const existingProduct = acc.find((p) => p.id_producto === producto.id_producto);
|
||||
const existingProduct = acc.find((p) => BigInt(p.id_producto) === producto.id_producto);
|
||||
if (existingProduct) {
|
||||
existingProduct.descriptions.push(producto.productos_descripcion);
|
||||
existingProduct.descriptions.push(producto.productos_descripcion!);
|
||||
if (producto.productos_marca) existingProduct.marcas.add(producto.productos_marca);
|
||||
existingProduct.in_datasets_count = Math.max(
|
||||
existingProduct.in_datasets_count,
|
||||
|
@ -70,8 +56,8 @@ WHERE p.id_producto = index.id_producto) as in_datasets_count
|
|||
);
|
||||
} else {
|
||||
acc.push({
|
||||
id_producto: producto.id_producto,
|
||||
descriptions: [producto.productos_descripcion],
|
||||
id_producto: producto.id_producto!.toString(),
|
||||
descriptions: [producto.productos_descripcion!],
|
||||
marcas: new Set(producto.productos_marca ? [producto.productos_marca] : []),
|
||||
in_datasets_count: producto.in_datasets_count
|
||||
});
|
||||
|
@ -90,63 +76,5 @@ WHERE p.id_producto = index.id_producto) as in_datasets_count
|
|||
'Cache-Control': 'public, max-age=600'
|
||||
});
|
||||
|
||||
// 'latest_datasets',
|
||||
// sql`
|
||||
// WITH latest_datasets AS (
|
||||
// SELECT d1.id
|
||||
// FROM datasets d1
|
||||
// JOIN (
|
||||
// SELECT id_comercio, MAX(date) as max_date
|
||||
// FROM datasets
|
||||
// GROUP BY id_comercio
|
||||
// ) d2 ON d1.id_comercio = d2.id_comercio AND d1.date = d2.max_date
|
||||
// )`
|
||||
// .select({
|
||||
// id_producto: productos_descripcion_index.id_producto,
|
||||
// productos_descripcion: productos_descripcion_index.productos_descripcion,
|
||||
// productos_marca: productos_descripcion_index.productos_marca,
|
||||
// })
|
||||
// .from(productos_descripcion_index)
|
||||
// .where(ilike(productos_descripcion_index.productos_descripcion, `%${query}%`))
|
||||
// .orderBy(sql`
|
||||
// WITH latest_datasets AS (
|
||||
// SELECT d1.id
|
||||
// FROM datasets d1
|
||||
// JOIN (
|
||||
// SELECT id_comercio, MAX(date) as max_date
|
||||
// FROM datasets
|
||||
// GROUP BY id_comercio
|
||||
// ) d2 ON d1.id_comercio = d2.id_comercio AND d1.date = d2.max_date
|
||||
// )
|
||||
// SELECT COUNT(DISTINCT p.id_dataset) as dataset_count
|
||||
// FROM precios p
|
||||
// JOIN latest_datasets ld ON p.id_dataset = ld.id
|
||||
// WHERE p.id_producto = ${productos_descripcion_index.id_producto}`);
|
||||
return { productos, collapsedProductos, query };
|
||||
// const precios = await sql<
|
||||
// {
|
||||
// id_producto: string;
|
||||
// productos_precio_lista: number;
|
||||
// productos_descripcion: string;
|
||||
// }[]
|
||||
// >`
|
||||
// WITH latest_prices AS (
|
||||
// SELECT DISTINCT ON (id_comercio, id_producto)
|
||||
// id_comercio,
|
||||
// id_producto,
|
||||
// productos_precio_lista,
|
||||
// productos_descripcion
|
||||
// FROM precios
|
||||
// )
|
||||
// SELECT
|
||||
// id_producto,
|
||||
// productos_precio_lista,
|
||||
// productos_descripcion
|
||||
// FROM latest_prices
|
||||
// WHERE productos_descripcion ILIKE ${`%${query}%`}
|
||||
// `;
|
||||
|
||||
// return {
|
||||
// precios
|
||||
// };
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue