Skip to content

Commit b07e091

Browse files
committed
Merge Data: Editorial changes
1 parent 7c2254f commit b07e091

File tree

2 files changed

+59
-41
lines changed

2 files changed

+59
-41
lines changed

Orange/widgets/data/owmergedata.py

Lines changed: 30 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,8 @@ def decode_pair(widget, pair):
202202
def _encode_domain(self, domain):
203203
if domain is None:
204204
return {}
205-
return dict(self.encode_variables(chain(domain.variables, domain.metas)))
205+
all_vars = chain(domain.variables, domain.metas)
206+
return dict(self.encode_variables(all_vars))
206207

207208
def settings_from_widget(self, widget, *_args):
208209
context = widget.current_context
@@ -315,10 +316,9 @@ def __init__(self):
315316
self.extra_model = DomainModelWithTooltips(content)
316317

317318
box = gui.hBox(self.controlArea, box=None)
318-
self.infoBoxData = gui.label(
319-
box, self, self.dataInfoText(None), box="Data")
320-
self.infoBoxExtraData = gui.label(
321-
box, self, self.dataInfoText(None), box="Extra Data")
319+
no_info = self.data_info(None)
320+
self.info_box_data = gui.label(box, self, no_info, box="Data")
321+
self.info_box_extra_data = gui.label(box, self, no_info, box="Extra Data")
322322

323323
grp = gui.radioButtons(
324324
self.controlArea, self, "merging", box="Merging",
@@ -341,49 +341,19 @@ def __init__(self):
341341
def change_merging(self):
342342
self.commit()
343343

344-
@staticmethod
345-
def _try_set_combo(combo, var):
346-
if var in combo.model():
347-
combo.setCurrentIndex(combo.model().indexOf(var))
348-
else:
349-
combo.setCurrentIndex(0)
350-
351-
def _find_best_match(self):
352-
def get_unique_str_metas_names(model_):
353-
return [m for m in model_ if isinstance(m, StringVariable)]
354-
355-
attr, extra_attr, n_max_intersect = INDEX, INDEX, 0
356-
str_metas = get_unique_str_metas_names(self.model)
357-
extra_str_metas = get_unique_str_metas_names(self.extra_model)
358-
for m_a, m_b in product(str_metas, extra_str_metas):
359-
col = self.data[:, m_a].metas
360-
extra_col = self.extra_data[:, m_b].metas
361-
if col.size and extra_col.size \
362-
and isinstance(col[0][0], str) \
363-
and isinstance(extra_col[0][0], str):
364-
n_inter = len(np.intersect1d(col, extra_col))
365-
if n_inter > n_max_intersect:
366-
n_max_intersect, attr, extra_attr = n_inter, m_a, m_b
367-
return attr, extra_attr
368-
369344
@Inputs.data
370345
@check_sql_input
371-
def setData(self, data):
346+
def set_data(self, data):
372347
self.data = data
373348
self.model.set_domain(data and data.domain)
374-
self.infoBoxData.setText(self.dataInfoText(data))
349+
self.info_box_data.setText(self.data_info(data))
375350

376351
@Inputs.extra_data
377352
@check_sql_input
378-
def setExtraData(self, data):
353+
def set_extra_data(self, data):
379354
self.extra_data = data
380355
self.extra_model.set_domain(data and data.domain)
381-
self.infoBoxExtraData.setText(self.dataInfoText(data))
382-
383-
def _restore_combo_current_items(self, side, prev_settings):
384-
for row, pair in zip(self.attr_boxes.rows, prev_settings):
385-
self._try_set_combo(
386-
[row.left_combo, row.right_combo][side], pair[side])
356+
self.info_box_extra_data.setText(self.data_info(data))
387357

388358
def store_combo_state(self):
389359
self.attr_pairs = self.attr_boxes.current_state()
@@ -396,8 +366,26 @@ def handleNewSignals(self):
396366
self.attr_boxes.set_state(self.attr_pairs)
397367
self.unconditional_commit()
398368

369+
def _find_best_match(self):
370+
def get_unique_str_metas_names(model_):
371+
return [m for m in model_ if isinstance(m, StringVariable)]
372+
373+
attr, extra_attr, n_max_intersect = INDEX, INDEX, 0
374+
str_metas = get_unique_str_metas_names(self.model)
375+
extra_str_metas = get_unique_str_metas_names(self.extra_model)
376+
for m_a, m_b in product(str_metas, extra_str_metas):
377+
col = self.data[:, m_a].metas
378+
extra_col = self.extra_data[:, m_b].metas
379+
if col.size and extra_col.size \
380+
and isinstance(col[0][0], str) \
381+
and isinstance(extra_col[0][0], str):
382+
n_inter = len(np.intersect1d(col, extra_col))
383+
if n_inter > n_max_intersect:
384+
n_max_intersect, attr, extra_attr = n_inter, m_a, m_b
385+
return attr, extra_attr
386+
399387
@staticmethod
400-
def dataInfoText(data):
388+
def data_info(data):
401389
if data is None:
402390
return "No data."
403391
else:
@@ -408,7 +396,7 @@ def dataInfoText(data):
408396

409397
def commit(self):
410398
self.clear_messages()
411-
merged = None if not self.data or not self.extra_data else self.merge()
399+
merged = self.merge() if self.data and self.extra_data else None
412400
self.Outputs.data.send(merged)
413401

414402
def send_report(self):
@@ -692,6 +680,7 @@ def mig_value(x):
692680
if hasattr(settings, "attr_pairs"):
693681
del settings["attr_pairs"]
694682

683+
695684
if __name__ == "__main__": # pragma: no cover
696685
WidgetPreview(OWMergeData).run(
697686
setData=Orange.data.Table("tests/data-gender-region"),

Orange/widgets/data/tests/test_owmergedata.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,35 @@ def test_retrieve_settings(self):
288288
widget2.attr_boxes.current_state(),
289289
[(INDEX, INDEX), (INSTANCEID, INSTANCEID), (var0, var1)])
290290

291+
def test_match_settings(self):
292+
widget = self.widget
293+
boxes = widget.attr_boxes
294+
domainA = self.dataA.domain
295+
domainB = self.dataB.domain
296+
297+
self.send_signal(widget.Inputs.data, self.dataA)
298+
self.send_signal(widget.Inputs.extra_data, self.dataA)
299+
attr_pairs = [(INDEX, INDEX), (INSTANCEID, INSTANCEID),
300+
(domainA[0], domainA[1]), (domainA[1], domainA[0])]
301+
boxes.set_state(attr_pairs)
302+
boxes.emit_list()
303+
self.assertEqual(widget.attr_pairs, attr_pairs)
304+
305+
self.send_signal(widget.Inputs.data, None)
306+
self.assertEqual(widget.attr_pairs, [(INDEX, INDEX)])
307+
308+
self.send_signal(widget.Inputs.data, self.dataA)
309+
self.assertEqual(widget.attr_pairs, attr_pairs)
310+
311+
self.send_signal(widget.Inputs.extra_data, self.dataB)
312+
attr_pairs2 = [(domainA[0], domainB[0]), (domainA[1], domainB[1])]
313+
boxes.set_state(attr_pairs2)
314+
boxes.emit_list()
315+
self.assertEqual(widget.attr_pairs, attr_pairs2)
316+
317+
self.send_signal(widget.Inputs.extra_data, self.dataA)
318+
self.assertEqual(widget.attr_pairs, attr_pairs)
319+
291320
def test_migrate_settings(self):
292321
attr1, attr2, attr3, attr4, attr5 = [object() for _ in range(5)]
293322
orig_settings = dict(

0 commit comments

Comments
 (0)