From 610332716c7f2a933af8b73b30a1d461880ac171 Mon Sep 17 00:00:00 2001 From: desperateCoder Date: Thu, 23 Mar 2023 12:57:23 +0100 Subject: search cards: first try impl --- .../nextcloud/deck/database/DataBaseAdapter.java | 36 ++++++++++++++++++++-- .../nextcloud/deck/database/dao/CardDao.java | 13 ++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/database/DataBaseAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/database/DataBaseAdapter.java index ecbbd247a..e0b754866 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/database/DataBaseAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/database/DataBaseAdapter.java @@ -35,6 +35,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.concurrent.CompletableFuture; @@ -868,11 +869,40 @@ public class DataBaseAdapter { /** * Search all {@link FullCard}s grouped by {@link Stack}s which contain the term in {@link Card#getTitle()} or {@link Card#getDescription()}. - * {@link Stack}s ar sorted by {@link Stack#getOrder()}, {@link Card}s for each {@link Stack} are sorted by {@link Card#getOrder()}. + * {@link Stack}s are sorted by {@link Stack#getOrder()}, {@link Card}s for each {@link Stack} are sorted by {@link Card#getOrder()}. */ public LiveData>> searchCards(final long accountId, final long localBoardId, @NonNull String term, int limitPerStack) { - // TODO - return new ReactiveLiveData<>(); + String sqlSearchTerm = term.trim(); + if (sqlSearchTerm.isEmpty()) { + throw new IllegalArgumentException("empty search term"); + } + sqlSearchTerm = "%" + sqlSearchTerm + "%"; + + + return new ReactiveLiveData<>(db.getCardDao().searchCard(accountId, localBoardId, sqlSearchTerm)) + .map(result -> mapToStacksForCardSearch(result, limitPerStack), executor); + } + + private Map> mapToStacksForCardSearch(List matches, int limitPerStack) { + Map> result = new HashMap<>(); + if (matches != null && !matches.isEmpty()) { + // results are sorted by stack -> jackpot: + Stack lastStack = null; + for (FullCard card : matches) { + // find right bucket + if (lastStack == null || !Objects.equals(lastStack.getLocalId(), card.getCard().getStackId())) { + lastStack = db.getStackDao().getStackByLocalIdDirectly(card.getCard().getStackId()); + } + // check if bucket exists + List fullCards = result.computeIfAbsent(lastStack, k -> new ArrayList<>()); + // create bucket + if (fullCards.size() < limitPerStack) { + // put into bucket + fullCards.add(card); + } + } + } + return result; } public LiveData> findProposalsForUsersToAssign(final long accountId, long boardId, long notAssignedToLocalCardId, final int topX) { diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/database/dao/CardDao.java b/app/src/main/java/it/niedermann/nextcloud/deck/database/dao/CardDao.java index fbbb1708b..ba483e21f 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/database/dao/CardDao.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/database/dao/CardDao.java @@ -124,4 +124,17 @@ public interface CardDao extends GenericDao { @Transaction @Query(QUERY_UPCOMING_CARDS) List getUpcomingCardsDirectly(); + + @Transaction + @Query("SELECT c.* FROM card c " + + "inner join Stack s on c.stackId = s.id " + + "WHERE s.boardId = :localBoardId " + + "and (c.title like :term or c.description like :term) " + + "and c.accountId = :accountId " + + "and s.accountId = :accountId " + + "and c.status <> 3 " + + "and s.status <> 3 " + + "and c.archived = 0 " + + "order by s.`order`, c.`order`") + LiveData> searchCard(long accountId, long localBoardId, String term); } \ No newline at end of file -- cgit v1.2.3