diff options
author | desperateCoder <echotodevnull@gmail.com> | 2023-03-23 14:57:23 +0300 |
---|---|---|
committer | desperateCoder <echotodevnull@gmail.com> | 2023-03-23 14:57:23 +0300 |
commit | 610332716c7f2a933af8b73b30a1d461880ac171 (patch) | |
tree | 3dcccee4c79047c3cb8ff9892193ae85a4911685 | |
parent | 01a405651411cc794d0f194907a77e1fb9d22bc3 (diff) |
search cards: first try implsearch-cards
-rw-r--r-- | app/src/main/java/it/niedermann/nextcloud/deck/database/DataBaseAdapter.java | 36 | ||||
-rw-r--r-- | app/src/main/java/it/niedermann/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<Map<Stack, List<FullCard>>> 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<Stack, List<FullCard>> mapToStacksForCardSearch(List<FullCard> matches, int limitPerStack) { + Map<Stack, List<FullCard>> 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<FullCard> fullCards = result.computeIfAbsent(lastStack, k -> new ArrayList<>()); + // create bucket + if (fullCards.size() < limitPerStack) { + // put into bucket + fullCards.add(card); + } + } + } + return result; } public LiveData<List<User>> 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<Card> { @Transaction @Query(QUERY_UPCOMING_CARDS) List<FullCard> 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<List<FullCard>> searchCard(long accountId, long localBoardId, String term); }
\ No newline at end of file |