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:
Diffstat (limited to 'app/src/main/java/it/niedermann/nextcloud/deck/database/DataBaseAdapter.java')
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/database/DataBaseAdapter.java36
1 files changed, 33 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) {