From 240943210efb0fd85352d0a4b3a04a33efa121b3 Mon Sep 17 00:00:00 2001
From: Julian Krauser <jkrauser209@gmail.com>
Date: Wed, 2 Apr 2025 08:37:33 +0200
Subject: [PATCH 1/2] change: more precise member search

---
 src/service/club/member/memberService.ts | 37 ++++++++++++++++--------
 1 file changed, 25 insertions(+), 12 deletions(-)

diff --git a/src/service/club/member/memberService.ts b/src/service/club/member/memberService.ts
index 234b73f..6095653 100644
--- a/src/service/club/member/memberService.ts
+++ b/src/service/club/member/memberService.ts
@@ -28,19 +28,32 @@ export default abstract class MemberService {
     let query = this.applyMemberBaseJoins();
 
     if (search != "") {
-      search.split(" ").forEach((term, index) => {
-        const searchQuery = `%${term}%`;
-        const dynamic = "searchQuery" + Math.random().toString(36).substring(2);
-        if (index == 0) {
-          query = query.where(`member.firstname LIKE :${dynamic} OR member.lastname LIKE :${dynamic}`, {
-            [dynamic]: searchQuery,
-          });
-        } else {
-          query = query.orWhere(`member.firstname LIKE :${dynamic} OR member.lastname LIKE :${dynamic}`, {
-            [dynamic]: searchQuery,
-          });
+      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]}%`,
+            }
+          );
+        });
+      }
     }
 
     if (ids.length != 0) {
-- 
2.45.3


From daa0dda4dbbbbc41e63df09ba0904ff24590fe7d Mon Sep 17 00:00:00 2001
From: Julian Krauser <jkrauser209@gmail.com>
Date: Thu, 3 Apr 2025 08:10:00 +0200
Subject: [PATCH 2/2] 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]}%`) })
+                )
+              );
+          });
       }
     }
 
-- 
2.45.3