15
15
*/
16
16
package org .springframework .data .elasticsearch .core ;
17
17
18
+ import static java .util .Collections .*;
18
19
import static org .assertj .core .api .Assertions .*;
19
20
import static org .elasticsearch .index .query .QueryBuilders .*;
20
21
import static org .springframework .data .elasticsearch .annotations .FieldType .*;
24
25
import lombok .Data ;
25
26
import lombok .EqualsAndHashCode ;
26
27
import lombok .NoArgsConstructor ;
28
+ import org .elasticsearch .index .query .IdsQueryBuilder ;
27
29
import org .springframework .dao .OptimisticLockingFailureException ;
28
30
import org .springframework .data .elasticsearch .core .mapping .SeqNoPrimaryTerm ;
31
+ import org .springframework .data .elasticsearch .core .query .Query ;
29
32
import reactor .core .publisher .Mono ;
30
33
import reactor .test .StepVerifier ;
31
34
@@ -858,6 +861,61 @@ void shouldReturnEmptyFluxOnSaveAllWithEmptyInput() {
858
861
.verifyComplete ();
859
862
}
860
863
864
+ @ Test // DATAES-799
865
+ void getShouldReturnSeqNoPrimaryTerm () {
866
+ OptimisticEntity original = new OptimisticEntity ();
867
+ original .setMessage ("It's fine" );
868
+ OptimisticEntity saved = template .save (original ).block ();
869
+
870
+ template .get (saved .getId (), OptimisticEntity .class )
871
+ .as (StepVerifier ::create )
872
+ .assertNext (this ::assertThatSeqNoPrimaryTermIsFilled )
873
+ .verifyComplete ();
874
+ }
875
+
876
+ private void assertThatSeqNoPrimaryTermIsFilled (OptimisticEntity retrieved ) {
877
+ assertThat (retrieved .seqNoPrimaryTerm ).isNotNull ();
878
+ assertThat (retrieved .seqNoPrimaryTerm .getSequenceNumber ()).isNotNull ();
879
+ assertThat (retrieved .seqNoPrimaryTerm .getSequenceNumber ()).isNotNegative ();
880
+ assertThat (retrieved .seqNoPrimaryTerm .getPrimaryTerm ()).isNotNull ();
881
+ assertThat (retrieved .seqNoPrimaryTerm .getPrimaryTerm ()).isPositive ();
882
+ }
883
+
884
+ @ Test // DATAES-799
885
+ void multiGetShouldReturnSeqNoPrimaryTerm () {
886
+ OptimisticEntity original = new OptimisticEntity ();
887
+ original .setMessage ("It's fine" );
888
+ OptimisticEntity saved = template .save (original ).block ();
889
+
890
+ template .multiGet (multiGetQueryForOne (saved .getId ()), OptimisticEntity .class , template .getIndexCoordinatesFor (OptimisticEntity .class ))
891
+ .as (StepVerifier ::create )
892
+ .assertNext (this ::assertThatSeqNoPrimaryTermIsFilled )
893
+ .verifyComplete ();
894
+ }
895
+
896
+ private Query multiGetQueryForOne (String id ) {
897
+ return new NativeSearchQueryBuilder ().withIds (singletonList (id )).build ();
898
+ }
899
+
900
+ @ Test // DATAES-799
901
+ void searchShouldReturnSeqNoPrimaryTerm () {
902
+ OptimisticEntity original = new OptimisticEntity ();
903
+ original .setMessage ("It's fine" );
904
+ OptimisticEntity saved = template .save (original ).block ();
905
+
906
+ template .search (searchQueryForOne (saved .getId ()), OptimisticEntity .class , template .getIndexCoordinatesFor (OptimisticEntity .class ))
907
+ .map (SearchHit ::getContent )
908
+ .as (StepVerifier ::create )
909
+ .assertNext (this ::assertThatSeqNoPrimaryTermIsFilled )
910
+ .verifyComplete ();
911
+ }
912
+
913
+ private Query searchQueryForOne (String id ) {
914
+ return new NativeSearchQueryBuilder ()
915
+ .withFilter (new IdsQueryBuilder ().addIds (id ))
916
+ .build ();
917
+ }
918
+
861
919
@ Test // DATAES-799
862
920
void shouldThrowOptimisticLockingFailureExceptionWhenConcurrentUpdateOccursOnEntityWithSeqNoPrimaryTermProperty () {
863
921
OptimisticEntity original = new OptimisticEntity ();
@@ -876,6 +934,40 @@ void shouldThrowOptimisticLockingFailureExceptionWhenConcurrentUpdateOccursOnEnt
876
934
.expectError (OptimisticLockingFailureException .class )
877
935
.verify ();
878
936
}
937
+
938
+ @ Test // DATAES-799
939
+ void shouldThrowOptimisticLockingFailureExceptionWhenConcurrentUpdateOccursOnVersionedEntityWithSeqNoPrimaryTermProperty () {
940
+ OptimisticAndVersionedEntity original = new OptimisticAndVersionedEntity ();
941
+ original .setMessage ("It's fine" );
942
+ OptimisticAndVersionedEntity saved = template .save (original ).block ();
943
+
944
+ OptimisticAndVersionedEntity forEdit1 = template .get (saved .getId (), OptimisticAndVersionedEntity .class ).block ();
945
+ OptimisticAndVersionedEntity forEdit2 = template .get (saved .getId (), OptimisticAndVersionedEntity .class ).block ();
946
+
947
+ forEdit1 .setMessage ("It'll be ok" );
948
+ template .save (forEdit1 ).block ();
949
+
950
+ forEdit2 .setMessage ("It'll be great" );
951
+ template .save (forEdit2 )
952
+ .as (StepVerifier ::create )
953
+ .expectError (OptimisticLockingFailureException .class )
954
+ .verify ();
955
+ }
956
+
957
+ @ Test // DATAES-799
958
+ void shouldAllowFullReplaceOfEntityWithBothSeqNoPrimaryTermAndVersion () {
959
+ OptimisticAndVersionedEntity original = new OptimisticAndVersionedEntity ();
960
+ original .setMessage ("It's fine" );
961
+ OptimisticAndVersionedEntity saved = template .save (original ).block ();
962
+
963
+ OptimisticAndVersionedEntity forEdit = template .get (saved .getId (), OptimisticAndVersionedEntity .class ).block ();
964
+
965
+ forEdit .setMessage ("It'll be ok" );
966
+ template .save (forEdit )
967
+ .as (StepVerifier ::create )
968
+ .expectNextCount (1 )
969
+ .verifyComplete ();
970
+ }
879
971
880
972
@ Data
881
973
@ Document (indexName = "marvel" )
@@ -952,10 +1044,19 @@ static class SampleEntity {
952
1044
}
953
1045
954
1046
@ Data
955
- @ Document (indexName = DEFAULT_INDEX )
1047
+ @ Document (indexName = "test-index-reactive-optimistic-entity-template" )
956
1048
static class OptimisticEntity {
957
1049
@ Id private String id ;
958
1050
private String message ;
959
1051
private SeqNoPrimaryTerm seqNoPrimaryTerm ;
960
1052
}
1053
+
1054
+ @ Data
1055
+ @ Document (indexName = "test-index-reactive-optimistic-and-versioned-entity-template" )
1056
+ static class OptimisticAndVersionedEntity {
1057
+ @ Id private String id ;
1058
+ private String message ;
1059
+ private SeqNoPrimaryTerm seqNoPrimaryTerm ;
1060
+ @ Version private Long version ;
1061
+ }
961
1062
}
0 commit comments