Skip to content

Commit

Permalink
Finished example/jimmer-sql-graphql
Browse files Browse the repository at this point in the history
  • Loading branch information
babyfish-ct committed May 26, 2022
1 parent 691b158 commit 2994580
Show file tree
Hide file tree
Showing 48 changed files with 886 additions and 541 deletions.
7 changes: 3 additions & 4 deletions example/jimmer-sql-graphql/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,15 @@ repositories {

dependencies {

implementation 'org.babyfish.jimmer:jimmer-core:0.0.12'
implementation 'org.babyfish.jimmer:jimmer-sql:0.0.12'
annotationProcessor 'org.babyfish.jimmer:jimmer-apt:0.0.12'
implementation 'org.babyfish.jimmer:jimmer-core:0.0.14'
implementation 'org.babyfish.jimmer:jimmer-sql:0.0.14'
annotationProcessor 'org.babyfish.jimmer:jimmer-apt:0.0.14'

implementation 'org.springframework.boot:spring-boot-starter-graphql'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'

runtimeOnly 'com.h2database:h2:2.1.212'
runtimeOnly 'org.flywaydb:flyway-core:8.5.11'

implementation 'com.graphql-java:graphql-java-extended-scalars:18.1'

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class GraphQLConfig {
public RuntimeWiringConfigurer runtimeWiringConfigurer() {

return wiringBuilder -> wiringBuilder
.scalar(ExtendedScalars.UUID)
.scalar(ExtendedScalars.GraphQLLong)
.scalar(ExtendedScalars.GraphQLBigDecimal);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.babyfish.jimmer.sql.example.graphql.cfg;

import org.babyfish.jimmer.sql.SqlClient;
import org.babyfish.jimmer.sql.dialect.H2Dialect;
import org.babyfish.jimmer.sql.example.graphql.entities.Gender;
import org.babyfish.jimmer.sql.runtime.*;
import org.slf4j.Logger;
Expand All @@ -11,8 +12,13 @@
import org.springframework.jdbc.datasource.DataSourceUtils;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import java.util.function.Function;

Expand All @@ -25,6 +31,11 @@ public class SqlClientConfig {
public SqlClient sqlClient(DataSource dataSource) {
return SqlClient.newBuilder()
.setConnectionManager(
/*
* It's very important to use
* "org.springframework.jdbc.datasource.DataSourceUtils"!
* This is spring transaction aware ConnectionManager
*/
new ConnectionManager() {
@Override
public <R> R execute(Function<Connection, R> block) {
Expand All @@ -37,7 +48,13 @@ public <R> R execute(Function<Connection, R> block) {
}
}
)
.setDialect(
new H2Dialect() // Support sequence
)
.setExecutor(
/*
* Log SQL and variables
*/
new Executor() {
@Override
public <R> R execute(
Expand Down Expand Up @@ -66,5 +83,32 @@ public <R> R execute(
.build();
}


@Bean
public ApplicationRunner initializeH2DatabaseRunner(SqlClient sqlClient) {
return args -> {
sqlClient.getConnectionManager().execute(con -> {
InputStream inputStream = SqlClient.class
.getClassLoader()
.getResourceAsStream("h2-database.sql");
if (inputStream == null) {
throw new RuntimeException("no h2-database.sql");
}
try (Reader reader = new InputStreamReader(inputStream)) {
char[] buf = new char[1024];
StringBuilder builder = new StringBuilder();
while (true) {
int len = reader.read(buf);
if (len == -1) {
break;
}
builder.append(buf, 0, len);
}
con.createStatement().execute(builder.toString());
} catch (IOException | SQLException ex) {
throw new RuntimeException("Cannot initialize h2 database", ex);
}
return null;
});
};
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package org.babyfish.jimmer.sql.example.graphql.controller;

import org.babyfish.jimmer.sql.SqlClient;
import org.babyfish.jimmer.sql.ast.mutation.AffectedTable;
import org.babyfish.jimmer.sql.example.graphql.dal.AuthorRepository;
import org.babyfish.jimmer.sql.example.graphql.entities.Author;
import org.babyfish.jimmer.sql.example.graphql.entities.AuthorTableEx;
import org.babyfish.jimmer.sql.example.graphql.entities.Book;
import org.babyfish.jimmer.sql.example.graphql.input.AuthorInput;
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.BatchMapping;
import org.springframework.graphql.data.method.annotation.MutationMapping;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Controller;
Expand Down Expand Up @@ -48,4 +51,19 @@ public Map<Author, List<Book>> books(
(q, book) -> q.orderBy(book.name())
).batchLoad(authors);
}

// --- Mutation ---

@MutationMapping
public Author saveAuthor(@Argument AuthorInput input) {
return sqlClient.getEntities().save(input.toAuthor()).getModifiedEntity();
}

@MutationMapping
public int deleteAuthor(@Argument long id) {
return sqlClient
.getEntities()
.delete(Author.class, id)
.getAffectedRowCount(AffectedTable.of(Author.class));
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.babyfish.jimmer.sql.example.graphql.controller;

import org.babyfish.jimmer.sql.SqlClient;
import org.babyfish.jimmer.sql.ast.mutation.AffectedTable;
import org.babyfish.jimmer.sql.example.graphql.dal.BookRepository;
import org.babyfish.jimmer.sql.example.graphql.entities.*;
import org.babyfish.jimmer.sql.example.graphql.input.BookInput;
Expand Down Expand Up @@ -71,10 +72,15 @@ public Map<Book, List<Author>> authors(List<Book> books) {
@MutationMapping
@Transactional
public Book saveBook(@Argument BookInput input) {
return sqlClient.getEntities().save(input.toBook()).getModifiedEntity();
}

@MutationMapping
@Transactional
public int deleteBook(long id) {
return sqlClient
.getEntities()
.saveCommand(input.toBook())
.execute()
.getModifiedEntity();
.delete(Book.class, id)
.getAffectedRowCount(AffectedTable.of(Book.class));
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package org.babyfish.jimmer.sql.example.graphql.controller;

import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import org.babyfish.jimmer.sql.SqlClient;
import org.babyfish.jimmer.sql.ast.mutation.AffectedTable;
import org.babyfish.jimmer.sql.example.graphql.dal.BookRepository;
import org.babyfish.jimmer.sql.example.graphql.dal.BookStoreRepository;
import org.babyfish.jimmer.sql.example.graphql.entities.Book;
Expand All @@ -18,7 +20,6 @@
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -67,7 +68,7 @@ public Map<BookStore, List<Book>> books(

@BatchMapping
public Map<BookStore, BigDecimal> avgPrice(List<BookStore> stores) {
Map<UUID, BigDecimal> avgPriceMap =
Map<Long, BigDecimal> avgPriceMap =
bookRepository.findAvgPricesByStoreIds(
stores.stream().map(BookStore::id).collect(Collectors.toList())
);
Expand All @@ -87,10 +88,15 @@ public Map<BookStore, BigDecimal> avgPrice(List<BookStore> stores) {
@MutationMapping
@Transactional
public BookStore saveBookStore(@Argument BookStoreInput input) {
return sqlClient.getEntities().save(input.toBookStore()).getModifiedEntity();
}

@MutationMapping
@Transactional
public int deleteBookStore(Long id) {
return sqlClient
.getEntities()
.saveCommand(input.toBookStore())
.execute()
.getModifiedEntity();
.delete(BookStore.class, id)
.getAffectedRowCount(AffectedTable.of(BookStore.class));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.babyfish.jimmer.sql.SqlClient;
import org.babyfish.jimmer.sql.ast.LikeMode;
import org.babyfish.jimmer.sql.ast.Predicate;
import org.babyfish.jimmer.sql.example.graphql.entities.Author;
import org.babyfish.jimmer.sql.example.graphql.entities.AuthorTable;
import org.springframework.lang.Nullable;
Expand All @@ -19,8 +20,10 @@ public List<Author> find(@Nullable String name) {
return sqlClient.createQuery(AuthorTable.class, (q, author) -> {
if (StringUtils.hasText(name)) {
q.where(
author.firstName().ilike(name, LikeMode.START),
author.lastName().ilike(name, LikeMode.START)
Predicate.or(
author.firstName().ilike(name, LikeMode.START),
author.lastName().ilike(name, LikeMode.START)
)
);
}
q.orderBy(author.firstName());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.babyfish.jimmer.sql.SqlClient;
import org.babyfish.jimmer.sql.ast.LikeMode;
import org.babyfish.jimmer.sql.ast.Predicate;
import org.babyfish.jimmer.sql.ast.tuple.Tuple2;
import org.babyfish.jimmer.sql.example.graphql.entities.AuthorTableEx;
import org.babyfish.jimmer.sql.example.graphql.entities.Book;
Expand All @@ -14,7 +15,6 @@
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.UUID;

@Repository
public class BookRepository {
Expand Down Expand Up @@ -42,8 +42,9 @@ public List<Book> find(
book.id().in(
q.createSubQuery(AuthorTableEx.class, (sq, author) -> {
sq.where(
author.firstName().ilike(authorName, LikeMode.START).or(
author.lastName().ilike(authorName, LikeMode.START)
Predicate.or(
author.firstName().ilike(authorName, LikeMode.START),
author.lastName().ilike(authorName, LikeMode.START)
)
);
return sq.select(author.books().id());
Expand All @@ -57,8 +58,8 @@ public List<Book> find(
}).execute();
}

public Map<UUID, BigDecimal> findAvgPricesByStoreIds(
Collection<UUID> storeIds
public Map<Long, BigDecimal> findAvgPricesByStoreIds(
Collection<Long> storeIds
) {
return Tuple2.toMap(
sqlClient.createQuery(BookTable.class, (q, book) -> {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,20 @@
package org.babyfish.jimmer.sql.example.graphql.entities;

import org.babyfish.jimmer.sql.Key;
import org.babyfish.jimmer.sql.meta.UUIDIdGenerator;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import java.util.List;
import java.util.UUID;

@Entity
public interface Author {

@Id
@GeneratedValue(generator = UUIDIdGenerator.FULL_NAME)
UUID id();
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "sequence:AUTHOR_ID_SEQ"
)
long id();

@Key
@NotBlank
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
package org.babyfish.jimmer.sql.example.graphql.entities;

import org.babyfish.jimmer.sql.Key;
import org.babyfish.jimmer.sql.meta.UUIDIdGenerator;

import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Positive;
import java.math.BigDecimal;
import java.util.List;
import java.util.UUID;

@Entity
public interface Book {

@Id
@GeneratedValue(generator = UUIDIdGenerator.FULL_NAME)
UUID id();
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "sequence:BOOK_ID_SEQ"
)
long id();

@Key
@NotBlank
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
package org.babyfish.jimmer.sql.example.graphql.entities;

import org.babyfish.jimmer.sql.Key;
import org.babyfish.jimmer.sql.meta.UUIDIdGenerator;
import org.springframework.lang.Nullable;

import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
import java.util.List;
import java.util.UUID;

@Entity
public interface BookStore {

@Id
@GeneratedValue(generator = UUIDIdGenerator.FULL_NAME)
UUID id();
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "sequence:BOOK_STORE_ID_SEQ"
)
long id();

@Key
@NotBlank
Expand Down
Loading

0 comments on commit 2994580

Please sign in to comment.