Skip to content

Commit

Permalink
address comments and reorganize code examples
Browse files Browse the repository at this point in the history
  • Loading branch information
vnikolova committed Oct 2, 2024
1 parent 279329f commit f63fc63
Show file tree
Hide file tree
Showing 15 changed files with 395 additions and 253 deletions.
1 change: 1 addition & 0 deletions documentation-website/Writerside/hi.tree
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
</toc-element>
<toc-element toc-title="Deep Dive into DAO">
<toc-element topic="DAO-Table-Types.topic"/>
<toc-element topic="DAO-Entity-definition.topic"/>
<toc-element topic="DAO-CRUD-Operations.topic"/>
<toc-element topic="DAO-Relationships.topic"/>
<toc-element topic="DAO-Field-Transformations.topic"/>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,138 +1,34 @@
package org.example

import org.example.entities.*
import org.example.tables.*
import org.jetbrains.exposed.dao.id.CompositeID
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
import org.example.examples.*
import org.example.tables.CitiesTable
import org.example.tables.DirectorsTable
import org.example.tables.StarWarsFilmsTable
import org.example.tables.UserRatingsTable
import org.example.tables.UsersTable
import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.SchemaUtils
import org.jetbrains.exposed.sql.StdOutSqlLogger
import org.jetbrains.exposed.sql.addLogger
import org.jetbrains.exposed.sql.transactions.transaction
import java.util.*

fun main() {
Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver")

transaction {
addLogger(StdOutSqlLogger)
createFilms()
createDirectors()
createUsersAndRatings()
}
}

fun createFilms() {
SchemaUtils.create(StarWarsFilmsTable)

// Create a new record
val movie = StarWarsFilmEntity.new {
name = "The Last Jedi"
sequelId = 8
director = "Rian Johnson"
}

// Create a new record with id
StarWarsFilmEntity.new(id = 2) {
name = "The Rise of Skywalker"
sequelId = 9
director = "J.J. Abrams"
}

// Read a property value
val movieName = movie.name
println("Created a new film named $movieName")

// Read the id value
val movieId: Int = movie.id.value
println("The id of the new movie is $movieId")

// Read all movies
val allMovies = StarWarsFilmEntity.all()
allMovies.forEach({ println(it.name) })

// Sort results in ascending order
val moviesByAscOrder = StarWarsFilmEntity.all().sortedBy { it.sequelId }
moviesByAscOrder.map { println(it.sequelId) }

// Sort results in descending order
val moviesByDescOrder = StarWarsFilmEntity.all().sortedByDescending { it.sequelId }
moviesByDescOrder.map { println(it.sequelId) }

// Read all with a condition
val specificMovie = StarWarsFilmEntity.find { StarWarsFilmsTable.sequelId eq 8 }
specificMovie.forEach({ println("Found a movie with sequelId 8 and name " + it.name) })

// Get an entity by its id value
val fifthMovie = StarWarsFilmEntity.findById(5)
println(fifthMovie?.name)

// Update an entity value
movie.name = "Episode VIII – The Last Jedi"

// Find by id and update
val updatedMovie = StarWarsFilmEntity.findByIdAndUpdate(5) {
it.name = "Episode VIII – The Last Jedi"
}
println(updatedMovie?.name)

// Find a single record by a condition and update
val updatedMovie2 = StarWarsFilmEntity.findSingleByAndUpdate(StarWarsFilmsTable.name eq "The Last Jedi") {
it.name = "Episode VIII – The Last Jedi"
}
println(updatedMovie2?.name)

// Delete a record
movie.delete()
}

fun createDirectors() {
SchemaUtils.create(DirectorsTable)

val directorId = CompositeID {
it[DirectorsTable.name] = "J.J. Abrams"
it[DirectorsTable.guildId] = UUID.randomUUID()
}
SchemaUtils.create(StarWarsFilmsTable)
SchemaUtils.create(DirectorsTable)
SchemaUtils.create(UsersTable)
SchemaUtils.create(UserRatingsTable)
SchemaUtils.create(CitiesTable)

DirectorEntity.new(directorId) {
genre = Genre.SCI_FI
}

// Find records by composite id
/*
SELECT DIRECTORS."name", DIRECTORS.GUILD_ID, DIRECTORS.GENRE
FROM DIRECTORS
WHERE (DIRECTORS."name" = 'J.J. Abrams')
AND (DIRECTORS.GUILD_ID = '2cc64f4f-1a2c-41ce-bda1-ee492f787f4b')
*/
val directors = DirectorEntity.find { DirectorsTable.id eq directorId }
directors.forEach({ println(it.genre) })
}

