Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

SO-4826: FHIR ValueSet/ConceptMap operations #909

Merged
merged 11 commits into from
Oct 1, 2021
Merged
Prev Previous commit
Next Next commit
feat!: simplify result set sorting by field/script usage
  • Loading branch information
cmark committed Sep 30, 2021

Verified

This commit was signed with the committer’s verified signature.
schroda schroda
commit 53cef9c1b4153aa9772e42cf96a15b24d385aeaf
Original file line number Diff line number Diff line change
@@ -34,7 +34,7 @@
import com.b2international.snowowl.core.jobs.JobRequests;
import com.b2international.snowowl.core.jobs.RemoteJobEntry;
import com.b2international.snowowl.core.jobs.RemoteJobs;
import com.b2international.snowowl.core.request.SearchResourceRequest.SortField;
import com.b2international.snowowl.core.request.SearchResourceRequest.Sort;
import com.b2international.snowowl.core.rest.AbstractRestService;
import com.b2international.snowowl.core.validation.ValidationRequests;
import com.b2international.snowowl.core.validation.issue.ValidationIssue;
@@ -165,7 +165,7 @@ public ResponseEntity<Void> beginValidation(
.isWhitelisted(false)
.all()
.filterByResourceUri(codeSystemURI)
.sortBy(SortField.ascending(ValidationIssue.Fields.RULE_ID))
.sortBy(Sort.fieldAsc(ValidationIssue.Fields.RULE_ID))
.buildAsync()
.execute(bus)
.then(issues -> {
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2018 B2i Healthcare Pte Ltd, http://b2i.sg
* Copyright 2018-2021 B2i Healthcare Pte Ltd, http://b2i.sg
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,37 +22,38 @@
import org.junit.Test;

import com.b2international.snowowl.core.request.SearchResourceRequest.Sort;
import com.b2international.snowowl.core.request.SearchResourceRequest.SortField;
import com.b2international.snowowl.core.request.SortParser;
import com.google.common.collect.ImmutableList;

/**
* @since 7.0
*/
public class SortParserTest {

@Test
public void parseRegularSortString() throws Exception {
final List<Sort> expected = ImmutableList.of(
SortField.ascending("field1"),
SortField.ascending("field2"),
SortField.descending("field3"));
Sort.fieldAsc("field1"),
Sort.fieldAsc("field2"),
Sort.fieldDesc("field3"));
final List<Sort> actual = SortParser.parse("field1,field2:asc,field3:desc");
assertEquals(expected, actual);
}

@Test
public void parseEmptySeparator() throws Exception {
final List<Sort> expected = ImmutableList.of(
SortField.ascending("field1"),
SortField.ascending("field2"),
SortField.descending("field3"));
Sort.fieldAsc("field1"),
Sort.fieldAsc("field2"),
Sort.fieldDesc("field3"));
final List<Sort> actual = SortParser.parse("field1,,,field2:asc,field3:desc");
assertEquals(expected, actual);
}

@Test
public void parseWhitespaceAroundSeparator() throws Exception {
final List<Sort> expected = ImmutableList.of(
SortField.ascending("field1"),
SortField.ascending("field2"));
Sort.fieldAsc("field1"),
Sort.fieldAsc("field2"));
final List<Sort> actual = SortParser.parse(" field1, field2");
assertEquals(expected, actual);
}
Original file line number Diff line number Diff line change
@@ -23,7 +23,7 @@
import com.b2international.snowowl.core.codesystem.CodeSystemRequests;
import com.b2international.snowowl.core.plugin.Component;
import com.b2international.snowowl.core.request.ResourceRequests;
import com.b2international.snowowl.core.request.SearchResourceRequest.SortField;
import com.b2international.snowowl.core.request.SearchResourceRequest.Sort;
import com.b2international.snowowl.core.version.Version;
import com.b2international.snowowl.core.version.VersionDocument;
import com.b2international.snowowl.core.version.Versions;
@@ -141,7 +141,7 @@ private String getVersionsInfo(CodeSystem cs) {
final Versions versions = ResourceRequests.prepareSearchVersion()
.all()
.filterByResource(cs.getResourceURI())
.sortBy(SortField.ascending(VersionDocument.Fields.EFFECTIVE_TIME))
.sortBy(Sort.fieldAsc(VersionDocument.Fields.EFFECTIVE_TIME))
.buildAsync()
.execute(getBus())
.getSync(1, TimeUnit.MINUTES);
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2018 B2i Healthcare Pte Ltd, http://b2i.sg
* Copyright 2018-2021 B2i Healthcare Pte Ltd, http://b2i.sg
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,7 +24,7 @@
import com.b2international.snowowl.core.console.CommandLineStream;
import com.b2international.snowowl.core.date.DateFormats;
import com.b2international.snowowl.core.date.Dates;
import com.b2international.snowowl.core.request.SearchResourceRequest.SortField;
import com.b2international.snowowl.core.request.SearchResourceRequest.Sort;
import com.google.common.base.Strings;

import picocli.CommandLine.HelpCommand;
@@ -47,7 +47,7 @@ public final class JobsCommand extends Command {
@Override
public void run(CommandLineStream out) {
List<RemoteJobEntry> entries = JobRequests.prepareSearch().all()
.sortBy(SortField.ascending(RemoteJobEntry.Fields.SCHEDULE_DATE))
.sortBy(Sort.fieldAsc(RemoteJobEntry.Fields.SCHEDULE_DATE))
.buildAsync()
.execute(getBus())
.getSync()
Original file line number Diff line number Diff line change
@@ -47,7 +47,7 @@ public abstract class SearchIndexResourceRequest<C extends ServiceProvider, B, D
/**
* Special field name for sorting based on the document score (relevance).
*/
public static final SortField SCORE = SortField.descending(SortBy.FIELD_SCORE);
public static final SortField SCORE = Sort.fieldDesc(SortBy.FIELD_SCORE);

@Override
protected final B doExecute(C context) throws IOException {
Original file line number Diff line number Diff line change
@@ -44,6 +44,8 @@
*/
public abstract class SearchResourceRequest<C extends ServiceProvider, B> extends IndexResourceRequest<C, B> {

private static final long serialVersionUID = 1L;

/**
* Special option character that can be used for special search expressions in filters where usually a user enters a text, like a term filter.
* @see #getSpecialOptionKey
@@ -81,10 +83,26 @@ public Sort(final boolean ascending) {
public boolean isAscending() {
return ascending;
}

public static SortField fieldAsc(String field) {
return SortField.of(field, true);
}

public static SortField fieldDesc(String field) {
return SortField.of(field, false);
}

public static SortScript scriptAsc(String script, final Map<String, Object> arguments) {
return SortScript.of(script, arguments, true);
}

public static SortScript scriptDesc(String script, final Map<String, Object> arguments) {
return SortScript.of(script, arguments, false);
}

}

public static class SortField extends Sort {
public static final class SortField extends Sort {

private static final long serialVersionUID = 2L;

@@ -103,14 +121,6 @@ public static SortField of(String field, boolean ascending) {
return new SortField(field, ascending);
}

public static SortField ascending(String field) {
return of(field, true);
}

public static SortField descending(String field) {
return of(field, false);
}

@Override
public int hashCode() {
return Objects.hash(field, isAscending());
@@ -133,7 +143,7 @@ public String toString() {
}
}

public static class SortScript extends Sort {
public static final class SortScript extends Sort {

private static final long serialVersionUID = 2L;

@@ -160,14 +170,6 @@ public static SortScript of(String script, final Map<String, Object> arguments,
return new SortScript(script, arguments, ascending);
}

public static SortScript ascending(String script, final Map<String, Object> arguments) {
return of(script, arguments, true);
}

public static SortScript descending(String script, final Map<String, Object> arguments) {
return of(script, arguments, false);
}

@Override
public int hashCode() {
return Objects.hash(script, arguments, isAscending());
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2018-2020 B2i Healthcare Pte Ltd, http://b2i.sg
* Copyright 2018-2021 B2i Healthcare Pte Ltd, http://b2i.sg
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,6 +23,9 @@
import com.b2international.commons.CompareUtils;
import com.google.common.base.Splitter;

/**
* @since 7.0
*/
public final class SortParser {

private static final Pattern FIELD_PATTERN = Pattern.compile("^[a-zA-Z0-9_\\.]+$");
@@ -69,9 +72,9 @@ public static List<SearchResourceRequest.Sort> parse(final String sortBy) {
}

if (ascending) {
return SearchResourceRequest.SortField.ascending(field);
return SearchResourceRequest.Sort.fieldAsc(field);
} else {
return SearchResourceRequest.SortField.descending(field);
return SearchResourceRequest.Sort.fieldDesc(field);
}
})
.collect(Collectors.toList());
Original file line number Diff line number Diff line change
@@ -48,7 +48,7 @@
import com.b2international.snowowl.core.locks.IOperationLockManager;
import com.b2international.snowowl.core.repository.RepositoryRequests;
import com.b2international.snowowl.core.request.*;
import com.b2international.snowowl.core.request.SearchResourceRequest.SortField;
import com.b2international.snowowl.core.request.SearchResourceRequest.Sort;
import com.b2international.snowowl.core.terminology.TerminologyRegistry;
import com.b2international.snowowl.core.uri.ResourceURLSchemaSupport;
import com.b2international.snowowl.core.version.Version;
@@ -267,7 +267,7 @@ private Optional<Version> getMostRecentVersion(RepositoryContext context, Termin
return ResourceRequests.prepareSearchVersion()
.one()
.filterByResource(codeSystem.getResourceURI())
.sortBy(SortField.descending(VersionDocument.Fields.EFFECTIVE_TIME))
.sortBy(Sort.fieldDesc(VersionDocument.Fields.EFFECTIVE_TIME))
.build()
.execute(context)
.stream()
Original file line number Diff line number Diff line change
@@ -85,7 +85,7 @@ public PathWithVersion resolveWithVersion(ServiceProvider context, ResourceURI u

if (uriToResolve.isLatest()) {
// fetch the latest resource version if LATEST is specified in the URI
versionSearch.sortBy(SearchResourceRequest.SortField.descending(VersionDocument.Fields.EFFECTIVE_TIME));
versionSearch.sortBy(SearchResourceRequest.Sort.fieldDesc(VersionDocument.Fields.EFFECTIVE_TIME));
} else {
// try to fetch the path as exact version if not the special LATEST is specified in the URI
versionSearch.filterByVersionId(uriToResolve.getPath());
Original file line number Diff line number Diff line change
@@ -231,7 +231,7 @@ private Optional<Version> getLatestCodeSystemVersion(RepositoryContext context,
return ResourceRequests.prepareSearchVersion()
.one()
.filterByResource(codeSystemUri)
.sortBy(SearchResourceRequest.SortField.descending(VersionDocument.Fields.EFFECTIVE_TIME))
.sortBy(SearchResourceRequest.Sort.fieldDesc(VersionDocument.Fields.EFFECTIVE_TIME))
.buildAsync()
.get(context)
.stream()
Original file line number Diff line number Diff line change
@@ -24,11 +24,7 @@
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.SortedSet;
import java.util.*;
import java.util.stream.Collectors;

import org.eclipse.core.runtime.IProgressMonitor;
@@ -37,7 +33,7 @@
import com.b2international.snowowl.core.date.Dates;
import com.b2international.snowowl.core.date.EffectiveTimes;
import com.b2international.snowowl.core.domain.BranchContext;
import com.b2international.snowowl.core.request.SearchResourceRequest.SortField;
import com.b2international.snowowl.core.request.SearchResourceRequest.Sort;
import com.b2international.snowowl.core.request.SearchResourceRequestIterator;
import com.b2international.snowowl.snomed.common.SnomedConstants.Concepts;
import com.b2international.snowowl.snomed.common.SnomedRf2Headers;
@@ -139,7 +135,7 @@ private SearchResourceRequestIterator<SnomedConceptSearchRequestBuilder, SnomedC
SnomedConceptSearchRequestBuilder builder = SnomedRequests.prepareSearchConcept()
.setLocales(locales)
.setExpand(expand)
.sortBy(SortField.ascending(SnomedConceptDocument.Fields.ID))
.sortBy(Sort.fieldAsc(SnomedConceptDocument.Fields.ID))
.setLimit(10_000);

if (includeInactiveMembers) {
Original file line number Diff line number Diff line change
@@ -66,7 +66,7 @@
import com.b2international.snowowl.core.identity.Permission;
import com.b2international.snowowl.core.repository.RepositoryRequests;
import com.b2international.snowowl.core.request.*;
import com.b2international.snowowl.core.request.SearchResourceRequest.SortField;
import com.b2international.snowowl.core.request.SearchResourceRequest.Sort;
import com.b2international.snowowl.core.version.Version;
import com.b2international.snowowl.core.version.VersionDocument;
import com.b2international.snowowl.core.version.Versions;
@@ -566,7 +566,7 @@ private Optional<LocalDate> getLatestModuleEffectiveTime(final RepositoryContext
SnomedRefSetMemberSearchRequestBuilder requestBuilder = SnomedRequests.prepareSearchMember()
.filterByRefSet(Concepts.REFSET_MODULE_DEPENDENCY_TYPE)
.filterByActive(true)
.sortBy(SortField.descending(field))
.sortBy(Sort.fieldDesc(field))
.setLimit(1);

// See the comment in setModules; a value of "null" means that all modules should be exported
@@ -1085,7 +1085,7 @@ private static Versions getCodeSystemVersions(final RepositoryContext context, f
return ResourceRequests.prepareSearchVersion()
.all()
.filterByResource(resource)
.sortBy(SearchResourceRequest.SortField.descending(VersionDocument.Fields.EFFECTIVE_TIME))
.sortBy(SearchResourceRequest.Sort.fieldDesc(VersionDocument.Fields.EFFECTIVE_TIME))
.buildAsync()
.get(context);
}
Original file line number Diff line number Diff line change
@@ -57,7 +57,7 @@
import com.b2international.snowowl.core.internal.locks.DatastoreLockContextDescriptions;
import com.b2international.snowowl.core.locks.Locks;
import com.b2international.snowowl.core.repository.ContentAvailabilityInfoProvider;
import com.b2international.snowowl.core.request.SearchResourceRequest.SortField;
import com.b2international.snowowl.core.request.SearchResourceRequest.Sort;
import com.b2international.snowowl.core.request.io.ImportDefectAcceptor;
import com.b2international.snowowl.core.request.io.ImportDefectAcceptor.ImportDefectBuilder;
import com.b2international.snowowl.core.request.io.ImportResponse;
@@ -366,7 +366,7 @@ private void updateCodeSystemSettings(final BranchContext context, final Resourc
.filterByType(SnomedRefSetType.LANGUAGE)
.filterByActive(true)
.setFields(SnomedConceptDocument.Fields.ID)
.sortBy(SortField.ascending(SnomedConceptDocument.Fields.ID))
.sortBy(Sort.fieldAsc(SnomedConceptDocument.Fields.ID))
.build()
.execute(context);

Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2018-2020 B2i Healthcare Pte Ltd, http://b2i.sg
* Copyright 2018-2021 B2i Healthcare Pte Ltd, http://b2i.sg
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@
import java.util.stream.Stream;

import com.b2international.snowowl.core.domain.RepositoryContext;
import com.b2international.snowowl.core.request.SearchResourceRequest.SortField;
import com.b2international.snowowl.core.request.SearchResourceRequest.Sort;
import com.b2international.snowowl.snomed.common.SnomedRf2Headers;
import com.b2international.snowowl.snomed.core.domain.Rf2ReleaseType;
import com.b2international.snowowl.snomed.core.domain.SnomedConcept;
@@ -65,7 +65,7 @@ protected String[] getHeader() {
protected SnomedConceptSearchRequestBuilder createComponentSearchRequestBuilder() {
return SnomedRequests
.prepareSearchConcept()
.sortBy(SortField.ascending(SnomedConceptDocument.Fields.ID));
.sortBy(Sort.fieldAsc(SnomedConceptDocument.Fields.ID));
}

@Override
Original file line number Diff line number Diff line change
@@ -21,7 +21,7 @@
import java.util.stream.Stream;

import com.b2international.snowowl.core.domain.RepositoryContext;
import com.b2international.snowowl.core.request.SearchResourceRequest.SortField;
import com.b2international.snowowl.core.request.SearchResourceRequest.Sort;
import com.b2international.snowowl.snomed.common.SnomedRf2Headers;
import com.b2international.snowowl.snomed.core.domain.RelationshipValueType;
import com.b2international.snowowl.snomed.core.domain.Rf2ReleaseType;
@@ -71,7 +71,7 @@ protected SnomedRelationshipSearchRequestBuilder createComponentSearchRequestBui
return SnomedRequests
.prepareSearchRelationship()
.filterByValueTypes(VALUE_TYPES)
.sortBy(SortField.ascending(SnomedRelationshipIndexEntry.Fields.ID));
.sortBy(Sort.fieldAsc(SnomedRelationshipIndexEntry.Fields.ID));
}

@Override
Loading