From c66bf0ad5695ef547c7f602e5c8a4607ce4699a0 Mon Sep 17 00:00:00 2001
From: Philipp Rudiger
Date: Mon, 11 Dec 2017 22:02:49 +0000
Subject: [PATCH] Ensure Compositor does not make superfluous copies
---
holoviews/core/options.py | 5 +++--
tests/testbokehcallbacks.py | 17 ++++++++++++++---
2 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/holoviews/core/options.py b/holoviews/core/options.py
index 83e4bb8100..7f3c35d1df 100644
--- a/holoviews/core/options.py
+++ b/holoviews/core/options.py
@@ -880,9 +880,10 @@ def map(cls, obj, mode='data', backend=None):
if overlay_compositors:
obj = obj.map(lambda obj: cls.collapse_element(obj, mode=mode, backend=backend),
[CompositeOverlay])
- if element_compositors:
+ element_patterns = [c.pattern for c in element_compositors]
+ if element_compositors and obj.traverse(lambda x: x, element_patterns):
obj = obj.map(lambda obj: cls.collapse_element(obj, mode=mode, backend=backend),
- [c.pattern for c in element_compositors])
+ element_patterns)
return obj
diff --git a/tests/testbokehcallbacks.py b/tests/testbokehcallbacks.py
index dae0b8e7a5..102918f1ca 100644
--- a/tests/testbokehcallbacks.py
+++ b/tests/testbokehcallbacks.py
@@ -1,12 +1,14 @@
from unittest import SkipTest
from nose.plugins.attrib import attr
-from holoviews.element.comparison import ComparisonTestCase
+from holoviews.core import NdOverlay
from holoviews.core.options import Store
-
+from holoviews.element import Curve
+from holoviews.element.comparison import ComparisonTestCase
+from holoviews.streams import Selection1D
try:
- from holoviews.plotting.bokeh.callbacks import Callback
+ from holoviews.plotting.bokeh.callbacks import Callback, Selection1DCallback
from holoviews.plotting.bokeh.util import bokeh_version
from bokeh.events import Tap
@@ -52,6 +54,15 @@ def test_customjs_callback_attributes_js_for_cb_data(self):
'data["y1"] = cb_data["geometry"]["y1"];\n')
self.assertEqual(js_code, code)
+
+ def test_callback_on_ndoverlay_is_attached(self):
+ ndoverlay = NdOverlay({i: Curve([i]) for i in range(5)})
+ selection = Selection1D(source=ndoverlay)
+ plot = bokeh_renderer.get_plot(ndoverlay)
+ self.assertEqual(len(plot.callbacks), 1)
+ self.assertIsInstance(plot.callbacks[0], Selection1DCallback)
+
+
@attr(optional=1)
class TestBokehServerJSCallbacks(ComparisonTestCase):