diff --git a/agr_api/src/main/java/org/alliancegenome/api/controller/GeneController.java b/agr_api/src/main/java/org/alliancegenome/api/controller/GeneController.java index 54c7d2232..938563e5f 100644 --- a/agr_api/src/main/java/org/alliancegenome/api/controller/GeneController.java +++ b/agr_api/src/main/java/org/alliancegenome/api/controller/GeneController.java @@ -12,6 +12,7 @@ import org.alliancegenome.api.entity.GeneGeneticInteractionDocument; import org.alliancegenome.api.entity.GeneMolecularInteractionDocument; import org.alliancegenome.api.entity.GeneToGeneParalogyDocument; +import org.alliancegenome.api.entity.GeneToGeneOrthologyDocument; import org.alliancegenome.api.rest.interfaces.GeneRESTInterface; import org.alliancegenome.api.service.*; import org.alliancegenome.api.service.helper.APIServiceHelper; @@ -56,6 +57,9 @@ public class GeneController implements GeneRESTInterface { @Inject ExpressionCacheRepository expressionCacheRepository; + @Inject + OrthologyESService orthologyESService; + @Inject DiseaseService diseaseService; @@ -628,7 +632,7 @@ private JsonResultResponse getEmpiricalDiseaseAnnotation(Stri } @Override - public JsonResultResponse getGeneOrthology(String id, + public JsonResultResponse getGeneOrthology(String id, List geneIDs, String geneLister, String stringencyFilter, @@ -652,7 +656,7 @@ public JsonResultResponse getGeneOrthology(String id, pagination.addFieldFilter(FieldFilter.STRINGENCY, stringencyFilter); pagination.addFieldFilter(FieldFilter.ORTHOLOGY_METHOD, method); pagination.addFieldFilter(FieldFilter.ORTHOLOGY_TAXON, taxonID); - final JsonResultResponse response = orthologyCacheService.getOrthologyMultiGeneJson(geneList, pagination); + final JsonResultResponse response = orthologyESService.getOrthologyList(id, pagination); response.setHttpServletRequest(null); return response; } diff --git a/agr_api/src/main/java/org/alliancegenome/api/controller/OrthologyController.java b/agr_api/src/main/java/org/alliancegenome/api/controller/OrthologyController.java index c3921381a..8c37608f0 100644 --- a/agr_api/src/main/java/org/alliancegenome/api/controller/OrthologyController.java +++ b/agr_api/src/main/java/org/alliancegenome/api/controller/OrthologyController.java @@ -79,12 +79,6 @@ public JsonResultResponse getMultiSpeciesOrthology(List tax return response; } - @Override - public JsonResultResponse getMultiGeneOrthology(List geneIDs, String geneList, String stringencyFilter, String method, Integer rows, Integer page) { - // controller.setRequest(request); - return controller.getGeneOrthology(null, geneIDs, geneList, stringencyFilter, null, method, rows, page); - } - @Override public JsonResultResponse getAllMethodsCalculations() { LocalDateTime startDate = LocalDateTime.now(); diff --git a/agr_api/src/main/java/org/alliancegenome/api/rest/interfaces/GeneRESTInterface.java b/agr_api/src/main/java/org/alliancegenome/api/rest/interfaces/GeneRESTInterface.java index 26d279f2c..959a1d89d 100644 --- a/agr_api/src/main/java/org/alliancegenome/api/rest/interfaces/GeneRESTInterface.java +++ b/agr_api/src/main/java/org/alliancegenome/api/rest/interfaces/GeneRESTInterface.java @@ -10,6 +10,7 @@ import org.alliancegenome.api.entity.GeneMolecularInteractionDocument; import org.alliancegenome.api.entity.GeneToGeneParalogyDocument; import org.alliancegenome.api.entity.GenePhenotypeAnnotationDocument; +import org.alliancegenome.api.entity.GeneToGeneOrthologyDocument; import org.alliancegenome.cache.repository.helper.JsonResultResponse; import org.alliancegenome.neo4j.entity.DiseaseAnnotation; import org.alliancegenome.neo4j.entity.DiseaseSummary; @@ -406,10 +407,9 @@ JsonResultResponse getPrimaryAnnotatedEntityForModel( @GET @Path("/{id}/orthologs") - @JsonView(value = {View.Homology.class}) - @Operation(summary = "Download homology records.") + @Operation(summary = "Get orthology records.") @APIResponses(value = { @APIResponse(responseCode = "200", content = @Content(mediaType = "application/json", schema = @Schema(implementation = Null.class))) }) - JsonResultResponse getGeneOrthology( + JsonResultResponse getGeneOrthology( @Parameter(in = ParameterIn.PATH, name = "id", description = "Source Gene ID: the gene for which you are searching homologous gene, e.g. 'MGI:109583'", required = true, schema = @Schema(type = SchemaType.STRING)) @PathParam("id") String id, @Parameter(in = ParameterIn.QUERY, name = "geneId", description = "List of additional source gene IDs for which homology is retrieved.", schema = @Schema(type = SchemaType.STRING)) diff --git a/agr_api/src/main/java/org/alliancegenome/api/rest/interfaces/OrthologyRESTInterface.java b/agr_api/src/main/java/org/alliancegenome/api/rest/interfaces/OrthologyRESTInterface.java index df4d14450..0c35fb7af 100644 --- a/agr_api/src/main/java/org/alliancegenome/api/rest/interfaces/OrthologyRESTInterface.java +++ b/agr_api/src/main/java/org/alliancegenome/api/rest/interfaces/OrthologyRESTInterface.java @@ -69,19 +69,6 @@ JsonResultResponse getSingleSpeciesOrthology( JsonResultResponse getMultiSpeciesOrthology(@QueryParam("taxonID") List taxonID, @QueryParam("taxonIdList") String taxonIdList, @QueryParam("stringencyFilter") String stringencyFilter, @QueryParam("methods") String methods, @DefaultValue("20") @QueryParam("rows") Integer rows, @DefaultValue("1") @QueryParam("start") Integer start) throws IOException; - @GET - @Path("/geneMap") - @JsonView(value = { View.Homology.class }) - @Operation(summary = "Retrieve homologous gene records for given list of geneMap") - @APIResponses(value = { @APIResponse(responseCode = "200", content = @Content(mediaType = "application/json", schema = @Schema(implementation = Null.class))) }) - JsonResultResponse getMultiGeneOrthology( - @Parameter(in = ParameterIn.QUERY, name = "geneID", description = "List of geneMap (specified by their ID) for which homology is retrieved, e.g. 'MGI:109583'", schema = @Schema(type = SchemaType.STRING)) @QueryParam("geneID") List geneID, - @Parameter(in = ParameterIn.QUERY, name = "geneIdList", description = "List of additional source gene IDs for which homology is retrieved in a comma-delimited list, e.g. 'MGI:109583,RGD:2129,MGI:97570", schema = @Schema(type = SchemaType.STRING)) @QueryParam("geneIdList") String geneList, - @Parameter(in = ParameterIn.QUERY, name = "filter.stringency", description = "apply stringency containsFilterValue", schema = @Schema(type = SchemaType.STRING)) @DefaultValue("stringent") @QueryParam("filter.stringency") String stringency, - @Parameter(in = ParameterIn.QUERY, name = "filter.method", description = "calculation methods", schema = @Schema(type = SchemaType.STRING)) @QueryParam("filter.method") String method, - @Parameter(in = ParameterIn.QUERY, name = "limit", description = "Number of rows returned", schema = @Schema(type = SchemaType.INTEGER)) @DefaultValue("20") @QueryParam("limit") Integer limit, - @Parameter(in = ParameterIn.QUERY, name = "page", description = "Page number", schema = @Schema(type = SchemaType.INTEGER)) @DefaultValue("1") @QueryParam("page") Integer page) throws IOException; - @GET @Path("/methods") @JsonView(value = { View.OrthologyMethod.class }) diff --git a/agr_api/src/main/java/org/alliancegenome/api/service/OrthologyESService.java b/agr_api/src/main/java/org/alliancegenome/api/service/OrthologyESService.java new file mode 100644 index 000000000..bf1b4e29c --- /dev/null +++ b/agr_api/src/main/java/org/alliancegenome/api/service/OrthologyESService.java @@ -0,0 +1,52 @@ +package org.alliancegenome.api.service; + +import java.util.ArrayList; +import java.util.List; + +import static org.elasticsearch.index.query.QueryBuilders.boolQuery; + +import org.alliancegenome.api.entity.GeneToGeneOrthologyDocument; +import org.alliancegenome.cache.repository.helper.JsonResultResponse; +import org.alliancegenome.cache.repository.helper.OrthologyFiltering; +import org.alliancegenome.core.api.service.FilterService; +import org.alliancegenome.es.model.query.Pagination; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.TermQueryBuilder; +import org.elasticsearch.search.SearchHit; + +import jakarta.enterprise.context.RequestScoped; + +@RequestScoped +public class OrthologyESService extends ESService { + + public JsonResultResponse getOrthologyList(String geneID, Pagination pagination) { + BoolQueryBuilder bool = boolQuery(); + bool.filter(new TermQueryBuilder("geneToGeneOrthologyGenerated.subjectGene.primaryExternalId.keyword", geneID)); + + SearchResponse searchResponse = getSearchResponse(bool, pagination, null, false); + + JsonResultResponse response = new JsonResultResponse<>(); + response.setTotal((int) searchResponse.getHits().getTotalHits().value); + + List list = new ArrayList<>(); + + for (SearchHit searchHit : searchResponse.getHits().getHits()) { + try { + String source = searchHit.getSourceAsString(); + GeneToGeneOrthologyDocument object = mapper.readValue(source, GeneToGeneOrthologyDocument.class); + list.add(object); + } catch (Exception e) { + e.printStackTrace(); + } + } + + FilterService filterService = new FilterService<>(new OrthologyFiltering()); + List gene2GeneOrthoFiltered = filterService.filterAnnotations(list, pagination.getFieldFilterValueMap()); + + response.setResults(gene2GeneOrthoFiltered); + return response; + } + + +} diff --git a/agr_api/src/test/java/org/alliancegenome/api/tests/integration/GeneIT.java b/agr_api/src/test/java/org/alliancegenome/api/tests/integration/GeneIT.java index 83768338a..4889fa5f5 100644 --- a/agr_api/src/test/java/org/alliancegenome/api/tests/integration/GeneIT.java +++ b/agr_api/src/test/java/org/alliancegenome/api/tests/integration/GeneIT.java @@ -23,6 +23,7 @@ import org.alliancegenome.api.dto.ExpressionSummary; import org.alliancegenome.api.dto.ExpressionSummaryGroup; import org.alliancegenome.api.dto.ExpressionSummaryGroupTerm; +import org.alliancegenome.api.entity.GeneToGeneOrthologyDocument; import org.alliancegenome.api.service.GeneService; import org.alliancegenome.cache.repository.helper.JsonResultResponse; import org.alliancegenome.core.ExpressionDetail; @@ -98,7 +99,7 @@ public void checkOrthologyAPIWithFilter() { GeneController controller = new GeneController(); String[] geneIDs = {"RGD:2129"}; - JsonResultResponse response = controller.getGeneOrthology("MGI:109583", asList(geneIDs), null, "stringENT", null, null, 20, 1); + JsonResultResponse response = controller.getGeneOrthology("MGI:109583", asList(geneIDs), null, "stringENT", null, null, 20, 1); assertThat("Matches found for containsFilterValue 'stringent", response.getTotal(), greaterThan(0)); } @@ -106,7 +107,7 @@ public void checkOrthologyAPIWithFilter() { public void checkOrthologyForListOfGenes() { GeneController controller = new GeneController(); - JsonResultResponse response = controller.getGeneOrthology("MGI:109583", null, null, "stringENT", null, null, 20, 1); + JsonResultResponse response = controller.getGeneOrthology("MGI:109583", null, null, "stringENT", null, null, 20, 1); assertThat("Matches found for containsFilterValue 'stringent", response.getTotal(), greaterThan(0)); } @@ -122,7 +123,7 @@ public void checkOrthologyForSingleSpecies() throws IOException { public void checkOrthologyAPIWithSpecies() { GeneController controller = new GeneController(); - JsonResultResponse response = controller.getGeneOrthology("MGI:109583", null, null, "stringent", null, null, 20, 1); + JsonResultResponse response = controller.getGeneOrthology("MGI:109583", null, null, "stringent", null, null, 20, 1); assertThat("No matches found for species 'NCBITaxon:10115", response.getTotal(), greaterThan(5)); String taxonArray = "NCBITaxon:10116"; @@ -147,7 +148,7 @@ public void checkOrthologyAPIWithMethods() { GeneController controller = new GeneController(); String methods = "ZFIN"; - JsonResultResponse response = controller.getGeneOrthology("MGI:109583", null, null, null, null, methods, 20, 1); + JsonResultResponse response = controller.getGeneOrthology("MGI:109583", null, null, null, null, methods, 20, 1); assertThat("No match against method 'ZFIN'", response.getTotal(), greaterThan(0)); methods = "OrthoFinder"; @@ -167,7 +168,7 @@ public void checkOrthologyAPIWithMethods() { public void checkOrthologyAPINoFilters() { GeneController controller = new GeneController(); - JsonResultResponse response = controller.getGeneOrthology("MGI:109583", null, null, null, null, null, 20, 1); + JsonResultResponse response = controller.getGeneOrthology("MGI:109583", null, null, null, null, null, 20, 1); assertThat("matches found for gene MGI:109583'", response.getTotal(), greaterThan(0)); } diff --git a/agr_indexer/src/main/java/org/alliancegenome/indexer/config/IndexerConfig.java b/agr_indexer/src/main/java/org/alliancegenome/indexer/config/IndexerConfig.java index 346e69e1d..d74a52c1e 100644 --- a/agr_indexer/src/main/java/org/alliancegenome/indexer/config/IndexerConfig.java +++ b/agr_indexer/src/main/java/org/alliancegenome/indexer/config/IndexerConfig.java @@ -13,6 +13,7 @@ import org.alliancegenome.indexer.indexers.curation.GeneToGeneParalogyIndexer; import org.alliancegenome.indexer.indexers.curation.PhenotypeAnnotationCurationIndexer; import org.alliancegenome.indexer.indexers.curation.ReleaseInfoIndexer; +import org.alliancegenome.indexer.indexers.curation.GeneToGeneOrthologyIndexer; public enum IndexerConfig { @@ -32,6 +33,7 @@ public enum IndexerConfig { ParalogyIndexer("paralogy", GeneToGeneParalogyIndexer.class, 4, 5000, 5000, 8, 1), PhenotypeAnnotationIndexer("phenotypeAnnotation", PhenotypeAnnotationCurationIndexer.class, 4, 1500, 1500, 2, 1), ReleaseInfoIndexer("release", ReleaseInfoIndexer.class, 1, 1, 1, 1, 1), + GeneToGeneOrthologyIndexer("geneToGeneOrthology", GeneToGeneOrthologyIndexer.class, 4, 1426, 1426, 8, 1) ; diff --git a/agr_indexer/src/main/java/org/alliancegenome/indexer/indexers/curation/GeneToGeneOrthologyIndexer.java b/agr_indexer/src/main/java/org/alliancegenome/indexer/indexers/curation/GeneToGeneOrthologyIndexer.java new file mode 100644 index 000000000..48e4dd20c --- /dev/null +++ b/agr_indexer/src/main/java/org/alliancegenome/indexer/indexers/curation/GeneToGeneOrthologyIndexer.java @@ -0,0 +1,134 @@ +package org.alliancegenome.indexer.indexers.curation; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingDeque; + +import org.alliancegenome.api.entity.GeneToGeneOrthologyDocument; +import org.alliancegenome.curation_api.model.entities.Gene; +import org.alliancegenome.curation_api.model.entities.orthology.GeneToGeneOrthologyGenerated; +import org.alliancegenome.curation_api.response.SearchResponse; +import org.alliancegenome.indexer.RestConfig; +import org.alliancegenome.indexer.config.IndexerConfig; +import org.alliancegenome.indexer.indexers.Indexer; +import org.alliancegenome.indexer.indexers.curation.service.GeneToGeneOrthologyService; +import org.apache.commons.collections4.CollectionUtils; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class GeneToGeneOrthologyIndexer extends Indexer { + + private GeneToGeneOrthologyService service = new GeneToGeneOrthologyService(); + + public GeneToGeneOrthologyIndexer(IndexerConfig config) { + super(config); + } + + @Override + public void index() { + try { + log.info("Getting orthologs"); + + SearchResponse orthologyResponse = service.getGeneToGeneOrthology(0, 0); + + log.info("GeneToGeneParalogy count: " + orthologyResponse.getTotalResults()); + + int totalPages = (int) (orthologyResponse.getTotalResults() / indexerConfig.getBufferSize()); + + LinkedBlockingDeque queue = new LinkedBlockingDeque<>(); + for (int i = 0; i <= totalPages; i++) { + queue.add(String.valueOf(i)); + } + + initiateThreading(queue); + + } catch (Exception e) { + e.printStackTrace(); + } + + } + + @Override + protected ObjectMapper customizeObjectMapper(ObjectMapper objectMapper) { + return RestConfig.config.getJacksonObjectMapperFactory().createObjectMapper(); + } + + protected void startSingleThread(LinkedBlockingDeque queue) { + while (true) { + try { + if (queue.isEmpty()) { + return; + } + String page = queue.takeFirst(); + SearchResponse resp = service + .getGeneToGeneOrthology(Integer.valueOf(page), indexerConfig.getBufferSize()); + List docs = createGeneToGeneOrthologyDocuments(resp.getResults()); + + indexDocuments(docs); + } catch (Exception e) { + log.error("Error while indexing...", e); + System.exit(-1); + return; + } + } + } + + private List createGeneToGeneOrthologyDocuments( + List g2gOrthoList) { + List documents = new ArrayList<>(); + for (GeneToGeneOrthologyGenerated g2gOrtho : g2gOrthoList) { + GeneToGeneOrthologyDocument document = new GeneToGeneOrthologyDocument(); + + document.setGeneToGeneOrthologyGenerated(g2gOrtho); + createStringencyFilter(g2gOrtho, document); + createGeneAnnotations(g2gOrtho, document); + removeAnnotationLists(document); + + documents.add(document); + } + return documents; + } + + private void createStringencyFilter(GeneToGeneOrthologyGenerated g2gOrtho, GeneToGeneOrthologyDocument document) { + if (Boolean.TRUE.equals(g2gOrtho.getStrictFilter())) { + document.setStringencyFilter("stringent"); + } else if (Boolean.TRUE.equals(g2gOrtho.getModerateFilter())) { + document.setStringencyFilter("moderate"); + } + } + + private void createGeneAnnotations(GeneToGeneOrthologyGenerated g2gOrtho, GeneToGeneOrthologyDocument document) { + Map map = new HashMap<>(); + putGeneInfo(map, g2gOrtho.getSubjectGene()); + putGeneInfo(map, g2gOrtho.getObjectGene()); + document.setGeneAnnotations(map); + } + + private void putGeneInfo(Map map, Gene gene) { + Map data = new HashMap<>(); + data.put("hasExpressionAnnotations", hasExpressionAnnotations(gene)); + data.put("hasDiseaseAnnotations", hasDiseaseAnnotations(gene)); + map.put(gene.getIdentifier(), data); + } + + private boolean hasDiseaseAnnotations(Gene gene) { + return CollectionUtils.isNotEmpty(gene.getGeneDiseaseAnnotations()); + } + + private boolean hasExpressionAnnotations(Gene gene) { + return CollectionUtils.isNotEmpty(gene.getGeneExpressionAnnotations()); + } + + private void removeAnnotationLists(GeneToGeneOrthologyDocument document) { + document.getGeneToGeneOrthologyGenerated().getSubjectGene().setGeneDiseaseAnnotations(null); + document.getGeneToGeneOrthologyGenerated().getSubjectGene().setGeneExpressionAnnotations(null); + document.getGeneToGeneOrthologyGenerated().getObjectGene().setGeneDiseaseAnnotations(null); + document.getGeneToGeneOrthologyGenerated().getObjectGene().setGeneExpressionAnnotations(null); + } + +} diff --git a/agr_indexer/src/main/java/org/alliancegenome/indexer/indexers/curation/interfaces/GeneToGeneOrthologyGeneratedInterface.java b/agr_indexer/src/main/java/org/alliancegenome/indexer/indexers/curation/interfaces/GeneToGeneOrthologyGeneratedInterface.java index b4b16cea1..38c413008 100644 --- a/agr_indexer/src/main/java/org/alliancegenome/indexer/indexers/curation/interfaces/GeneToGeneOrthologyGeneratedInterface.java +++ b/agr_indexer/src/main/java/org/alliancegenome/indexer/indexers/curation/interfaces/GeneToGeneOrthologyGeneratedInterface.java @@ -27,4 +27,12 @@ SearchResponse findForPublic( @DefaultValue("0") @QueryParam("page") Integer page, @DefaultValue("10") @QueryParam("limit") Integer limit, HashMap params); + + @POST + @Path("/findForPublic") + SearchResponse findForPublic( + @DefaultValue("0") @QueryParam("page") Integer page, + @DefaultValue("10") @QueryParam("limit") Integer limit, + @DefaultValue("ForPublic") @QueryParam("view") String view, + HashMap params); } diff --git a/agr_indexer/src/main/java/org/alliancegenome/indexer/indexers/curation/service/GeneToGeneOrthologyService.java b/agr_indexer/src/main/java/org/alliancegenome/indexer/indexers/curation/service/GeneToGeneOrthologyService.java new file mode 100644 index 000000000..61e9af2ee --- /dev/null +++ b/agr_indexer/src/main/java/org/alliancegenome/indexer/indexers/curation/service/GeneToGeneOrthologyService.java @@ -0,0 +1,26 @@ +package org.alliancegenome.indexer.indexers.curation.service; + +import java.util.HashMap; + +import org.alliancegenome.core.config.ConfigHelper; +import org.alliancegenome.curation_api.model.entities.orthology.GeneToGeneOrthologyGenerated; +import org.alliancegenome.curation_api.response.SearchResponse; +import org.alliancegenome.indexer.RestConfig; +import org.alliancegenome.indexer.indexers.curation.interfaces.GeneToGeneOrthologyGeneratedInterface; + +import si.mazi.rescu.RestProxyFactory; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class GeneToGeneOrthologyService { + private final GeneToGeneOrthologyGeneratedInterface orthologyApi = RestProxyFactory.createProxy(GeneToGeneOrthologyGeneratedInterface.class, ConfigHelper.getCurationApiUrl(), RestConfig.config); + + public SearchResponse getGeneToGeneOrthology(Integer page, Integer limit) { + + HashMap params = new HashMap<>(); + params.put("internal", false); + params.put("obsolete", false); + + return orthologyApi.findForPublic(page, limit, "GeneToGeneOrthologyForIndexer", params); + } +} diff --git a/agr_java_core/src/main/java/org/alliancegenome/api/entity/GeneToGeneOrthologyDocument.java b/agr_java_core/src/main/java/org/alliancegenome/api/entity/GeneToGeneOrthologyDocument.java new file mode 100644 index 000000000..90ae204b6 --- /dev/null +++ b/agr_java_core/src/main/java/org/alliancegenome/api/entity/GeneToGeneOrthologyDocument.java @@ -0,0 +1,25 @@ +package org.alliancegenome.api.entity; + +import java.util.Map; + +import org.alliancegenome.curation_api.model.entities.orthology.GeneToGeneOrthologyGenerated; +import org.alliancegenome.es.index.ESDocument; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data @EqualsAndHashCode(callSuper = true) +public class GeneToGeneOrthologyDocument extends ESDocument { + + protected String category = "gene_to_gene_orthology"; + private String stringencyFilter = "all"; + private Map geneAnnotations; + + private GeneToGeneOrthologyGenerated geneToGeneOrthologyGenerated; + + @Override + public String getType() { + return category; + } + +} diff --git a/agr_java_core/src/main/java/org/alliancegenome/cache/repository/OrthologyCacheRepository.java b/agr_java_core/src/main/java/org/alliancegenome/cache/repository/OrthologyCacheRepository.java index 9e7736e41..6bc43fa3c 100644 --- a/agr_java_core/src/main/java/org/alliancegenome/cache/repository/OrthologyCacheRepository.java +++ b/agr_java_core/src/main/java/org/alliancegenome/cache/repository/OrthologyCacheRepository.java @@ -8,7 +8,7 @@ import java.util.stream.Collectors; import org.alliancegenome.cache.repository.helper.JsonResultResponse; -import org.alliancegenome.cache.repository.helper.OrthologyFiltering; +import org.alliancegenome.cache.repository.helper.OrthologyNeoCacheFiltering; import org.alliancegenome.cache.repository.helper.OrthologySorting; import org.alliancegenome.core.api.service.FilterService; import org.alliancegenome.es.index.site.doclet.OrthologyDoclet; @@ -191,7 +191,7 @@ public JsonResultResponse getOrthologyMultiGeneJson(List ge long start = System.currentTimeMillis(); List homologViewList = repo.getAllOrthologyGenes(geneIDs); //filtering - FilterService filterService = new FilterService<>(new OrthologyFiltering()); + FilterService filterService = new FilterService<>(new OrthologyNeoCacheFiltering()); List homologViewFiltered = filterService.filterAnnotations(homologViewList, pagination.getFieldFilterValueMap()); List paginatedViewFiltered = homologViewFiltered.stream() @@ -275,7 +275,7 @@ public JsonResultResponse getOrthologyByTwoSpecies(String taxonIDOn JsonResultResponse response = new JsonResultResponse<>(); //filtering - FilterService filterService = new FilterService<>(new OrthologyFiltering()); + FilterService filterService = new FilterService<>(new OrthologyNeoCacheFiltering()); List filteredOrthologyList = filterService.filterAnnotations(homologViewList, pagination.getFieldFilterValueMap()); response.setTotal(filteredOrthologyList.size()); @@ -292,7 +292,7 @@ public JsonResultResponse getOrthologyBySpecies(String taxonIDOne, JsonResultResponse response = new JsonResultResponse<>(); //filtering - FilterService filterService = new FilterService<>(new OrthologyFiltering()); + FilterService filterService = new FilterService<>(new OrthologyNeoCacheFiltering()); List filteredOrthologyList = filterService.filterAnnotations(homologViewList, pagination.getFieldFilterValueMap()); response.setTotal(filteredOrthologyList.size()); diff --git a/agr_java_core/src/main/java/org/alliancegenome/cache/repository/helper/OrthologyFiltering.java b/agr_java_core/src/main/java/org/alliancegenome/cache/repository/helper/OrthologyFiltering.java index 156cf6c5c..48dbae516 100644 --- a/agr_java_core/src/main/java/org/alliancegenome/cache/repository/helper/OrthologyFiltering.java +++ b/agr_java_core/src/main/java/org/alliancegenome/cache/repository/helper/OrthologyFiltering.java @@ -1,24 +1,27 @@ package org.alliancegenome.cache.repository.helper; +import java.util.List; +import java.util.stream.Collectors; + +import org.alliancegenome.api.entity.GeneToGeneOrthologyDocument; import org.alliancegenome.es.model.query.FieldFilter; -import org.alliancegenome.neo4j.view.HomologView; import org.alliancegenome.neo4j.view.OrthologyFilter.Stringency; import org.apache.commons.collections.CollectionUtils; -public class OrthologyFiltering extends AnnotationFiltering { +public class OrthologyFiltering extends AnnotationFiltering { - public FilterFunction stringencyFilter = - (orthologView, value) -> { + public FilterFunction stringencyFilter = + (orthoDoc, value) -> { Stringency stringency = Stringency.getOrthologyFilter(value); if (stringency == null) { return false; } if (stringency.equals(Stringency.STRINGENT)) { - return FilterFunction.contains(orthologView.getStringencyFilter(), value); + return FilterFunction.contains(orthoDoc.getStringencyFilter(), value); } if (stringency.equals(Stringency.MODERATE)) { - return FilterFunction.contains(orthologView.getStringencyFilter(), value) || FilterFunction.contains(orthologView.getStringencyFilter(), Stringency.STRINGENT.name()); + return FilterFunction.contains(orthoDoc.getStringencyFilter(), value) || FilterFunction.contains(orthoDoc.getStringencyFilter(), Stringency.STRINGENT.name()); } if (stringency.equals(Stringency.ALL)) { return true; @@ -26,12 +29,18 @@ public class OrthologyFiltering extends AnnotationFiltering { return false; }; - public FilterFunction methodFilter = - (orthologView, value) -> { - if (CollectionUtils.isEmpty(orthologView.getPredictionMethodsMatched())) { + public FilterFunction methodFilter = + (orthoDoc, value) -> { + if (CollectionUtils.isEmpty(orthoDoc.getGeneToGeneOrthologyGenerated().getPredictionMethodsMatched())) { return false; } - String concatenatedMethods = String.join(",", orthologView.getPredictionMethodsMatched()); + List concatenatedMethodsList = orthoDoc.getGeneToGeneOrthologyGenerated().getPredictionMethodsMatched() + .stream() + .map(method -> method.getVocabulary().getName()) + .collect(Collectors.toList()); + + String concatenatedMethods = String.join(",", concatenatedMethodsList); + return FilterFunction.contains(concatenatedMethods, value); }; diff --git a/agr_java_core/src/main/java/org/alliancegenome/cache/repository/helper/OrthologyNeoCacheFiltering.java b/agr_java_core/src/main/java/org/alliancegenome/cache/repository/helper/OrthologyNeoCacheFiltering.java new file mode 100644 index 000000000..cddbce09e --- /dev/null +++ b/agr_java_core/src/main/java/org/alliancegenome/cache/repository/helper/OrthologyNeoCacheFiltering.java @@ -0,0 +1,43 @@ +package org.alliancegenome.cache.repository.helper; + +import org.alliancegenome.es.model.query.FieldFilter; +import org.alliancegenome.neo4j.view.HomologView; +import org.alliancegenome.neo4j.view.OrthologyFilter.Stringency; +import org.apache.commons.collections.CollectionUtils; + +public class OrthologyNeoCacheFiltering extends AnnotationFiltering { + + + public FilterFunction stringencyFilter = + (orthologView, value) -> { + Stringency stringency = Stringency.getOrthologyFilter(value); + if (stringency == null) { + return false; + } + if (stringency.equals(Stringency.STRINGENT)) { + return FilterFunction.contains(orthologView.getStringencyFilter(), value); + } + if (stringency.equals(Stringency.MODERATE)) { + return FilterFunction.contains(orthologView.getStringencyFilter(), value) || FilterFunction.contains(orthologView.getStringencyFilter(), Stringency.STRINGENT.name()); + } + if (stringency.equals(Stringency.ALL)) { + return true; + } + return false; + }; + + public FilterFunction methodFilter = + (orthologView, value) -> { + if (CollectionUtils.isEmpty(orthologView.getPredictionMethodsMatched())) { + return false; + } + String concatenatedMethods = String.join(",", orthologView.getPredictionMethodsMatched()); + return FilterFunction.contains(concatenatedMethods, value); + }; + + public OrthologyNeoCacheFiltering() { + filterFieldMap.put(FieldFilter.STRINGENCY, stringencyFilter); + filterFieldMap.put(FieldFilter.ORTHOLOGY_METHOD, methodFilter); + } + +}