---
title: "Data Sources"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Data Sources}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  eval = FALSE
)
```

`querychat` supports several different data sources, including:

1. Data frames
2. DBI database connections (e.g., SQLite, PostgreSQL, MySQL, DuckDB)
3. Custom `DataSource` interfaces

The sections below describe how to use each type of data source with `querychat`.

## Data frames

You can use any data frame as a data source in `querychat`. Simply pass it to `querychat()`:

```{r}
library(querychat)
library(palmerpenguins)

qc <- querychat(mtcars)
qc$app()  # Launch the app
```

Behind the scenes, `querychat` creates an in-memory DuckDB database and registers your data frame as a table for SQL query execution.

## Database connections

You can also connect `querychat` directly to a table in any database supported by [DBI](https://dbi.r-dbi.org/). This includes popular databases like SQLite, DuckDB, PostgreSQL, MySQL, and many more.

Assuming you have a database set up and accessible, you can create a DBI connection and pass it to `querychat()`. Below are some examples for common databases.

### DuckDB

```{r}
library(DBI)
library(duckdb)
library(querychat)

# Connect to a DuckDB database file
con <- dbConnect(duckdb::duckdb(), dbdir = "my_database.duckdb")

qc <- querychat(con, "my_table")
qc$app()  # Launch the app

# Don't forget to disconnect when done
# dbDisconnect(con)
```

### SQLite

```{r}
library(DBI)
library(RSQLite)
library(querychat)

# Connect to a SQLite database file
con <- dbConnect(RSQLite::SQLite(), "my_database.db")

qc <- querychat(con, "my_table")
qc$app()  # Launch the app

# Don't forget to disconnect when done
# dbDisconnect(con)
```

### PostgreSQL

```{r}
library(DBI)
library(RPostgres)
library(querychat)

# Connect to PostgreSQL
con <- dbConnect(
  RPostgres::Postgres(),
  host = "localhost",
  port = 5432,
  dbname = "mydatabase",
  user = "myuser",
  password = "mypassword"
)

qc <- querychat(con, "my_table")
qc$app()  # Launch the app

# Don't forget to disconnect when done
# dbDisconnect(con)
```

### MySQL

```{r}
library(DBI)
library(RMariaDB)
library(querychat)

# Connect to MySQL
con <- dbConnect(
  RMariaDB::MariaDB(),
  host = "localhost",
  port = 3306,
  dbname = "mydatabase",
  user = "myuser",
  password = "mypassword"
)

qc <- querychat(con, "my_table")
qc$app()  # Launch the app

# Don't forget to disconnect when done
# dbDisconnect(con)
```

## Creating a database from a data frame

If you don't have a database set up, you can easily create a local DuckDB database from a data frame:

```{r}
library(DBI)
library(duckdb)

con <- dbConnect(duckdb::duckdb(), dbdir = "my_database.duckdb")

# Write a data frame to the database
dbWriteTable(con, "penguins", penguins)

# Or from CSV
duckdb::duckdb_read_csv(con, "my_table", "path/to/your/file.csv")
```

Then you can connect to this database using the DuckDB example above.

## Custom sources

If you have a custom data source that doesn't fit into the above categories, you can implement the `DataSource` interface.
See the [DataSource reference](../reference/DataSource.html) for more details on implementing this interface.
