Skip to content

Commit

Permalink
review comments
Browse files Browse the repository at this point in the history
  • Loading branch information
nitin-ebi committed Sep 10, 2024
1 parent 95fa3b9 commit d4f1e7c
Show file tree
Hide file tree
Showing 4 changed files with 214 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -192,8 +192,7 @@ public QueryResponse getChromosomes(@RequestParam(name = "species") String speci
MultiMongoDbFactory.setDatabaseNameForCurrentThread(DBAdaptorConnector.getDBName(species));
List<String> chromosomeList = new ArrayList<>(service.findDistinctChromosomes());

if (contigNamingConvention != null && !contigNamingConvention.equals(ContigNamingConvention.NO_REPLACEMENT)
&& !contigNamingConvention.equals(ContigNamingConvention.INSDC)) {
if (contigAliasService.skipContigTranslation(contigNamingConvention)) {
chromosomeList = chromosomeList.stream().map(chromosome -> {
String translatedChromosome = contigAliasService.translateContigFromInsdc(chromosome, contigNamingConvention);
if (translatedChromosome.equals("")) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,14 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import uk.ac.ebi.eva.commons.core.models.VariantType;
import uk.ac.ebi.eva.commons.core.models.contigalias.ContigNamingConvention;
import uk.ac.ebi.eva.commons.core.models.ws.VariantWithSamplesAndAnnotation;
import uk.ac.ebi.eva.commons.mongodb.services.AnnotationMetadataNotFoundException;
import uk.ac.ebi.eva.commons.mongodb.services.VariantWithSamplesAndAnnotationsService;
import uk.ac.ebi.eva.lib.eva_utils.DBAdaptorConnector;
import uk.ac.ebi.eva.lib.eva_utils.MultiMongoDbFactory;
import uk.ac.ebi.eva.server.ws.EvaWSServer;
import uk.ac.ebi.eva.server.ws.contigalias.ContigAliasService;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
Expand All @@ -47,6 +49,9 @@ public class GA4GHBeaconWSServer extends EvaWSServer {
@Autowired
private VariantWithSamplesAndAnnotationsService service;

@Autowired
private ContigAliasService contigAliasService;

protected static Logger logger = LoggerFactory.getLogger(GA4GHBeaconWSServer.class);

public GA4GHBeaconWSServer() { }
Expand All @@ -56,6 +61,8 @@ public GA4GHBeaconResponse beacon(@RequestParam("referenceName") String chromoso
@RequestParam("start") long start,
@RequestParam("allele") String allele,
@RequestParam("datasetIds") List<String> studies,
@RequestParam(name = "contigNamingConvention", required = false)
ContigNamingConvention contigNamingConvention,
HttpServletResponse response)
throws IOException, AnnotationMetadataNotFoundException {
initializeQuery();
Expand All @@ -76,6 +83,10 @@ public GA4GHBeaconResponse beacon(@RequestParam("referenceName") String chromoso
variantEntities = service.findByChromosomeAndStartAndAltAndStudyIn(chromosome, start, allele, studies, null);
}

String translatedContig = contigAliasService.translateContigFromInsdc(chromosome, contigNamingConvention);
if (translatedContig != null && !translatedContig.isEmpty()) {
chromosome = translatedContig;
}
return new GA4GHBeaconResponse(chromosome, start, allele, String.join(",", studies),
variantEntities.size() > 0);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import uk.ac.ebi.eva.commons.core.models.Region;
import uk.ac.ebi.eva.commons.core.models.contigalias.ContigNamingConvention;
import uk.ac.ebi.eva.commons.core.models.ws.VariantWithSamplesAndAnnotation;
import uk.ac.ebi.eva.commons.mongodb.filter.FilterBuilder;
import uk.ac.ebi.eva.commons.mongodb.filter.VariantRepositoryFilter;
Expand All @@ -43,6 +44,7 @@
import uk.ac.ebi.eva.lib.eva_utils.MultiMongoDbFactory;
import uk.ac.ebi.eva.server.Utils;
import uk.ac.ebi.eva.server.ws.EvaWSServer;
import uk.ac.ebi.eva.server.ws.contigalias.ContigAliasService;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
Expand All @@ -59,6 +61,9 @@ public class GA4GHVariantWSServer extends EvaWSServer {
@Autowired
private VariantWithSamplesAndAnnotationsService service;

@Autowired
private ContigAliasService contigAliasService;

protected static Logger logger = LoggerFactory.getLogger(GA4GHVariantWSServer.class);

public GA4GHVariantWSServer() {
Expand All @@ -76,6 +81,8 @@ public GASearchVariantsResponse getVariantsByRegion(@RequestParam("referenceName
// @RequestParam("variantName") String id,
@RequestParam(name = "variantSetIds", required = false) List<String> files,
// @RequestParam(name = "callSetIds", required = false) String samples,
@RequestParam(name = "contigNamingConvention", required = false)
ContigNamingConvention contigNamingConvention,
@RequestParam(name = "pageToken", required = false) String pageToken,
@RequestParam(name = "pageSize", defaultValue = "10") int limit)
throws UnknownHostException, IOException, AnnotationMetadataNotFoundException {
Expand All @@ -97,7 +104,8 @@ public GASearchVariantsResponse getVariantsByRegion(@RequestParam("referenceName
List<VariantWithSamplesAndAnnotation> variantEntities = service.findByRegionsAndComplexFilters(regions, filters,
null, null,
pageRequest);
List<VariantWithSamplesAndAnnotation> variants = Collections.unmodifiableList(variantEntities);
List<VariantWithSamplesAndAnnotation> variants = Collections.unmodifiableList(
contigAliasService.getVariantsWithTranslatedContig(variantEntities, contigNamingConvention));

Long numTotalResults = service.countByRegionsAndComplexFilters(regions, filters);

Expand All @@ -111,11 +119,13 @@ public GASearchVariantsResponse getVariantsByRegion(@RequestParam("referenceName
}

@RequestMapping(value = "/search", method = RequestMethod.POST, consumes = "application/json")
public GASearchVariantsResponse getVariantsByRegion(GASearchVariantRequest request)
public GASearchVariantsResponse getVariantsByRegion(GASearchVariantRequest request,
@RequestParam(name = "contigNamingConvention", required = false)
ContigNamingConvention contigNamingConvention)
throws UnknownHostException, IOException, AnnotationMetadataNotFoundException {
request.validate();
return getVariantsByRegion(request.getReferenceName(), request.getStart(), request.getEnd(),
request.getVariantSetIds(), request.getPageToken(), request.getPageSize());
request.getVariantSetIds(), contigNamingConvention, request.getPageToken(), request.getPageSize());
}

@ExceptionHandler(IllegalArgumentException.class)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
package uk.ac.ebi.eva.server.contigalias;

import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.web.client.RestTemplate;
import uk.ac.ebi.eva.commons.core.models.Annotation;
import uk.ac.ebi.eva.commons.core.models.FeatureCoordinates;
import uk.ac.ebi.eva.commons.core.models.contigalias.ContigAliasChromosome;
import uk.ac.ebi.eva.commons.core.models.contigalias.ContigAliasEmbedded;
import uk.ac.ebi.eva.commons.core.models.contigalias.ContigAliasResponse;
import uk.ac.ebi.eva.commons.core.models.contigalias.ContigNamingConvention;
import uk.ac.ebi.eva.commons.core.models.ws.VariantWithSamplesAndAnnotation;
import uk.ac.ebi.eva.server.ws.contigalias.ContigAliasService;

import java.util.Arrays;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.when;

public class ContigAliasServiceTest {

@Mock
private RestTemplate restTemplate;

@InjectMocks
private ContigAliasService contigAliasService;

private final String contigAliasUrl = "http://example.com";

@Before
public void setup() {
MockitoAnnotations.initMocks(this);
contigAliasService = new ContigAliasService(restTemplate, contigAliasUrl);
}

@Test
public void testSkipContigTranslation() {
assertTrue(contigAliasService.skipContigTranslation(null));
assertTrue(contigAliasService.skipContigTranslation(ContigNamingConvention.INSDC));
assertTrue(contigAliasService.skipContigTranslation(ContigNamingConvention.NO_REPLACEMENT));
assertFalse(contigAliasService.skipContigTranslation(ContigNamingConvention.UCSC));
assertFalse(contigAliasService.skipContigTranslation(ContigNamingConvention.ENA_SEQUENCE_NAME));
assertFalse(contigAliasService.skipContigTranslation(ContigNamingConvention.REFSEQ));
}


@Test
public void testGetVariantsWithTranslatedContig() {
List<VariantWithSamplesAndAnnotation> variantsList = Arrays.asList(new VariantWithSamplesAndAnnotation("1", 1000, 1005,
"A", "T", "rs1"));

// skip translation
List<VariantWithSamplesAndAnnotation> result = contigAliasService
.getVariantsWithTranslatedContig(variantsList, ContigNamingConvention.INSDC);
assertEquals("1", result.get(0).getChromosome());

// no translation
when(restTemplate.getForObject(anyString(), eq(ContigAliasResponse.class)))
.thenReturn(new ContigAliasResponse());
result = contigAliasService
.getVariantsWithTranslatedContig(variantsList, ContigNamingConvention.ENA_SEQUENCE_NAME);
assertEquals("1", result.get(0).getChromosome());

// with translation
when(restTemplate.getForObject(anyString(), eq(ContigAliasResponse.class)))
.thenReturn(getContigAliasResponse(ContigNamingConvention.ENA_SEQUENCE_NAME, "chr1"));
result = contigAliasService
.getVariantsWithTranslatedContig(variantsList, ContigNamingConvention.ENA_SEQUENCE_NAME);
assertEquals("chr1", result.get(0).getChromosome());
}

@Test
public void testGetFeatureCoordinatesWithTranslatedContig() {
List<FeatureCoordinates> featureCoordinatesList = Arrays.asList(new FeatureCoordinates("id", "fbx02", "feature", "1", 0, 1));

// skip translation
List<FeatureCoordinates> result = contigAliasService
.getFeatureCoordinatesWithTranslatedContig(featureCoordinatesList, ContigNamingConvention.INSDC);
assertEquals("1", result.get(0).getChromosome());

// no translation
when(restTemplate.getForObject(anyString(), eq(ContigAliasResponse.class))).thenReturn(new ContigAliasResponse());
result = contigAliasService.getFeatureCoordinatesWithTranslatedContig(featureCoordinatesList, ContigNamingConvention.ENA_SEQUENCE_NAME);
assertEquals("1", result.get(0).getChromosome());

// with translation
when(restTemplate.getForObject(anyString(), eq(ContigAliasResponse.class)))
.thenReturn(getContigAliasResponse(ContigNamingConvention.ENA_SEQUENCE_NAME, "chr1"));
result = contigAliasService.getFeatureCoordinatesWithTranslatedContig(featureCoordinatesList, ContigNamingConvention.ENA_SEQUENCE_NAME);
assertEquals("chr1", result.get(0).getChromosome());
}

@Test
public void testGetAnnotationWithTranslatedContig() {
Annotation annotation = new Annotation("1", 0, 0, null, null, null, null);

// skip translation
Annotation result = contigAliasService
.getAnnotationWithTranslatedContig(annotation, ContigNamingConvention.INSDC);
assertEquals("1", result.getChromosome());

// no translation
when(restTemplate.getForObject(anyString(), eq(ContigAliasResponse.class))).thenReturn(new ContigAliasResponse());
result = contigAliasService.getAnnotationWithTranslatedContig(annotation, ContigNamingConvention.ENA_SEQUENCE_NAME);
assertEquals("1", result.getChromosome());

// with translation
when(restTemplate.getForObject(anyString(), eq(ContigAliasResponse.class)))
.thenReturn(getContigAliasResponse(ContigNamingConvention.ENA_SEQUENCE_NAME, "chr1"));
result = contigAliasService.getAnnotationWithTranslatedContig(annotation, ContigNamingConvention.ENA_SEQUENCE_NAME);
assertEquals("chr1", result.getChromosome());
}

@Test
public void testTranslateContigFromInsdc() {
// no translation
when(restTemplate.getForObject(anyString(), eq(ContigAliasResponse.class))).thenReturn(new ContigAliasResponse());
String translatedContig = contigAliasService.translateContigFromInsdc("1", ContigNamingConvention.ENA_SEQUENCE_NAME);
assertEquals("", translatedContig);

// with translation
when(restTemplate.getForObject(anyString(), eq(ContigAliasResponse.class)))
.thenReturn(getContigAliasResponse(ContigNamingConvention.ENA_SEQUENCE_NAME, "chr1"));
translatedContig = contigAliasService.translateContigFromInsdc("1", ContigNamingConvention.ENA_SEQUENCE_NAME);
assertEquals("chr1", translatedContig);

}

@Test
public void testTranslateContigToInsdc() {
// no translation
when(restTemplate.getForObject(anyString(), eq(ContigAliasResponse.class))).thenReturn(new ContigAliasResponse());
String translatedContig = contigAliasService.translateContigToInsdc("1", "asm1", null);
assertEquals("1", translatedContig);

// with refseq translation
when(restTemplate.getForObject(anyString(), eq(ContigAliasResponse.class)))
.thenReturn(getContigAliasResponse(ContigNamingConvention.INSDC, "chr1"));
translatedContig = contigAliasService.translateContigToInsdc("1", "asm1", ContigNamingConvention.REFSEQ);
assertEquals("chr1", translatedContig);

// with ena_seq_name translation
when(restTemplate.getForObject(anyString(), eq(ContigAliasResponse.class)))
.thenReturn(getContigAliasResponse(ContigNamingConvention.INSDC, "chr1"));
translatedContig = contigAliasService.translateContigToInsdc("1", "asm1", ContigNamingConvention.ENA_SEQUENCE_NAME);
assertEquals("chr1", translatedContig);

}


private ContigAliasResponse getContigAliasResponse(ContigNamingConvention contigNamingConvention, String chromosome) {
ContigAliasChromosome contigAliasChromosome = new ContigAliasChromosome();
switch (contigNamingConvention) {
case GENBANK_SEQUENCE_NAME:
contigAliasChromosome.setGenbankSequenceName(chromosome);
break;
case REFSEQ:
contigAliasChromosome.setRefseq(chromosome);
break;
case UCSC:
contigAliasChromosome.setUcscName(chromosome);
break;
case ENA_SEQUENCE_NAME:
contigAliasChromosome.setEnaSequenceName(chromosome);
break;
case INSDC:
contigAliasChromosome.setInsdcAccession(chromosome);
break;
}

ContigAliasEmbedded contigAliasEmbedded = new ContigAliasEmbedded();
contigAliasEmbedded.setContigAliasChromosomes(Arrays.asList(contigAliasChromosome));

ContigAliasResponse contigAliasResponse = new ContigAliasResponse();
contigAliasResponse.setEmbedded(contigAliasEmbedded);

return contigAliasResponse;
}


}

0 comments on commit d4f1e7c

Please sign in to comment.