Skip to content

Commit b4b1d6e

Browse files
committed
Refactor: Introduce OpenSearchQueryUtils and OpenSearchIdenterQueryUtils for query building; update OpenSearchService and OpensearchController to support new search parameters
1 parent 13d468a commit b4b1d6e

File tree

14 files changed

+243
-559
lines changed

14 files changed

+243
-559
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package no.nav.testnav.dollysearchservice;
22

3-
import org.springframework.boot.SpringApplication;
3+
import no.nav.dolly.libs.nais.NaisEnvironmentApplicationContextInitializer;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.boot.builder.SpringApplicationBuilder;
56

67
@SpringBootApplication
78
public class
89
DollySearchServiceApplicationStarter {
910
public static void main(String[] args) {
1011

11-
SpringApplication.run(DollySearchServiceApplicationStarter.class, args);
12+
new SpringApplicationBuilder(DollySearchServiceApplicationStarter.class)
13+
.initializers(new NaisEnvironmentApplicationContextInitializer())
14+
.run(args);
1215
}
1316
}

apps/dolly-search-service/src/main/java/no/nav/testnav/dollysearchservice/domain/ElasticTyper.java

-44
This file was deleted.

apps/dolly-search-service/src/main/java/no/nav/testnav/dollysearchservice/dto/Kategori.java

-16
This file was deleted.

apps/dolly-search-service/src/main/java/no/nav/testnav/dollysearchservice/dto/SearchRequest.java

-30
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package no.nav.testnav.dollysearchservice.provider;
22

