CTABLES basics work
authorBen Pfaff <blp@cs.stanford.edu>
Thu, 30 Dec 2021 21:58:21 +0000 (13:58 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Thu, 13 Jan 2022 05:52:26 +0000 (21:52 -0800)
src/language/stats/ctables.c

index dc761ade728e85235f89953dcd6d093303cdffec..1729f34f3b9adeaa2fe1bf4adc162fc53af4dca4 100644 (file)
@@ -1435,8 +1435,16 @@ ctables_execute (struct dataset *ds, struct ctables *ct)
             {
               struct ctables_freqtab *ft = t->fts[j];
 
-              size_t hash = 0;
+#if 0
+              for (size_t k = 0; k < ft->vars.n; k++)
+                {
+                  const struct variable *var = ft->vars.vars[k];
+                  if (
+
 
+                }
+#endif
+              size_t hash = 0;
               for (size_t k = 0; k < ft->vars.n; k++)
                 {
                   const struct variable *var = ft->vars.vars[k];
@@ -1480,6 +1488,9 @@ ctables_execute (struct dataset *ds, struct ctables *ct)
     {
       struct ctables_table *t = &ct->tables[i];
 
+      struct pivot_table *pt = pivot_table_create (N_("Custom Tables"));
+      struct pivot_dimension *d = pivot_dimension_create (
+        pt, PIVOT_AXIS_ROW, N_("Rows"));
       for (size_t j = 0; j < t->n_fts; j++)
         {
           struct ctables_freqtab *ft = t->fts[j];
@@ -1489,9 +1500,40 @@ ctables_execute (struct dataset *ds, struct ctables *ct)
           size_t n = 0;
           HMAP_FOR_EACH (f, struct freq, node, &ft->data)
             ft->sorted[n++] = f;
-          sort (ft->sorted, ft->data.count, sizeof *ft->sorted,
+          assert (n == ft->data.count);
+          sort (ft->sorted, n, sizeof *ft->sorted,
                 compare_freq_3way, &ft->vars);
+
+          struct pivot_category **groups = xnmalloc (ft->vars.n,
+                                                     sizeof *groups);
+          for (size_t k = 0; k < n; k++)
+            {
+              struct freq *prev = k > 0 ? ft->sorted[k - 1] : NULL;
+              struct freq *f = ft->sorted[k];
+
+              size_t n_common = 0;
+              if (prev)
+                for (; n_common + 1 < ft->vars.n; n_common++)
+                  if (!value_equal (&prev->values[n_common],
+                                    &f->values[n_common],
+                                    var_get_type (ft->vars.vars[n_common])))
+                    break;
+
+              for (size_t m = n_common; m + 1 < ft->vars.n; m++)
+                groups[m] = pivot_category_create_group__ (
+                  m > 0 ? groups[m - 1] : d->root,
+                  pivot_value_new_var_value (ft->vars.vars[m], &f->values[m]));
+
+              int leaf = pivot_category_create_leaf (
+                ft->vars.n > 1 ? groups[ft->vars.n - 2] : d->root,
+                pivot_value_new_var_value (ft->vars.vars[ft->vars.n - 1],
+                                           &f->values[ft->vars.n - 1]));
+
+              pivot_table_put1 (pt, leaf, pivot_value_new_number (f->count));
+            }
+          free (groups);
         }
+      pivot_table_submit (pt);
     }
 
   for (size_t i = 0; i < ct->n_tables; i++)