Skip to content

Commit

Permalink
feat: add/rearrange metadata fields
Browse files Browse the repository at this point in the history
existing fields moved from book to series: publisher, age rating, reading direction
new book fields: tags
new series fields: tags, genres, language, summary

closes gotson#276
  • Loading branch information
gotson committed Aug 24, 2020
1 parent d8db46c commit 9e406e3
Show file tree
Hide file tree
Showing 37 changed files with 1,087 additions and 328 deletions.
2 changes: 2 additions & 0 deletions komga/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ dependencies {
implementation("commons-io:commons-io:2.7")
implementation("org.apache.commons:commons-lang3:3.11")

implementation("com.ibm.icu:icu4j:67.1")

implementation("org.apache.tika:tika-core:1.24.1")
implementation("org.apache.commons:commons-compress:1.20")
implementation("com.github.junrar:junrar:7.2.0")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package db.migration.sqlite

import org.flywaydb.core.api.migration.BaseJavaMigration
import org.flywaydb.core.api.migration.Context
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.jdbc.datasource.SingleConnectionDataSource

class V20200820150923__metadata_fields_part_2 : BaseJavaMigration() {
override fun migrate(context: Context) {
val jdbcTemplate = JdbcTemplate(SingleConnectionDataSource(context.connection, true))

val bookMetadata = jdbcTemplate.queryForList(
"""select m.AGE_RATING, m.AGE_RATING_LOCK, m.PUBLISHER, m.PUBLISHER_LOCK, m.READING_DIRECTION, m.READING_DIRECTION_LOCK, b.SERIES_ID, m.NUMBER_SORT
from BOOK_METADATA m
left join BOOK B on B.ID = m.BOOK_ID"""
)

if (bookMetadata.isNotEmpty()) {
val parameters = bookMetadata
.groupBy { it["SERIES_ID"] }
.map { (seriesId, v) ->
val ageRating = v.mapNotNull { it["AGE_RATING"] as Int? }.max()
val ageRatingLock = v.mapNotNull { it["AGE_RATING_LOCK"] as Int? }.max()

val publisher =
v.filter { (it["PUBLISHER"] as String).isNotEmpty() }
.sortedByDescending { it["NUMBER_SORT"] as Double? }
.map { it["PUBLISHER"] as String }
.firstOrNull()
val publisherLock = v.mapNotNull { it["PUBLISHER_LOCK"] as Int? }.max()

val readingDir =
v.mapNotNull { it["READING_DIRECTION"] as String? }
.groupingBy { it }
.eachCount()
.maxBy { it.value }?.key
val readingDirLock = v.mapNotNull { it["READING_DIRECTION_LOCK"] as Int? }.max()

arrayOf(ageRating, ageRatingLock, publisher, publisherLock, readingDir, readingDirLock, seriesId)
}

jdbcTemplate.batchUpdate(
"UPDATE SERIES_METADATA SET AGE_RATING = ?, AGE_RATING_LOCK = ?, PUBLISHER = ?, PUBLISHER_LOCK = ?, READING_DIRECTION = ?, READING_DIRECTION_LOCK = ? WHERE SERIES_ID = ?",
parameters
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
alter table series_metadata
add column PUBLISHER varchar NOT NULL DEFAULT '';
alter table series_metadata
add column PUBLISHER_LOCK boolean NOT NULL DEFAULT 0;

alter table series_metadata
add column READING_DIRECTION varchar NULL;
alter table series_metadata
add column READING_DIRECTION_LOCK boolean NOT NULL DEFAULT 0;

alter table series_metadata
add column AGE_RATING int NULL;
alter table series_metadata
add column AGE_RATING_LOCK boolean NOT NULL DEFAULT 0;

alter table SERIES_METADATA
add column SUMMARY varchar NOT NULL DEFAULT '';
alter table SERIES_METADATA
add column SUMMARY_LOCK boolean NOT NULL DEFAULT 0;

alter table SERIES_METADATA
add column LANGUAGE varchar NOT NULL DEFAULT '';
alter table SERIES_METADATA
add column LANGUAGE_LOCK boolean NOT NULL DEFAULT 0;

alter table SERIES_METADATA
add column GENRES_LOCK boolean NOT NULL DEFAULT 0;

alter table SERIES_METADATA
add column TAGS_LOCK boolean NOT NULL DEFAULT 0;


CREATE TABLE SERIES_METADATA_GENRE
(
GENRE varchar NOT NULL,
SERIES_ID varchar NOT NULL,
FOREIGN KEY (SERIES_ID) REFERENCES SERIES (ID)
);

CREATE TABLE SERIES_METADATA_TAG
(
TAG varchar NOT NULL,
SERIES_ID varchar NOT NULL,
FOREIGN KEY (SERIES_ID) REFERENCES SERIES (ID)
);

CREATE TABLE BOOK_METADATA_TAG
(
TAG varchar NOT NULL,
BOOK_ID varchar NOT NULL,
FOREIGN KEY (BOOK_ID) REFERENCES BOOK (ID)
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
PRAGMA foreign_keys= OFF;

ALTER TABLE BOOK_METADATA
RENAME TO _BOOK_METADATA_OLD;

CREATE TABLE BOOK_METADATA
(
CREATED_DATE datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
LAST_MODIFIED_DATE datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
NUMBER varchar NOT NULL,
NUMBER_LOCK boolean NOT NULL DEFAULT 0,
NUMBER_SORT real NOT NULL,
NUMBER_SORT_LOCK boolean NOT NULL DEFAULT 0,
RELEASE_DATE date NULL,
RELEASE_DATE_LOCK boolean NOT NULL DEFAULT 0,
SUMMARY varchar NOT NULL DEFAULT '',
SUMMARY_LOCK boolean NOT NULL DEFAULT 0,
TITLE varchar NOT NULL,
TITLE_LOCK boolean NOT NULL DEFAULT 0,
AUTHORS_LOCK boolean NOT NULL DEFAULT 0,
TAGS_LOCK boolean NOT NULL DEFAULT 0,
BOOK_ID varchar NOT NULL PRIMARY KEY,
FOREIGN KEY (BOOK_ID) REFERENCES BOOK (ID)
);

INSERT INTO BOOK_METADATA (CREATED_DATE, LAST_MODIFIED_DATE, NUMBER, NUMBER_LOCK, NUMBER_SORT, NUMBER_SORT_LOCK,
RELEASE_DATE, RELEASE_DATE_LOCK, SUMMARY, SUMMARY_LOCK, TITLE, TITLE_LOCK, AUTHORS_LOCK,
BOOK_ID)
SELECT CREATED_DATE,
LAST_MODIFIED_DATE,
NUMBER,
NUMBER_LOCK,
NUMBER_SORT,
NUMBER_SORT_LOCK,
RELEASE_DATE,
RELEASE_DATE_LOCK,
SUMMARY,
SUMMARY_LOCK,
TITLE,
TITLE_LOCK,
AUTHORS_LOCK,
BOOK_ID
FROM _BOOK_METADATA_OLD;

DROP TABLE _BOOK_METADATA_OLD;

PRAGMA foreign_keys= ON;
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,17 @@ class BookMetadata(
summary: String = "",
number: String,
val numberSort: Float,
val readingDirection: ReadingDirection? = null,
publisher: String = "",
val ageRating: Int? = null,
val releaseDate: LocalDate? = null,
val authors: List<Author> = emptyList(),
val tags: Set<String> = emptySet(),

val titleLock: Boolean = false,
val summaryLock: Boolean = false,
val numberLock: Boolean = false,
val numberSortLock: Boolean = false,
val readingDirectionLock: Boolean = false,
val publisherLock: Boolean = false,
val ageRatingLock: Boolean = false,
val releaseDateLock: Boolean = false,
val authorsLock: Boolean = false,
val tagsLock: Boolean = false,

val bookId: String = "",

Expand All @@ -33,27 +29,22 @@ class BookMetadata(
val title = title.trim()
val summary = summary.trim()
val number = number.trim()
val publisher = publisher.trim()

fun copy(
title: String = this.title,
summary: String = this.summary,
number: String = this.number,
numberSort: Float = this.numberSort,
readingDirection: ReadingDirection? = this.readingDirection,
publisher: String = this.publisher,
ageRating: Int? = this.ageRating,
releaseDate: LocalDate? = this.releaseDate,
authors: List<Author> = this.authors.toList(),
tags: Set<String> = this.tags,
titleLock: Boolean = this.titleLock,
summaryLock: Boolean = this.summaryLock,
numberLock: Boolean = this.numberLock,
numberSortLock: Boolean = this.numberSortLock,
readingDirectionLock: Boolean = this.readingDirectionLock,
publisherLock: Boolean = this.publisherLock,
ageRatingLock: Boolean = this.ageRatingLock,
releaseDateLock: Boolean = this.releaseDateLock,
authorsLock: Boolean = this.authorsLock,
tagsLock: Boolean = this.tagsLock,
bookId: String = this.bookId,
createdDate: LocalDateTime = this.createdDate,
lastModifiedDate: LocalDateTime = this.lastModifiedDate
Expand All @@ -63,32 +54,21 @@ class BookMetadata(
summary = summary,
number = number,
numberSort = numberSort,
readingDirection = readingDirection,
publisher = publisher,
ageRating = ageRating,
releaseDate = releaseDate,
authors = authors,
tags = tags,
titleLock = titleLock,
summaryLock = summaryLock,
numberLock = numberLock,
numberSortLock = numberSortLock,
readingDirectionLock = readingDirectionLock,
publisherLock = publisherLock,
ageRatingLock = ageRatingLock,
releaseDateLock = releaseDateLock,
authorsLock = authorsLock,
tagsLock = tagsLock,
bookId = bookId,
createdDate = createdDate,
lastModifiedDate = lastModifiedDate
)

enum class ReadingDirection {
LEFT_TO_RIGHT,
RIGHT_TO_LEFT,
VERTICAL,
WEBTOON
}

override fun toString(): String =
"BookMetadata(numberSort=$numberSort, readingDirection=$readingDirection, ageRating=$ageRating, releaseDate=$releaseDate, authors=$authors, titleLock=$titleLock, summaryLock=$summaryLock, numberLock=$numberLock, numberSortLock=$numberSortLock, readingDirectionLock=$readingDirectionLock, publisherLock=$publisherLock, ageRatingLock=$ageRatingLock, releaseDateLock=$releaseDateLock, authorsLock=$authorsLock, bookId=$bookId, createdDate=$createdDate, lastModifiedDate=$lastModifiedDate, title='$title', summary='$summary', number='$number', publisher='$publisher')"
"BookMetadata(numberSort=$numberSort, releaseDate=$releaseDate, authors=$authors, titleLock=$titleLock, summaryLock=$summaryLock, numberLock=$numberLock, numberSortLock=$numberSortLock, releaseDateLock=$releaseDateLock, authorsLock=$authorsLock, bookId=$bookId, createdDate=$createdDate, lastModifiedDate=$lastModifiedDate, title='$title', summary='$summary', number='$number')"
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,6 @@ data class BookMetadataPatch(
val summary: String?,
val number: String?,
val numberSort: Float?,
val readingDirection: BookMetadata.ReadingDirection?,
val publisher: String?,
val ageRating: Int?,
val releaseDate: LocalDate?,
val authors: List<Author>?,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,24 @@ class SeriesMetadata(
val status: Status = Status.ONGOING,
title: String,
titleSort: String = title,
summary: String = "",
val readingDirection: ReadingDirection? = null,
publisher: String = "",
val ageRating: Int? = null,
val language: String = "",
val genres: Set<String> = emptySet(),
val tags: Set<String> = emptySet(),

val statusLock: Boolean = false,
val titleLock: Boolean = false,
val titleSortLock: Boolean = false,
val summaryLock: Boolean = false,
val readingDirectionLock: Boolean = false,
val publisherLock: Boolean = false,
val ageRatingLock: Boolean = false,
val languageLock: Boolean = false,
val genresLock: Boolean = false,
val tagsLock: Boolean = false,

val seriesId: String = "",

Expand All @@ -18,14 +32,30 @@ class SeriesMetadata(
) : Auditable() {
val title = title.trim()
val titleSort = titleSort.trim()
val summary = summary.trim()
val publisher = publisher.trim()

fun copy(
status: Status = this.status,
title: String = this.title,
titleSort: String = this.titleSort,
summary: String = this.summary,
readingDirection: ReadingDirection? = this.readingDirection,
publisher: String = this.publisher,
ageRating: Int? = this.ageRating,
language: String = this.language,
genres: Set<String> = this.genres,
tags: Set<String> = this.tags,
statusLock: Boolean = this.statusLock,
titleLock: Boolean = this.titleLock,
titleSortLock: Boolean = this.titleSortLock,
summaryLock: Boolean = this.summaryLock,
readingDirectionLock: Boolean = this.readingDirectionLock,
publisherLock: Boolean = this.publisherLock,
ageRatingLock: Boolean = this.ageRatingLock,
languageLock: Boolean = this.languageLock,
genresLock: Boolean = this.genresLock,
tagsLock: Boolean = this.tagsLock,
seriesId: String = this.seriesId,
createdDate: LocalDateTime = this.createdDate,
lastModifiedDate: LocalDateTime = this.lastModifiedDate
Expand All @@ -34,9 +64,23 @@ class SeriesMetadata(
status = status,
title = title,
titleSort = titleSort,
summary = summary,
readingDirection = readingDirection,
publisher = publisher,
ageRating = ageRating,
language = language,
genres = genres,
tags = tags,
statusLock = statusLock,
titleLock = titleLock,
titleSortLock = titleSortLock,
summaryLock = summaryLock,
readingDirectionLock = readingDirectionLock,
publisherLock = publisherLock,
ageRatingLock = ageRatingLock,
languageLock = languageLock,
genresLock = genresLock,
tagsLock = tagsLock,
seriesId = seriesId,
createdDate = createdDate,
lastModifiedDate = lastModifiedDate
Expand All @@ -46,6 +90,14 @@ class SeriesMetadata(
ENDED, ONGOING, ABANDONED, HIATUS
}

override fun toString(): String =
"SeriesMetadata(status=$status, statusLock=$statusLock, titleLock=$titleLock, titleSortLock=$titleSortLock, seriesId=$seriesId, createdDate=$createdDate, lastModifiedDate=$lastModifiedDate, title='$title', titleSort='$titleSort')"
enum class ReadingDirection {
LEFT_TO_RIGHT,
RIGHT_TO_LEFT,
VERTICAL,
WEBTOON
}

override fun toString(): String {
return "SeriesMetadata(status=$status, readingDirection=$readingDirection, ageRating=$ageRating, language=$language, genres=$genres, statusLock=$statusLock, titleLock=$titleLock, titleSortLock=$titleSortLock, readingDirectionLock=$readingDirectionLock, publisherLock=$publisherLock, ageRatingLock=$ageRatingLock, languageLock=$languageLock, genresLock=$genresLock, seriesId='$seriesId', createdDate=$createdDate, lastModifiedDate=$lastModifiedDate, title='$title', titleSort='$titleSort', summary='$summary', publisher='$publisher')"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ data class SeriesMetadataPatch(
val title: String?,
val titleSort: String?,
val status: SeriesMetadata.Status?,
val summary: String?,
val readingDirection: SeriesMetadata.ReadingDirection?,
val publisher: String?,
val ageRating: Int?,
val language: String?,
val genres: Set<String>,

val collections: List<String> = emptyList()
val collections: List<String>
)
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ interface BookMetadataRepository {
fun findByIdOrNull(bookId: String): BookMetadata?
fun findByIds(bookIds: Collection<String>): Collection<BookMetadata>

fun findAuthorsByName(search: String): List<String>

fun insert(metadata: BookMetadata)
fun insertMany(metadatas: Collection<BookMetadata>)
fun update(metadata: BookMetadata)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.gotson.komga.domain.persistence

interface ReferentialRepository {
fun findAuthorsByName(search: String): List<String>
fun findAllGenres(): Set<String>
fun findAllTags(): Set<String>
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@ interface SeriesMetadataRepository {
fun findById(seriesId: String): SeriesMetadata
fun findByIdOrNull(seriesId: String): SeriesMetadata?

fun insert(metadata: SeriesMetadata): SeriesMetadata
fun insert(metadata: SeriesMetadata)
fun update(metadata: SeriesMetadata)

fun delete(seriesId: String)
fun delete(seriesIds: Collection<String>)

fun count(): Long
}

0 comments on commit 9e406e3

Please sign in to comment.