## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set(collapse = TRUE, comment = "#>",
                      error = FALSE, warning = FALSE, message = FALSE)

## ----load---------------------------------------------------------------------
library(DuckDBDataFrame)

## ----construct----------------------------------------------------------------
mtcars_df <- cbind(model = rownames(mtcars), mtcars)
path <- tempfile(fileext = ".parquet")
arrow::write_parquet(mtcars_df, path)

tbl <- DuckDBTable(path, datacols = colnames(mtcars),
                   keycols = list(model = mtcars_df$model))
dim(tbl)

## ----construct-keycol---------------------------------------------------------
d_str  <- DuckDBDataFrame(path, datacols = colnames(mtcars), keycol = "model")
d_list <- DuckDBDataFrame(path, datacols = colnames(mtcars),
                          keycol = list(model = mtcars_df$model))
setequal(rownames(d_str), rownames(d_list))   # same key set
isTRUE(all.equal(d_str, d_list))               # but not all.equal (row order)

## ----rownum-------------------------------------------------------------------
tbl0 <- DuckDBTable(path, datacols = colnames(mtcars))
has_row_number(tbl0)   # unkeyed: rows addressed by generated number

dfk <- DuckDBDataFrame(path, datacols = colnames(mtcars),
                       keycol = list(model = mtcars_df$model))
has_row_number(dfk)    # keyed DataFrame: row names, no row number

## ----table-vs-df--------------------------------------------------------------
tbl1 <- DuckDBTable(path, datacols = colnames(mtcars))
df1  <- DuckDBDataFrame(path, datacols = colnames(mtcars))
identical(tbl1, df1)
isTRUE(all.equal(tbl1, df1))

## ----conn---------------------------------------------------------------------
conn <- acquireDuckDBConn()
identical(dbconn(tbl), conn)

## ----dimtbls------------------------------------------------------------------
state_df <- data.frame(
    state = rep(rownames(state.x77), times = ncol(state.x77)),
    metric = rep(colnames(state.x77), each = nrow(state.x77)),
    value = as.vector(state.x77))
sp <- tempfile(fileext = ".parquet"); arrow::write_parquet(state_df, sp)
tbl2 <- DuckDBTable(sp, datacols = "value",
                    keycols = list(state = rownames(state.x77),
                                   metric = colnames(state.x77)))
dimtbls(tbl2) <- list(state = DataFrame(
    row.names = rownames(state.x77),
    region = rep(c("West", "East"), length.out = nrow(state.x77))))
names(dimtbls(tbl2))

## ----extend-------------------------------------------------------------------
setClass("AnnotatedDuckDBDataFrame",
         contains = "DuckDBDataFrame",
         representation(annotation = "character"))

df  <- DuckDBDataFrame(path, datacols = colnames(mtcars),
                       keycol = list(model = mtcars_df$model))
adf <- new("AnnotatedDuckDBDataFrame", df, annotation = "mtcars demo")

is(adf, "DuckDBDataFrame")   # inherits the backend
dim(adf)                     # inherited, still lazy
adf@annotation               # the added slot

## ----sessioninfo--------------------------------------------------------------
sessionInfo()

