@@ -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 " "
0 commit comments