Is this different from omit_empty?

On Thu, Jun 13, 2019, 9:15 AM John Darrington <[email protected]>
wrote:

> This change adds a feature to the pivot table implementation such that
> columns
> and/or rows which are completely empty (except for the headings) are not
> rendered.
>
> * src/output/pivot-output.c (pivot_table_submit_layer): Keep an array
> recording
> the occupancy of each row and column. (compose_headings): Use it to hide
> empty
> rows/columns.
> * src/output/pivot-table.h [struct pivot_table]: New members
> hide_empty_columns,
> hide_empty_rows.
> ---
>  src/output/pivot-output.c | 83
> ++++++++++++++++++++++++++++++-----------------
>  src/output/pivot-table.h  |  2 ++
>  2 files changed, 56 insertions(+), 29 deletions(-)
>
> diff --git a/src/output/pivot-output.c b/src/output/pivot-output.c
> index 69a6f7fec..27ece3dc4 100644
> --- a/src/output/pivot-output.c
> +++ b/src/output/pivot-output.c
> @@ -22,6 +22,7 @@
>
>  #include "data/settings.h"
>  #include "libpspp/assertion.h"
> +#include "libpspp/sparse-array.h"
>  #include "libpspp/pool.h"
>  #include "output/tab.h"
>  #include "output/table.h"
> @@ -190,7 +191,8 @@ compose_headings (struct tab_table *t,
>                    struct footnote **footnotes,
>                    enum settings_value_show show_values,
>                    enum settings_value_show show_variables,
> -                  bool rotate_inner_labels, bool rotate_outer_labels)
> +                  bool rotate_inner_labels, bool rotate_outer_labels,
> +                  const struct sparse_array *occupied)
>  {
>    enum table_axis b = !a;
>    int b_size = a_axis->label_depth;
> @@ -213,7 +215,7 @@ compose_headings (struct tab_table *t,
>              {
>                const struct pivot_category *c = find_category (
>                  d, dim_index, column_enumeration + x1 * stride, row_ofs);
> -              if (!c)
> +              if (!c || !sparse_array_get (occupied, x1))
>                  {
>                    x1++;
>                    continue;
> @@ -363,6 +365,50 @@ pivot_table_submit_layer (const struct pivot_table
> *pt,
>        free (content);
>      }
>
> +  size_t *dindexes = xcalloc (pt->n_dimensions, sizeof *dindexes);
> +  size_t y = 0;
> +  struct sparse_array *occupied_rows = sparse_array_create (1);
> +  struct sparse_array *occupied_columns = sparse_array_create (1);
> +  PIVOT_ENUMERATION_FOR_EACH (pindexes[PIVOT_AXIS_ROW], row_enumeration,
> +                              &pt->axes[PIVOT_AXIS_ROW])
> +    {
> +      size_t x = 0;
> +      if (! pt->hide_empty_rows)
> +        sparse_array_insert (occupied_rows, y);
> +
> +      PIVOT_ENUMERATION_FOR_EACH (pindexes[PIVOT_AXIS_COLUMN],
> +                                  column_enumeration,
> +                                  &pt->axes[PIVOT_AXIS_COLUMN])
> +        {
> +          if (! pt->hide_empty_columns)
> +            {
> +              if (! sparse_array_get (occupied_columns, x))
> +                sparse_array_insert (occupied_columns, x);
> +            }
> +          pivot_table_convert_indexes_ptod (pt, pindexes, dindexes);
> +          const struct pivot_value *value = pivot_table_get (pt,
> dindexes);
> +          if (value)
> +          {
> +            if (! sparse_array_get (occupied_columns, x))
> +              sparse_array_insert (occupied_columns, x);
> +
> +            if (! sparse_array_get (occupied_rows, y))
> +              sparse_array_insert (occupied_rows, y);
> +          }
> +          fill_cell (table,
> +                     x + stub[H], y + stub[V],
> +                     x + stub[H], y + stub[V],
> +                     &pt->areas[PIVOT_AREA_DATA], PIVOT_AREA_DATA,
> +                     value, footnotes,
> +                     pt->show_values, pt->show_variables, false);
> +
> +          x++;
> +        }
> +
> +      y++;
> +    }
> +  free (dindexes);
> +
>    compose_headings (table,
>                      &pt->axes[PIVOT_AXIS_COLUMN], H,
> &pt->axes[PIVOT_AXIS_ROW],
>                      pt->borders,
> @@ -375,7 +421,8 @@ pivot_table_submit_layer (const struct pivot_table *pt,
>                      PIVOT_AREA_COLUMN_LABELS,
>                      &pt->areas[PIVOT_AREA_CORNER], footnotes,
>                      pt->show_values, pt->show_variables,
> -                    pt->rotate_inner_column_labels, false);
> +                    pt->rotate_inner_column_labels, false,
> +                    occupied_columns);
>
>    compose_headings (table,
>                      &pt->axes[PIVOT_AXIS_ROW], V,
> &pt->axes[PIVOT_AXIS_COLUMN],
> @@ -389,33 +436,11 @@ pivot_table_submit_layer (const struct pivot_table
> *pt,
>                      PIVOT_AREA_ROW_LABELS,
>                      &pt->areas[PIVOT_AREA_CORNER], footnotes,
>                      pt->show_values, pt->show_variables,
> -                    false, pt->rotate_outer_row_labels);
> +                    false, pt->rotate_outer_row_labels,
> +                    occupied_rows);
>
> -  size_t *dindexes = xcalloc (pt->n_dimensions, sizeof *dindexes);
> -  size_t y = 0;
> -  PIVOT_ENUMERATION_FOR_EACH (pindexes[PIVOT_AXIS_ROW], row_enumeration,
> -                              &pt->axes[PIVOT_AXIS_ROW])
> -    {
> -      size_t x = 0;
> -      PIVOT_ENUMERATION_FOR_EACH (pindexes[PIVOT_AXIS_COLUMN],
> -                                  column_enumeration,
> -                                  &pt->axes[PIVOT_AXIS_COLUMN])
> -        {
> -          pivot_table_convert_indexes_ptod (pt, pindexes, dindexes);
> -          const struct pivot_value *value = pivot_table_get (pt,
> dindexes);
> -          fill_cell (table,
> -                     x + stub[H], y + stub[V],
> -                     x + stub[H], y + stub[V],
> -                     &pt->areas[PIVOT_AREA_DATA], PIVOT_AREA_DATA,
> -                     value, footnotes,
> -                     pt->show_values, pt->show_variables, false);
> -
> -          x++;
> -        }
> -
> -      y++;
> -    }
> -  free (dindexes);
> +  sparse_array_destroy (occupied_rows);
> +  sparse_array_destroy (occupied_columns);
>
>    if (pt->corner_text && stub[H] && stub[V])
>      fill_cell (table, 0, 0, stub[H] - 1, stub[V] - 1,
> diff --git a/src/output/pivot-table.h b/src/output/pivot-table.h
> index 6104cb131..1164abb1d 100644
> --- a/src/output/pivot-table.h
> +++ b/src/output/pivot-table.h
> @@ -371,6 +371,8 @@ struct pivot_table
>      bool row_labels_in_corner;
>      bool show_grid_lines;
>      bool omit_empty;
> +    bool hide_empty_columns;
> +    bool hide_empty_rows;
>      size_t *current_layer; /* axis[PIVOT_AXIS_LAYER]->n_dimensions
> elements. */
>      char *table_look;
>      enum settings_value_show show_values;
> --
> 2.11.0
>
>
> _______________________________________________
> pspp-dev mailing list
> [email protected]
> https://lists.gnu.org/mailman/listinfo/pspp-dev
>
_______________________________________________
pspp-dev mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/pspp-dev

Reply via email to