From 8889d439b37f78c7fad1435d6ae00bb3bf86a868 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sun, 2 Jan 2022 14:31:34 -0800 Subject: [PATCH] category filtering works --- src/language/stats/ctables.c | 61 +++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/src/language/stats/ctables.c b/src/language/stats/ctables.c index 3954637f33..07de68d919 100644 --- a/src/language/stats/ctables.c +++ b/src/language/stats/ctables.c @@ -314,7 +314,6 @@ struct ctables_table struct ctables_chisq *chisq; struct ctables_pairwise *pairwise; - }; struct ctables_var @@ -1979,6 +1978,49 @@ ctables_domain_insert (struct ctables_table *t, struct ctables_freq *f, return d; } +static const struct ctables_cat_value * +ctables_categories_match (const struct ctables_categories *cats, + const union value *v, const struct variable *var) +{ + const struct ctables_cat_value *othernm = NULL; + for (size_t i = cats->n_values; i-- > 0; ) + { + const struct ctables_cat_value *cv = &cats->values[i]; + switch (cv->type) + { + case CCVT_NUMBER: + if (cv->number == v->f) + return cv; + break; + + case CCVT_STRING: + NOT_REACHED (); + + case CCVT_RANGE: + if ((cv->range[0] == -DBL_MAX || v->f >= cv->range[0]) + && (cv->range[1] == DBL_MAX || v->f <= cv->range[1])) + return cv; + break; + + case CCVT_MISSING: + if (var_is_value_missing (var, v)) + return cv; + break; + + case CCVT_OTHERNM: + if (!othernm) + othernm = cv; + break; + + case CCVT_SUBTOTAL: + case CCVT_HSUBTOTAL: + break; + } + } + + return var_is_value_missing (var, v) ? NULL : othernm; +} + static void ctables_freqtab_insert (struct ctables_table *t, const struct ccase *c, @@ -1992,6 +2034,23 @@ ctables_freqtab_insert (struct ctables_table *t, }; const struct var_array *ss = &t->vaas[t->summary_axis].vas[ix[t->summary_axis]]; + for (enum pivot_axis_type a = 0; a < PIVOT_N_AXES; a++) + { + const struct var_array *va = &t->vaas[a].vas[ix[a]]; + for (size_t i = 0; i < va->n; i++) + { + if (i == va->scale_idx) + continue; + + const struct ctables_categories *cats = t->categories[var_get_dict_index (va->vars[i])]; + if (!cats || !cats->n_values) + continue; + + if (!ctables_categories_match (cats, case_data (c, va->vars[i]), va->vars[i])) + return; + } + } + size_t hash = 0; for (enum pivot_axis_type a = 0; a < PIVOT_N_AXES; a++) { -- 2.30.2