Skip to content

Commit 33daabf

Browse files
committed
Fix for previous fix. Added separate endpoint for Schema search for now.
1 parent dda8da6 commit 33daabf

File tree

5 files changed

+112
-3
lines changed

5 files changed

+112
-3
lines changed

src/main/java/fi/vm/yti/datamodel/api/v2/dto/ModelType.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,5 @@ public enum ModelType {
1111
* FI: Ydintietomalli,
1212
* EN: Core vocabulary
1313
*/
14-
LIBRARY,
15-
SCHEMA
14+
LIBRARY
1615
}

src/main/java/fi/vm/yti/datamodel/api/v2/endpoint/FrontendController.java

+8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import fi.vm.yti.datamodel.api.v2.opensearch.index.IndexCrosswalk;
99
import fi.vm.yti.datamodel.api.v2.opensearch.index.IndexModel;
1010
import fi.vm.yti.datamodel.api.v2.opensearch.index.IndexResourceInfo;
11+
import fi.vm.yti.datamodel.api.v2.opensearch.index.IndexSchema;
1112
import fi.vm.yti.datamodel.api.v2.service.FrontendService;
1213
import fi.vm.yti.datamodel.api.v2.service.SearchIndexService;
1314
import fi.vm.yti.security.AuthenticatedUserProvider;
@@ -98,6 +99,13 @@ public List<String> getSupportedDataTypes() {
9899
return ModelConstants.SUPPORTED_DATA_TYPES;
99100
}
100101

102+
@Operation(summary = "Search schemas")
103+
@ApiResponse(responseCode = "200", description = "List of schema objects")
104+
@GetMapping(value = "/searchSchemas", produces = APPLICATION_JSON_VALUE)
105+
public SearchResponseDTO<IndexSchema> getSchemas(ModelSearchRequest request) {
106+
return searchIndexService.searchSchemas(request, userProvider.getUser());
107+
}
108+
101109
@Operation(summary = "Search crosswalks")
102110
@ApiResponse(responseCode = "200", description = "List of crosswalk objects")
103111
@GetMapping(value = "/searchCrosswalks", produces = APPLICATION_JSON_VALUE)

src/main/java/fi/vm/yti/datamodel/api/v2/opensearch/index/OpenSearchIndexer.java

