Skip to content

Commit 59ce60b

Browse files
committed
Add interop code and tests
1 parent f3696a1 commit 59ce60b

File tree

6 files changed

+202
-7
lines changed

6 files changed

+202
-7
lines changed

DESCRIPTION

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ Suggests:
3131
DBI,
3232
RSQLite,
3333
knitr,
34-
RUnit
34+
RUnit,
35+
yaml
3536
VignetteBuilder: knitr
3637
ByteCompile: true

NAMESPACE

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ export(build_pivot_control)
3737
export(build_pivot_control_q)
3838
export(build_unpivot_control)
3939
export(check_cols_form_unique_keys)
40+
export(convert_cdata_spec_to_yaml)
4041
export(convert_records)
42+
export(convert_yaml_to_cdata_spec)
4143
export(draw_frame)
4244
export(get_transform_details)
4345
export(layout_by)
@@ -62,6 +64,7 @@ export(rowrecs_to_blocks_spec)
6264
export(rows_are_uniquely_keyed)
6365
export(run_cdata_tests)
6466
export(unpivot_to_blocks)
67+
importFrom(methods,is)
6568
importFrom(methods,setGeneric)
6669
importFrom(rqdatatable,ex_data_table)
6770
importFrom(stats,as.formula)

R/cdata_yaml.R

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11

