Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/stefan-niedermann/nextcloud-deck.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordesperateCoder <echotodevnull@gmail.com>2023-03-23 14:57:23 +0300
committerdesperateCoder <echotodevnull@gmail.com>2023-03-23 14:57:23 +0300
commit610332716c7f2a933af8b73b30a1d461880ac171 (patch)
tree3dcccee4c79047c3cb8ff9892193ae85a4911685
parent01a405651411cc794d0f194907a77e1fb9d22bc3 (diff)
search cards: first try implsearch-cards
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/database/DataBaseAdapter.java36
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/database/dao/CardDao.java13
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