[gnumeric] AutoFilter: speed up really large filters.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] AutoFilter: speed up really large filters.
- Date: Fri, 12 Jun 2020 23:35:23 +0000 (UTC)
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]