-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathcdata_yaml.R
124 lines (114 loc) · 3.63 KB
/
cdata_yaml.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#' @importFrom methods is
NULL
convert_yaml_to_data_frame <- function(obj) {
n <- length(obj)
if (n<1) {
return(NULL)
}
n1 = names(obj)[[1]]
d = data.frame(x = obj[[n1]],
stringsAsFactors = FALSE)
colnames(d) <- n1
if (n<2) {
return(d)
}
for (i in (2:n)) {
ni = names(obj)[[i]]
d[[ni]] <- obj[[ni]]
}
return(d)
}
convert_data_frame_to_yaml <- function(d) {
lst = list()
for(n in colnames(d)) {
lst[[n]] <- d[[n]]
}
return(lst)
}
convert_yaml_to_record_spec <- function(obj) {
record_keys <- NULL
control_table_keys <- NULL
if ("record_keys" %in% names(obj)) {
record_keys = obj$record_keys
}
if ("control_table_keys" %in% names(obj)) {
control_table_keys = obj$control_table_keys
}
control_table <- convert_yaml_to_data_frame(obj$control_table)
return(list('record_keys' = record_keys,
'control_table_keys' = control_table_keys,
'control_table' = control_table))
}
#' Read a cdata record transform from a simple object (such as is imported from YAML).
#'
#' @param obj object to convert
#' @return cdata transform specification
#'
#' @export
#'
convert_yaml_to_cdata_spec <- function(obj) {
blocks_in = NULL
blocks_out = NULL
if ("blocks_out" %in% names(obj)) {
blocks_out = convert_yaml_to_record_spec(obj$blocks_out)
}
if ("blocks_in" %in% names(obj)) {
blocks_in = convert_yaml_to_record_spec(obj$blocks_in)
}
# TODO: work on check/strict options
if ((!is.null(blocks_in)) && (!is.null(blocks_out))) {
# TODO: work on recordKeys point
return(layout_specification(incoming_shape = blocks_in$control_table,
outgoing_shape = blocks_out$control_table,
recordKeys = blocks_in$record_keys,
incoming_controlTableKeys = blocks_in$control_table_keys,
outgoing_controlTableKeys = blocks_out$control_table_keys))
}
if (!is.null(blocks_in)) {
return(blocks_to_rowrecs_spec(controlTable = blocks_in$control_table,
recordKeys = blocks_in$record_keys,
controlTableKeys = blocks_in$control_table_keys))
}
if (!is.null(blocks_out)) {
return(rowrecs_to_blocks_spec(controlTable = blocks_out$control_table,
recordKeys = blocks_out$record_keys,
controlTableKeys = blocks_out$control_table_keys))
}
return(NULL)
}
#' Convert a layout_specification, blocks_to_rowrecs_spec, or rowrecs_to_blocks_spec to a simple object.
#'
#' @param spec a layout_specification, blocks_to_rowrecs_spec, or rowrecs_to_blocks_spec
#' @return a simple object suitable for YAML serialization
#'
#' @export
#'
convert_cdata_spec_to_yaml <- function(spec) {
if(is(spec, "blocks_to_rowrecs_spec")) {
return(list(
blocks_in = list(
record_keys = spec$recordKeys,
control_table_keys = spec$controlTableKeys,
control_table = spec$controlTable
)
))
}
if(is(spec, "rowrecs_to_blocks_spec")) {
return(list(
blocks_out = list(
record_keys = spec$recordKeys,
control_table_keys = spec$controlTableKeys,
control_table = spec$controlTable
)
))
}
if(is(spec, "cdata_general_transform_spec")) {
blocks_in = convert_cdata_spec_to_yaml(spec$blocks_to_rowrecs_spec)
blocks_out = convert_cdata_spec_to_yaml(spec$rowrecs_to_blocks_spec)
return(list(
blocks_in = blocks_in$blocks_in,
blocks_out = blocks_out$blocks_out
))
}
stop(paste("unexpected class: ", paste(class(spec), collapse = ', ')))
}