Skip to content

Commit 0553e2e

Browse files
committed
Fix Table.ndarray and add a test for it
closes #13
1 parent bdc40bf commit 0553e2e

File tree

4 files changed

+58
-5
lines changed

4 files changed

+58
-5
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ repositories {
1212
}
1313

1414
dependencies {
15-
implementation("com.martmists.ndarray-simd:ndarray-simd:1.5.1")
15+
implementation("com.martmists.ndarray-simd:ndarray-simd:1.5.2")
1616
}
1717
```
1818

build.gradle.kts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ plugins {
1717
}
1818

1919
group = "com.martmists.ndarray-simd"
20-
version = "1.5.1"
20+
version = "1.5.2"
2121
val isProduction = (findProperty("production") ?: System.getProperty("production")) != null
2222

2323
repositories {
@@ -293,6 +293,10 @@ kotlin {
293293
implementation("com.sksamuel.scrimage:scrimage-core:4.1.3")
294294
implementation("dev.langchain4j:langchain4j:0.32.0")
295295
implementation("org.jetbrains.kotlinx:dataframe-core:0.13.1")
296+
297+
implementation("org.jetbrains.exposed:exposed-core:0.60.0")
298+
implementation("org.jetbrains.exposed:exposed-jdbc:0.60.0")
299+
implementation("org.xerial:sqlite-jdbc:3.44.1.0")
296300
}
297301
}
298302

src/jvmMain/kotlin/com/martmists/ndarray/simd/compat/exposed_doublearray.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import com.martmists.ndarray.simd.impl.create
66
import com.martmists.ndarray.simd.impl.product
77
import org.jetbrains.exposed.sql.Column
88
import org.jetbrains.exposed.sql.ColumnType
9+
import org.jetbrains.exposed.sql.Op
910
import org.jetbrains.exposed.sql.Table
11+
import org.jetbrains.exposed.sql.statements.api.ExposedBlob
12+
import org.jetbrains.exposed.sql.statements.api.PreparedStatementApi
1013
import org.jetbrains.exposed.sql.vendors.SQLServerDialect
1114
import org.jetbrains.exposed.sql.vendors.currentDialect
1215
import java.io.InputStream
@@ -29,14 +32,20 @@ internal class F64ArrayColumnType : ColumnType<F64Array>() {
2932
else -> error("Unexpected value of type F64Array: $value of ${value::class.qualifiedName}")
3033
}
3134

32-
override fun nonNullValueToString(value: F64Array) = currentDialect.dataTypeProvider.hexToDb(store(value).toHexString())
33-
private fun ByteArray.toHexString(): String = joinToString(separator = "") { eachByte -> "%02x".format(eachByte) }
35+
override fun notNullValueToDB(value: F64Array) = ExposedBlob(store(value))
3436

3537
override fun readObject(rs: ResultSet, index: Int) = when {
3638
currentDialect is SQLServerDialect -> rs.getBytes(index)?.let(F64ArrayColumnType::parse)
3739
else -> rs.getBinaryStream(index)?.let(F64ArrayColumnType::parse)
3840
}
3941

42+
override fun setParameter(stmt: PreparedStatementApi, index: Int, value: Any?) {
43+
when (val toSetValue = (value as? ExposedBlob)?.inputStream ?: value) {
44+
is InputStream -> stmt.setInputStream(index, toSetValue, false)
45+
else -> super.setParameter(stmt, index, toSetValue)
46+
}
47+
}
48+
4049
companion object {
4150
@JvmStatic
4251
fun store(data: F64Array): ByteArray {
@@ -78,5 +87,4 @@ internal class F64ArrayColumnType : ColumnType<F64Array>() {
7887
* @param size The size of the vector.
7988
* @since 1.4.3
8089
*/
81-
@Deprecated("Currently not working as expected!")
8290
fun Table.ndarray(name: String): Column<F64Array> = registerColumn(name, F64ArrayColumnType())

src/jvmTest/kotlin/SqliteTest.kt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import com.martmists.ndarray.simd.F64Array
2+
import com.martmists.ndarray.simd.compat.ndarray
3+
import org.jetbrains.exposed.sql.Database
4+
import org.jetbrains.exposed.sql.SchemaUtils
5+
import org.jetbrains.exposed.sql.Table
6+
import org.jetbrains.exposed.sql.insert
7+
import org.jetbrains.exposed.sql.selectAll
8+
import org.jetbrains.exposed.sql.transactions.transaction
9+
import java.io.File
10+
import kotlin.test.Test
11+
import kotlin.test.assertEquals
12+
13+
class SqliteTest {
14+
object MyTable : Table() {
15+
val arr = ndarray("test")
16+
}
17+
18+
@Test
19+
fun testSerialization() {
20+
val arr1 = F64Array.random(10, 10)
21+
22+
val db = Database.connect("jdbc:sqlite:./data.sqlite3", "org.sqlite.JDBC")
23+
File("./data.sqlite3").deleteOnExit()
24+
25+
transaction(db) {
26+
SchemaUtils.createMissingTablesAndColumns(MyTable)
27+
28+
MyTable.insert {
29+
it[MyTable.arr] = arr1
30+
}
31+
}
32+
33+
val arr2 = transaction(db) {
34+
val row = MyTable.selectAll().first()
35+
row[MyTable.arr]
36+
}
37+
38+
assertEquals(arr1, arr2)
39+
40+
}
41+
}

0 commit comments

Comments
 (0)