Skip to content

Commit 0c1c7de

Browse files
committed
Merge branch 'release-1.1.3'
2 parents 1126a61 + 22329d4 commit 0c1c7de

File tree

6 files changed

+123
-24
lines changed

6 files changed

+123
-24
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
<groupId>ubc.pavlab</groupId>
77
<artifactId>rdp</artifactId>
8-
<version>1.1.2</version>
8+
<version>1.1.3</version>
99

1010
<parent>
1111
<groupId>org.springframework.boot</groupId>

src/main/java/ubc/pavlab/rdp/controllers/UserController.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public Collection<UserGene> getGenes() {
8080
}
8181

8282
@RequestMapping(value = "/user/term", method = RequestMethod.GET)
83-
public Set<UserTerm> getTerms() {
83+
public List<UserTerm> getTerms() {
8484
return userService.findCurrentUser().getUserTerms();
8585
}
8686

src/main/java/ubc/pavlab/rdp/model/User.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,7 @@
1212
import ubc.pavlab.rdp.model.enums.TierType;
1313

1414
import javax.persistence.*;
15-
import java.util.HashMap;
16-
import java.util.HashSet;
17-
import java.util.Map;
18-
import java.util.Set;
15+
import java.util.*;
1916
import java.util.stream.Collectors;
2017

2118

@@ -75,7 +72,7 @@ public class User {
7572
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
7673
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
7774
@JoinColumn(name = "user_id")
78-
private Set<UserTerm> userTerms = new HashSet<>();
75+
private List<UserTerm> userTerms = new ArrayList<>();
7976

8077
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
8178
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "user")

src/main/java/ubc/pavlab/rdp/model/UserGene.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
@Getter
2525
@Setter
2626
@NoArgsConstructor
27-
@ToString
27+
@ToString(callSuper = true)
2828
public class UserGene extends Gene {
2929

3030
@Id

src/main/java/ubc/pavlab/rdp/services/UserServiceImpl.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ public User confirmVerificationToken( String token ) {
392392
}
393393

394394
private Collection<Gene> calculatedGenesInTaxon( User user, Taxon taxon ) {
395-
return goService.getGenes( user.getUserTerms(), taxon );
395+
return goService.getGenes( user.getTermsByTaxon( taxon ), taxon );
396396
}
397397

398398
private boolean removeGenesFromUserByTaxon( User user, Taxon taxon ) {

src/test/java/ubc/pavlab/rdp/services/UserServiceImplTest.java

+117-15
Original file line numberDiff line numberDiff line change
@@ -715,12 +715,12 @@ public void updateTermsAndGenesInTaxon_whenUserHasNoGeneOrTerms() {
715715

716716
userService.updateTermsAndGenesInTaxon( user, taxon, geneTierMap, terms );
717717

718-
assertThatUserTermsAreEqualTo( user, terms );
718+
assertThatUserTermsAreEqualTo( user, taxon, terms );
719719

720720
Map<Gene, TierType> expectedGenes = new HashMap<>( geneTierMap );
721721
calculatedGenes.forEach( g -> expectedGenes.putIfAbsent( g, TierType.TIER3 ) );
722722

723-
assertThatUserGenesAreEqualTo( user, expectedGenes );
723+
assertThatUserGenesAreEqualTo( user, taxon, expectedGenes );
724724

725725
}
726726

@@ -757,12 +757,70 @@ public void updateTermsAndGenesInTaxon_whenUserHasGenesAndTerms() {
757757

758758
userService.updateTermsAndGenesInTaxon( user, taxon, geneTierMap, terms );
759759

760-
assertThatUserTermsAreEqualTo( user, terms );
760+
assertThatUserTermsAreEqualTo( user, taxon, terms );
761761

762762
Map<Gene, TierType> expectedGenes = new HashMap<>( geneTierMap );
763763
calculatedGenes.forEach( g -> expectedGenes.putIfAbsent( g, TierType.TIER3 ) );
764764

765-
assertThatUserGenesAreEqualTo( user, expectedGenes );
765+
assertThatUserGenesAreEqualTo( user, taxon, expectedGenes );
766+
767+
}
768+
769+
@Test
770+
public void updateTermsAndGenesInTaxon_whenUserHasGenesAndTermsInMultipleTaxons() {
771+
User user = createUser( 1 );
772+
773+
Taxon taxon = createTaxon( 1 );
774+
Gene geneWillBeRemoved = createGene( 999, taxon );
775+
GeneOntologyTerm termWillBeRemoved = createTermWithGene( toGOId( geneWillBeRemoved.getGeneId() ), geneWillBeRemoved );
776+
user.getUserTerms().add( createUserTerm( 1, termWillBeRemoved, taxon ) );
777+
user.getUserGenes().put( geneWillBeRemoved.getGeneId(), createUserGene( 1, geneWillBeRemoved, user, TierType.TIER1 ) );
778+
779+
Gene geneWillChangeTier = createGene( 5, taxon );
780+
GeneOntologyTerm termWillRemain = createTermWithGene( toGOId( geneWillChangeTier.getGeneId() ), geneWillChangeTier );
781+
user.getUserTerms().add( createUserTerm( 2, termWillRemain, taxon ) );
782+
user.getUserGenes().put( geneWillChangeTier.getGeneId(), createUserGene( 2, geneWillChangeTier, user, TierType.TIER3 ) );
783+
784+
// Taxon 2
785+
Taxon taxon2 = createTaxon( 2 );
786+
Gene geneOtherTaxon = createGene( 9999, taxon2 );
787+
GeneOntologyTerm termOtherTaxon = createTermWithGene( toGOId( geneOtherTaxon.getGeneId() ), geneOtherTaxon );
788+
user.getUserTerms().add( createUserTerm( 3, termOtherTaxon, taxon2 ) );
789+
user.getUserGenes().put( geneOtherTaxon.getGeneId(), createUserGene( 3, geneOtherTaxon, user, TierType.TIER1 ) );
790+
791+
Gene geneOtherTaxon2 = createGene( 5555, taxon2 );
792+
GeneOntologyTerm termOtherTaxon2 = createTermWithGene( toGOId( geneOtherTaxon2.getGeneId() ), geneOtherTaxon2 );
793+
user.getUserTerms().add( createUserTerm( 4, termOtherTaxon2, taxon2 ) );
794+
user.getUserGenes().put( geneOtherTaxon2.getGeneId(), createUserGene( 4, geneOtherTaxon2, user, TierType.TIER3 ) );
795+
796+
becomeUser( user );
797+
798+
Collection<GeneOntologyTerm> terms = IntStream.range( 1, 10 ).boxed().map(
799+
nbr -> createTermWithGene( toGOId( nbr ), createGene( nbr, taxon ) )
800+
).collect( Collectors.toSet() );
801+
802+
Mockito.when( goService.getGenes( Mockito.anyCollectionOf( GeneOntologyTerm.class ), Mockito.any() ) )
803+
.then( i -> {
804+
Collection<GeneOntologyTerm> givenTerms = i.getArgumentAt( 0, Collection.class );
805+
return givenTerms.stream().flatMap( t -> t.getDirectGenes().stream() ).collect( Collectors.toSet() );
806+
} );
807+
808+
Map<Gene, TierType> geneTierMap = Maps.newHashMap( geneWillChangeTier, TierType.TIER1 );
809+
810+
userService.updateTermsAndGenesInTaxon( user, taxon, geneTierMap, terms );
811+
812+
assertThatUserTermsAreEqualTo( user, taxon, terms );
813+
assertThatUserTermsAreEqualTo( user, taxon2, Sets.newSet( termOtherTaxon, termOtherTaxon2 ) );
814+
815+
Map<Gene, TierType> expectedGenes = new HashMap<>( geneTierMap );
816+
terms.stream().flatMap( t -> t.getDirectGenes().stream() ).forEach( g -> expectedGenes.putIfAbsent( g, TierType.TIER3 ) );
817+
818+
Map<Gene, TierType> expectedGenesTaxon2 = new HashMap<>();
819+
expectedGenesTaxon2.put( geneOtherTaxon, TierType.TIER1 );
820+
expectedGenesTaxon2.put( geneOtherTaxon2, TierType.TIER3 );
821+
822+
assertThatUserGenesAreEqualTo( user, taxon, expectedGenes );
823+
assertThatUserGenesAreEqualTo( user, taxon2, expectedGenesTaxon2 );
766824

767825
}
768826

@@ -788,12 +846,12 @@ public void updateTermsAndGenesInTaxon_whenManualAndCalculatedGenesOverlap_thenK
788846

789847
userService.updateTermsAndGenesInTaxon( user, taxon, geneTierMap, terms );
790848

791-
assertThatUserTermsAreEqualTo( user, terms );
849+
assertThatUserTermsAreEqualTo( user, taxon, terms );
792850

793851
Map<Gene, TierType> expectedGenes = new HashMap<>( geneTierMap );
794852
calculatedGenes.forEach( g -> expectedGenes.putIfAbsent( g, TierType.TIER3 ) );
795853

796-
assertThatUserGenesAreEqualTo( user, expectedGenes );
854+
assertThatUserGenesAreEqualTo( user, taxon, expectedGenes );
797855
}
798856

799857
@Test
@@ -827,12 +885,12 @@ public void updateTermsAndGenesInTaxon_whenOldAndNewOverlap_thenRetainIds() {
827885
userService.updateTermsAndGenesInTaxon( user, taxon, geneTierMap, terms );
828886

829887
// Might as well test this
830-
assertThatUserTermsAreEqualTo( user, terms );
888+
assertThatUserTermsAreEqualTo( user, taxon, terms );
831889

832890
Map<Gene, TierType> expectedGenes = new HashMap<>( geneTierMap );
833891
calculatedGenes.forEach( g -> expectedGenes.putIfAbsent( g, TierType.TIER3 ) );
834892

835-
assertThatUserGenesAreEqualTo( user, expectedGenes );
893+
assertThatUserGenesAreEqualTo( user, taxon, expectedGenes );
836894

837895
// This is really why we're here
838896
assertThat( user.getUserTerms().iterator().next().getId() ).isEqualTo( 1 );
@@ -873,16 +931,60 @@ public void updateTermsAndGenesInTaxon_whenUserHasGenesAndTerms_thenUpdateFreque
873931

874932
}
875933

876-
private void assertThatUserTermsAreEqualTo( User user, Collection<GeneOntologyTerm> terms ) {
877-
assertThat( user.getUserTerms() ).hasSize( terms.size() );
878-
assertThat( user.getUserTerms().stream().map( GeneOntologyTerm::getGoId ).collect( Collectors.toSet() ) )
934+
@Test
935+
public void updateTermsAndGenesInTaxon_whenTermsOverlapInDifferentSpecies_thenKeepBothTerms() {
936+
User user = createUser( 1 );
937+
Taxon taxon = createTaxon( 1 );
938+
Taxon taxon2 = createTaxon( 2 );
939+
940+
// These should retain ids so that Hibernate does not delete and re insert rows
941+
Gene geneInTaxon1 = createGene( 5, taxon );
942+
GeneOntologyTerm termInTaxon1 = createTermWithGene( toGOId( geneInTaxon1.getGeneId() ), geneInTaxon1 );
943+
user.getUserTerms().add( createUserTerm( 1, termInTaxon1, taxon ) );
944+
user.getUserGenes().put( geneInTaxon1.getGeneId(), createUserGene( 1, geneInTaxon1, user, TierType.TIER3 ) );
945+
946+
Gene geneInTaxon2 = createGene( 105, taxon2 );
947+
GeneOntologyTerm termInTaxon2 = createTermWithGene( toGOId( geneInTaxon2.getGeneId() ), geneInTaxon2 );
948+
user.getUserTerms().add( createUserTerm( 2, termInTaxon2, taxon2 ) );
949+
user.getUserGenes().put( geneInTaxon2.getGeneId(), createUserGene( 2, geneInTaxon2, user, TierType.TIER3 ) );
950+
951+
becomeUser( user );
952+
953+
// Mock goService.getRelatedGenes
954+
Collection<Gene> calculatedGenes = Collections.singleton( createGene( 205, taxon ) );
955+
Mockito.when( goService.getGenes( Mockito.anyCollectionOf( GeneOntologyTerm.class ), Mockito.eq( taxon ) ) ).thenReturn( calculatedGenes );
956+
Mockito.when( goService.getGenes( Mockito.anyCollectionOf( GeneOntologyTerm.class ), Mockito.eq( taxon2 ) ) ).thenReturn( Collections.emptySet() );
957+
958+
// Attempting to add term to taxon 1 that is already present in taxon 2
959+
Collection<GeneOntologyTerm> terms = Collections.singleton( createTermWithGene( toGOId( 105 ), createGene( 1005, taxon ) ) );
960+
961+
Map<Gene, TierType> geneTierMap = terms.stream()
962+
.flatMap( t -> t.getDirectGenes().stream() )
963+
.collect( Collectors.toMap( Function.identity(), g -> TierType.TIER1 ) );
964+
965+
userService.updateTermsAndGenesInTaxon( user, taxon, geneTierMap, terms );
966+
967+
// Why we are here
968+
assertThatUserTermsAreEqualTo( user, taxon, terms );
969+
assertThatUserTermsAreEqualTo( user, taxon2, Collections.singleton( termInTaxon2 ));
970+
971+
Map<Gene, TierType> expectedGenes = new HashMap<>( geneTierMap );
972+
calculatedGenes.forEach( g -> expectedGenes.putIfAbsent( g, TierType.TIER3 ) );
973+
974+
assertThatUserGenesAreEqualTo( user, taxon, expectedGenes );
975+
assertThatUserGenesAreEqualTo( user, taxon2, Maps.newHashMap( geneInTaxon2, TierType.TIER3 ) );
976+
977+
}
978+
979+
private void assertThatUserTermsAreEqualTo( User user, Taxon taxon, Collection<GeneOntologyTerm> terms ) {
980+
assertThat( user.getUserTerms().stream().filter( t -> t.getTaxon().equals( taxon ) ).count() ).isEqualTo( terms.size() );
981+
assertThat( user.getUserTerms().stream().filter( t -> t.getTaxon().equals( taxon ) ).map( GeneOntologyTerm::getGoId ).collect( Collectors.toSet() ) )
879982
.isEqualTo( terms.stream().map( GeneOntologyTerm::getGoId ).collect( Collectors.toSet() ) );
880983
}
881984

882-
private void assertThatUserGenesAreEqualTo( User user, Map<Gene, TierType> expectedGenes ) {
883-
assertThat( user.getUserGenes().keySet() )
884-
.containsExactlyElementsOf( expectedGenes.keySet().stream().map( Gene::getGeneId )
885-
.collect( Collectors.toSet() ) );
985+
private void assertThatUserGenesAreEqualTo( User user, Taxon taxon, Map<Gene, TierType> expectedGenes ) {
986+
assertThat( user.getGenesByTaxon( taxon ) )
987+
.containsExactlyElementsOf( expectedGenes.keySet() );
886988
expectedGenes.forEach( ( g, tier ) -> assertThat( user.getUserGenes().get( g.getGeneId() ).getTier() ).isEqualTo( tier ) );
887989
}
888990

0 commit comments

Comments
 (0)