2+
#' @importFrom methods is
3+
NULL
4+
25
convert_yaml_to_data_frame <- function(obj) {
36
n <- length(obj)
47
if (n<1) {
@@ -18,6 +21,15 @@ convert_yaml_to_data_frame <- function(obj) {
1821
return(d)
1922
}
2023

24+
convert_data_frame_to_yaml <- function(d) {
25+
lst = list()
26+
for(n in colnames(d)) {
27+
lst[[n]] <- d[[n]]
28+
}
29+
return(lst)
30+
}
31+
32+
2133
convert_yaml_to_record_spec <- function(obj) {
2234
record_keys <- NULL
2335
control_table_keys <- NULL
@@ -33,6 +45,7 @@ convert_yaml_to_record_spec <- function(obj) {
3345
'control_table' = control_table))
3446
}
3547

48+
3649
#' Read a cdata record transform from a simple object (such as is imported from YAML).
3750
#'
3851
#' @param obj object to convert
@@ -52,11 +65,11 @@ convert_yaml_to_cdata_spec <- function(obj) {
5265
# TODO: work on check/strict options
5366
if ((!is.null(blocks_in)) && (!is.null(blocks_out))) {
5467
# TODO: work on recordKeys point
55-
return(cdata::layout_specification(incoming_shape = blocks_in$control_table,
56-
outgoing_shape = blocks_out$control_table,
57-
recordKeys = blocks_in$record_keys,
58-
incoming_controlTableKeys = blocks_in$control_table_keys,
59-
outgoing_controlTableKeys = blocks_out$control_table_keys))
68+
return(layout_specification(incoming_shape = blocks_in$control_table,
69+
outgoing_shape = blocks_out$control_table,
70+
recordKeys = blocks_in$record_keys,
71+
incoming_controlTableKeys = blocks_in$control_table_keys,
72+
outgoing_controlTableKeys = blocks_out$control_table_keys))
6073
}
6174
if (!is.null(blocks_in)) {
6275
return(blocks_to_rowrecs_spec(controlTable = blocks_in$control_table,
@@ -71,4 +84,41 @@ convert_yaml_to_cdata_spec <- function(obj) {
7184
return(NULL)
7285
}
7386

74-
# TODO: cdata to yaml
87+
88+
#' Convert a layout_specification, blocks_to_rowrecs_spec, or rowrecs_to_blocks_spec to a simple object.
89+
#'
90+
#' @param spec a layout_specification, blocks_to_rowrecs_spec, or rowrecs_to_blocks_spec
91+
#' @return a simple object suitable for YAML serialization
92+
#'
93+
#' @export
94+
#'
95+
convert_cdata_spec_to_yaml <- function(spec) {
96+
if(is(spec, "blocks_to_rowrecs_spec")) {
97+
return(list(
98+
blocks_in = list(
99+
record_keys = spec$recordKeys,
100+
control_table_keys = spec$controlTableKeys,
101+
control_table = spec$controlTable
102+
)
103+
))
104+
}
105+
if(is(spec, "rowrecs_to_blocks_spec")) {
106+
return(list(
107+
blocks_out = list(
108+
record_keys = spec$recordKeys,
109+
control_table_keys = spec$controlTableKeys,
110+
control_table = spec$controlTable
111+
)
112+
))
113+
}
114+
if(is(spec, "cdata_general_transform_spec")) {
115+
blocks_in = convert_cdata_spec_to_yaml(spec$blocks_to_rowrecs_spec)
116+
blocks_out = convert_cdata_spec_to_yaml(spec$rowrecs_to_blocks_spec)
117+
return(list(
118+
blocks_in = blocks_in$blocks_in,
119+
blocks_out = blocks_out$blocks_out
120+
))
121+
}
122+
stop(paste("unexpected class: ", paste(class(spec), collapse = ', ')))
123+
}
124+

inst/unit_tests/test_encode.R

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
2+
3+
test_encode <- function() {
4+
d = data.frame(x = 1:3,
5+
y = c('a', 'b', 'c'),
6+
stringsAsFactors = FALSE)
7+
8+
d_simple <- cdata:::convert_data_frame_to_yaml(d)
9+
d_back1 <- cdata:::convert_yaml_to_data_frame(d_simple)
10+
RUnit::checkEquals(d, d_back1)
11+
12+
row_keys <- c('id', 'Species')
13+
14+
block_record <- wrapr::qchar_frame(
15+
"Part" , "Measure", "Value" |
16+
"Petal", "Length" , Petal.Length |
17+
"Petal", "Width" , Petal.Width |
18+
"Sepal", "Length" , Sepal.Length |
19+
"Sepal", "Width" , Sepal.Width )
20+
block_keys <- c('Part', 'Measure')
21+
22+
brtrrs <- blocks_to_rowrecs_spec(controlTable = block_record,
23+
recordKeys = row_keys,
24+
controlTableKeys = block_keys)
25+
rrtbrs <- rowrecs_to_blocks_spec(controlTable = block_record,
26+
recordKeys = row_keys,
27+
controlTableKeys = block_keys)
28+
29+
incoming_shape <- qchar_frame(
30+
"row", "col1", "col2", "col3" |
31+
"row1", v11, v12, v13 |
32+
"row2", v21, v22, v23 |
33+
"row3", v31, v32, v33 )
34+
35+
36+
outgoing_shape <- qchar_frame(
37+
"column", "row1", "row2", "row3" |
38+
"col1", v11, v21 , v31 |
39+
"col2", v12, v22 , v32 |
40+
"col3", v13, v23 , v33 )
41+
42+
brtbrts <- layout_specification(
43+
incoming_shape = incoming_shape,
44+
outgoing_shape = outgoing_shape,
45+
recordKeys = 'record_id')
46+
47+
brtrrs_simple <- convert_cdata_spec_to_yaml(brtrrs)
48+
brtrrs_back <- convert_yaml_to_cdata_spec(brtrrs_simple)
49+
RUnit::checkEquals(format(brtrrs), format(brtrrs_back))
50+
51+
rrtbrs_simple <- convert_cdata_spec_to_yaml(rrtbrs)
52+
rrtbrs_back <- convert_yaml_to_cdata_spec(rrtbrs_simple)
53+
RUnit::checkEquals(format(rrtbrs), format(rrtbrs_back))
54+
55+
brtbrts_simple <- convert_cdata_spec_to_yaml(brtbrts)
56+
brtbrts_back <- convert_yaml_to_cdata_spec(brtbrts_simple)
57+
RUnit::checkEquals(format(brtbrts), format(brtbrts_back))
58+
59+
if(requireNamespace('yaml', quietly = TRUE)) {
60+
brtrrs_yaml <- yaml::as.yaml(brtrrs_simple)
61+
brtrrs_back_y <- convert_yaml_to_cdata_spec(yaml::read_yaml(text = brtrrs_yaml))
62+
RUnit::checkEquals(format(brtrrs), format(brtrrs_back_y))
63+
64+
rrtbrs_yaml <- yaml::as.yaml(rrtbrs_simple)
65+
rrtbrs_back_y <- convert_yaml_to_cdata_spec(yaml::read_yaml(text = rrtbrs_yaml))
66+
RUnit::checkEquals(format(rrtbrs), format(rrtbrs_back_y))
67+
68+
brtbrts_yaml <- yaml::as.yaml(brtbrts_simple)
69+
brtbrts_back_y <- convert_yaml_to_cdata_spec(yaml::read_yaml(text = brtbrts_yaml))
70+
RUnit::checkEquals(format(brtbrts), format(brtbrts_back_y))
71+
}
72+
73+
invisible(NULL)
74+
}
75+
76+
test_read_from_data_algebra <- function() {
77+
text = '
78+
type: data_algebra.cdata_impl.RecordMap
79+
blocks_out:
80+
type: data_algebra.cdata.RecordSpecification
81+
record_keys:
82+
- id
83+
- Species
84+
control_table_keys:
85+
- Part
86+
- Measure
87+
control_table:
88+
Part:
89+
- Petal
90+
- Petal
91+
- Sepal
92+
- Sepal
93+
Measure:
94+
- Length
95+
- Width
96+
- Length
97+
- Width
98+
Value:
99+
- Petal.Length
100+
- Petal.Width
101+
- Sepal.Length
102+
- Sepal.Width
103+
'
104+
xform = convert_yaml_to_cdata_spec(yaml::read_yaml(text = text))
105+
RUnit::checkTrue(is(xform, "rowrecs_to_blocks_spec"))
106+
}
107+

man/convert_cdata_spec_to_yaml.Rd

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/convert_yaml_to_cdata_spec.Rd

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)