implemented table join

This commit is contained in:
nova 2020-05-17 23:30:24 +05:30
parent 2956829f9d
commit a960f43cb6
7 changed files with 70 additions and 34 deletions

View File

@ -11,23 +11,23 @@ import com.example.services.LibraryService
import play.api.libs.json.Json import play.api.libs.json.Json
@Singleton @Singleton
class HomeController @Inject() (userDAO: UserDAO, carDAO: CarDAO, libraryService: LibraryService, cc: ControllerComponents) class HomeController @Inject() (
(implicit ec: ExecutionContext) userDAO: UserDAO,
extends AbstractController(cc) { carDAO: CarDAO,
libraryService: LibraryService,
cc: ControllerComponents
)(implicit ec: ExecutionContext)
extends AbstractController(cc) {
def index = Action.async { implicit request => def index = Action.async { implicit request =>
userDAO.all.map { users => userDAO.all.map { users => Ok(views.html.index(users)) }
Ok(views.html.index(users))
}
} }
def cars = Action.async { implicit request => def cars = Action.async { implicit request =>
carDAO.all.map { cars => carDAO.all.map { cars => Ok(views.html.cars(cars)) }
Ok(views.html.cars(cars))
}
} }
def book = Action.async{ def book = Action.async {
// libraryService.findBookById(1).map(e => Ok(Json.toJson(e))) // libraryService.findBookById(1).map(e => Ok(Json.toJson(e)))
// libraryService.insertBookAndAuthor(Book("new book"), Author(2, "Some retard")) // libraryService.insertBookAndAuthor(Book("new book"), Author(2, "Some retard"))
@ -36,4 +36,10 @@ class HomeController @Inject() (userDAO: UserDAO, carDAO: CarDAO, libraryService
} yield (Ok(Json.toJson(maybeBook))) } yield (Ok(Json.toJson(maybeBook)))
} }
def authors(bookId: Long) = Action.async { implicit request =>
libraryService.getAuthorsForBook(bookId).map( t => {
Ok(Json.toJson(t))
})
}
} }

View File

@ -6,6 +6,7 @@
GET / controllers.HomeController.index GET / controllers.HomeController.index
GET /cars controllers.HomeController.cars GET /cars controllers.HomeController.cars
GET /book controllers.HomeController.book GET /book controllers.HomeController.book
GET /authors/:bookId controllers.HomeController.authors(bookId: Long)
# Map static resources from the /public folder to the /assets URL path # Map static resources from the /public folder to the /assets URL path
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)

View File

