Skip to content

Commit 8815160

Browse files
authored
Merge pull request #4550 from NejcDebevec/unique_names
[FIX] Detect duplicate names of variables in projections.
2 parents 64c51ca + 6a91784 commit 8815160

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

Orange/widgets/visualize/tests/test_owlinearprojection.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from AnyQt.QtCore import QItemSelectionModel
77

8-
from Orange.data import Table, Domain, DiscreteVariable
8+
from Orange.data import Table, Domain, DiscreteVariable, ContinuousVariable
99
from Orange.widgets.settings import Context
1010
from Orange.widgets.tests.base import (
1111
WidgetTest, WidgetOutputsTestMixin, datasets,
@@ -185,6 +185,17 @@ def test_two_classes_dataset(self):
185185
self.send_signal(self.widget.Inputs.data, Table("heart_disease"))
186186
self.assertFalse(self.widget.radio_placement.buttons[1].isEnabled())
187187

188+
def test_unique_name(self):
189+
data = Table("iris")
190+
new = ContinuousVariable("C-y")
191+
d = Table.from_numpy(Domain(list(data.domain.attributes[:3])+[new],
192+
class_vars=data.domain.class_vars), data.X,
193+
data.Y)
194+
self.send_signal(self.widget.Inputs.data, d)
195+
output = self.get_output(self.widget.Outputs.annotated_data)
196+
metas = ["C-x (1)", "C-y (1)", "Selected"]
197+
self.assertEqual([meta.name for meta in output.domain.metas], metas)
198+
188199

189200
class LinProjVizRankTests(WidgetTest):
190201
"""

Orange/widgets/visualize/utils/widget.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -707,10 +707,18 @@ def _manual_move_finish(self, anchor_idx, x, y):
707707
def _get_projection_data(self):
708708
if self.data is None or self.projection is None:
709709
return None
710+
proposed = [a.name for a in self.projection.domain.attributes]
711+
names = get_unique_names(self.data.domain, proposed)
712+
713+
if proposed != names:
714+
attributes = tuple([attr.copy(name=name) for name, attr in
715+
zip(names, self.projection.domain.attributes)])
716+
else:
717+
attributes = self.projection.domain.attributes
710718
return self.data.transform(
711719
Domain(self.data.domain.attributes,
712720
self.data.domain.class_vars,
713-
self.data.domain.metas + self.projection.domain.attributes))
721+
self.data.domain.metas + attributes))
714722

715723
def commit(self):
716724
super().commit()

0 commit comments

Comments
 (0)