33
import io.swagger.v3.oas.annotations.Operation;
4+
import io.swagger.v3.oas.annotations.media.Schema;
45
import lombok.RequiredArgsConstructor;
5-
import no.nav.testnav.dollysearchservice.domain.ElasticTyper;
6-
import no.nav.testnav.dollysearchservice.dto.SearchRequest;
7-
import no.nav.testnav.dollysearchservice.dto.SearchResponse;
6+
import no.nav.testnav.libs.data.dollysearchservice.v1.SearchRequest;
7+
import no.nav.testnav.libs.data.dollysearchservice.v1.SearchResponse;
88
import no.nav.testnav.dollysearchservice.service.OpenSearchService;
9-
import org.springframework.web.bind.annotation.GetMapping;
109
import org.springframework.web.bind.annotation.PostMapping;
1110
import org.springframework.web.bind.annotation.RequestBody;
1211
import org.springframework.web.bind.annotation.RequestMapping;
@@ -21,17 +20,16 @@ public class OpensearchController {
2120

2221
private final OpenSearchService openSearchService;
2322

24-
@GetMapping("/identer")
25-
@Operation(description = "Henter identer som matcher søk i request, registre kun")
26-
public Mono<SearchResponse> getIdenterMed(@RequestParam ElasticTyper... typer) {
27-
28-
return openSearchService.getTyper(typer);
29-
}
30-
3123
@PostMapping("/identer")
3224
@Operation(description = "Henter identer som matcher søk i request, både registre og persondetaljer")
33-
public Mono<SearchResponse> getIdenterMed(@RequestBody SearchRequest request) {
25+
public Mono<SearchResponse> getIdenterMed(@RequestBody SearchRequest request,
26+
@Schema(description = "Sidenummer")
27+
@RequestParam(required = false) Integer side,
28+
@Schema(description = "Antall resultater per side")
29+
@RequestParam(required = false) Integer antall,
30+
@Schema(description = "Seed for paginering")
31+
@RequestParam(required = false) Integer seed) {
3432

35-
return openSearchService.search(request);
33+
return openSearchService.search(request, side, antall, seed);
3634
}
3735
}

apps/dolly-search-service/src/main/java/no/nav/testnav/dollysearchservice/service/OpenSearchService.java

+9-30
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,17 @@
55
import lombok.RequiredArgsConstructor;
66
import lombok.extern.slf4j.Slf4j;
77
import no.nav.testnav.dollysearchservice.consumer.ElasticSearchConsumer;
8-
import no.nav.testnav.dollysearchservice.domain.ElasticTyper;
9-
import no.nav.testnav.dollysearchservice.dto.Kategori;
10-
import no.nav.testnav.dollysearchservice.dto.SearchRequest;
11-
import no.nav.testnav.dollysearchservice.dto.SearchResponse;
8+
import no.nav.testnav.libs.data.dollysearchservice.v1.SearchRequest;
9+
import no.nav.testnav.libs.data.dollysearchservice.v1.SearchResponse;
10+
import no.nav.testnav.dollysearchservice.utils.OpenSearchQueryBuilder;
1211
import org.opensearch.common.unit.TimeValue;
1312
import org.opensearch.index.query.BoolQueryBuilder;
1413
import org.opensearch.search.SearchHits;
1514
import org.opensearch.search.builder.SearchSourceBuilder;
16-
import org.springframework.beans.factory.annotation.Value;
1715
import org.springframework.stereotype.Service;
1816
import reactor.core.publisher.Mono;
1917

20-
import java.util.Comparator;
21-
import java.util.List;
2218
import java.util.concurrent.TimeUnit;
23-
import java.util.stream.Stream;
2419

2520
import static java.util.Objects.nonNull;
2621
import static org.apache.commons.lang3.StringUtils.isNotBlank;
@@ -33,36 +28,20 @@ public class OpenSearchService {
3328
private final ElasticSearchConsumer elasticSearchConsumer;
3429
private final ObjectMapper objectMapper;
3530

36-
public Mono<SearchResponse> getTyper(ElasticTyper[] typer) {
31+
public Mono<SearchResponse> search(SearchRequest request, Integer side, Integer antall, Integer seed) {
3732

38-
var query = OpenSearchQueryBuilder.buildTyperQuery(typer);
39-
return execQuery(query);
33+
var query = OpenSearchQueryBuilder.buildSearchQuery(request, seed);
34+
return execQuery(query, side, antall);
4035
}
4136

42-
public Mono<SearchResponse> search(SearchRequest request) {
43-
44-
var query = OpenSearchQueryBuilder.buildSearchQuery(request);
45-
return execQuery(query);
46-
}
47-
48-
public List<Kategori> getTyper() {
49-
50-
return Stream.of(ElasticTyper.values())
51-
.map(entry -> Kategori.builder()
52-
.type(entry.name())
53-
.beskrivelse(entry.getBeskrivelse())
54-
.build())
55-
.sorted(Comparator.comparing(Kategori::getBeskrivelse))
56-
.toList();
57-
}
58-
59-
private Mono<SearchResponse> execQuery(BoolQueryBuilder query) {
37+
private Mono<SearchResponse> execQuery(BoolQueryBuilder query, Integer side, Integer antall) {
6038

6139
return Mono.from(elasticSearchConsumer.search(new org.opensearch.action.search.SearchRequest()
6240
.indices("pdl-sok")
6341
.source(new SearchSourceBuilder()
42+
.from(nonNull(side) ? side : 0)
6443
.query(query)
65-
.size(10)
44+
.size(nonNull(antall) ? antall : 10)
6645
.timeout(new TimeValue(3, TimeUnit.SECONDS))))
6746
.map(this::getIdenter));
6847
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package no.nav.testnav.dollysearchservice.utils;
2+
3+
import lombok.experimental.UtilityClass;
4+
import no.nav.testnav.libs.data.dollysearchservice.v1.SearchRequest;
5+
import org.opensearch.index.query.BoolQueryBuilder;
6+
import org.opensearch.index.query.QueryBuilders;
7+
8+
import java.util.List;
9+
import java.util.Set;
10+
import java.util.stream.Collectors;
11+
12+
import static no.nav.testnav.dollysearchservice.utils.OpenSearchQueryUtils.FOLKEREGISTERIDENTIFIKATOR;
13+
import static no.nav.testnav.dollysearchservice.utils.OpenSearchQueryUtils.HENT_IDENTER;
14+
import static no.nav.testnav.dollysearchservice.utils.OpenSearchQueryUtils.HISTORISK;
15+
import static no.nav.testnav.dollysearchservice.utils.OpenSearchQueryUtils.METADATA_HISTORISK;
16+
import static no.nav.testnav.dollysearchservice.utils.OpenSearchQueryUtils.NAVSPERSONIDENTIFIKATOR;
17+
import static no.nav.testnav.dollysearchservice.utils.OpenSearchQueryUtils.matchQuery;
18+
import static no.nav.testnav.dollysearchservice.utils.OpenSearchQueryUtils.nestedMatchQuery;
19+
import static no.nav.testnav.dollysearchservice.utils.OpenSearchQueryUtils.nestedRegexpQuery;
20+
21+
@UtilityClass
22+
public class OpenSearchIdenterQueryUtils {
23+
24+
private static final List<Character> NPID_ID = List.of('2', '3', '6', '7');
25+
26+
public static BoolQueryBuilder addIdenterIdentifier(SearchRequest request) {
27+
28+
return request.getIdenter().isEmpty() ?
29+
30+
QueryBuilders.boolQuery()
31+
.must(addDollyIdentifier()) :
32+
33+
QueryBuilders.boolQuery()
34+
.must(addIdenterQuery(request));
35+
}
36+
37+
private static BoolQueryBuilder addDollyIdentifier() {
38+
39+
return QueryBuilders.boolQuery()
40+
.should(matchQuery("tags", "DOLLY"))
41+
.should(QueryBuilders.boolQuery()
42+
.must(nestedMatchQuery(FOLKEREGISTERIDENTIFIKATOR, METADATA_HISTORISK, false))
43+
.must(nestedRegexpQuery(FOLKEREGISTERIDENTIFIKATOR, "identifikasjonsnummer", "\\d{2}[4-5]\\d{8}")))
44+
.should(QueryBuilders.boolQuery()
45+
.must(nestedMatchQuery(NAVSPERSONIDENTIFIKATOR, METADATA_HISTORISK, false))
46+
.must(nestedRegexpQuery(NAVSPERSONIDENTIFIKATOR, "identifikasjonsnummer", "\\d{2}[6-7]\\d{8}")));
47+
}
48+
49+
private static BoolQueryBuilder addIdenterQuery(SearchRequest request) {
50+
51+
var folkeregisterPids = getFolkeregisterIdenter(request);
52+
var nPids = getNpids(request);
53+
54+
if (!folkeregisterPids.isEmpty() && !nPids.isEmpty()) {
55+
56+
return QueryBuilders.boolQuery()
57+
.must(QueryBuilders.boolQuery()
58+
.should(QueryBuilders.boolQuery()
59+
.must(nestedMatchQuery(FOLKEREGISTERIDENTIFIKATOR, METADATA_HISTORISK, false))
60+
.must(nestedMatchQuery(FOLKEREGISTERIDENTIFIKATOR, "type",
61+
request.getPersonRequest().getIdenttype().name()))
62+
.must(QueryBuilders.termsQuery(FOLKEREGISTERIDENTIFIKATOR + ".identifikasjonsnummer", folkeregisterPids))
63+
)
64+
.should(QueryBuilders.boolQuery()
65+
.must(nestedMatchQuery(HENT_IDENTER, HISTORISK, false))
66+
.must(nestedMatchQuery(HENT_IDENTER, "gruppe", "NPID"))
67+
.must(QueryBuilders.termsQuery(HENT_IDENTER + ".identer", nPids))
68+
)
69+
);
70+
} else if (!folkeregisterPids.isEmpty()) {
71+
72+
QueryBuilders.boolQuery()
73+
.must(QueryBuilders.boolQuery()
74+
.must(nestedMatchQuery(FOLKEREGISTERIDENTIFIKATOR, METADATA_HISTORISK, false))
75+
.must(nestedMatchQuery(FOLKEREGISTERIDENTIFIKATOR, "type",
76+
request.getPersonRequest().getIdenttype().name()))
77+
.must(QueryBuilders.termsQuery(FOLKEREGISTERIDENTIFIKATOR + ".identifikasjonsnummer", folkeregisterPids))
78+
);
79+
} else {
80+
81+
QueryBuilders.boolQuery()
82+
.must(QueryBuilders.boolQuery()
83+
.must(nestedMatchQuery(HENT_IDENTER, HISTORISK, false))
84+
.must(nestedMatchQuery(HENT_IDENTER, "gruppe", "NPID"))
85+
.must(QueryBuilders.termsQuery(HENT_IDENTER + ".identer", nPids))
86+
);
87+
}
88+
return null;
89+
}
90+
91+
private static Set<String> getNpids(SearchRequest request) {
92+
93+
return request.getIdenter().stream()
94+
.filter(OpenSearchIdenterQueryUtils::isNpid)
95+
.collect(Collectors.toSet());
96+
}
97+
98+
private static Set<String> getFolkeregisterIdenter(SearchRequest request) {
99+
100+
return request.getIdenter().stream()
101+
.filter(ident -> !isNpid(ident))
102+
.collect(Collectors.toSet());
103+
}
104+
105+
private boolean isNpid(String ident) {
106+
107+
return NPID_ID.contains(ident.charAt(2));
108+
}
109+
}

0 commit comments

Comments
 (0)