@@ -98,24 +98,30 @@ DataSource <- R6::R6Class(
9898# ' database table. See [DBISource] for the full description of available
9999# ' methods.
100100# '
101- # ' Use the `engine` parameter to choose between "duckdb" (default) or "sqlite",
102- # ' or set the global option `querychat.DataFrameSource.engine to choose the
103- # ' default engine for all DataFrameSource instances.
101+ # ' By default, DataFrameSource uses the first available engine from duckdb
102+ # ' (checked first) or RSQLite. You can explicitly set the `engine` parameter to
103+ # ' choose between "duckdb" or "sqlite", or set the global option
104+ # ' `querychat.DataFrameSource.engine` to choose the default engine for all
105+ # ' DataFrameSource instances. At least one of these packages must be installed.
104106# '
105107# ' @export
106108# ' @examples
107109# ' \dontrun{
108- # ' # Create a data frame source
110+ # ' # Create a data frame source (uses first available: duckdb or sqlite)
109111# ' df_source <- DataFrameSource$new(mtcars, "mtcars")
110112# '
111113# ' # Get database type
112- # ' df_source$get_db_type() # Returns "DuckDB"
114+ # ' df_source$get_db_type() # Returns "DuckDB" or "SQLite"
113115# '
114116# ' # Execute a query
115117# ' result <- df_source$execute_query("SELECT * FROM mtcars WHERE mpg > 25")
116118# '
119+ # ' # Explicitly choose an engine
120+ # ' df_sqlite <- DataFrameSource$new(mtcars, "mtcars", engine = "sqlite")
121+ # '
117122# ' # Clean up when done
118123# ' df_source$cleanup()
124+ # ' df_sqlite$cleanup()
119125# ' }
120126DataFrameSource <- R6 :: R6Class(
121127 " DataFrameSource" ,
@@ -131,6 +137,10 @@ DataFrameSource <- R6::R6Class(
131137 # ' @param table_name Name to use for the table in SQL queries. Must be a
132138 # ' valid table name (start with letter, contain only letters, numbers,
133139 # ' and underscores)
140+ # ' @param engine Database engine to use: "duckdb" or "sqlite". Set the
141+ # ' global option `querychat.DataFrameSource.engine` to specify the default
142+ # ' engine for all instances. If NULL (default), uses the first available
143+ # ' engine from duckdb or RSQLite (in that order).
134144 # ' @return A new DataFrameSource object
135145 # ' @examples
136146 # ' \dontrun{
@@ -139,11 +149,12 @@ DataFrameSource <- R6::R6Class(
139149 initialize = function (
140150 df ,
141151 table_name ,
142- engine = getOption(" querychat.DataFrameSource.engine" , " duckdb " )
152+ engine = getOption(" querychat.DataFrameSource.engine" , NULL )
143153 ) {
144154 check_data_frame(df )
145155 check_sql_table_name(table_name )
146156
157+ engine <- engine %|| % get_default_dataframe_engine()
147158 engine <- tolower(engine )
148159 arg_match(engine , c(" duckdb" , " sqlite" ))
149160
@@ -341,6 +352,22 @@ is_data_source <- function(x) {
341352}
342353
343354
355+ get_default_dataframe_engine <- function () {
356+ if (is_installed(" duckdb" )) {
357+ return (" duckdb" )
358+ }
359+ if (is_installed(" RSQLite" )) {
360+ return (" sqlite" )
361+ }
362+ cli :: cli_abort(c(
363+ " No compatible database engine installed for DataFrameSource" ,
364+ " i" = " Install either {.pkg duckdb} or {.pkg RSQLite}:" ,
365+ " " = " {.run install.packages(\" duckdb\" )}" ,
366+ " " = " {.run install.packages(\" RSQLite\" )}"
367+ ))
368+ }
369+
370+
344371get_schema_impl <- function (conn , table_name , categorical_threshold = 20 ) {
345372 # Get column information
346373 columns <- DBI :: dbListFields(conn , table_name )
0 commit comments