From 5a873f946509d0524d30ce01a54abecb981c4676 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Fri, 12 May 2023 11:11:34 +0100 Subject: [PATCH] Added `prefix` parameter to `GET /names/search`. --- src/main/java/org/qortal/api/resource/NamesResource.java | 5 ++++- src/main/java/org/qortal/repository/NameRepository.java | 2 +- .../org/qortal/repository/hsqldb/HSQLDBNameRepository.java | 7 +++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/qortal/api/resource/NamesResource.java b/src/main/java/org/qortal/api/resource/NamesResource.java index 30f04b70..7627c413 100644 --- a/src/main/java/org/qortal/api/resource/NamesResource.java +++ b/src/main/java/org/qortal/api/resource/NamesResource.java @@ -173,6 +173,7 @@ public class NamesResource { ) @ApiErrors({ApiError.NAME_UNKNOWN, ApiError.REPOSITORY_ISSUE}) public List searchNames(@QueryParam("query") String query, + @Parameter(description = "Prefix only (if true, only the beginning of the name is matched)") @QueryParam("prefix") Boolean prefixOnly, @Parameter(ref = "limit") @QueryParam("limit") Integer limit, @Parameter(ref = "offset") @QueryParam("offset") Integer offset, @Parameter(ref="reverse") @QueryParam("reverse") Boolean reverse) { @@ -181,7 +182,9 @@ public class NamesResource { throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.INVALID_CRITERIA, "Missing query"); } - return repository.getNameRepository().searchNames(query, limit, offset, reverse); + boolean usePrefixOnly = Boolean.TRUE.equals(prefixOnly); + + return repository.getNameRepository().searchNames(query, usePrefixOnly, limit, offset, reverse); } catch (ApiException e) { throw e; } catch (DataException e) { diff --git a/src/main/java/org/qortal/repository/NameRepository.java b/src/main/java/org/qortal/repository/NameRepository.java index a8b2a3db..32097ca4 100644 --- a/src/main/java/org/qortal/repository/NameRepository.java +++ b/src/main/java/org/qortal/repository/NameRepository.java @@ -14,7 +14,7 @@ public interface NameRepository { public boolean reducedNameExists(String reducedName) throws DataException; - public List searchNames(String query, Integer limit, Integer offset, Boolean reverse) throws DataException; + public List searchNames(String query, boolean prefixOnly, Integer limit, Integer offset, Boolean reverse) throws DataException; public List getAllNames(Integer limit, Integer offset, Boolean reverse) throws DataException; diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBNameRepository.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBNameRepository.java index 3e4a8e11..40f123d1 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBNameRepository.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBNameRepository.java @@ -103,7 +103,7 @@ public class HSQLDBNameRepository implements NameRepository { } } - public List searchNames(String query, Integer limit, Integer offset, Boolean reverse) throws DataException { + public List searchNames(String query, boolean prefixOnly, Integer limit, Integer offset, Boolean reverse) throws DataException { StringBuilder sql = new StringBuilder(512); List bindParams = new ArrayList<>(); @@ -111,7 +111,10 @@ public class HSQLDBNameRepository implements NameRepository { + "is_for_sale, sale_price, reference, creation_group_id FROM Names " + "WHERE LCASE(name) LIKE ? ORDER BY name"); - bindParams.add(String.format("%%%s%%", query.toLowerCase())); + // Search anywhere in the name, unless "prefixOnly" has been requested + // Note that without prefixOnly it will bypass any indexes + String queryWildcard = prefixOnly ? String.format("%s%%", query.toLowerCase()) : String.format("%%%s%%", query.toLowerCase()); + bindParams.add(queryWildcard); if (reverse != null && reverse) sql.append(" DESC");