Skip to content

Commit cebb02f

Browse files
committed
get_unique_names: Handle more independent names
1 parent 56c12a5 commit cebb02f

File tree

2 files changed

+89
-10
lines changed

2 files changed

+89
-10
lines changed

Orange/data/tests/test_util.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,78 @@ def test_get_unique_names_with_domain(self):
4848
self.assertEqual(get_unique_names(domain, "foo"), "foo (1)")
4949
self.assertEqual(get_unique_names(domain, "baz"), "baz (4)")
5050

51+
def test_get_unique_names_not_equal(self):
52+
names = ["foo", "bar", "baz", "baz (3)"]
53+
self.assertEqual(
54+
get_unique_names(names, ["qux"], equal_numbers=False), ["qux"]
55+
)
56+
self.assertEqual(
57+
get_unique_names(names, ["foo"], equal_numbers=False), ["foo (1)"]
58+
)
59+
self.assertEqual(
60+
get_unique_names(names, ["baz"], equal_numbers=False), ["baz (4)"]
61+
)
62+
self.assertEqual(
63+
get_unique_names(names, ["baz (3)"], equal_numbers=False),
64+
["baz (3) (1)"]
65+
)
66+
self.assertEqual(
67+
get_unique_names(names, ["qux", "quux"], equal_numbers=False),
68+
["qux", "quux"]
69+
)
70+
self.assertEqual(
71+
get_unique_names(names, ["bar", "baz"], equal_numbers=False),
72+
["bar (1)", "baz (4)"]
73+
)
74+
self.assertEqual(
75+
get_unique_names(names, ["qux", "baz"], equal_numbers=False),
76+
["qux", "baz (4)"]
77+
)
78+
self.assertEqual(
79+
get_unique_names(names, ["qux", "bar"], equal_numbers=False),
80+
["qux", "bar (1)"]
81+
)
82+
self.assertEqual(
83+
get_unique_names(names, ["foo", "bar", "baz"], equal_numbers=False),
84+
["foo (1)", "bar (1)", "baz (4)"]
85+
)
86+
87+
a, b, c, d = map(ContinuousVariable, ["foo", "bar", "baz", "baz (3)"])
88+
domain = Domain([a, b], c, [d])
89+
self.assertEqual(
90+
get_unique_names(names, ["qux"], equal_numbers=False), ["qux"]
91+
)
92+
self.assertEqual(
93+
get_unique_names(names, ["foo"], equal_numbers=False), ["foo (1)"]
94+
)
95+
self.assertEqual(
96+
get_unique_names(names, ["baz"], equal_numbers=False), ["baz (4)"]
97+
)
98+
self.assertEqual(
99+
get_unique_names(names, ["baz (3)"], equal_numbers=False),
100+
["baz (3) (1)"]
101+
)
102+
self.assertEqual(
103+
get_unique_names(domain, ["qux", "quux"], equal_numbers=False),
104+
["qux", "quux"]
105+
)
106+
self.assertEqual(
107+
get_unique_names(domain, ["bar", "baz"], equal_numbers=False),
108+
["bar (1)", "baz (4)"]
109+
)
110+
self.assertEqual(
111+
get_unique_names(domain, ["qux", "baz"], equal_numbers=False),
112+
["qux", "baz (4)"]
113+
)
114+
self.assertEqual(
115+
get_unique_names(domain, ["qux", "bar"], equal_numbers=False),
116+
["qux", "bar (1)"]
117+
)
118+
self.assertEqual(
119+
get_unique_names(domain, ["foo", "bar", "baz"], equal_numbers=False),
120+
["foo (1)", "bar (1)", "baz (4)"]
121+
)
122+
51123
def test_get_unique_names_from_duplicates(self):
52124
self.assertEqual(
53125
get_unique_names_duplicates(["foo", "bar", "baz"]),

Orange/data/util.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ def get_indices(names, name):
171171
for a in re.finditer(RE_FIND_INDEX.format(re.escape(name)), x)]
172172

173173

174-
def get_unique_names(names, proposed):
174+
def get_unique_names(names, proposed, equal_numbers=True):
175175
"""
176176
Returns unique names for variables
177177
@@ -189,13 +189,15 @@ def get_unique_names(names, proposed):
189189
list.
190190
191191
The method is used in widgets like MDS, which adds two variables (`x` and
192-
`y`). It is desired that they have the same index. If `x`, `x (1)` and
193-
`x (2)` and `y` (but no other `y`'s already exist in the domain, MDS
194-
should append `x (3)` and `y (3)`, not `x (3)` and y (1)`.
192+
`y`). It is desired that they have the same index. In case when
193+
equal_numbers=True, if `x`, `x (1)` and `x (2)` and `y` (but no other
194+
`y`'s already exist in the domain, MDS should append `x (3)` and `y (3)`,
195+
not `x (3)` and y (1)`.
195196
196197
Args:
197198
names (Domain or list of str): used names
198199
proposed (str or list of str): proposed name
200+
equal_numbers (bool): Add same number to all proposed names
199201
200202
Return:
201203
str or list of str
@@ -206,13 +208,18 @@ def get_unique_names(names, proposed):
206208
names = [var.name for var in chain(names.variables, names.metas)]
207209
if isinstance(proposed, str):
208210
return get_unique_names(names, [proposed])[0]
209-
indicess = [indices
210-
for indices in (get_indices(names, name) for name in proposed)
211-
if indices]
212-
if not (set(proposed) & set(names) or indicess):
211+
indices = {
212+
name: max(get_indices(names, name), default=0) + 1 for name in proposed
213+
if name in names
214+
}
215+
if not (set(proposed) & set(names) or indices):
213216
return proposed
214-
max_index = max(map(max, indicess), default=0) + 1
215-
return [f"{name} ({max_index})" for name in proposed]
217+
if equal_numbers:
218+
max_index = max(indices.values())
219+
return [f"{name} ({max_index})" for name in proposed]
220+
else:
221+
return [f"{name} ({indices[name]})" if name in indices else name
222+
for name in proposed]
216223

217224

218225
def get_unique_names_duplicates(proposed: list, return_duplicated=False) -> list:

0 commit comments

Comments
 (0)