thirdPartyRepository = $thirdPartyRepository; } public function provideQuery(string $pattern, array $parameters): SearchApiQuery { $query = (new SearchApiQuery) ->setSelectKey('tparty') ->setSelectJsonbMetadata("jsonb_build_object('id', tparty.id)") ->setFromClause('chill_3party.third_party AS tparty LEFT JOIN chill_main_address cma ON cma.id = tparty.address_id LEFT JOIN chill_main_postal_code cmpc ON cma.postcode_id = cmpc.id LEFT JOIN chill_3party.third_party AS parent ON tparty.parent_id = parent.id LEFT JOIN chill_main_address cma_p ON parent.address_id = cma_p.id LEFT JOIN chill_main_postal_code cmpc_p ON cma_p.postcode_id = cmpc.id') ->andWhereClause("tparty.active IS TRUE") ; $strs = explode(' ', $pattern); $wheres = []; $whereArgs = []; $pertinence = []; $pertinenceArgs = []; foreach ($strs as $str) { if (!empty($str)) { $wheres[] = "(LOWER(UNACCENT(?)) <<% tparty.canonicalized OR tparty.canonicalized LIKE '%' || LOWER(UNACCENT(?)) || '%')"; $whereArgs[] = [$str, $str]; $pertinence[] = "STRICT_WORD_SIMILARITY(LOWER(UNACCENT(?)), tparty.canonicalized) + ". "(tparty.canonicalized LIKE '%s' || LOWER(UNACCENT(?)) || '%')::int + ". // take postcode label into account, but lower than the canonicalized field "COALESCE((LOWER(UNACCENT(cmpc.label)) LIKE '%' || LOWER(UNACCENT(?)) || '%')::int * 0.3, 0) + ". "COALESCE((LOWER(UNACCENT(cmpc_p.label)) LIKE '%' || LOWER(UNACCENT(?)) || '%')::int * 0.3, 0)"; $pertinenceArgs[] = [$str, $str, $str, $str]; } } $query ->setSelectPertinence(\implode(' + ', $pertinence), \array_merge([], ...$pertinenceArgs)) ->andWhereClause(\implode(' OR ', $wheres), \array_merge([], ...$whereArgs)); return $query; } public function supportsTypes(string $pattern, array $types, array $parameters): bool { return \in_array('thirdparty', $types); } public function prepare(array $metadatas): void { } public function supportsResult(string $key, array $metadatas): bool { return $key === 'tparty'; } public function getResult(string $key, array $metadata, float $pertinence) { return $this->thirdPartyRepository->find($metadata['id']); } }