@ -1,31 +1,28 @@
2020-05-14 01:04:22,774 [INFO] from play.api.http.EnabledFilters in play-dev-mode-akka.actor.default-dispatcher-7 - Enabled Filters (see <https://www.playframework.com/documentation/latest/Filters>): 2020-05-16 21:21:04,771 [INFO] from play.api.http.EnabledFilters in play-dev-mode-akka.actor.default-dispatcher-5 - Enabled Filters (see <https://www.playframework.com/documentation/latest/Filters>):
play.filters.csrf.CSRFFilter play.filters.csrf.CSRFFilter
play.filters.headers.SecurityHeadersFilter play.filters.headers.SecurityHeadersFilter
play.filters.hosts.AllowedHostsFilter play.filters.hosts.AllowedHostsFilter
2020-05-14 01:04:22,780 [INFO] from play.api.Play in play-dev-mode-akka.actor.default-dispatcher-7 - Application started (Dev) (no global state) 2020-05-16 21:21:04,777 [INFO] from play.api.Play in play-dev-mode-akka.actor.default-dispatcher-5 - Application started (Dev) (no global state)
2020-05-14 01:04:41,915 [INFO] from play.api.http.EnabledFilters in play-dev-mode-akka.actor.default-dispatcher-7 - Enabled Filters (see <https://www.playframework.com/documentation/latest/Filters>): 2020-05-16 21:21:05,234 [DEBUG] from slick.jdbc.JdbcBackend.statement in myapp.database-1 - Preparing statement: select x2."ID", x2."NAME", x3.x4, x3.x5, x3.x6, x3.x7 from (select "ID" as x4, "AUTHOR_ID" as x6, "TITLE" as x5, "CREATED_AT" as x7 from "BOOKS" where "ID" = 2 limit 1) x3, "AUTHORS" x2 where x2."ID" = x3.x6
2020-05-16 21:21:09,910 [DEBUG] from slick.jdbc.JdbcBackend.statement in myapp.database-2 - Preparing statement: select x2."ID", x2."NAME", x3.x4, x3.x5, x3.x6, x3.x7 from (select "ID" as x4, "AUTHOR_ID" as x6, "TITLE" as x5, "CREATED_AT" as x7 from "BOOKS" where "ID" = 1 limit 1) x3, "AUTHORS" x2 where x2."ID" = x3.x6
2020-05-16 21:26:25,801 [INFO] from play.api.http.EnabledFilters in play-dev-mode-akka.actor.default-dispatcher-7 - Enabled Filters (see <https://www.playframework.com/documentation/latest/Filters>):
play.filters.csrf.CSRFFilter play.filters.csrf.CSRFFilter
play.filters.headers.SecurityHeadersFilter play.filters.headers.SecurityHeadersFilter
play.filters.hosts.AllowedHostsFilter play.filters.hosts.AllowedHostsFilter
2020-05-14 01:04:41,917 [INFO] from play.api.Play in play-dev-mode-akka.actor.default-dispatcher-7 - Application started (Dev) (no global state) 2020-05-16 21:26:25,804 [INFO] from play.api.Play in play-dev-mode-akka.actor.default-dispatcher-7 - Application started (Dev) (no global state)
2020-05-14 01:04:46,364 [INFO] from play.api.http.EnabledFilters in play-dev-mode-akka.actor.default-dispatcher-7 - Enabled Filters (see <https://www.playframework.com/documentation/latest/Filters>): 2020-05-16 21:26:25,894 [DEBUG] from slick.jdbc.JdbcBackend.statement in myapp.database-1 - Preparing statement: select x2."ID", x2."NAME", x3."ID", x3."TITLE", x3."AUTHOR_ID", x3."CREATED_AT" from "AUTHORS" x2, "BOOKS" x3 where (x3."ID" = 1) and (x2."ID" = x3."AUTHOR_ID")
2020-05-16 21:29:57,361 [INFO] from play.api.internal.libs.concurrent.CoordinatedShutdownSupport in pool-14-thread-4 - Starting synchronous coordinated shutdown with ServerStoppedReason reason and 35000 milliseconds timeout
2020-05-16 21:29:57,362 [INFO] from play.core.server.AkkaHttpServer in pool-14-thread-4 - Stopping Akka HTTP server...
2020-05-16 21:29:57,363 [INFO] from play.core.server.AkkaHttpServer in play-dev-mode-akka.actor.internal-dispatcher-3 - Terminating server binding for /0:0:0:0:0:0:0:0:8080
2020-05-16 21:29:59,781 [INFO] from play.api.http.EnabledFilters in play-dev-mode-akka.actor.internal-dispatcher-17 - Enabled Filters (see <https://www.playframework.com/documentation/latest/Filters>):
play.filters.csrf.CSRFFilter play.filters.csrf.CSRFFilter
play.filters.headers.SecurityHeadersFilter play.filters.headers.SecurityHeadersFilter
play.filters.hosts.AllowedHostsFilter play.filters.hosts.AllowedHostsFilter
2020-05-14 01:04:46,366 [INFO] from play.api.Play in play-dev-mode-akka.actor.default-dispatcher-7 - Application started (Dev) (no global state) 2020-05-16 21:29:59,783 [INFO] from play.api.Play in play-dev-mode-akka.actor.internal-dispatcher-17 - Application started (Dev) (no global state)
2020-05-14 10:15:22,298 [INFO] from play.core.server.AkkaHttpServer in play-dev-mode-shutdown-hook-1 - Stopping Akka HTTP server... 2020-05-16 21:29:59,810 [INFO] from play.core.server.AkkaHttpServer in play-dev-mode-akka.actor.internal-dispatcher-19 - Running provided shutdown stop hooks
2020-05-14 10:15:22,300 [INFO] from play.core.server.AkkaHttpServer in play-dev-mode-akka.actor.internal-dispatcher-5 - Terminating server binding for /0:0:0:0:0:0:0:0:8080
2020-05-14 10:15:32,165 [INFO] from play.api.http.EnabledFilters in play-dev-mode-akka.actor.internal-dispatcher-15 - Enabled Filters (see <https://www.playframework.com/documentation/latest/Filters>):
play.filters.csrf.CSRFFilter
play.filters.headers.SecurityHeadersFilter
play.filters.hosts.AllowedHostsFilter
2020-05-14 10:15:32,176 [INFO] from play.api.Play in play-dev-mode-akka.actor.internal-dispatcher-15 - Application started (Dev) (no global state)
2020-05-14 10:15:32,221 [INFO] from play.core.server.AkkaHttpServer in play-dev-mode-akka.actor.internal-dispatcher-18 - Running provided shutdown stop hooks

View File

@ -3,12 +3,23 @@ package com.example.models
import play.api.libs.json.Json import play.api.libs.json.Json
import java.time.Instant import java.time.Instant
final case class Book(id: Long, title: String, authorId: Long, createdAt: Instant) final case class Book(
id: Long,
title: String,
authorId: Long,
createdAt: Instant
)
final case class NewBook(title: String, authorId: Long) final case class NewBook(title: String, authorId: Long)
final case class BookDTO(title: String, authorId: Long, createdAt: Instant) final case class BookDTO(title: String, authorId: Long, createdAt: Instant)
final case class Author(id: Long, name: String) final case class Author(id: Long, name: String)
final case class NewAuthor(name: String) final case class NewAuthor(name: String)
object Book { object Book {
implicit val bookJsonWrite = Json.format[Book] def tupled = (Book.apply _).tupled
} implicit val bookJsonFormat = Json.format[Book]
}
object Author {
def tupled = (Author.apply _).tupled
implicit val authorsJsonFormat = Json.format[Author]
}

View File

@ -23,4 +23,6 @@ trait LibraryService {
// Insert a book and an author composing two DBIOs in a transaction // Insert a book and an author composing two DBIOs in a transaction
def insertBookAndAuthor(book: NewBook, author: NewAuthor): Future[(Long, Long)] def insertBookAndAuthor(book: NewBook, author: NewAuthor): Future[(Long, Long)]
def getAuthorsForBook(id: Long): Future[Seq[(Author, Book)]]
} }

View File

@ -36,6 +36,10 @@ class SlickLibraryDbio extends Tables {
def insertAuthor2(author: NewAuthor): DBIO[Long] = def insertAuthor2(author: NewAuthor): DBIO[Long] =
Query.writeAuthors2 += author Query.writeAuthors2 += author
def getAuthorsForBook(bookId: Long): DBIO[Seq[(AuthorsRow, BooksRow)]] = {
Query.authorOfBook(bookId).result
}
def authorToRow(author: Author) = author.transformInto[AuthorsRow] def authorToRow(author: Author) = author.transformInto[AuthorsRow]
def bookToRow(book: Book) = book.transformInto[BooksRow] def bookToRow(book: Book) = book.transformInto[BooksRow]
def authorsRowToAuthor(author: AuthorsRow) = author.transformInto[Author] def authorsRowToAuthor(author: AuthorsRow) = author.transformInto[Author]
@ -76,16 +80,20 @@ class SlickLibraryDbio extends Tables {
lazy val authorOfBook = (bookId: Long) => lazy val authorOfBook = (bookId: Long) =>
for { for {
(authors, books) <- Authors join Books on (_.id === _.authorId) filter { (author, book) <- Authors join
Books on (_.id === _.authorId) filter {
case (authors, books) => books.id === bookId case (authors, books) => books.id === bookId
} }
} yield (authors, books) } yield (author, book)
lazy val authorOfBook2 = (bookId: Long) => lazy val authorOfBook2 = (bookId: Long) =>
for { for {
authorId <- Books.filter(_.id === bookId).take(1).map(_.authorId) (authorId, book) <- Books
authors <- Authors filter (_.id === authorId) .filter(_.id === bookId)
} yield (authors.name) .take(1)
.map(b => (b.authorId, b))
author <- Authors filter (_.id === authorId)
} yield (author, book)
// lazy val authorOfBook3 = (bookId: Long) => // lazy val authorOfBook3 = (bookId: Long) =>
// for { // for {

View File

@ -16,6 +16,17 @@ class SlickLibraryService @Inject() (
libraryDbio: SlickLibraryDbio libraryDbio: SlickLibraryDbio
)(implicit ec: ExecutionContext) )(implicit ec: ExecutionContext)
extends LibraryService { extends LibraryService {
override def getAuthorsForBook(id: Long): Future[Seq[(Author, Book)]] = {
db.run{
libraryDbio.getAuthorsForBook(id).map(_.map {
case (x, y) => {
( libraryDbio.authorsRowToAuthor(x), libraryDbio.booksRowToBooks(y))
}
})
}
}
import libraryDbio.profile.api._ import libraryDbio.profile.api._
// Simple function that returns a book // Simple function that returns a book