Establish compatibility with igraph >= 2.0.0 (#2187) and withr 3.0.0(#2184).
Reexport tibble::glimpse()
instead of pillar::glimpse()
to avoid pillar dependency with roxygen2 7.3.0 (#2179).
dm_sql()
now processes table_names
with dbplyr::escape()
, therefore also accepting dbplyr objects (#2129).copy_dm_to()
creates string columns of necessary lengths for MariaDB and SQL Server. This worked before for SQL Server in dm 1.0.5, now also works on MariaDB (#311, #2066, #2082).Explicitly fail on compute(temporary = TRUE)
, which never worked correctly (#2059, #2103).
Warn about DuckDB not supporting autoincrementing primary keys (#2099).
check_suggested()
a standalone (#2054).Tweak vignette for compute(temporary = TRUE)
.
Update documentation of check_suggested()
(@olivroy, #2055).
dm()
, new_dm()
, as_dm()
and dm_validate()
. dm()
and as_dm()
no longer call dm_validate()
(#2108).Add test for copy_dm_to(table_names = )
(#250, #2101).
Work around test failures for dbplyr 2.4.0.
Remove most skips from tests (#2052).
copy_dm_to()
now warns unconditionally on unsupported arguments, and fails if copy_to
is provided (#1944). Use the new dm_sql()
function as a replacement for copy_dm_to(copy_to = )
(#1915, #2011, @jangorecki).
New json_unnest()
and json_unpack()
, currently implemented for data frames only (#991, #997).
dm_rows_append()
also works for local dm, with support for autoincrement primary keys (#1727, #1745).
Breaking change: Add check_dots_empty()
calls (#1929, #1943).
Test MySQL on GHA (#1940).
Improve MySQL compatibility regarding learning of database schemas and checking of constraints (#1938).
check_dots_empty()
calls (#1929, #1943).Compatibility with duckdb 0.9.1.
Minor fixes in dm_pack_tbl()
and dm_unwrap_tbl()
(#1947).
Use rlang::check_installed()
internally to install missing suggested packages on the fly (@olivroy, #1348, #2036, #2039, #2040).
Use vectorized rlang::is_installed()
to decide if examples should be run (@olivroy, #2043).
Recategorize and describe function reference.
Better error and information messages when querying keys.
collect.zoomed_dm()
shows a more helpful error message (#1929, #1945).
Add information on default font size to ?dm_draw
(#1935).
Add db-*
rules to Makefile to simplify Docker-based database setup.
Remove curly braces, add \pkg
(@olivroy, #2042).
Replace tibble()
by fast_tibble()
(@mgirlich, #1928).
Replace superseded dplyr::recode()
(@mgirlich, #1927).
Remove most skips from tests (#2052).
Add explicit unique key to dm_for_filter()
.
Add Postgres test for dm_sql()
.
Switch internal testing to MariaDB.
Fast offline checks with new "DM_OFFLINE"
environment variable.
New GHA checks for the case of missing suggested packages (#1952).
Make check_suggested()
a standalone (#2054).
Backport changes from attempted CRAN release (#2046).
Move magrittr (#1975, #1983), DBI (#1974), and pillar (#1976) to "Suggests"
.
Require RMariaDB 1.3.0, work around tidyverse/dbplyr#1190 and tidyverse/dbplyr#1195 (#1989).
Prefer map*()
over lapply()
and vapply()
.
styler::style_pkg(scope = "tokens")
.
Rename internal new_dm3()
to dm_from_def()
(#1225, #1949).
Remove dead code (#979, #1950, #1871).
Reorganize build_copy_queries()
(#1923).
Avoid dbplyr::ident_q()
(#1788).
Add ellipsis to tbl_sum()
signature (#1941).
Compare version returned by getRversion()
with string instead of number.
Work around vctrs bug in jsonlite 1.8.5.
dm_from_con()
gains .names
argument for pattern-based construction of table names in the dm object (@owenjonesuob, #1790).
New dm_set_table_descriptions()
, dm_get_table_descriptions()
and dm_reset_table_descriptions()
to set table labels as persistent attributes of the table object (#1888).
dm_from_con()
can retrieve multiple schemas, pass a character vector to the schema
argument (@owenjonesuob, #1533, #1789).
build_copy_queries()
and db_learn_from_db()
improvements (@samssann, #1642, #1677, #1739).
UK support for dm_draw()
(#1731, #1877).
Allow for additional description of tables in dm_draw() (#1875, #1876).
Establish compatibility with dbplyr 2.3.3 and 2.4.0 (@mgirlich, #1919).
In copy_dm_to()
, call collect()
only when copying data, table by table (@jangorecki, #1900).
Use roxyglobals (#1838).
Require purrr >= 1.0.0 for list_c()
(#1847, #1848).
Add table description to diagram in README.
Tweak testing instructions. Mention Makefile
in CONTRIBUTING.md. Describe Docker setup (#1898).
Vignette corrections (@MikeJohnPage, #1882).
Avoid tidyverse package.
dm_wrap_tbl()
and dm_unwrap_tbl()
(#835, #1450).Add cheat sheet as a vignette (#1653).
Suggest creating a function for your database dm
object (#1827, #1828).
Add alternative text to author images for pkgdown website (#1804).
Compatibility with dev jsonlite (#1837).
Remove tidyverse dependency (#1798, #1834).
Minimal patch to fix multiple match updates (@DavisVaughan, #1806).
Adapt to rlang 1.1.0 changes (#1817).
Make sure {dm}
passes “noSuggests” workflow (#1659).
dm_add_pk()
gains autoincrement
argument (#1689), autoincrement primary keys are configured on the database with copy_dm_to()
(#1696).
New dm_add_uk()
, dm_rm_uk()
and dm_get_all_uks()
functions for explicit support of unique keys (#622, #1716).
dm_get_all_pks()
and dm_get_all_fks()
return output in the order of table
or parent_table
argument (#1707).
Improve error message for dm_add_pk()
when the columns
argument is missing (#1644, #1646).
dm_get_all_pks()
, dm_get_all_fks()
, and dm_get_all_uks()
require unquoted table names as input, for consistency with other parts of the API (#1741).dm_examine_constraints()
works for dm
objects on the database with compound keys (#1713).Update pkgdown URL to https://dm.cynkra.com/ (#1652).
Fix link rot (#1671).
Require dplyr >= 1.1.0 and lifecycle >= 1.0.3 (#1771, #1637).
Checks pass if all suggested packages are missing (#1659).
Fix r-devel builds (#1776).
dm_unpack_tbl()
sets PK before FK (#1715).
Clean up dm_rows_append()
implementation (#1714).
dm()
accepts tables that are of class "tbl_sql"
but not "tbl_dbi"
(#1695, #1710).
Use correctly typed missing value for lists (@DavisVaughan, #1686).
dm_from_con()
can use multiple schemata (@mgirlich, #1441, #1449).
pack_join(keep = TRUE)
preserves order of packed columns (#1513, #1514).
pack_join(keep = TRUE)
keeps keys of y
in the resulting packed column (#1451, #1452).
New json_pack.tbl_lazy()
and json_nest.tbl_lazy()
(#969, #975).
dm_paste()
gives correct output for factor columns with many levels (#1510, #1511).Fix compatibility with duckdb 0.5.0 (#1509, #1518).
Refactor dm_unwrap_tbl()
so it builds a “unwrap plan” first (#1446, #1447).
Reenable dm_rows_update()
test (#1437).
dm_deconstruct()
creates code to deconstruct a dm
object into individual keyed tables via pull_tbl(keyed = TRUE)
(#1354).dm_ptype()
in dm_gui()
, generate better code (#1353).New dm_gui()
for interactive editing of dm
objects (#1076, #1319).
dm_get_tables()
and pull_tbl()
gain a new keyed = FALSE
argument. If set to TRUE
, table objects of class "dm_keyed_tbl"
are returned. These objects inherit from the underlying data structure (tibble or lazy table), keep track of primary and foreign keys, and can be used later on in a call to dm()
to recreate a dm object with the keys (#1187).
New by_position
argument to check_subset()
, check_set_equality()
, check_cardinality_...()
and examine_cardinality()
(#1253).
dm()
accepts dm objects (#1226).
dm_examine_constraints()
honors implicit unique keys defined by foreign keys (#1131, #1209).
dm_filter()
is now stable, with a new API that avoids exposing an intermediate state with filters not yet applied, with a compatibility wrapper (#424, #426, #1236).
check_cardinality_...()
, examine_cardinality()
, check_subset()
and check_set_equality()
are now stable and consistently use a common interface with arguments named x
, y
, x_select
and y_select
, with compatibility wrappers (#1194, #1229).
dm_examine_cardinalities()
and dm_examine_constraints()
are now stable with a new signature and a compatibility wrapper (#1193, #1195).
dm_apply_filters()
, dm_apply_filters_to_tbl()
and dm_get_filters()
are deprecated (#424, #426, #1236).
dm_disambiguate_cols()
adds table names as a suffix by default, and gains a .position
argument to restore the original behavior. Arguments sep
and quiet
are renamed to .sep
and .quiet
(#1293, #1327).
dm_squash_to_tbl()
is deprecated in favor of the new .recursive
argument to dm_flatten_to_tbl()
. Arguments start
and join
are renamed to .start
and .join
(#1272, #1324).
dm_rm_tbl()
is deprecated in favor of dm_select_tbl()
(#1275).
dm_bind()
and dm_add_tbl()
are deprecated in favor of dm()
(#1226).
rows_truncate()
and dm_rows_truncate()
are deprecated, because they use DDL as opposed to all other verbs that use DML (#1031, #1321).
All internal S3 classes now use the "dm_"
prefix (#1285, #1339).
Add ellipses to all generics (#1298).
Reexport tibble()
(#1279).
dm_ptype()
, dm_financial()
and dm_pixarfilms()
are stable now (#1254).
Turn all “questioning” functions to “experimental” (#1030, #1237).
is_unique_key()
uses vctrs::vec_count()
on local data frames for speed (@eutwt, #1247).
check_key()
uses vctrs::vec_duplicate_any()
on local data frames for speed (@eutwt, #1234).
dm_draw()
works if a table name has a space (#1219).
Don’t print rule in glimpse.dm()
for empty dm()
(#1208).
Work around ANSI escape issues in CRAN rendering of vignette (#1156, #1330).
Fix column names in ?dm_get_all_pks
(#1245).
Improve contrast for display of dm_financial()
(#1073, #1250).
Add contributing guide (#1222).
Use sensible node and edge IDs, corresponding to the data model, in SVG graph (#1214).
Tests for datamodelr code (#1215).
Implement glimpse()
for zoomed_df
(@IndrajeetPatil, #1003, #1161).
Remove message about automated key selection with the select
argument in joins on zoomed_df
(@IndrajeetPatil, #1113, #1176).
dm_from_con(learn_keys = TRUE)
works for MariaDB (#1106, #1123, #1169, @maelle), and for compound keys in Postgres (#342, #1006, #1016) and SQL Server (#342).
New json_pack_join()
, json_nest_join()
, json_pack()
and json_nest()
, similar to pack_join()
, dplyr::nest_join()
, tidyr::pack()
and tidyr::nest()
, but create character columns (#917, #918, #973, #974).
nest_join()
and pack_join()
support zoomed_df
objects (#1119, @IndrajeetPatil).
Marked stable functions as stable, in particular dm()
and related functions (#1032, #1040).
Remove own rows_*()
implementation for lazy tables, they are now available in dbplyr >= 2.2.0 (#912, #1024, #1028).
Deprecate dm_join_to_tbl()
, dm_is_referenced()
and dm_get_referencing_tables()
(#1038).
New dm_validate()
replaces now deprecated validate_dm()
(#1033).
dm_get_con()
and dm_get_filters()
use dm
as argument name (#1034, #1036).
Mark ...
in dm_flatten_to_tbl()
as experimental (#1037).
Add ellipses to dm_disambiguate_cols()
, dm_draw()
, dm_examine_constraints()
, dm_nycflights13()
and dm_pixarfilms()
(#1035).
New dm_from_con()
, soft-deprecated dm_from_src()
(#1014, #1018, #1044).
Moved pack_join()
arguments past the ellipsis for consistency (#920, #921).
The pkgdown site now uses BS5 for greater readability (#1067, @maelle).
Better message for dm_rows_...()
functions if the in_place
argument is missing (@IndrajeetPatil, #414, #1160).
Better message for learning error (#1081).
Greatly improved consistency, content, and language across all articles (@IndrajeetPatil, #1056, #1132, #1157, #1166, #1079, #1082, #1098, #1100, #1101, #1103, #1112, #1120, #1158, #1175).
Tweaks of intro vignette and README (#1066, #1075, @maelle).
Document glimpse()
S3 method for dm
(@IndrajeetPatil, #1121).
Update credentials to fallback databases for dm_financial()
hosted on pacha.dev (#916, @pachadotdev), also used now for vignettes (#1118) and in dm_from_con()
example (#993).
Update license year (#1029).
Switch to duckdb as default database backend (#1179).
Test duckdb and MariaDB on GHA (#1091, #1136).
pack_join()
works correctly if name
is the same as an existing column in either table. In some cases a column is overwritten, this is consistent with nest_join()
behavior (#864, #865).dm_insert_zoomed()
uses the color from the zoomed table for the new table (#750, #863).copy_dm_to()
consumes less memory and is faster when writing to SQL Server (#855).copy_dm_to()
shows progress bars again (#850, #855).dbAppendTable()
for zero-row tables (#847).dm_wrap_tbl()
, dm_unwrap_tbl()
, dm_nest_tbl()
, dm_unnest_tbl()
, dm_pack_tbl()
and dm_unpack_tbl()
(#595, #733, #737).dm_examine_cardinality()
(#264, #735).pack_join()
generic and method for data frames, the same to tidyr::pack()
as dplyr::nest_join()
is to tidyr::nest()
(#721, #722).dm_pixarfilms()
is exported and gains a consistent = FALSE
argument; if TRUE
the data is modified so that all referential constraints are satisfied (#703, #707, #708, @erictleung).db_schema_...()
functions no longer pro-actively check for schema existence (#672, #815, #771).db_schema_list.Microsoft SQL Server
no longer ignoring schemas for which the owner cannot be found (#815, #771).copy_dm_to()
works with DuckDB again, the SQL statements to define the tables and indexes are now created by us (#701, #709).dm_pixarfilms()
creates a dm object with data from the {pixarfilms} package (#600, @erictleung).check_cardinality_0_1()
, check_cardinality_0_n()
, check_cardinality_1_1()
, check_cardinality_1_n()
, and examine_cardinality()
now support compound keys (#524).check_subset()
and check_set_equality()
support compound keys (#523).dm_paste()
adds the on_delete
argument to dm_add_fk()
(#673).dm_disambiguate_cols()
also disambiguates columns used in keys, to support correct disambiguation for compound keys (#662).dm_disambiguate_cols()
now emits the source code equivalent of a renaming operation (#684).dm_examine_constraints()
uses backticks to surround table names (#687).decompose_table()
now avoids creating NA
values in the key column (#580).dm_draw()
works with empty tables (#585).mutate()
, transmute()
, distinct()
and summarize()
now support dplyr::across()
and extra arguments (#640).relocate()
now works on zoomed dm
objects (#666).dm_add_fk()
gains on_delete
argument which copy_dm_to()
picks up and translates to an ON DELETE CASCADE
or ON DELETE NO ACTION
specification for the foreign key (#649).dm_copy_to()
defines foreign keys during table creation, for all databases except DuckDB. Tables are created in topological order (#658). For cyclic relationship graphs, table creation is attempted in the original order and may fail (#664).waldo::compare()
shows better output for dm objects (#642).dm_paste()
output uses trailing commas in the dm::dm()
and tibble::tibble()
calls, and sorts column attributes by name, for better modularity (#641).db_schema_create()
, db_schema_drop()
, db_schema_exists()
and db_schema_list()
replace the corresponding sql_schema_*()
functions, the latter are soft-deprecated (#670). The connection argument to db_schema_*()
is called con
, not dest
(#668).copy_dm_to()
and sql_create_schema()
no longer actively check for schema existence (#644, #660).OUTPUT
clause for SQL Server (#647).sql_rows_delete()
with returning
argument for SQL Server (#645).rows_insert()
, rows_update()
and rows_delete()
gain returning
argument. In combination with in_place = TRUE
this argument makes the newly inserted rows accessible via get_returning_rows()
after the operation completes (#593, @mgirlich).rows_patch()
for DBI connections (#610, @mgirlich).NO ACTION
instead of CASCADE
in foreign key constraints to permit self-references.dm_from_src()
supports pool::Pool
objects (#599, @moodymudskipper).dm_rows_update()
and related functions for dm objects with tables without primary key (#592).glimpse()
is implemented for dm
objects (#605).rows_insert()
, rows_update()
and rows_delete()
(#617, @mgirlich).dm_zoom_to()
for dm
objects with an empty table (#626, @moodymudskipper).dm
objects in some corner cases (#596).sql_schema_list()
supports pool::Pool
objects (#633, @brancengregory).check_suggested()
everywhere (#572, @moodymudskipper).dm
objects (#597).rows_truncate()
in interactive mode (#588).rows_delete()
for databases (#589).dm_examine_constraints()
, dm_rows_insert()
and related, copy_dm_to()
and collect.dm()
show progress bars in interactive mode via the progress package. The new progress = NA
argument controls the behavior (#262, @moodymudskipper).copy_dm_to()
gains a copy_to
argument to support other ways of copying data to the database (#582).dm_get_all_fks()
returns a data frame with a parent_key_cols
instead of a parent_pk_cols
column (introduced in dm 0.2.0), to reflect the fact that a foreign key no longer necessarily points to a primary key (#562).*_pk()
and *_fk()
functions now verify that the dots are actually empty (#536).dm_get_pk()
is deprecated in favor of dm_get_all_pks()
(#561).dm_has_fk()
and dm_get_fk()
are deprecated in favor of dm_get_all_fks()
(#561).dm_add_fk()
gains ref_columns
argument that supports creating foreign keys to non-primary keys (#402).dm_get_all_pks()
gains table
argument for filtering the returned primary keys (#560).dm_get_all_fks()
gains parent_table
argument for filtering the returned foreign keys (#560).dm_rm_fk()
gains an optional ref_columns
argument. This function now supports removal of multiple foreign keys filtered by parent or child table or columns, with a message (#559).dm_rm_pk()
gains columns
argument and allows filtering by columns and by tables or removing all primary keys. The rm_referencing_fks
argument has been deprecated in favor of the new fail_fk
argument (#558).dm_get_all_fks()
has been optimized for speed and no longer sorts the keys (#560)..rds
file (#402)."dm_v1"
class from dm objects again, this would have made every S3 dispatch more costly. Relying on an internal "version"
attribute instead (#547).dm_get_src()
tbl.dm()
, src_tbls.dm()
, copy_to.dm()
. These functions have better alternatives and use the notion of a “data source” which is being phased out of dplyr (#527).*_pk()
and *_fk()
functions gain an ellipsis argument that comes before check
, force
and rm_referencing_fks
arguments (#520).dm_add_pk()
and dm_add_fk()
support compound keys via the c()
notation, e.g. dm_add_pk(dm, table, c(col1, col2))
. dm_nycflights13()
returns a data model with compound keys by default. Use compound = FALSE
to return the data model from dm v0.1.13 or earlier (#3).dm_get_all_fks()
includes parent_pk_cols
column that describes the primary key columns of the parent table (#335).dm_from_src()
supports the schema
argument also for MariaDB and MySQL databases (#516)."dm_v1"
in addition to "dm"
, to allow backward-compatible changes of the internal format (#521).dm_examine_constraints()
and other check functions count the number of rows that violate constraints for primary and foreign keys (#335).copy_dm_to(set_key_constraints = FALSE)
downgrades unique indexes to regular indexes (#335).rows_truncate()
implemented for data frames (#335).dm_enum_fk_candidates()
enumerates column in the order they apper in the table (#335).dm_draw()
gains column_types
argument, if TRUE
the column type is shown for each displayed column (#444, @samssann).copy_dm_to()
gains schema
argument (#432).dm_from_src()
gains dbname
argument for MSSQL (#472).rows_update()
when multiple columns are updated (#488, @samssann).enum_fk_candidates()
now only checks distinct values, this improves performance for large tables. As a consequence, only the number of distinct values is reported for mismatches, not the number of mismatching rows/entries (#494).?dm_zoom_to
(#403).dm_from_src()
gains dbname
argument for MSSQL (#472).count()
and tally()
for dplyr 1.0.3 compatibility (#475).dm_from_src()
for MSSQL when learn_keys = FALSE
(#427).expect_snapshot()
everywhere (#456).vignette("howto-dm-copy", package = "dm")
and vignette("howto-dm-rows", package = "dm")
discuss updating data on the database. In part derived from vignette("howto-dm-db", package = "dm")
(#411, @jawond).dm_mutate_tbl()
(#448).dm_financial()
falls back to db-edu.pacha.dev if relational.fit.cvut.cz is unavailable (#446, @pachamaltese).R CMD check
.dm_from_src()
accepts schema
argument for MSSQL databases (#367).dm_get_src()
returns NULL
for local data sources (#394).copy_dm_to()
gives a deprecation message (#395).copy_dm_to()
gives a better error message for bad table_names
(#397).dm
objects with local data sources no longer show the “Table source” part in the output.dm_bind()
for binding two or more ‘dm’ objects together (#417).dm_financial()
no longer prints message about learn_keys = FALSE
.dm_rows_update()
and related functions now use the primary keys defined in x
for establishing matching rows.withCallingHandlers()
where appropriate (#422)..dm
and .dm_zoomed
methods (#300).dm_financial()
are not run if connection can’t be established (#418).dm_paste()
generates self-contained code (#401).rows_truncate()
for databases.collect()
works on a zoomed dm, with a message.dm_add_pk(check = TRUE)
gives a better error message.rows_insert()
works if column names consist of SQL keywords (#409).src_sqlite()
in examples (#372).New dm_rows_insert()
, dm_rows_update()
, dm_rows_patch()
, dm_rows_upsert()
, dm_rows_delete()
and dm_rows_truncate()
, calling the corresponding rows_*()
method for every table (#319).
New rows_truncate()
(#319).
Added rows_insert()
and rows_update()
methods for SQLite, Postgres, MariaDB and MSSQL (#319).
Missing arguments now give a better error message (#388).
Empty dm
object prints as dm()
(#386).
copy_dm_to()
also accepts a function as the table_names
argument. The unique_table_names()
argument is deprecated (#80).
Add TL;DR to README (#377, @jawond).
Add content from old README to howto-dm-theory.Rmd
(#378, @jawond).
Require dplyr >= 1.0.0.
Use GitHub Actions (#369, @pat-s).
src_sqlite()
in vignettes (#372)."dm_error_tables_not_neighbours"
to "dm_error_tables_not_neighbors"
.dm_from_src()
now works for databases other than Postgres and MSSQL (#288), gives a warning if tables cannot be accessed with table_name = NULL
(#348), and gains learn_keys
argument to control querying of primary and foreign keys from the database (#340).dm_examine_constraints()
now prints a different message if a dm has no constraints defined."dm_zoomed"
: head()
, tail()
, pull()
, group_data()
, group_indices()
, group_vars()
, group_keys()
and groups()
(#236, #203).dm_paste()
supports writing colors and the table definition via the new options
argument. The definition can be written to a file via the new path
argument. The select
argument is soft-deprecated (#218, #302).dm_add_tbl()
uses rlang::list2()
internally, now accepts :=
to specify table names.dm_ptype()
(#301).dm_financial()
and dm_financial_sqlite()
.check_key()
now also works on a zoomed dm.dm_add_pk()
, dm_rm_pk()
, dm_add_fk()
and dm_rm_fk()
are now stricter when keys exists or when attempting to remove keys that don’t exist. A more relaxed mode of operation may be added later (#214).examine_cardinality()
, dm_examine_constraints()
and enum_pk_candidates()
now work for columns named n
.dm_set_key_constraints()
(and by extension dm_copy_to(set_key_constraints = TRUE)
) now quote identifiers for the SQL that creates foreign keys on the database.collect()
gives a better error message when called on a "dm_zoomed"
(#294).check_subset()
gives a clean error message if the tables are complex expressions.dm_from_src(schema = "...")
works on Postgres if search_path
is not set on the connection.compute.dm_zoomed()
no longer throws an error.src_df()
(#336).dm_draw()
output is shown in examples (#251).dm_nycflights13(subset = TRUE)
memoizes subset and also reduces the size of the weather
table.format.dm()
.dm_examine_constraints()
formats the problems nicely.dm_from_src()
for Postgres through the new schema
and table_type
arguments (#256).filter.dm_zoomed()
no longer sets the filter.examine_()
functions never throw an error (#238).dm_zoom_to()
, dm_insert_zoomed()
, dm_update_zoomed()
and dm_discard_zoomed()
; check_()
-> examine_()
; dm_get_filter()
-> dm_get_filters()
; dm_from_src()
+ dm_learn_from_db()
-> dm_from_src()
(#233).$.dm_zoomed()
, [.dm_zoomed()
, [[.dm_zoomed()
, length.dm_zoomed()
, names.dm_zoomed()
, tbl_vars.dm_zoomed()
(#199, #216).as.list()
methods (#213).dm_examine_constraints()
and other key-related functions for compound keys (#239).R CMD check
with dev versions of dependencies.cdm_
prefix to dm_
. The old names are still available (#117).pull_tbl()
extracts a single table from a dm
(#206).dm_apply_filters_to_tbl()
that applies filters in related tables to a table, similar to dm_apply_filters()
; tbl()
, $
and [[
no longer apply filter conditions defined in related tables (#161).dm_paste()
(#160).check_cardinality()
returns the nature of the relationship between parent_table$pk_col
and child_table$fk_col
(#15).check_key()
no longer maps empty selection list to all columns.check_key()
supports tidyselect (#188).dm_rm_tbl()
supports tidyselect (#127).decompose_table()
uses tidyselect (#194).copy_to()
for dm
objects (#129).ref_table
column in dm_check_constraints()
(#178).str()
shows simplified views (#123).validate_dm()
(#173).dm_rm_fk()
(#175).check_key()
for databases (#208).cdm_filter()
and filter.dm_zoomed()
apply the filter instantly, the expression is recorded only for display purposes and for terminating the search for filtered tables in cdm_apply_filters()
. This now allows using a variety of operations on filtered dm
objects (#124).dimnames()
, colnames()
, dim()
, distinct()
, arrange()
, slice()
, separate()
and unite()
implemented for zoomed dm-s (#130).cdm_flatten_to_tbl()
(#147).slice.dm_zoomed()
: user decides in arg .keep_pk
if PK column is tracked or not (#152).enum_pk_candidates()
works with zoomed dm-s (#156).enum_fk_candidates()
(#156).cdm_insert_zoomed_tbl()
and cdm_add_tbl()
, defaulting to renaming of old and new tables when adding tables with duplicate names (#132).dm()
is akin to tibble()
, dm_from_src()
works like dm()
did previously, new_dm()
only accepts a list of tables and no longer validates, validate_dm()
checks internal consistency (#69).compute.dm()
applies filters and calls compute()
on all tables (#135).dm
(#100).dm_zoomed
(#131).cdm_select_tbl()
works again when multiple foreign keys are defined between two tables (#122).dm
. Zooming to a table vie cdm_zoom_to_tbl()
creates a zoomed dm
on which the {dplyr} verbs can be applied. The resulting table can be put back into the dm
with cdm_update_zoomed_tbl()
(overwriting the original table) or cdm_insert_zoomed_tbl()
(creating a new table), respectively (#89).cdm_select_to_tbl()
removes foreign key constraints if the corresponding columns are removed."dm"
using cdm_select_tbl()
(#108).dm
objects via dm()
and new_dm()
(#96).cdm_flatten_to_tbl()
now flattens all immediate neighbors by default (#95).cdm_add_tbl()
and cdm_rm_tbl()
(#90).cdm_get_con()
(#84).dm
object is defined using a nested tibble, one row per table (#57).cdm_enum_pk_candidates()
and cdm_enum_fk_candidates()
both show candidates first (#85).cdm_flatten_to_tbl()
works only in the immediate neighborhood (#75).cdm_squash_to_tbl()
implements recursive flattening for left, inner and full join (#75).cdm_check_constraints()
to check referential integrity of a dm
(#56).cdm_copy_to()
gains table_names
argument (#79).check_key()
now deals correctly with named column lists (#83).cdm_add_pk()
with a missing column.R CMD check
.cdm_enum_fk_candidates()
checks for class compatibility implicitly via left_join()
.cdm_enum_fk_candidates()
contains a more detailed entry in column why if no error & no candidate (percentage of mismatched vals etc.).cdm_join_to_tbl()
and cdm_flatten_to_tbl()
in the presence of cycles or disconnected tables (#74).src
component from dm (#38).cdm_get_src()
for local dm always returns a src based on .GlobalEnv
.cdm_flatten()
gains ...
argument to specify which tables to include. Currently, all tables must form a connected subtree rooted at start
. Disambiguation of column names now happens after selecting relevant tables. The resulting SQL query is more efficient for inner and outer joins if filtering is applied. Flattening with a right_join
with more than two tables is not well-defined and gives an error (#62).cdm_disambiguate_cols()
.cdm_flatten_to_tbl()
disambiguates only the necessary columns.enum_pk_candidates()
for character data.cdm_add_pk()
and cdm_add_fk()
no longer check data integrity by default.join
argument is a function, to avoid surprises when the caller passes data.cdm_copy_to()
works correctly with filtered dm
objects.cdm_apply_filters()
actually resets the filter conditions.cdm_draw()
no longer supports the table_names
argument, use cdm_select_tbl()
.dm
to a database now creates indexes for all primary and foreign keys.cdm_nrow()
returns named list (#49).cdm_semi_join()
.cdm_find_conn_tbls()
and the all_connected
argument to cdm_select()
(#35).cdm_set_key_constraints()
.cdm_select()
to cdm_select_tbl()
, now uses {tidyselect}.cdm_nycflights13()
now has cycle = FALSE
as default.cdm_check_for_*()
to cdm_enum_*()
.cdm_filter()
only records the filtering operation, the filter is applied only when querying a table via tbl()
or when calling compute()
or the new cdm_apply_filters()
(#32).cdm_flatten_to_tbl()
flattens a dm
to a wide table with starting from a specified table (#13). Rename cdm_join_tbl()
to cdm_join_to_tbl()
.cdm_disambiguate_cols()
(#40).cdm_rename()
(#41) and cdm_select()
(#50) for renaming and selecting columns of dm
tables.length.dm()
and length<-.dm()
(#53).$
, [[
, [
, names()
, str()
and length()
now implemented for dm objects (read-only).enum_pk_candidates()
.browse_docs()
opens the pkgdown website (#36).as_dm()
now also accepts a list of remote tables (#30).cdm_rename_tbl()
and cdm_select_tbl()
(#14).cdm_enum_fk_candidates()
and cdm_enum_pk_candidates()
contain a why
column that explains the reasons for rejection in a human-readable form (#12).create_graph_from_dm()
no longer fails in the presence of cycles (#10).cdm_filter()
no longer requires a primary key.decompose_table()
adds the new column in the table to the end.tbl()
now fails if the table is not part of the data model.nse_function()
replaces h()
for marking functions as NSE to avoid R CMD check warnings.NOT NULL
constraints are set at creation of the table. This removes the necessity to store column types.Initial GitHub release.
dm
objects and basic functions:dm()
new_dm()
validate_dm()
cdm_get_src()
cdm_get_tables()
cdm_get_data_model()
is_dm()
as_dm()
cdm_add_pk()
cdm_has_pk()
cdm_get_pk()
cdm_get_all_pks()
cdm_rm_pk()
cdm_check_for_pk_candidates()
cdm_add_fk()
cdm_has_fk()
cdm_get_fk()
cdm_get_all_fks()
cdm_rm_fk()
cdm_check_for_fk_candidates()
cdm_draw()
cdm_set_colors()
cdm_get_colors()
cdm_get_available_colors()
cdm_join_tbl()
cdm_filter()
cdm_semi_join()
cdm_nrow()
cdm_copy_to()
cdm_set_key_constraints()
cdm_learn_from_db()
cdm_is_referenced()
cdm_get_referencing_tables()
cdm_select()
cdm_find_conn_tbls()
decompose_table()
reunite_parent_child()
reunite_parent_child_from_list()
check_key()
check_if_subset()
check_set_equality()
check_cardinality_0_n()
check_cardinality_1_n()
check_cardinality_1_1()
check_cardinality_0_1()
cdm_nycflights13()
cdm_rename_table()
cdm_rename_tables()