From 69ac5c131fa54d813cf076d4b10a3faf75e70600 Mon Sep 17 00:00:00 2001 From: Jolan Rensen Date: Thu, 26 Jun 2025 14:28:12 +0200 Subject: [PATCH] Alternative fix for #1282 which adds `tableTypes` to `DbType` --- dataframe-jdbc/api/dataframe-jdbc.api | 1 + .../jetbrains/kotlinx/dataframe/io/db/DbType.kt | 16 ++++++++++++++++ .../jetbrains/kotlinx/dataframe/io/readJdbc.kt | 9 +++++---- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/dataframe-jdbc/api/dataframe-jdbc.api b/dataframe-jdbc/api/dataframe-jdbc.api index 552c069316..21e5c2e85b 100644 --- a/dataframe-jdbc/api/dataframe-jdbc.api +++ b/dataframe-jdbc/api/dataframe-jdbc.api @@ -120,6 +120,7 @@ public abstract class org/jetbrains/kotlinx/dataframe/io/db/DbType { public abstract fun convertSqlTypeToKType (Lorg/jetbrains/kotlinx/dataframe/io/TableColumnMetadata;)Lkotlin/reflect/KType; public final fun getDbTypeInJdbcUrl ()Ljava/lang/String; public abstract fun getDriverClassName ()Ljava/lang/String; + public fun getTableTypes ()Ljava/util/List; public abstract fun isSystemTable (Lorg/jetbrains/kotlinx/dataframe/io/TableMetadata;)Z public fun sqlQueryLimit (Ljava/lang/String;I)Ljava/lang/String; public static synthetic fun sqlQueryLimit$default (Lorg/jetbrains/kotlinx/dataframe/io/db/DbType;Ljava/lang/String;IILjava/lang/Object;)Ljava/lang/String; diff --git a/dataframe-jdbc/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/db/DbType.kt b/dataframe-jdbc/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/db/DbType.kt index def6e815c3..953cc8b547 100644 --- a/dataframe-jdbc/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/db/DbType.kt +++ b/dataframe-jdbc/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/db/DbType.kt @@ -2,7 +2,10 @@ package org.jetbrains.kotlinx.dataframe.io.db import org.jetbrains.kotlinx.dataframe.io.TableColumnMetadata import org.jetbrains.kotlinx.dataframe.io.TableMetadata +import org.jetbrains.kotlinx.dataframe.io.getSchemaForAllSqlTables +import org.jetbrains.kotlinx.dataframe.io.readAllSqlTables import org.jetbrains.kotlinx.dataframe.schema.ColumnSchema +import java.sql.DatabaseMetaData import java.sql.ResultSet import kotlin.reflect.KType @@ -21,6 +24,19 @@ public abstract class DbType(public val dbTypeInJdbcUrl: String) { */ public abstract val driverClassName: String + /** + * The table type(s) (`TABLE_TYPE`) of ordinary tables in the SQL database, used by + * [getSchemaForAllSqlTables], and [readAllSqlTables] as a filter when querying the database + * for all the tables it has using [DatabaseMetaData.getTables]. + * + * This is usually "TABLE" or "BASE TABLE", which is what [tableTypes] is set to by default, + * but it can be overridden to any custom list of table types, or `null` to let the JDBC integration + * return all types of tables. + * + * See [DatabaseMetaData.getTableTypes] for all supported table types of your specific database. + */ + public open val tableTypes: List? = listOf("TABLE", "BASE TABLE") + /** * Returns a [ColumnSchema] produced from [tableColumnMetadata]. */ diff --git a/dataframe-jdbc/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/readJdbc.kt b/dataframe-jdbc/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/readJdbc.kt index 7bd110ba73..2d88ed3c5c 100644 --- a/dataframe-jdbc/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/readJdbc.kt +++ b/dataframe-jdbc/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/readJdbc.kt @@ -642,8 +642,9 @@ public fun DataFrame.Companion.readAllSqlTables( val metaData = connection.metaData val determinedDbType = dbType ?: extractDBTypeFromConnection(connection) - // exclude a system and other tables without data, but it looks like it is supported badly for many databases - val tables = metaData.getTables(catalogue, null, null, arrayOf("TABLE")) + // exclude system- and other tables without data (it looks like it is supported badly for many databases) + val tableTypes = determinedDbType.tableTypes?.toTypedArray() + val tables = metaData.getTables(catalogue, null, null, tableTypes) val dataFrames = mutableMapOf() @@ -861,8 +862,8 @@ public fun DataFrame.Companion.getSchemaForAllSqlTables( val metaData = connection.metaData val determinedDbType = dbType ?: extractDBTypeFromConnection(connection) - val tableTypes = arrayOf("TABLE") - // exclude a system and other tables without data + // exclude system- and other tables without data + val tableTypes = determinedDbType.tableTypes?.toTypedArray() val tables = metaData.getTables(null, null, null, tableTypes) val dataFrameSchemas = mutableMapOf()