[gnumeric] AutoFilter: speed up really large filters.



commit eefef54e6407a25df91b3cd037ef2864fd070441
Author: Morten Welinder <terra gnome org>
Date:   Fri Jun 12 19:33:16 2020 -0400

    AutoFilter: speed up really large filters.

 NEWS                     |  1 +
 configure.ac             |  2 +-
 src/gnm-so-path.c        | 12 ++++++++----
 src/sheet-control-gui.c  |  9 +++++++++
 src/sheet-control-priv.h |  1 +
 src/sheet-control.c      |  2 ++
 src/sheet-control.h      |  2 ++
 src/sheet-filter.c       |  8 ++++++++
 src/sheet-object.c       | 24 +++++++++++++++---------
 9 files changed, 47 insertions(+), 14 deletions(-)
---
diff --git a/NEWS b/NEWS
index 8f38aed9e..44b2d609e 100644
--- a/NEWS
+++ b/NEWS
@@ -18,6 +18,7 @@ Morten:
        * Fix Ctrl-; cursor position.  [#494]
        * Fix ssconvert --merge-to problem.  [#496]
        * Fix sheet size paste problem.  [#497]
+       * Speed up really large auto-filters.  [#465]
 
 --------------------------------------------------------------------------
 Gnumeric 1.12.47
diff --git a/configure.ac b/configure.ac
index bf48948a3..636f4f306 100644
--- a/configure.ac
+++ b/configure.ac
@@ -166,7 +166,7 @@ PKG_PROG_PKG_CONFIG(0.18)
 
 dnl *****************************
 libspreadsheet_reqs="
-       libgoffice-${GOFFICE_API_VER}   >= 0.10.46
+       libgoffice-${GOFFICE_API_VER}   >= 0.10.48
        libgsf-1                >= 1.14.33
        libxml-2.0              >= 2.4.12
 "
diff --git a/src/gnm-so-path.c b/src/gnm-so-path.c
index cf0e4407d..b6fb69ca7 100644
--- a/src/gnm-so-path.c
+++ b/src/gnm-so-path.c
@@ -205,10 +205,14 @@ cb_gnm_so_path_changed (GnmSOPath const *sop,
                        G_GNUC_UNUSED GParamSpec *pspec,
                        GnmSOPathView *group)
 {
-       GList *ptr = GOC_GROUP (group)->children;
-       for (; ptr && ptr->data; ptr = ptr->next)
-               if (GOC_IS_PATH (ptr->data))
-                       cb_gnm_so_path_style_changed (GOC_ITEM (ptr->data), sop);
+       GPtrArray *children = goc_group_get_children (GOC_GROUP (group));
+       unsigned ui;
+       for (ui = 0; ui < children->len; ui++) {
+               GocItem *item = g_ptr_array_index (children, ui);
+               if (GOC_IS_PATH (item))
+                       cb_gnm_so_path_style_changed (item, sop);
+       }
+       g_ptr_array_unref (children);
 
        if (sop->text != NULL && *sop->text != 0) {
                /* set a font, a very bad solution, but will do until we move to GOString */
diff --git a/src/sheet-control-gui.c b/src/sheet-control-gui.c
index a29f6c1bb..db76a8655 100644
--- a/src/sheet-control-gui.c
+++ b/src/sheet-control-gui.c
@@ -3946,6 +3946,14 @@ scg_show_im_tooltip (SheetControl *sc, GnmInputMsg *im, GnmCellPos *pos)
        }
 }
 
+static void
+scg_freeze_object_view (SheetControl *sc, gboolean freeze)
+{
+       SCG_FOREACH_PANE
+               (GNM_SCG(sc), pane,
+                GocGroup *g = pane->object_views;
+                goc_group_freeze (g, freeze););
+}
 
 static void
 scg_class_init (GObjectClass *object_class)
@@ -3974,6 +3982,7 @@ scg_class_init (GObjectClass *object_class)
        sc_class->object_create_view       = scg_object_create_view;
        sc_class->scale_changed            = scg_scale_changed;
        sc_class->show_im_tooltip          = scg_show_im_tooltip;
+       sc_class->freeze_object_view       = scg_freeze_object_view;
 }
 
 GSF_CLASS (SheetControlGUI, sheet_control_gui,
diff --git a/src/sheet-control-priv.h b/src/sheet-control-priv.h
index b5128500e..a9601d68e 100644
--- a/src/sheet-control-priv.h
+++ b/src/sheet-control-priv.h
@@ -36,6 +36,7 @@ typedef struct {
        void (*scale_changed)           (SheetControl *sc);
        void (*show_im_tooltip)         (SheetControl *sc,
                                         GnmInputMsg *im, GnmCellPos *pos);
+       void (*freeze_object_view)      (SheetControl *sc, gboolean freeze);
 } SheetControlClass;
 
 #define SHEET_CONTROL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GNM_SHEET_CONTROL_TYPE, SheetControlClass))
diff --git a/src/sheet-control.c b/src/sheet-control.c
index d8c01ce42..461790674 100644
--- a/src/sheet-control.c
+++ b/src/sheet-control.c
@@ -135,3 +135,5 @@ SC_VIRTUAL (object_create_view,     (SheetControl *sc, SheetObject *so), (sc, so))
 SC_VIRTUAL (scale_changed,     (SheetControl *sc), (sc))
 
 SC_VIRTUAL (show_im_tooltip,   (SheetControl *sc, GnmInputMsg *im, GnmCellPos *pos), (sc, im, pos))
+
+SC_VIRTUAL (freeze_object_view,        (SheetControl *sc, gboolean freeze), (sc, freeze))
diff --git a/src/sheet-control.h b/src/sheet-control.h
index 306edef0e..2bf5602fb 100644
--- a/src/sheet-control.h
+++ b/src/sheet-control.h
@@ -48,6 +48,8 @@ void sc_scale_changed         (SheetControl *sc);
 void sc_show_im_tooltip         (SheetControl *sc,
                                 GnmInputMsg *im, GnmCellPos *pos);
 
+void sc_freeze_object_view      (SheetControl *sc, gboolean freeze);
+
 G_END_DECLS
 
 #endif /* _GNM_SHEET_CONTROL_H_ */
diff --git a/src/sheet-filter.c b/src/sheet-filter.c
index ff42f24c0..45801b2cd 100644
--- a/src/sheet-filter.c
+++ b/src/sheet-filter.c
@@ -27,6 +27,8 @@
 #include <workbook.h>
 #include <sheet.h>
 #include <sheet-private.h>
+#include <sheet-view.h>
+#include <sheet-control.h>
 #include <cell.h>
 #include <expr.h>
 #include <value.h>
@@ -796,12 +798,18 @@ gnm_filter_remove (GnmFilter *filter)
        }
        filter->sheet = NULL;
 
+       SHEET_FOREACH_CONTROL
+               (sheet, view, sc, sc_freeze_object_view (sc, TRUE););
+
        for (i = filter->fields->len; i-- > 0; ) {
                SheetObject *so = g_ptr_array_index (filter->fields, i);
                sheet_object_clear_sheet (so);
                g_object_unref (so);
        }
        g_ptr_array_set_size (filter->fields, 0);
+
+       SHEET_FOREACH_CONTROL
+               (sheet, view, sc, sc_freeze_object_view (sc, FALSE););
 }
 
 /**
diff --git a/src/sheet-object.c b/src/sheet-object.c
index 54a4ed087..4754eb8e7 100644
--- a/src/sheet-object.c
+++ b/src/sheet-object.c
@@ -544,12 +544,20 @@ sheet_object_get_sheet (SheetObject const *so)
 static gboolean
 cb_create_views (void)
 {
-       unsigned ui, l = so_create_view_sos->len;
-
-       for (ui = 0; ui < l; ui++) {
-               SheetObject *so = g_ptr_array_index (so_create_view_sos, ui);
-               SHEET_FOREACH_CONTROL (so->sheet, view, control,
-                                      sc_object_create_view (control, so););
+       int pass;
+
+       for (pass = 1; pass <= 3; pass++) {
+               unsigned ui, l = so_create_view_sos->len;
+               for (ui = 0; ui < l; ui++) {
+                       SheetObject *so = g_ptr_array_index (so_create_view_sos, ui);
+                       SHEET_FOREACH_CONTROL
+                               (so->sheet, view, control,
+                                if (pass == 2)
+                                        sc_object_create_view (control, so);
+                                else
+                                        sc_freeze_object_view (control, pass == 1);
+                                       );
+               }
        }
        g_ptr_array_set_size (so_create_view_sos, 0);
        so_create_view_src = 0;
@@ -1486,9 +1494,7 @@ sheet_object_view_get_item (SheetObjectView *sov)
 {
        g_return_val_if_fail (GNM_IS_SO_VIEW (sov), NULL);
 
-       if (sov->base.children == NULL)
-               return NULL;
-       return GOC_ITEM (sov->base.children->data);
+       return goc_group_get_child (GOC_GROUP (sov), 0);
 }
 
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]