File tree Expand file tree Collapse file tree 6 files changed +94
-8
lines changed
Filter options
src/org/immutables/criteria/reactor
test/org/immutables/criteria/reactor
src/org/immutables/criteria/repository/rxjava2
test/org/immutables/criteria/repository/rxjava2 Expand file tree Collapse file tree 6 files changed +94
-8
lines changed
Original file line number Diff line number Diff line change 73
73
<type >test-jar</type >
74
74
<scope >test</scope >
75
75
</dependency >
76
+ <dependency >
77
+ <groupId >org.immutables</groupId >
78
+ <artifactId >criteria-inmemory</artifactId >
79
+ <version >${project.version} </version >
80
+ <scope >test</scope >
81
+ </dependency >
76
82
<dependency >
77
83
<groupId >io.projectreactor</groupId >
78
84
<artifactId >reactor-test</artifactId >
Original file line number Diff line number Diff line change 17
17
package org .immutables .criteria .reactor ;
18
18
19
19
import org .immutables .criteria .backend .Backend ;
20
+ import org .immutables .criteria .expression .ImmutableQuery ;
20
21
import org .immutables .criteria .expression .Query ;
21
22
import org .immutables .criteria .repository .reactive .ReactiveFetcher ;
22
23
import reactor .core .publisher .Flux ;
23
24
import reactor .core .publisher .Mono ;
24
25
25
26
import java .util .Objects ;
27
+ import java .util .function .UnaryOperator ;
26
28
27
- class ReactorFetcherDelegate <T > implements ReactorFetcher <T > {
29
+ class ReactorFetcherDelegate <T > implements ReactorFetcher <T >, ReactorFetcher . DistinctLimitOffset < T > {
28
30
29
31
private final ReactiveFetcher <T > delegate ;
30
32
31
33
private ReactorFetcherDelegate (ReactiveFetcher <T > delegate ) {
32
34
this .delegate = Objects .requireNonNull (delegate , "delegate" );
33
35
}
34
36
37
+ private ReactorFetcherDelegate <T > changeQuery (UnaryOperator <Query > fn ) {
38
+ return new ReactorFetcherDelegate <>(delegate .changeQuery (fn ));
39
+ }
40
+
41
+
42
+ @ Override
43
+ public LimitOffset <T > distinct () {
44
+ return changeQuery (query -> ImmutableQuery .copyOf (query ).withDistinct (true ));
45
+ }
46
+
47
+ @ Override
48
+ public Offset <T > limit (long limit ) {
49
+ return changeQuery (query -> ImmutableQuery .copyOf (query ).withLimit (limit ));
50
+ }
51
+
52
+ @ Override
53
+ public ReactorFetcherDelegate <T > offset (long offset ) {
54
+ return changeQuery (query -> ImmutableQuery .copyOf (query ).withOffset (offset ));
55
+ }
56
+
35
57
@ Override
36
58
public Flux <T > fetch () {
37
59
return Flux .from (delegate .fetch ());
Original file line number Diff line number Diff line change 17
17
package org .immutables .criteria .reactor ;
18
18
19
19
import org .immutables .criteria .Criteria ;
20
+ import org .immutables .criteria .inmemory .InMemoryBackend ;
20
21
import org .immutables .criteria .repository .FakeBackend ;
21
22
import org .immutables .value .Value ;
22
23
import org .junit .jupiter .api .Test ;
@@ -33,10 +34,22 @@ void empty() {
33
34
34
35
@ Test
35
36
void single () {
36
- ReactorModelRepository repo = new ReactorModelRepository (new FakeBackend (Flux .just (ImmutableReactorModel .builder ().build ())));
37
+ ReactorModelRepository repo = new ReactorModelRepository (new FakeBackend (Flux .just (ImmutableReactorModel .builder ().id ( "id1" ). build ())));
37
38
StepVerifier .create (repo .findAll ().fetch ()).thenRequest (1 ).expectNextCount (1 ).expectComplete ().verify ();
38
39
}
39
40
41
+ /**
42
+ * Validate the projections work with different types of facets (see {@link org.immutables.criteria.repository.Facet}).
43
+ */
44
+ @ Test
45
+ void projection () {
46
+ // need in-memory backend because of projections. FakeBackend does not support projections.
47
+ InMemoryBackend backend = new InMemoryBackend ();
48
+ ReactorModelRepository repo = new ReactorModelRepository (backend );
49
+ repo .insert (ImmutableReactorModel .builder ().id ("id1" ).build ()).block ();
50
+ StepVerifier .create (repo .findAll ().select (ReactorModelCriteria .reactorModel .id ).limit (1 ).offset (0 ).fetch ()).thenRequest (1 ).expectNext ("id1" ).expectComplete ().verify ();
51
+ }
52
+
40
53
@ Test
41
54
void error () {
42
55
ReactorModelRepository repo = new ReactorModelRepository (new FakeBackend (Flux .error (new RuntimeException ("boom" ))));
@@ -46,5 +59,8 @@ void error() {
46
59
@ Value .Immutable
47
60
@ Criteria
48
61
@ Criteria .Repository (facets = {ReactorReadable .class , ReactorWritable .class , ReactorWatchable .class })
49
- interface ReactorModel {}
50
- }
62
+ interface ReactorModel {
63
+ @ Criteria .Id
64
+ String id ();
65
+ }
66
+ }
Original file line number Diff line number Diff line change 20
20
import io .reactivex .Maybe ;
21
21
import io .reactivex .Single ;
22
22
import org .immutables .criteria .backend .Backend ;
23
+ import org .immutables .criteria .expression .ImmutableQuery ;
23
24
import org .immutables .criteria .expression .Query ;
24
25
import org .immutables .criteria .repository .reactive .ReactiveFetcher ;
25
26
26
27
import java .util .Objects ;
28
+ import java .util .function .UnaryOperator ;
27
29
28
- class RxJavaFetcherDelegate <T > implements RxJavaFetcher <T > {
30
+ class RxJavaFetcherDelegate <T > implements RxJavaFetcher <T >, RxJavaFetcher . DistinctLimitOffset < T > {
29
31
30
32
private final ReactiveFetcher <T > delegate ;
31
33
@@ -65,4 +67,24 @@ static <T> RxJavaFetcherDelegate<T> fromReactive(ReactiveFetcher<T> delegate) {
65
67
static <T > RxJavaFetcherDelegate <T > of (Query query , Backend .Session session ) {
66
68
return fromReactive (ReactiveFetcher .of (query , session ));
67
69
}
70
+
71
+ private RxJavaFetcherDelegate <T > changeQuery (UnaryOperator <Query > fn ) {
72
+ return new RxJavaFetcherDelegate <>(delegate .changeQuery (fn ));
73
+ }
74
+
75
+
76
+ @ Override
77
+ public LimitOffset <T > distinct () {
78
+ return changeQuery (query -> ImmutableQuery .copyOf (query ).withDistinct (true ));
79
+ }
80
+
81
+ @ Override
82
+ public Offset <T > limit (long limit ) {
83
+ return changeQuery (query -> ImmutableQuery .copyOf (query ).withLimit (limit ));
84
+ }
85
+
86
+ @ Override
87
+ public RxJavaFetcher <T > offset (long offset ) {
88
+ return changeQuery (query -> ImmutableQuery .copyOf (query ).withOffset (offset ));
89
+ }
68
90
}
Original file line number Diff line number Diff line change @@ -55,7 +55,7 @@ protected RxJavaReader<T> newReader(Query query) {
55
55
return new RxJavaReader <>(query , session );
56
56
}
57
57
58
- public <T1 > RxJavaMapper1 <T1 > select (Projection <T1 > proj1 ) {
58
+ public <T1 > RxJavaMapper1 . DistinctLimitOffset <T1 > select (Projection <T1 > proj1 ) {
59
59
Query newQuery = this .query .addProjections (Matchers .toExpression (proj1 ));
60
60
return new RxJavaMappers .Mapper1 <T1 >(newQuery , session );
61
61
}
Original file line number Diff line number Diff line change @@ -34,10 +34,27 @@ void empty() {
34
34
35
35
@ Test
36
36
void single () {
37
- RxJavaModelRepository repo = new RxJavaModelRepository (new FakeBackend (Flowable .just (ImmutableRxJavaModel .builder ().build ())));
37
+ RxJavaModelRepository repo = new RxJavaModelRepository (new FakeBackend (Flowable .just (ImmutableRxJavaModel .builder ().id ( "id1" ). build ())));
38
38
repo .findAll ().fetch ().test ().awaitDone (1 , TimeUnit .SECONDS ).assertValueCount (1 );
39
39
}
40
40
41
+ /**
42
+ * Validate the projections work with different types of facets (see {@link org.immutables.criteria.repository.Facet}).
43
+ */
44
+ @ Test
45
+ void projection () {
46
+ // TODO: can't use InMemoryBackend because of circular dependency.
47
+ RxJavaModelRepository repo = new RxJavaModelRepository (new FakeBackend (Flowable .just (ImmutableRxJavaModel .builder ().id ("id1" ).build ())));
48
+ repo .findAll ()
49
+ //.select(RxJavaModelCriteria.rxJavaModel.id) TODO: FakeBackend does not support projections
50
+ .limit (1 )
51
+ .offset (0 )
52
+ .fetch ()
53
+ .test ()
54
+ .awaitDone (1 , TimeUnit .SECONDS )
55
+ .assertValueCount (1 );
56
+ }
57
+
41
58
@ Test
42
59
void error () {
43
60
RxJavaModelRepository repo = new RxJavaModelRepository (new FakeBackend (Flowable .error (new RuntimeException ("boom" ))));
@@ -47,5 +64,8 @@ void error() {
47
64
@ Value .Immutable
48
65
@ Criteria
49
66
@ Criteria .Repository (facets = {RxJavaReadable .class , RxJavaWritable .class , RxJavaWatchable .class })
50
- interface RxJavaModel {}
67
+ interface RxJavaModel {
68
+ @ Criteria .Id
69
+ String id ();
70
+ }
51
71
}
You can’t perform that action at this time.
0 commit comments