summaryrefslogtreecommitdiff
path: root/clams-server/src/main/java/no/eliashaugsbakk/clams/server/service/PostsSearchService.java
blob: 1b29c02c7b4058b4f778fbaf4587736bc4a3b64e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package no.eliashaugsbakk.clams.server.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import no.eliashaugsbakk.clams.server.model.PostMetaData;
import no.eliashaugsbakk.clams.server.repository.PostsRepo;

public class PostsSearchService {
  private final PostsRepo postsRepo;

  public PostsSearchService(PostsRepo postsRepo) {
    this.postsRepo = postsRepo;
  }

  public List<PostMetaData> searchPosts(String query) {
    if (query == null || query.isBlank()) return List.of();

    int titleValue = 10;
    int summaryValue = 5;
    int bodyValue = 1;

    Map<PostMetaData, Integer> searchRanking = new HashMap<>();
    String lowerQuery = query.toLowerCase();

    List<PostMetaData> postsMetaData = postsRepo.listPostsMetaData();
    List<PostMetaData> bodyResults = postsRepo.searchPostsBody(query);

    postsMetaData.stream()
        .filter(post -> post.title().toLowerCase().contains(lowerQuery))
        .forEach(post -> searchRanking.merge(post, titleValue, Integer::sum));

    postsMetaData.stream()
        .filter(post -> post.summary() != null && post.summary().toLowerCase().contains(lowerQuery))
        .forEach(post -> searchRanking.merge(post, summaryValue, Integer::sum));

    bodyResults.forEach(post -> searchRanking.merge(post, bodyValue, Integer::sum));

    return searchRanking.entrySet().stream()
        .sorted((e1, e2) -> Integer.compare(e2.getValue(), e1.getValue()))
        .map(Map.Entry::getKey)
        .toList();
  }
}