fun createUsersAndRatings() {
SchemaUtils.create(UsersTable)
SchemaUtils.create(UserRatingsTable)
SchemaUtils.create(CitiesTable)
// Create examples
val createExamples = CreateExamples()
createExamples.createFilms()

// Read an entity with a join to another table
val query = UsersTable.innerJoin(UserRatingsTable).innerJoin(StarWarsFilmsTable)
.select(UsersTable.columns)
.where {
StarWarsFilmsTable.sequelId eq 2 and (UserRatingsTable.value greater 5)
}.withDistinct()

val users = UserEntity.wrapRows(query).toList()
users.map { println(it.name) }

CitiesTable.insert {
it[name] = "Amsterdam"
// Read examples
val readExamples = ReadExamples()
readExamples.readExamples()
}

// Use a query as an expression to sort cities by the number of users in each city
val expression = wrapAsExpression<Int>(
UsersTable.select(UsersTable.id.count())
.where { CitiesTable.id eq UsersTable.cityId }
)
val cities = CitiesTable.selectAll()
.orderBy(expression, SortOrder.DESC)
.toList()

cities.map { println(it[CitiesTable.name]) }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.example.entities

import org.example.tables.StarWarsWFilmsWithRankTable
import org.jetbrains.exposed.dao.IntEntity
import org.jetbrains.exposed.dao.IntEntityClass
import org.jetbrains.exposed.dao.id.EntityID
import org.jetbrains.exposed.sql.Op
import org.jetbrains.exposed.sql.Query

class StarWarsWFilmWithRankEntity(id: EntityID<Int>) : IntEntity(id) {
var sequelId by StarWarsWFilmsWithRankTable.sequelId
var name by StarWarsWFilmsWithRankTable.name
var rating by StarWarsWFilmsWithRankTable.rating

val rank: Long
get() = readValues[StarWarsWFilmsWithRankTable.rank]

companion object : IntEntityClass<StarWarsWFilmWithRankEntity>(StarWarsWFilmsWithRankTable) {
override fun searchQuery(op: Op<Boolean>): Query {
return super.searchQuery(op).adjustSelect {
select(columns + StarWarsWFilmsWithRankTable.rank)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.example.entities

import org.example.tables.DirectorsCustomTable
import org.jetbrains.exposed.dao.Entity
import org.jetbrains.exposed.dao.EntityClass
import org.jetbrains.exposed.dao.id.EntityID

class DirectorCustomEntity(id: EntityID<String>) : Entity<String>(id) {
companion object : EntityClass<String, DirectorCustomEntity>(DirectorsCustomTable)

var name by DirectorsCustomTable.name
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package org.example.examples

import org.example.entities.DirectorEntity
import org.example.entities.StarWarsFilmEntity
import org.example.tables.DirectorsTable
import org.example.tables.Genre
import org.jetbrains.exposed.dao.id.CompositeID
import java.util.*

class CreateExamples {
fun createFilms() {
val movie = StarWarsFilmEntity.new {
name = "The Last Jedi"
sequelId = 8
director = "Rian Johnson"
}

// Create a new record with id
val movie2 = StarWarsFilmEntity.new(id = 2) {
name = "The Rise of Skywalker"
sequelId = 9
director = "J.J. Abrams"
}
}

fun createNewWithCompositeId() {
val directorId = CompositeID {
it[DirectorsTable.name] = "J.J. Abrams"
it[DirectorsTable.guildId] = UUID.randomUUID()
}

val director = DirectorEntity.new(directorId) {
genre = Genre.SCI_FI
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.example.examples

import org.example.entities.StarWarsFilmEntity

class DeleteExamples {
fun deleteFilm() {
val movie = StarWarsFilmEntity.new {
name = "The Last Jedi"
sequelId = 8
director = "Rian Johnson"
}
val deletedMovie = movie.delete()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package org.example.examples

import org.example.entities.DirectorEntity
import org.example.entities.StarWarsFilmEntity
import org.example.entities.StarWarsWFilmWithRankEntity
import org.example.entities.UserEntity
import org.example.tables.CitiesTable
import org.example.tables.DirectorsTable
import org.example.tables.StarWarsFilmsTable
import org.example.tables.UserRatingsTable
import org.example.tables.UsersTable
import org.jetbrains.exposed.dao.id.CompositeID
import org.jetbrains.exposed.sql.SortOrder
import org.jetbrains.exposed.sql.and
import org.jetbrains.exposed.sql.count
import org.jetbrains.exposed.sql.insert
import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.wrapAsExpression
import java.util.*

class ReadExamples {
fun readAll() {
// Read all movies
val allMovies = StarWarsFilmEntity.all()
allMovies.forEach({ println(it.name) })

// Sort results in ascending order
val moviesByAscOrder = StarWarsFilmEntity.all().sortedBy { it.sequelId }
moviesByAscOrder.map { println(it.sequelId) }

// Sort results in descending order
val moviesByDescOrder = StarWarsFilmEntity.all().sortedByDescending { it.sequelId }
moviesByDescOrder.map { println(it.sequelId) }
}

fun find() {
// Get an entity by its id value
val movie = StarWarsFilmEntity.findById(2)

if(movie != null) {
// Read a property value
val movieName = movie.name
println("Created a new film named $movieName")

// Read the id value
val movieId: Int = movie.id.value
println("The id of the new movie is $movieId")
}

// Read all with a condition
val specificMovie = StarWarsFilmEntity.find { StarWarsFilmsTable.sequelId eq 8 }
specificMovie.forEach({ println("Found a movie with sequelId 8 and name " + it.name) })
}

// Read an entity with a join to another table
fun readWithJoin() {
val query = UsersTable.innerJoin(UserRatingsTable).innerJoin(StarWarsFilmsTable)
.select(UsersTable.columns)
.where {
StarWarsFilmsTable.sequelId eq 2 and (UserRatingsTable.value greater 5)
}.withDistinct()

val users = UserEntity.wrapRows(query).toList()
users.map { println(it.name) }
}

fun findByCompositeId() {
// Find records by composite id
val directorId = CompositeID {
it[DirectorsTable.name] = "J.J. Abrams"
it[DirectorsTable.guildId] = UUID.randomUUID()
}

val directors = DirectorEntity.find { DirectorsTable.id eq directorId }
directors.forEach({ println(it.genre) })
}

fun queriesAsExpressions() {
// Use a query as an expression to sort cities by the number of users in each city
CitiesTable.insert {
it[name] = "Amsterdam"
}

val expression = wrapAsExpression<Int>(
UsersTable.select(UsersTable.id.count())
.where { CitiesTable.id eq UsersTable.cityId }
)
val cities = CitiesTable.selectAll()
.orderBy(expression, SortOrder.DESC)
.toList()

cities.map { println(it[CitiesTable.name]) }
}

fun readComputedField() {
StarWarsWFilmWithRankEntity.new {
sequelId = 8
name = "The Last Jedi"
rating = 4.2
}

StarWarsWFilmWithRankEntity.find { StarWarsFilmsTable.name like "The%" }.map { it.name to it.rank }
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.example.examples

import org.example.entities.StarWarsFilmEntity
import org.example.tables.StarWarsFilmsTable
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq

class UpdateExamples {
fun updateFilms() {
// Find by id and update
val updatedMovie = StarWarsFilmEntity.findByIdAndUpdate(5) {
it.name = "Episode VIII – The Last Jedi"
}
println(updatedMovie?.name)

// Find a single record by a condition and update
val updatedMovie2 = StarWarsFilmEntity.findSingleByAndUpdate(StarWarsFilmsTable.name eq "The Last Jedi") {
it.name = "Episode VIII – The Last Jedi"
}
println(updatedMovie2?.name)
}

}
Loading

0 comments on commit f63fc63

Please sign in to comment.