mirror of
https://github.com/catdevnull/preciazo.git
synced 2024-11-25 19:16:19 +00:00
mejorar búsqueda
This commit is contained in:
parent
b05776a736
commit
245dc2eb02
2 changed files with 48 additions and 28 deletions
|
@ -16,11 +16,17 @@ export const load: PageServerLoad = async ({ params }) => {
|
|||
// // 'datasets.id_comercio = latest_datasets.id_comercio AND datasets.date = latest_datasets.max_date'
|
||||
// ))
|
||||
|
||||
const query = params.query;
|
||||
const query = params.query
|
||||
.replaceAll(/á/giu, 'a')
|
||||
.replaceAll(/é/giu, 'e')
|
||||
.replaceAll(/í/giu, 'i')
|
||||
.replaceAll(/ó/giu, 'o')
|
||||
.replaceAll(/ú/giu, 'u')
|
||||
.replaceAll(/ñ/giu, 'n');
|
||||
const productos = await db.execute<{
|
||||
id_producto: string;
|
||||
productos_descripcion: string;
|
||||
productos_marca: string;
|
||||
productos_marca: string | null;
|
||||
in_datasets_count: number;
|
||||
}>(sql`
|
||||
SELECT id_producto, productos_descripcion, productos_marca,
|
||||
|
@ -46,7 +52,7 @@ WHERE p.id_producto = index.id_producto) as in_datasets_count
|
|||
const existingProduct = acc.find((p) => p.id_producto === producto.id_producto);
|
||||
if (existingProduct) {
|
||||
existingProduct.descriptions.push(producto.productos_descripcion);
|
||||
existingProduct.marcas.add(producto.productos_marca);
|
||||
if (producto.productos_marca) existingProduct.marcas.add(producto.productos_marca);
|
||||
existingProduct.in_datasets_count = Math.max(
|
||||
existingProduct.in_datasets_count,
|
||||
producto.in_datasets_count
|
||||
|
@ -55,7 +61,7 @@ WHERE p.id_producto = index.id_producto) as in_datasets_count
|
|||
acc.push({
|
||||
id_producto: producto.id_producto,
|
||||
descriptions: [producto.productos_descripcion],
|
||||
marcas: new Set([producto.productos_marca]),
|
||||
marcas: new Set(producto.productos_marca ? [producto.productos_marca] : []),
|
||||
in_datasets_count: producto.in_datasets_count
|
||||
});
|
||||
}
|
||||
|
|
|
@ -8,6 +8,17 @@
|
|||
import { goto } from '$app/navigation';
|
||||
|
||||
export let data: PageData;
|
||||
|
||||
function parseMarcas(marcas: readonly string[]) {
|
||||
const x = marcas
|
||||
.map((m) => m.trim().replaceAll(/['`´]/g, ''))
|
||||
.filter((m) => !['sin marca', 'VARIOS'].includes(m))
|
||||
.filter((m) => m.length > 0);
|
||||
if (x.length === 0) {
|
||||
return ['n/a'];
|
||||
}
|
||||
return Array.from(new Set(x));
|
||||
}
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
|
@ -21,28 +32,31 @@
|
|||
</Button>
|
||||
<SearchBar />
|
||||
<h1 class="my-2 text-2xl font-bold">Resultados para "{data.query}"</h1>
|
||||
{#each data.collapsedProductos as producto}
|
||||
<a href={`/id_producto/${producto.id_producto}`} class="my-2 block">
|
||||
<Card.Root class="transition-colors duration-200 hover:bg-gray-100">
|
||||
<Card.Header class="block px-3 py-2 pb-0">
|
||||
<Badge
|
||||
>{Array.from(producto.marcas)
|
||||
.filter((m) => !['sin marca', 'VARIOS'].includes(m))
|
||||
.filter((m) => m?.trim().length > 0)
|
||||
.join('/')}</Badge
|
||||
>
|
||||
<Badge variant="outline">en {producto.in_datasets_count} cadenas</Badge>
|
||||
<Badge variant="outline">EAN {producto.id_producto}</Badge>
|
||||
</Card.Header>
|
||||
<Card.Content class="px-3 py-2">
|
||||
{#each producto.descriptions as description}
|
||||
<span>{description}</span>
|
||||
{#if description !== producto.descriptions[producto.descriptions.length - 1]}
|
||||
<span class="text-gray-500">⋅</span>{' '}
|
||||
{/if}
|
||||
{/each}
|
||||
</Card.Content>
|
||||
</Card.Root>
|
||||
</a>
|
||||
{/each}
|
||||
{#if data.collapsedProductos.length === 0}
|
||||
<p class="my-2 text-gray-600">
|
||||
No se encontraron resultados para "{data.query}". Tené en cuenta que actualmente, el algoritmo
|
||||
de búsqueda es muy básico. Probá buscando palabras clave como "alfajor", "ketchup" o
|
||||
"lenteja".
|
||||
</p>
|
||||
{:else}
|
||||
{#each data.collapsedProductos as producto}
|
||||
<a href={`/id_producto/${producto.id_producto}`} class="my-2 block">
|
||||
<Card.Root class="transition-colors duration-200 hover:bg-gray-100">
|
||||
<Card.Header class="block px-3 py-2 pb-0">
|
||||
<Badge>{parseMarcas(Array.from(producto.marcas)).join('/')}</Badge>
|
||||
<Badge variant="outline">en {producto.in_datasets_count} cadenas</Badge>
|
||||
<Badge variant="outline">EAN {producto.id_producto}</Badge>
|
||||
</Card.Header>
|
||||
<Card.Content class="px-3 py-2">
|
||||
{#each producto.descriptions as description}
|
||||
<span>{description}</span>
|
||||
{#if description !== producto.descriptions[producto.descriptions.length - 1]}
|
||||
<span class="text-gray-500">⋅</span>{' '}
|
||||
{/if}
|
||||
{/each}
|
||||
</Card.Content>
|
||||
</Card.Root>
|
||||
</a>
|
||||
{/each}
|
||||
{/if}
|
||||
</div>
|
||||
|
|
Loading…
Reference in a new issue