diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 25f2cfd0..9a9f0462 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,13 +8,16 @@ jobs: matrix: os: [ macOS-latest, windows-latest ] runs-on: ${{matrix.os}} + timeout-minutes: 30 steps: - name: Checkout the repo uses: actions/checkout@v2 - name: Set up JDK 11 - uses: actions/setup-java@v1 + uses: DeLaGuardo/setup-graalvm@4.0 with: - java-version: 11 + graalvm: 21.1.0 + java: java11 + arch: amd64 - name: Add msys to path if: matrix.os == 'windows-latest' run: SETX PATH "%PATH%;C:\msys64\mingw64\bin" diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 74c1bffd..5892b3c4 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -12,9 +12,11 @@ jobs: - name: Checkout the repo uses: actions/checkout@v2 - name: Set up JDK 11 - uses: actions/setup-java@v1 + uses: DeLaGuardo/setup-graalvm@4.0 with: - java-version: 11 + graalvm: 21.1.0 + java: java11 + arch: amd64 - name: Cache gradle uses: actions/cache@v2 with: @@ -22,10 +24,15 @@ jobs: key: ubuntu-20.04-gradle-${{ hashFiles('*.gradle.kts') }} restore-keys: | ubuntu-20.04-gradle- + - name: Cache konan + uses: actions/cache@v2 + with: + path: ~/.konan + key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} + restore-keys: | + ${{ runner.os }}-gradle- - name: Build - run: | - ./gradlew dokkaHtmlMultiModule --no-daemon --no-parallel --stacktrace - mv build/dokka/htmlMultiModule/-modules.html build/dokka/htmlMultiModule/index.html + run: ./gradlew dokkaHtmlMultiModule --no-daemon --no-parallel --stacktrace - name: Deploy to GitHub Pages uses: JamesIves/github-pages-deploy-action@4.1.0 with: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 42fa6d3b..c5c110e8 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -12,15 +12,17 @@ jobs: name: publish strategy: matrix: - os: [macOS-latest, windows-latest] + os: [ macOS-latest, windows-latest ] runs-on: ${{matrix.os}} steps: - name: Checkout the repo uses: actions/checkout@v2 - name: Set up JDK 11 - uses: actions/setup-java@v1 + uses: DeLaGuardo/setup-graalvm@4.0 with: - java-version: 11 + graalvm: 21.1.0 + java: java11 + arch: amd64 - name: Add msys to path if: matrix.os == 'windows-latest' run: SETX PATH "%PATH%;C:\msys64\mingw64\bin" diff --git a/dataforge-exposed/src/main/kotlin/space/kscience/dataforge/exposed/ExposedTable.kt b/dataforge-exposed/src/main/kotlin/space/kscience/dataforge/exposed/ExposedTable.kt index 2f79b604..81c3cb29 100644 --- a/dataforge-exposed/src/main/kotlin/space/kscience/dataforge/exposed/ExposedTable.kt +++ b/dataforge-exposed/src/main/kotlin/space/kscience/dataforge/exposed/ExposedTable.kt @@ -1,6 +1,5 @@ package space.kscience.dataforge.exposed -import org.jetbrains.exposed.dao.id.EntityID import org.jetbrains.exposed.dao.id.IntIdTable import org.jetbrains.exposed.sql.* import org.jetbrains.exposed.sql.transactions.transaction @@ -12,26 +11,55 @@ import kotlin.reflect.KType import kotlin.reflect.typeOf import org.jetbrains.exposed.sql.Column as SqlColumn +/** + * Exposed based [Column] implementation. + * + * @param T The type of table items. + * @property db The Exposed database. + * @param sqlTable The Exposed table, which must follow the properties defined for [ExposedTable.sqlTable]. + * @param sqlColumn The Exposed column. + * @param type The type of [T]. + */ public class ExposedColumn( public val db: Database, public val sqlTable: IntIdTable, public val sqlColumn: SqlColumn, public override val type: KType, ) : Column { + /** + * The name of this column. + */ public override val name: String get() = sqlColumn.name + /** + * Returns [Meta.EMPTY] because it is impossible to store metadata correctly with SQL columns. + */ public override val meta: Meta get() = Meta.EMPTY + /** + * Returns the count of rows in the table. + */ public override val size: Int get() = transaction(db) { sqlColumn.table.selectAll().count().toInt() } + /** + * Acquires the value of this column in the row [index]. + */ public override fun get(index: Int): T? = transaction(db) { sqlTable.select { sqlTable.id eq index + 1 }.firstOrNull()?.getOrNull(sqlColumn) } } +/** + * Exposed based [Row] implementation. + * + * @param T The type of table items. + * @param db The Exposed database. + * @param sqlTable The Exposed table, which must follow the properties defined for [ExposedTable.sqlTable]. + * @param sqlRow The Exposed row. + */ @Suppress("UNCHECKED_CAST") public class ExposedRow( public val db: Database, @@ -39,19 +67,39 @@ public class ExposedRow( public val sqlRow: ResultRow, ) : Row { + /** + * Acquires the value of [column] in this row. + */ public override fun get(column: String): T? = transaction(db) { val theColumn = sqlTable.columns.find { it.name == column } as SqlColumn? ?: return@transaction null sqlRow.getOrNull(theColumn) } } +/** + * Exposed based [Table] implementation. + * + * @property db The Exposed database. + * + * @property sqlTable The Exposed table. It must have the following properties: + * 1. Integer `id` column must be present with auto-increment by sequence 1, 2, 3… + * 1. All other columns must be of type [T]. + * + * @property type The type of [T]. + */ @Suppress("UNCHECKED_CAST") public class ExposedTable(public val db: Database, public val sqlTable: IntIdTable, public val type: KType) : Table { - public override val columns: List> = + /** + * The list of columns in this table. + */ + public override val columns: List> = sqlTable.columns.filterNot { it.name == "id" }.map { ExposedColumn(db, sqlTable, it as SqlColumn, type) } - public override val rows: List> + /** + * The list of rows in this table. + */ + public override val rows: List> get() = transaction(db) { sqlTable.selectAll().map { ExposedRow(db, sqlTable, it) } } @@ -64,9 +112,27 @@ public class ExposedTable(public val db: Database, public val sqlTable: } } -public inline fun ExposedTable(db: Database, table: IntIdTable): ExposedTable = - ExposedTable(db, table, typeOf()) +/** + * Constructs [ExposedTable]. + * + * @param T The type of table items. + * @param db The Exposed database. + * @param sqlTable The Exposed table, which must follow the properties defined for [ExposedTable.sqlTable]. + * @return A new [ExposedTable]. + */ +public inline fun ExposedTable(db: Database, sqlTable: IntIdTable): ExposedTable = + ExposedTable(db, sqlTable, typeOf()) +/** + * Constructs [ExposedTable]. + * + * @param T The type of table items. + * @param db The Exposed database. + * @param tableName The name of table. + * @param columns The list of columns' names. + * @param sqlColumnType The [IColumnType] for [T]. + * @return A new [ExposedTable]. + */ public inline fun ExposedTable( db: Database, tableName: String, diff --git a/gradle.properties b/gradle.properties index db27b7de..2bae1b5e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -org.gradle.jvmargs=-XX:MaxMetaspaceSize=512m +org.gradle.jvmargs=-XX:MaxMetaspaceSize=2G org.gradle.parallel=true kotlin.code.style=official @@ -6,4 +6,4 @@ kotlin.parallel.tasks.in.project=true kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.native.enableDependencyPropagation=false -kotlin.mpp.stability.nowarn=true \ No newline at end of file +kotlin.mpp.stability.nowarn=true