72 lines
1.8 KiB
R
Executable File
72 lines
1.8 KiB
R
Executable File
# R/tree_helpers.R
|
|
|
|
# Buchungsanzahl rekursiv für einen Knoten und alle Nachkommen
|
|
count_recursive <- function(num, df, counts) {
|
|
# Alle Nachkommen: alles im Bereich (num, num+1000) je nach Ebene
|
|
divisor <- ifelse(num %% 1000 == 0, 1000,
|
|
ifelse(num %% 100 == 0, 100,
|
|
ifelse(num %% 10 == 0, 10, 1)))
|
|
|
|
descendants <- df$id[
|
|
df$num >= num &
|
|
df$num < num + divisor
|
|
]
|
|
|
|
sum(counts$n[counts$account_id %in% descendants], na.rm = TRUE)
|
|
}
|
|
|
|
# Label mit Buchungsanzahl
|
|
make_label <- function(num, df, counts) {
|
|
name <- df$account_name[df$num == num]
|
|
total <- count_recursive(num, df, counts)
|
|
ifelse(total > 0,
|
|
paste0(name, " (", total, ")"),
|
|
name
|
|
)
|
|
}
|
|
|
|
# Baum rekursiv aufbauen
|
|
build_level <- function(df, counts, parent_num, divisor) {
|
|
if (divisor < 1) return(list())
|
|
|
|
children <- df[
|
|
df$num > parent_num &
|
|
df$num < parent_num + divisor * 10 &
|
|
df$num %% divisor == 0 &
|
|
df$num %% (divisor * 10) != 0,
|
|
]
|
|
|
|
if (nrow(children) == 0) return(list())
|
|
|
|
result <- lapply(seq_len(nrow(children)), function(i) {
|
|
child_num <- children$num[i]
|
|
subtree <- build_level(df, counts, child_num, divisor / 10)
|
|
if (length(subtree) == 0)
|
|
structure(list(), sttype = "default")
|
|
else
|
|
subtree
|
|
})
|
|
|
|
setNames(result, sapply(children$num, make_label, df = df, counts = counts))
|
|
}
|
|
|
|
# Hauptfunktion: kompletten Baum aus accounts-Tabelle bauen
|
|
build_account_tree <- function(conn) {
|
|
df <- dbReadTable(conn, "accounts")
|
|
df$num <- as.integer(substr(df$account_name, 1, 4))
|
|
|
|
counts <- tbl(conn, "postings") %>%
|
|
count(account_id) %>%
|
|
collect()
|
|
|
|
tops <- df[df$num %% 1000 == 0, ]
|
|
|
|
tree <- lapply(seq_len(nrow(tops)), function(i) {
|
|
build_level(df, counts, tops$num[i], 100)
|
|
})
|
|
|
|
setNames(
|
|
tree,
|
|
sapply(tops$num, make_label, df = df, counts = counts)
|
|
)
|
|
} |