From a3e3480951ad0d6f14ff1333f80f1c2c0d58402f Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sat, 15 Jan 2022 20:14:49 -0800 Subject: [PATCH] we don't really need two forks of the output code --- src/language/stats/ctables.c | 201 +++-------------------------------- 1 file changed, 12 insertions(+), 189 deletions(-) diff --git a/src/language/stats/ctables.c b/src/language/stats/ctables.c index 8dcd682f10..bba0fb67fc 100644 --- a/src/language/stats/ctables.c +++ b/src/language/stats/ctables.c @@ -1959,7 +1959,7 @@ ctables_summary_add (union ctables_summary *s, } } -static double +static double UNUSED ctables_summary_value (const struct ctables_cell *cell, union ctables_summary *s, const struct ctables_summary_spec *ss) @@ -2520,185 +2520,6 @@ merge_item_compare_3way (const struct merge_item *a, const struct merge_item *b) return strcmp (as->label, bs->label); } -static void -ctables_table_output_same_axis (struct ctables *ct, struct ctables_table *t) -{ - struct pivot_table *pt = pivot_table_create__ ( - (t->title - ? pivot_value_new_user_text (t->title, SIZE_MAX) - : pivot_value_new_text (N_("Custom Tables"))), - "Custom Tables"); - if (t->caption) - pivot_table_set_caption ( - pt, pivot_value_new_user_text (t->caption, SIZE_MAX)); - if (t->corner) - pivot_table_set_caption ( - pt, pivot_value_new_user_text (t->corner, SIZE_MAX)); - - pivot_table_set_look (pt, ct->look); - struct pivot_dimension *d[PIVOT_N_AXES]; - for (enum pivot_axis_type a = 0; a < PIVOT_N_AXES; a++) - { - static const char *names[] = { - [PIVOT_AXIS_ROW] = N_("Rows"), - [PIVOT_AXIS_COLUMN] = N_("Columns"), - [PIVOT_AXIS_LAYER] = N_("Layers"), - }; - d[a] = (t->axes[a] || a == t->summary_axis - ? pivot_dimension_create (pt, a, names[a]) - : NULL); - if (!d[a]) - continue; - - assert (t->axes[a]); - - struct ctables_cell **sorted = xnmalloc (t->cells.count, sizeof *sorted); - - struct ctables_cell *cell; - size_t n = 0; - HMAP_FOR_EACH (cell, struct ctables_cell, node, &t->cells) - if (!cell->hide) - sorted[n++] = cell; - assert (n <= t->cells.count); - - struct ctables_cell_sort_aux aux = { .t = t, .a = a }; - sort (sorted, n, sizeof *sorted, ctables_cell_compare_3way, &aux); - - size_t max_depth = 0; - for (size_t j = 0; j < t->stacks[a].n; j++) - if (t->stacks[a].nests[j].n > max_depth) - max_depth = t->stacks[a].nests[j].n; - - struct pivot_category **groups = xnmalloc (max_depth, sizeof *groups); - struct pivot_category *top = NULL; - int prev_leaf = 0; - for (size_t j = 0; j < n; j++) - { - struct ctables_cell *cell = sorted[j]; - const struct ctables_nest *nest = &t->stacks[a].nests[cell->axes[a].stack_idx]; - - size_t n_common = 0; - bool new_subtable = false; - if (j > 0) - { - struct ctables_cell *prev = sorted[j - 1]; - if (prev->axes[a].stack_idx == cell->axes[a].stack_idx) - { - for (; n_common < nest->n; n_common++) - if (n_common != nest->scale_idx - && (prev->axes[a].cvs[n_common].category - != cell->axes[a].cvs[n_common].category - || !value_equal (&prev->axes[a].cvs[n_common].value, - &cell->axes[a].cvs[n_common].value, - var_get_type (nest->vars[n_common])))) - break; - } - else - new_subtable = true; - } - else - new_subtable = true; - - if (new_subtable) - { - enum ctables_vlabel vlabel = ct->vlabels[var_get_dict_index (nest->vars[0])]; - top = d[a]->root; - if (vlabel != CTVL_NONE) - top = pivot_category_create_group__ ( - top, pivot_value_new_variable (nest->vars[0])); - } - if (n_common == nest->n) - { - cell->axes[a].leaf = prev_leaf; - continue; - } - - for (size_t k = n_common; k < nest->n; k++) - { - struct pivot_category *parent = k > 0 ? groups[k - 1] : top; - - struct pivot_value *label - = (k == nest->scale_idx ? NULL - : (cell->axes[a].cvs[k].category->type == CCT_TOTAL - || cell->axes[a].cvs[k].category->type == CCT_SUBTOTAL - || cell->axes[a].cvs[k].category->type == CCT_HSUBTOTAL) - ? pivot_value_new_user_text (cell->axes[a].cvs[k].category->total_label, - SIZE_MAX) - : pivot_value_new_var_value (nest->vars[k], - &cell->axes[a].cvs[k].value)); - if (k == nest->n - 1) - { - if (a == t->summary_axis) - { - if (label) - parent = pivot_category_create_group__ (parent, label); - const struct ctables_summary_spec_set *specs = &nest->specs[cell->sv]; - for (size_t m = 0; m < specs->n; m++) - { - int leaf = pivot_category_create_leaf ( - parent, pivot_value_new_text (specs->specs[m].label)); - if (m == 0) - prev_leaf = leaf; - } - } - else - { - /* This assertion is true as long as the summary axis - is the axis where the summaries are displayed. */ - assert (label); - - prev_leaf = pivot_category_create_leaf (parent, label); - } - break; - } - - if (label) - parent = pivot_category_create_group__ (parent, label); - - enum ctables_vlabel vlabel = ct->vlabels[var_get_dict_index (nest->vars[k + 1])]; - if (vlabel != CTVL_NONE) - parent = pivot_category_create_group__ ( - parent, pivot_value_new_variable (nest->vars[k + 1])); - groups[k] = parent; - } - - cell->axes[a].leaf = prev_leaf; - } - free (sorted); - free (groups); - } - struct ctables_cell *cell; - HMAP_FOR_EACH (cell, struct ctables_cell, node, &t->cells) - { - if (cell->hide) - continue; - - const struct ctables_nest *nest = &t->stacks[t->summary_axis].nests[cell->axes[t->summary_axis].stack_idx]; - const struct ctables_summary_spec_set *specs = &nest->specs[cell->sv]; - for (size_t j = 0; j < specs->n; j++) - { - size_t dindexes[3]; - size_t n_dindexes = 0; - - for (enum pivot_axis_type a = 0; a < PIVOT_N_AXES; a++) - if (d[a]) - { - int leaf = cell->axes[a].leaf; - if (a == t->summary_axis) - leaf += j; - dindexes[n_dindexes++] = leaf; - } - - double d = ctables_summary_value (cell, &cell->summaries[j], &specs->specs[j]); - struct pivot_value *value = pivot_value_new_number (d); - value->numeric.format = specs->specs[j].format; - pivot_table_put (pt, dindexes, n_dindexes, value); - } - } - - pivot_table_submit (pt); -} - static struct pivot_value * ctables_category_create_label (const struct ctables_category *cat, const struct variable *var, @@ -2876,18 +2697,23 @@ ctables_table_output_different_axis (struct ctables *ct, struct ctables_table *t size_t n_common = 0; if (!new_subtable) { - for (; n_common < nest->n; n_common++) + for (; n_common < n_levels; n_common++) { const struct ctables_level *level = &levels[n_common]; if (level->type == CTL_CATEGORY) { size_t var_idx = level->var_idx; if (prev->axes[a].cvs[var_idx].category - != cell->axes[a].cvs[var_idx].category - || !value_equal (&prev->axes[a].cvs[var_idx].value, + != cell->axes[a].cvs[var_idx].category) + { + break; + } + else if (!value_equal (&prev->axes[a].cvs[var_idx].value, &cell->axes[a].cvs[var_idx].value, - var_get_type (nest->vars[var_idx]))) - break; + var_get_type (nest->vars[var_idx]))) + { + break; + } } } } @@ -3183,10 +3009,7 @@ ctables_execute (struct dataset *ds, struct ctables *ct) if (t->clabels_example) ctables_sort_clabels_values (t); - if (t->summary_axis == t->slabels_axis) - ctables_table_output_same_axis (ct, ct->tables[i]); - else - ctables_table_output_different_axis (ct, ct->tables[i]); + ctables_table_output_different_axis (ct, ct->tables[i]); } return proc_commit (ds); } -- 2.30.2