Skip to content

Commit 260eb42

Browse files
authored
Merge pull request #59 from Paulanerus/dev
Dev
2 parents 0b6e4a3 + 65a9a34 commit 260eb42

2 files changed

Lines changed: 19 additions & 11 deletions

File tree

core/src/main/kotlin/dev/paulee/core/data/sql/Database.kt

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,31 +43,39 @@ private data class Column(
4343
override fun toString(): String = "$name $type ${if (primary) "PRIMARY KEY" else if (nullable) "" else "NOT NULL"}"
4444
}
4545

46-
private class Table(val name: String, columns: List<Column>) {
46+
private class Table(val name: String, val columns: List<Column>) {
4747

4848
val primaryKey: Column = columns.find { it.primary } ?: Column(
4949
"${name}_ag_id", ColumnType.INTEGER, primary = true, nullable = false
5050
)
5151

52-
val columns = listOf(primaryKey) + columns.filter { !it.primary }
52+
val orderedColumns = listOf(primaryKey) + columns.filter { !it.primary }
5353

5454
val tempTables = mutableMapOf<String, String>()
5555

5656
fun import(connection: DuckDBConnection, path: Path, hasId: Boolean) {
57+
val readCsvStmt = buildString {
58+
append("read_csv('$path', header = true, columns = {")
59+
append(columns.joinToString(", ") { column ->
60+
"'${column.name}': '${column.type}'"
61+
})
62+
append("})")
63+
}
64+
5765
val query = buildString {
5866
append("CREATE TABLE IF NOT EXISTS ")
5967
append(name)
6068

6169
if (hasId)
62-
append(" AS SELECT * FROM '$path';")
70+
append(" AS SELECT * FROM $readCsvStmt;")
6371
else
64-
append(" AS SELECT CAST(row_number() OVER () - 1 AS INTEGER) AS ${name}_ag_id, t.* FROM (SELECT * FROM '$path') AS t;")
72+
append(" AS SELECT CAST(row_number() OVER () - 1 AS INTEGER) AS ${name}_ag_id, t.* FROM (SELECT * FROM $readCsvStmt) AS t;")
6573
}
6674

6775
connection.createStatement().use {
6876
it.execute(query)
6977

70-
columns.mapNotNull { column ->
78+
orderedColumns.mapNotNull { column ->
7179
val name = column.name
7280
val normalized = normalizeSourceName(name)
7381

@@ -113,7 +121,7 @@ private class Table(val name: String, columns: List<Column>) {
113121
val results = mutableListOf<Map<String, String>>()
114122

115123
while (it.next()) {
116-
val row = columns.associate { column -> column.name to (it.getString(column.name) ?: "") }
124+
val row = orderedColumns.associate { column -> column.name to (it.getString(column.name) ?: "") }
117125

118126
results.add(row)
119127
}
@@ -164,9 +172,9 @@ private class Table(val name: String, columns: List<Column>) {
164172
}
165173
}
166174

167-
fun getColumnType(name: String): ColumnType? = columns.find { it.name == name }?.type
175+
fun getColumnType(name: String): ColumnType? = orderedColumns.find { it.name == name }?.type
168176

169-
override fun toString(): String = "$name primary=${primaryKey}, columns={${columns.joinToString(", ")}}"
177+
override fun toString(): String = "$name primary=${primaryKey}, columns={${orderedColumns.joinToString(", ")}}"
170178

171179
private fun buildWhereClause(connection: DuckDBConnection, whereClause: Map<String, List<String>>): String {
172180
if (whereClause.isEmpty()) return ""

gradle.properties

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ jdu.version=4.15
1111
coroutines.version=1.10.2
1212
tokenizers.version=0.34.0
1313
onnx.version=1.22.0
14-
duckdb.version=1.4.1.0
14+
duckdb.version=1.5.0.0
1515
caffeine.version=3.2.2
1616

1717
api.version=1.16.5
18-
core.version=1.18.14
18+
core.version=1.19.0
1919
ui.version=1.20.0
20-
app.version=1.7.0
20+
app.version=1.7.1

0 commit comments

Comments
 (0)