From 24d04a8d07a3abc3bd6550cd4a83cc1fed74b832 Mon Sep 17 00:00:00 2001 From: Robert Zondervan Date: Mon, 21 Oct 2024 11:42:19 +0200 Subject: [PATCH 1/2] Operationalise Search --- lib/Db/ObjectEntityMapper.php | 18 +++++++----------- lib/Service/MySQLJsonService.php | 10 ++++++++++ lib/Service/ObjectService.php | 13 +++++++------ 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/lib/Db/ObjectEntityMapper.php b/lib/Db/ObjectEntityMapper.php index 4a32555..6aacccd 100644 --- a/lib/Db/ObjectEntityMapper.php +++ b/lib/Db/ObjectEntityMapper.php @@ -100,7 +100,7 @@ public function findByRegisterAndSchema(string $register, string $schema): Objec return $this->findEntities(query: $qb); } - public function countAll(?array $filters = [], ?array $searchConditions = [], ?array $searchParams = []): int + public function countAll(?array $filters = [], ?string $search = null): int { $qb = $this->db->getQueryBuilder(); @@ -116,19 +116,12 @@ public function countAll(?array $filters = [], ?array $searchConditions = [], ?a } } - if (!empty($searchConditions)) { - $qb->andWhere('(' . implode(' OR ', $searchConditions) . ')'); - foreach ($searchParams as $param => $value) { - $qb->setParameter($param, $value); - } - } $qb = $this->databaseJsonService->filterJson($qb, $filters); + $qb = $this->databaseJsonService->searchJson($qb, $search); $result = $qb->executeQuery(); - $count = $result->fetchAll()[0]['count']; - - return $count; + return $result->fetchAll()[0]['count']; } /** @@ -141,7 +134,7 @@ public function countAll(?array $filters = [], ?array $searchConditions = [], ?a * @param array $searchParams The search parameters to apply to the objects * @return array An array of ObjectEntitys */ - public function findAll(?int $limit = null, ?int $offset = null, ?array $filters = [], ?array $searchConditions = [], ?array $searchParams = [], array $sort = []): array + public function findAll(?int $limit = null, ?int $offset = null, ?array $filters = [], ?array $searchConditions = [], ?array $searchParams = [], array $sort = [], ?string $search = null): array { $qb = $this->db->getQueryBuilder(); @@ -168,8 +161,11 @@ public function findAll(?int $limit = null, ?int $offset = null, ?array $filters } $qb = $this->databaseJsonService->filterJson(builder: $qb, filters: $filters); + $qb = $this->databaseJsonService->searchJson(builder: $qb, search: $search); $qb = $this->databaseJsonService->orderJson(builder: $qb, order: $sort); +// var_dump($qb->getSQL()); + return $this->findEntities(query: $qb); } diff --git a/lib/Service/MySQLJsonService.php b/lib/Service/MySQLJsonService.php index 3a8e267..e3b5049 100644 --- a/lib/Service/MySQLJsonService.php +++ b/lib/Service/MySQLJsonService.php @@ -20,6 +20,16 @@ function orderJson(IQueryBuilder $builder, array $order = []): IQueryBuilder return $builder; } + function searchJson(IQueryBuilder $builder, ?string $search = null): IQueryBuilder + { + if($search !== null) { + $builder->createNamedParameter(value: "%$search%", placeHolder: ':search'); + $builder->andWhere("JSON_SEARCH(object, 'one', :search) IS NOT NULL"); + } + + return $builder; + } + function filterJson(IQueryBuilder $builder, array $filters): IQueryBuilder { unset($filters['register'], $filters['schema'], $filters['updated'], $filters['created'], $filters['_queries']); diff --git a/lib/Service/ObjectService.php b/lib/Service/ObjectService.php index 6adb8a3..2d3dcd9 100755 --- a/lib/Service/ObjectService.php +++ b/lib/Service/ObjectService.php @@ -70,7 +70,7 @@ public function delete(array|\JsonSerializable $object): bool ); } - public function findAll(?int $limit = null, ?int $offset = null, array $filters = [], array $sort = []): array + public function findAll(?int $limit = null, ?int $offset = null, array $filters = [], array $sort = [], ?string $search = null): array { $objects = $this->getObjects( register: $this->getRegister(), @@ -78,21 +78,22 @@ public function findAll(?int $limit = null, ?int $offset = null, array $filters limit: $limit, offset: $offset, filters: $filters, - sort: $sort + sort: $sort, + search: $search ); // $data = array_map([$this, 'getDataFromObject'], $objects); return $objects; } - public function count(array $filters = []): int + public function count(array $filters = [], ?string $search = null): int { if($this->getSchema() !== null && $this->getRegister() !== null) { $filters['register'] = $this->getRegister(); $filters['schema'] = $this->getSchema(); } $count = $this->objectEntityMapper - ->countAll(filters: $filters); + ->countAll(filters: $filters, search: $search); return $count; } @@ -139,7 +140,7 @@ private function getDataFromObject(mixed $object) { * @return array The retrieved objects. * @throws \Exception */ - public function getObjects(?string $objectType = null, ?int $register = null, ?int $schema = null, ?int $limit = null, ?int $offset = null, array $filters = [], array $sort = []): array + public function getObjects(?string $objectType = null, ?int $register = null, ?int $schema = null, ?int $limit = null, ?int $offset = null, array $filters = [], array $sort = [], ?string $search = null): array { if($objectType === null && $register !== null && $schema !== null) { $objectType = 'objectEntity'; @@ -151,7 +152,7 @@ public function getObjects(?string $objectType = null, ?int $register = null, ?i $mapper = $this->getMapper($objectType); // Use the mapper to find and return all objects of the specified type - return $mapper->findAll(limit: $limit, offset: $offset, filters: $filters, sort: $sort); + return $mapper->findAll(limit: $limit, offset: $offset, filters: $filters, sort: $sort, search: $search); } /** From 6f6050e6897236b4cdb9d88afcf412128a922f99 Mon Sep 17 00:00:00 2001 From: Robert Zondervan Date: Mon, 21 Oct 2024 12:15:30 +0200 Subject: [PATCH 2/2] Fix filtering on arrays --- lib/Service/MySQLJsonService.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/Service/MySQLJsonService.php b/lib/Service/MySQLJsonService.php index e3b5049..9282b9a 100644 --- a/lib/Service/MySQLJsonService.php +++ b/lib/Service/MySQLJsonService.php @@ -61,8 +61,10 @@ function filterJson(IQueryBuilder $builder, array $filters): IQueryBuilder $builder->createNamedParameter(value: $value, placeHolder: ":value$filter"); $builder - ->andWhere("json_extract(object, :path$filter) = :value$filter"); + ->andWhere("json_extract(object, :path$filter) = :value$filter OR json_contains(object, json_quote(:value$filter), :path$filter)"); } +// var_dump($builder->getSQL()); + return $builder; }