Layered split file for FREQUENCIES works.
[pspp] / src / language / stats / frequencies.c
index ce2b416e3b2b259c5d08a3f4d6f4dd56f0545c7e..cf40446a77d5e944b8766594260d3500bf50e5e8 100644 (file)
@@ -244,7 +244,8 @@ static void do_barchart(const struct frq_chart *bar,
 
 static struct frq_stats_table *frq_stats_table_submit (
   struct frq_stats_table *, const struct frq_proc *,
-  const struct dictionary *, const struct variable *wv);
+  const struct dictionary *, const struct variable *wv,
+  const struct ccase *example);
 static void frq_stats_table_destroy (struct frq_stats_table *);
 
 static int
@@ -492,7 +493,7 @@ output_splits_once (bool *need_splits, const struct dataset *ds,
    calculated.  Displays statistics, percentiles, ... */
 static struct frq_stats_table *
 postcalc (struct frq_proc *frq, const struct dataset *ds,
-          struct ccase *first, struct frq_stats_table *fst)
+          struct ccase *example, struct frq_stats_table *fst)
 {
   const struct dictionary *dict = dataset_dict (ds);
   const struct variable *wv = dict_get_weight (dict);
@@ -509,8 +510,8 @@ postcalc (struct frq_proc *frq, const struct dataset *ds,
   if (frq->n_stats)
     {
       if (st != SPLIT_LAYERED)
-        output_splits_once (&need_splits, ds, first);
-      fst = frq_stats_table_submit (fst, frq, dict, wv);
+        output_splits_once (&need_splits, ds, example);
+      fst = frq_stats_table_submit (fst, frq, dict, wv, example);
     }
 
   for (size_t i = 0; i < frq->n_vars; i++)
@@ -520,7 +521,7 @@ postcalc (struct frq_proc *frq, const struct dataset *ds,
       /* Frequencies tables. */
       if (vf->tab.n_valid + vf->tab.n_missing <= frq->max_categories)
         {
-          output_splits_once (&need_splits, ds, first);
+          output_splits_once (&need_splits, ds, example);
           dump_freq_table (vf, wv);
         }
 
@@ -535,7 +536,7 @@ postcalc (struct frq_proc *frq, const struct dataset *ds,
 
          if (histogram)
            {
-              output_splits_once (&need_splits, ds, first);
+              output_splits_once (&need_splits, ds, example);
              chart_submit (histogram_chart_create (
                               histogram->gsl_hist, var_to_string(vf->var),
                               vf->tab.valid_cases,
@@ -549,13 +550,13 @@ postcalc (struct frq_proc *frq, const struct dataset *ds,
 
       if (frq->pie)
         {
-          output_splits_once (&need_splits, ds, first);
+          output_splits_once (&need_splits, ds, example);
           do_piechart(frq->pie, vf->var, &vf->tab);
         }
 
       if (frq->bar)
         {
-          output_splits_once (&need_splits, ds, first);
+          output_splits_once (&need_splits, ds, example);
           do_barchart(frq->bar, &vf->var, &vf->tab);
         }
 
@@ -578,15 +579,15 @@ frq_run (struct frq_proc *frq, struct dataset *ds)
       for (size_t i = 0; i < frq->n_vars; i++)
         hmap_init (&frq->vars[i].tab.data);
 
-      struct ccase *first = casereader_peek (group, 0);
+      struct ccase *example = casereader_peek (group, 0);
 
       struct ccase *c;
       for (; (c = casereader_read (group)) != NULL; case_unref (c))
         calc (frq, c, ds);
-      fst = postcalc (frq, ds, first, fst);
+      fst = postcalc (frq, ds, example, fst);
       casereader_destroy (group);
 
-      case_unref (first);
+      case_unref (example);
     }
   frq_stats_table_destroy (fst);
   casegrouper_destroy (grouper);
@@ -1579,8 +1580,6 @@ frq_stats_table_create (const struct frq_proc *frq,
   struct pivot_table *table = pivot_table_create (N_("Statistics"));
   pivot_table_set_weight_var (table, wv);
 
-  struct pivot_splits *splits = pivot_splits_create (table, dict);
-
   struct pivot_dimension *variables
     = pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Variables"));
   for (size_t i = 0; i < frq->n_vars; i++)
@@ -1614,6 +1613,9 @@ frq_stats_table_create (const struct frq_proc *frq,
                                     pc->p * 100.0));
     }
 
+  struct pivot_splits *splits = pivot_splits_create (table, PIVOT_AXIS_ROW,
+                                                     dict);
+
   struct frq_stats_table *fst = xmalloc (sizeof *fst);
   *fst = (struct frq_stats_table) { .table = table, .splits = splits };
   return fst;
@@ -1623,7 +1625,8 @@ static struct frq_stats_table *
 frq_stats_table_submit (struct frq_stats_table *fst,
                         const struct frq_proc *frq,
                         const struct dictionary *dict,
-                        const struct variable *wv)
+                        const struct variable *wv,
+                        const struct ccase *example)
 {
   if (!fst)
     {
@@ -1631,6 +1634,7 @@ frq_stats_table_submit (struct frq_stats_table *fst,
       if (!fst)
         return NULL;
     }
+  pivot_splits_new_split (fst->splits, example);
 
   int var_idx = 0;
   for (size_t i = 0; i < frq->n_vars; i++)
@@ -1642,9 +1646,9 @@ frq_stats_table_submit (struct frq_stats_table *fst,
       const struct freq_tab *ft = &vf->tab;
 
       int row = 0;
-      pivot_table_put2 (fst->table, var_idx, row++,
+      pivot_splits_put2 (fst->splits, fst->table, var_idx, row++,
                         pivot_value_new_number (ft->valid_cases));
-      pivot_table_put2 (fst->table, var_idx, row++,
+      pivot_splits_put2 (fst->splits, fst->table, var_idx, row++,
                         pivot_value_new_number (
                           ft->total_cases - ft->valid_cases));
 
@@ -1660,7 +1664,7 @@ frq_stats_table_submit (struct frq_stats_table *fst,
             = (j == FRQ_ST_MODE || j == FRQ_ST_MINIMUM || j == FRQ_ST_MAXIMUM
                ? pivot_value_new_var_value (vf->var, &v)
                : pivot_value_new_number (v.f));
-          pivot_table_put2 (fst->table, var_idx, row++, pv);
+          pivot_splits_put2 (fst->splits, fst->table, var_idx, row++, pv);
         }
 
       for (size_t j = 0; j < frq->n_percentiles; j++)
@@ -1672,8 +1676,8 @@ frq_stats_table_submit (struct frq_stats_table *fst,
           union value v = {
             .f = vf->tab.n_valid ? vf->percentiles[j] : SYSMIS
           };
-          pivot_table_put2 (fst->table, var_idx, row++,
-                            pivot_value_new_var_value (vf->var, &v));
+          pivot_splits_put2 (fst->splits, fst->table, var_idx, row++,
+                             pivot_value_new_var_value (vf->var, &v));
         }
 
       var_idx++;