From 215d7623b59307ff6543cef765ab3971cf1a70a3 Mon Sep 17 00:00:00 2001
From: Jaden Diefenbaugh <jaden.diefenbaugh@idiap.ch>
Date: Mon, 15 Oct 2018 11:42:00 -0700
Subject: [PATCH] [js][exp] choosing a protocol now smartly maps datasets based
 on names, fixes #126

---
 .../components/experiment/ExperimentEditor.jsx | 18 ++++++++++++++++--
 .../experiment/ExperimentEditor.spec.jsx       | 10 +++++-----
 2 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/conda/js/src/components/experiment/ExperimentEditor.jsx b/conda/js/src/components/experiment/ExperimentEditor.jsx
index d6fc65e6..acc55144 100644
--- a/conda/js/src/components/experiment/ExperimentEditor.jsx
+++ b/conda/js/src/components/experiment/ExperimentEditor.jsx
@@ -200,6 +200,9 @@ const levMapStrings = (keyArr: string[], valArr: string[]): { [string]: string }
 	const vals = [...valArr];
 	const map = {};
 
+	//console.log(keys);
+	//console.log(vals);
+
 	while(keys.length > 0){
 		const scores = {};
 		const matches = {};
@@ -227,6 +230,7 @@ const levMapStrings = (keyArr: string[], valArr: string[]): { [string]: string }
 		map[chosenKey] = matches[chosenKey];
 		keys.splice(keys.indexOf(chosenKey), 1);
 		vals.splice(vals.indexOf(matches[chosenKey]), 1);
+		//console.log(map);
 	}
 
 	const orderedMap = {};
@@ -234,6 +238,7 @@ const levMapStrings = (keyArr: string[], valArr: string[]): { [string]: string }
 		orderedMap[k] = map[k];
 	}
 
+	//console.log(orderedMap);
 	return orderedMap;
 };
 
@@ -587,7 +592,6 @@ export class ExperimentEditor extends React.Component<Props, State> {
 					onChange={e => {
 						const str = e.target.value;
 
-						//Object.keys(this.props.data.contents.datasets).map(dsName
 						const newDs = JSON.parse(str);
 						//console.log(newDs);
 						this.setContents({...this.props.data.contents, datasets: newDs});
@@ -628,7 +632,17 @@ export class ExperimentEditor extends React.Component<Props, State> {
 								const tcDs = tcDss.pop();
 								let setsIdx = sets.findIndex(set => set.set === tcDs.name && dbSetIsValidForTcDataset(set, tcDs));
 								if(setsIdx === -1){
-									setsIdx = sets.findIndex(set => dbSetIsValidForTcDataset(set, tcDs));
+									const validSets = sets.filter(set => dbSetIsValidForTcDataset(set, tcDs));
+									let bestScore = 10000;
+									let bestMatch = 'notfound';
+									for(const s of validSets){
+										const score = lev.get(tcDs.name, s.set);
+										if(score < bestScore){
+											bestScore = score;
+											bestMatch = s;
+										}
+									}
+									setsIdx = sets.findIndex(set => set == bestMatch);
 								}
 								if(setsIdx === -1)
 									return [dbProtStr, false];
diff --git a/conda/js/src/components/experiment/ExperimentEditor.spec.jsx b/conda/js/src/components/experiment/ExperimentEditor.spec.jsx
index dd218f75..017ee392 100644
--- a/conda/js/src/components/experiment/ExperimentEditor.spec.jsx
+++ b/conda/js/src/components/experiment/ExperimentEditor.spec.jsx
@@ -239,18 +239,18 @@ describe('<ExperimentEditor />', () => {
 			//console.log('doing dataset');
 
 			wrapper.find('svg #block_training_data').simulate('click');
-			wrapper.find('div.datasets select').at(0).simulate('change', { target: { value: '{"testing_data":{"database":"iris/1","protocol":"Main","set":"training"},"training_data":{"database":"iris/1","protocol":"Main","set":"testing"}}'}});
+			wrapper.find('div.datasets select').at(0).simulate('change', { target: { value: '{"testing_data":{"database":"iris/1","protocol":"Main","set":"testing"},"training_data":{"database":"iris/1","protocol":"Main","set":"training"}}'}});
 			expect(updateFunc.callCount).to.equal(1);
 			expect(wrapper.props().data.contents).to.have.deep.property('datasets', {
 				'testing_data': {
 					'database': 'iris/1',
 					'protocol': 'Main',
-					'set': 'training'
+					'set': 'testing'
 				},
 				'training_data': {
 					'database': 'iris/1',
 					'protocol': 'Main',
-					'set': 'testing'
+					'set': 'training'
 				}
 			});
 
@@ -492,12 +492,12 @@ describe('<ExperimentEditor />', () => {
 						'testing_data': {
 							'database': 'iris/1',
 							'protocol': 'Main',
-							'set': 'training'
+							'set': 'testing'
 						},
 						'training_data': {
 							'database': 'iris/1',
 							'protocol': 'Main',
-							'set': 'testing'
+							'set': 'training'
 						}
 					},
 					'globals': {
-- 
GitLab