+6
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,15 @@ public void initIndexes(){
7070
try {
7171
openSearchConnector.cleanIndex(OPEN_SEARCH_INDEX_MODEL);
7272
openSearchConnector.cleanIndex(OPEN_SEARCH_INDEX_RESOURCE);
73+
openSearchConnector.cleanIndex(OPEN_SEARCH_INDEX_CROSSWALK);
7374
logger.info("v2 Indexes cleaned");
7475
openSearchConnector.createIndex(OPEN_SEARCH_INDEX_MODEL, getModelMappings());
7576
openSearchConnector.createIndex(OPEN_SEARCH_INDEX_RESOURCE, getResourceMappings());
77+
openSearchConnector.createIndex(OPEN_SEARCH_INDEX_CROSSWALK, getCrosswalkMappings());
7678
initModelIndex();
7779
initResourceIndex();
80+
initSchemaIndex();
81+
initCrosswalkIndex();
7882

7983
logger.info("Indexes initialized");
8084
} catch (IOException ex) {
@@ -91,9 +95,11 @@ public void reindex() {
9195
logger.info("v2 Indexes cleaned");
9296
openSearchConnector.createIndex(OPEN_SEARCH_INDEX_MODEL, getModelMappings());
9397
openSearchConnector.createIndex(OPEN_SEARCH_INDEX_RESOURCE, getResourceMappings());
98+
openSearchConnector.createIndex(OPEN_SEARCH_INDEX_CROSSWALK, getCrosswalkMappings());
9499
openSearchConnector.createIndex(OPEN_SEARCH_INDEX_EXTERNAL, getExternalResourceMappings());
95100
initModelIndex();
96101
initResourceIndex();
102+
initSchemaIndex();
97103
initCrosswalkIndex();
98104
initExternalResourceIndex();
99105

src/main/java/fi/vm/yti/datamodel/api/v2/opensearch/queries/ModelQueryFactory.java

+73-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ private ModelQueryFactory() {
2626
public static SearchRequest createModelQuery(ModelSearchRequest request){
2727
var must = new ArrayList<Query>();
2828
var should = new ArrayList<Query>();
29+
var mustNot = new ArrayList<Query>();
2930

3031
var incompleteFrom = request.getIncludeIncompleteFrom();
3132
if(incompleteFrom != null && !incompleteFrom.isEmpty()){
@@ -44,8 +45,79 @@ public static SearchRequest createModelQuery(ModelSearchRequest request){
4445
if(modelType != null && !modelType.isEmpty()){
4546
var modelTypeQuery = QueryFactoryUtils.termsQuery("type", modelType.stream().map(ModelType::name).toList());
4647
must.add(modelTypeQuery);
48+
}
49+
50+
mustNot.add(QueryFactoryUtils.termQuery("type", "SCHEMA"));
51+
52+
var groups = request.getGroups();
53+
if(groups != null && !groups.isEmpty()){
54+
var groupsQuery = QueryFactoryUtils.termsQuery("isPartOf", groups);
55+
must.add(groupsQuery);
4756
}
4857

58+
var organizations = request.getOrganizations();
59+
if(organizations != null && !organizations.isEmpty()){
60+
var orgsQuery = QueryFactoryUtils.termsQuery("contributor", organizations.stream().map(UUID::toString).toList());
61+
must.add(orgsQuery);
62+
}
63+
64+
var language = request.getLanguage();
65+
if(language != null && !language.isBlank()) {
66+
var languageQuery = QueryFactoryUtils.termQuery("language", language);
67+
must.add(languageQuery);
68+
}
69+
70+
var status = request.getStatus();
71+
if(status != null && !status.isEmpty()){
72+
var statusQuery = QueryFactoryUtils.termsQuery("status", status.stream().map(Status::name).toList());
73+
must.add(statusQuery);
74+
}
75+
76+
var finalQuery = QueryBuilders.bool()
77+
.must(must)
78+
.mustNot(mustNot)
79+
.minimumShouldMatch("1")
80+
.should(should)
81+
.build();
82+
83+
var sortLang = request.getSortLang() != null ? request.getSortLang() : QueryFactoryUtils.DEFAULT_SORT_LANG;
84+
var sort = SortOptionsBuilders.field()
85+
.field("label." + sortLang + ".keyword")
86+
.order(SortOrder.Asc)
87+
.unmappedType(FieldType.Keyword)
88+
.build();
89+
90+
var sr = new SearchRequest.Builder()
91+
.index(OpenSearchIndexer.OPEN_SEARCH_INDEX_MODEL)
92+
.size(QueryFactoryUtils.pageSize(request.getPageSize()))
93+
.from(QueryFactoryUtils.pageFrom(request.getPageFrom()))
94+
.sort(SortOptions.of(s -> s.field(sort)))
95+
.query(finalQuery._toQuery())
96+
.build();
97+
98+
logPayload(sr);
99+
return sr;
100+
}
101+
102+
public static SearchRequest createSchemaQuery(ModelSearchRequest request) {
103+
var must = new ArrayList<Query>();
104+
var should = new ArrayList<Query>();
105+
106+
var incompleteFrom = request.getIncludeIncompleteFrom();
107+
if(incompleteFrom != null && !incompleteFrom.isEmpty()){
108+
var incompleteFromQuery = QueryFactoryUtils.termsQuery("contributor", incompleteFrom.stream().map(UUID::toString).toList());
109+
should.add(incompleteFromQuery);
110+
}
111+
112+
should.add(QueryFactoryUtils.hideIncompleteStatusQuery());
113+
114+
var queryString = request.getQuery();
115+
if(queryString != null && !queryString.isBlank()){
116+
must.add(QueryFactoryUtils.labelQuery(queryString));
117+
}
118+
119+
must.add(QueryFactoryUtils.termQuery("type", "SCHEMA"));
120+
49121
var groups = request.getGroups();
50122
if(groups != null && !groups.isEmpty()){
51123
var groupsQuery = QueryFactoryUtils.termsQuery("isPartOf", groups);
@@ -93,6 +165,6 @@ public static SearchRequest createModelQuery(ModelSearchRequest request){
93165

94166
logPayload(sr);
95167
return sr;
96-
}
168+
}
97169

98170
}

src/main/java/fi/vm/yti/datamodel/api/v2/service/SearchIndexService.java

+24
Original file line numberDiff line numberDiff line change
@@ -234,4 +234,28 @@ public SearchResponseDTO<IndexCrosswalk> searchCrosswalks(CrosswalkSearchRequest
234234
throw new OpenSearchException(e.getMessage(), OpenSearchIndexer.OPEN_SEARCH_INDEX_CROSSWALK);
235235
}
236236
}
237+
238+
public SearchResponseDTO<IndexSchema> searchSchemas(ModelSearchRequest request, @NotNull YtiUser user) {
239+
try {
240+
if (!user.isSuperuser()) {
241+
request.setIncludeIncompleteFrom(getOrganizationsForUser(user));
242+
}
243+
244+
var build = ModelQueryFactory.createSchemaQuery(request);
245+
var response = client.search(build, IndexSchema.class);
246+
247+
var modelSearchResponse = new SearchResponseDTO<IndexSchema>();
248+
modelSearchResponse.setResponseObjects(response.hits().hits().stream()
249+
.map(Hit::source)
250+
.toList()
251+
);
252+
modelSearchResponse.setTotalHitCount(response.hits().total().value());
253+
modelSearchResponse.setPageFrom(request.getPageFrom());
254+
modelSearchResponse.setPageSize(request.getPageSize());
255+
256+
return modelSearchResponse;
257+
} catch (IOException e) {
258+
throw new OpenSearchException(e.getMessage(), OpenSearchIndexer.OPEN_SEARCH_INDEX_MODEL);
259+
}
260+
}
237261
}

0 commit comments

Comments
 (0)