Skip to content

Commit

Permalink
feat : adds R2DBC Test (#1627)
Browse files Browse the repository at this point in the history
* feat : adds R2DBC Test

* fix void dereference issue

* use Jooq auto mapping feature

* adds more assertions

* format sql and removes unnecessary initialization

* moves common logic to repository

* expose as a method for reusability

* make more readable
  • Loading branch information
rajadilipkolli authored Jan 8, 2025
1 parent 82d1c3a commit 62ff5e3
Show file tree
Hide file tree
Showing 14 changed files with 454 additions and 185 deletions.
6 changes: 6 additions & 0 deletions r2dbc/boot-jooq-r2dbc-sample/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,12 @@
<style>AOSP</style>
</googleJavaFormat>
</java>
<sql>
<includes>
<include>src/main/resources/**/*.sql</include>
</includes>
<dbeaver />
</sql>
</configuration>
<executions>
<execution>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,37 @@
import static com.example.jooq.r2dbc.testcontainersflyway.db.tables.PostComments.POST_COMMENTS;
import static com.example.jooq.r2dbc.testcontainersflyway.db.tables.Posts.POSTS;
import static com.example.jooq.r2dbc.testcontainersflyway.db.tables.Tags.TAGS;
import static org.jooq.impl.DSL.multiset;
import static org.jooq.impl.DSL.select;

import com.example.jooq.r2dbc.config.logging.Loggable;
import com.example.jooq.r2dbc.model.response.PostCommentResponse;
import com.example.jooq.r2dbc.model.response.PostResponse;
import com.example.jooq.r2dbc.repository.PostRepository;
import com.example.jooq.r2dbc.testcontainersflyway.db.tables.records.PostCommentsRecord;
import com.example.jooq.r2dbc.testcontainersflyway.db.tables.records.PostsRecord;
import com.example.jooq.r2dbc.testcontainersflyway.db.tables.records.PostsTagsRecord;
import com.example.jooq.r2dbc.testcontainersflyway.db.tables.records.TagsRecord;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jooq.DSLContext;
import org.jooq.DeleteUsingStep;
import org.jooq.Record1;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;

@Component
@RequiredArgsConstructor
@Slf4j
public class Initializer implements CommandLineRunner {

private static final Logger log = LoggerFactory.getLogger(Initializer.class);
private final DSLContext dslContext;
private final PostRepository postRepository;

public Initializer(DSLContext dslContext, PostRepository postRepository) {
this.dslContext = dslContext;
this.postRepository = postRepository;
}

@Override
@Loggable
public void run(String... args) {
log.info("Running Initializer.....");
log.info("Running Initializer to use JOOQ only...");
DeleteUsingStep<PostsTagsRecord> postsTagsRecordDeleteUsingStep =
dslContext.deleteFrom(POSTS_TAGS);
DeleteUsingStep<TagsRecord> tagsRecordDeleteUsingStep = dslContext.deleteFrom(TAGS);
Expand Down Expand Up @@ -89,40 +90,9 @@ public void run(String... args) {
"test comments 2")
.returningResult(POST_COMMENTS.ID))
.collectList())
.thenMany(
dslContext
.select(
POSTS.ID,
POSTS.TITLE,
POSTS.CONTENT,
multiset(
select(
POST_COMMENTS.ID,
POST_COMMENTS.CONTENT,
POST_COMMENTS.CREATED_AT)
.from(POST_COMMENTS)
.where(
POST_COMMENTS.POST_ID.eq(
POSTS.ID)))
.as("comments")
.convertFrom(
record3s ->
record3s.into(
PostCommentResponse.class)),
multiset(
select(TAGS.NAME)
.from(TAGS)
.join(POSTS_TAGS)
.on(TAGS.ID.eq(POSTS_TAGS.TAG_ID))
.where(
POSTS_TAGS.POST_ID.eq(
POSTS.ID)))
.as("tags")
.convertFrom(record -> record.map(Record1::value1)))
.from(POSTS)
.orderBy(POSTS.CREATED_AT))
.thenMany(postRepository.retrievePostsWithCommentsAndTags(null))
.subscribe(
data -> log.debug("Retrieved data: {}", data.into(PostResponse.class)),
data -> log.debug("Retrieved data: {}", data),
error -> log.debug("error: ", error),
() -> log.debug("done"));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,13 @@

import java.time.LocalDateTime;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;

@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(value = "post_comments")
public class Comment {

Expand All @@ -35,4 +25,42 @@ public class Comment {

@Column("post_id")
private UUID postId;

public Comment() {}

public UUID getId() {
return id;
}

public Comment setId(UUID id) {
this.id = id;
return this;
}

public String getContent() {
return content;
}

public Comment setContent(String content) {
this.content = content;
return this;
}

public LocalDateTime getCreatedAt() {
return createdAt;
}

public Comment setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
return this;
}

public UUID getPostId() {
return postId;
}

public Comment setPostId(UUID postId) {
this.postId = postId;
return this;
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
package com.example.jooq.r2dbc.entities;

import com.example.jooq.r2dbc.model.Status;
import java.time.LocalDateTime;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
Expand All @@ -16,12 +12,7 @@
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;

@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(value = "posts")
public class Post {

Expand All @@ -36,7 +27,6 @@ public class Post {
private String content;

@Column("status")
@Builder.Default
private Status status = Status.DRAFT;

@Column("created_at")
Expand All @@ -54,4 +44,78 @@ public class Post {
@Column("version")
@Version
private Short version;

public Post() {}

public UUID getId() {
return id;
}

public Post setId(UUID id) {
this.id = id;
return this;
}

public String getTitle() {
return title;
}

public Post setTitle(String title) {
this.title = title;
return this;
}

public String getContent() {
return content;
}

public Post setContent(String content) {
this.content = content;
return this;
}

public Status getStatus() {
return status;
}

public Post setStatus(Status status) {
this.status = status;
return this;
}

public LocalDateTime getCreatedAt() {
return createdAt;
}

public Post setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
return this;
}

public String getCreatedBy() {
return createdBy;
}

public Post setCreatedBy(String createdBy) {
this.createdBy = createdBy;
return this;
}

public LocalDateTime getUpdatedAt() {
return updatedAt;
}

public Post setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
return this;
}

public Short getVersion() {
return version;
}

public Post setVersion(Short version) {
this.version = version;
return this;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.jooq.r2dbc.entities;
package com.example.jooq.r2dbc.model;

public enum Status {
DRAFT,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package com.example.jooq.r2dbc.model.response;

import com.example.jooq.r2dbc.model.Status;
import java.util.List;
import java.util.UUID;

public record PostResponse(
UUID id,
String title,
String content,
String createdBy,
Status status,
List<PostCommentResponse> comments,
List<String> tags) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.example.jooq.r2dbc.repository;

import com.example.jooq.r2dbc.entities.PostTagRelation;
import java.util.UUID;
import org.springframework.data.r2dbc.repository.R2dbcRepository;

public interface PostTagRepository extends R2dbcRepository<PostTagRelation, UUID> {}
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package com.example.jooq.r2dbc.repository.custom;

import com.example.jooq.r2dbc.model.response.PostResponse;
import org.jooq.Condition;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public interface CustomPostRepository {
Mono<Page<PostResponse>> findByKeyword(String keyword, Pageable pageable);

Flux<PostResponse> retrievePostsWithCommentsAndTags(Condition condition);
}
Loading

0 comments on commit 62ff5e3

Please sign in to comment.