From daa0dda4dbbbbc41e63df09ba0904ff24590fe7d Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Thu, 3 Apr 2025 08:10:00 +0200 Subject: [PATCH] change: optimized member search --- src/service/club/member/memberService.ts | 35 +++++++++++------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/service/club/member/memberService.ts b/src/service/club/member/memberService.ts index 6095653..3eae4e6 100644 --- a/src/service/club/member/memberService.ts +++ b/src/service/club/member/memberService.ts @@ -1,4 +1,4 @@ -import { SelectQueryBuilder } from "typeorm"; +import { Brackets, Like, SelectQueryBuilder } from "typeorm"; import { dataSource } from "../../../data-source"; import { member } from "../../../entity/club/member/member"; import { membership } from "../../../entity/club/member/membership"; @@ -29,30 +29,27 @@ export default abstract class MemberService { if (search != "") { let searchBits = search.split(" "); - console.log(searchBits); if (searchBits.length < 2) { query = query.where(`member.firstname LIKE :searchQuery OR member.lastname LIKE :searchQuery`, { searchQuery: `%${searchBits[0]}%`, }); } else { - let pairs: string[][] = []; - for (let i = 0; i < searchBits.length; i++) { - for (let j = 0; j < searchBits.length; j++) { - if (searchBits[i] != searchBits[j]) pairs.push([searchBits[i], searchBits[j]]); - } - } - - pairs.forEach((term, index) => { - const dynamic = "searchQuery" + Math.random().toString(36).substring(2); - query = query.orWhere( - `member.firstname LIKE :${dynamic + "_firstname"} AND member.lastname LIKE :${dynamic + "_lastname"}`, - { - [dynamic + "_firstname"]: `%${term[0]}%`, - [dynamic + "_lastname"]: `%${term[1]}%`, - } - ); - }); + searchBits + .flatMap((v, i) => searchBits.slice(i + 1).map((w) => [v, w])) + .forEach((term) => { + query = query + .orWhere( + new Brackets((qb) => + qb.where({ firstname: Like(`%${term[0]}%`) }).andWhere({ lastname: Like(`%${term[1]}%`) }) + ) + ) + .orWhere( + new Brackets((qb) => + qb.where({ firstname: Like(`%${term[1]}%`) }).andWhere({ lastname: Like(`%${term[0]}%`) }) + ) + ); + }); } }