From 4f9caa4dc67bb666a6c15d8587c4d89b92c73d39 Mon Sep 17 00:00:00 2001 From: GotPPay Date: Wed, 25 Oct 2017 00:28:31 +0200 Subject: [PATCH 1/6] izmjena algoritma --- backend/.env | 5 +- backend/app.js | 207 +++++++++++++++++++++++++++------- web/src/App.js | 23 +++- web/src/PairComponent.js | 4 +- web/src/PairsListComponent.js | 2 +- 5 files changed, 188 insertions(+), 53 deletions(-) diff --git a/backend/.env b/backend/.env index 689f0626..dd63b23b 100644 --- a/backend/.env +++ b/backend/.env @@ -1,2 +1,3 @@ -PEOPLE_DB=https://docs.google.com/spreadsheets/d/1s4Ytz7mf-YpszVTMTTrYd5iG_dsTGjrCpDQbpIx7zkU/edit#gid=0 -PAIRS_LIST=https://docs.google.com/spreadsheets/d/1gPuRhTry3YoJ_ibI2BfL1ue2_YLlhtW56OP39ADJY_4/edit#gid=0 +PEOPLE_DB=https://docs.google.com/spreadsheets/d/1s4Ytz7mf-YpszVTMTTrYd5iG_dsTGjrCpDQbpIx7zkU/edit#gid=1116948122 +PAIRS_LIST=https://docs.google.com/spreadsheets/d/1JXtDjajJLZb_iXvDYfBEVYdCfehF_URHeeO7_hBXLrI/edit#gid=0 + diff --git a/backend/app.js b/backend/app.js index 76439f06..7a8f53f9 100644 --- a/backend/app.js +++ b/backend/app.js @@ -113,7 +113,11 @@ function getPairs(callback){ } else { const pairs = []; - lastRow = result.valueRanges[0].values.length; + try{ + lastRow = result.valueRanges[0].values.length; + }catch(err){ + lastRow = 0; + } for (let i=0;i{ - if ((pair.name1==names[i] && pair.name2==names[j])||(pair.name1==names[j] && pair.name2==names[i])){ - found=true; - return; - } - }); - if (!found){ - usedNames.filter((name)=>{ - if (names[i] === name || names[j] === name){ - found=true; - return; - } - }); - } - + for (let i=0;i{ + if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){ + exist = true; + return; } + }); + if (!exist){ + newPairs.push({name1:tmpName1, name2:tmpName2}); + left_side.splice(i,1); + right_side.splice(j,1); + i=-1; + break; } } - if (next_i) continue; } - pairsForSave=newPairs; - callback.send(newPairs); + + //make pairs from names on left side + for (let i=0;i{ + if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){ + exist = true; + return; + } + }); + if (!exist){ + newPairs.push({name1:tmpName1, name2:tmpName2}); + left_side.splice(i,1); + if (i>j) + left_side.splice(j,1); + else + left_side.splice(j-1,1); + i=-1; + break; + } + } + } + + //make pairs from names on right side + for (let i=0;i{ + if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){ + exist = true; + return; + } + }); + if (!exist){ + newPairs.push({name1:tmpName1, name2:tmpName2}); + right_side.splice(i,1); + if (i>j) + right_side.splice(j,1); + else + right_side.splice(j-1,1); + i=-1; + break; + } + } + } + + //try to make pair using unused name from list of names and names on left side + if (names.length>0){ + let tmpName1 = names[0]; + for (let i=0;i{ + if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){ + exist = true; + return; + } + }); + if (!exist){ + newPairs.push({name1:tmpName1, name2:tmpName2}); + names=[]; + left_side.splice(i,1); + break; + } + } + } + + //try to make pair using unused name from list of names and names on right side + if (names.length>0){ + let tmpName1 = names[0]; + for (let i=0;i{ + if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){ + exist = true; + return; + } + }); + if (!exist){ + newPairs.push({name1:tmpName1, name2:tmpName2}); + names=[]; + right_side.splice(i,1); + break; + } + } + } + + pairsForSave = newPairs; + + let withoutPair = []; + for (let i=0;i0) + withoutPair.push(names[0]); + + if (withoutPair.length==0) withoutPair=null; + + callback.send({pairs: newPairs, left: withoutPair }); }); }); - //Napravi par -> Provjeri da li postoji -> Snimi ili ponovi postupak - } function SavePairs(callback){ - if (lastRow== null) return; + if (lastRow== null) { + callback.send({result:true}); + return; + } auth=oauth2Client; @@ -220,6 +340,7 @@ function SavePairs(callback){ const data = []; + if (lastRow == 0) lastRow=-1; let range1= '2017!A'+(lastRow+2)+':A'+(lastRow+2+pairsForSave.length); let range2= '2017!B'+(lastRow+2)+':B'+(lastRow+2+pairsForSave.length); @@ -279,5 +400,5 @@ app.get('/savePairs', (req,resp)=>{ app.listen(3005, function () { - console.log('server na portu 3005'); + console.log('Server running - port 3005'); }) \ No newline at end of file diff --git a/web/src/App.js b/web/src/App.js index e54465ad..b79f0af2 100644 --- a/web/src/App.js +++ b/web/src/App.js @@ -18,10 +18,10 @@ class App extends Component { getPairsEventHandler = (event) =>{ let url = `http://${BASE_URL}:3005/getPairs`; - this.setState({waitingPairs:true}); + this.setState({waitingPairs:true, renderFinish:false, waitingSave:true}); fetch(url, {}).then(function(response) { return response.json(); }).then(function(data) { - this.setState({pairs : data, renderPairsList:true, waitingPairs:false}); + this.setState({pairs : data.pairs, left:data.left, renderPairsList:true, waitingPairs:false, waitingSave:false}); }.bind(this)); @@ -46,13 +46,26 @@ class App extends Component {
-
-

List of pairs :

-
+ { + this.state.renderPairsList && +
+

List of pairs :

+
+ } { this.state.renderPairsList && } + { + this.state.renderPairsList && this.state.left && +
+

Without pair :

+ { + this.state.left.map((name, index) => + (
{index+1}. {name}
)) + } +
+ } { this.state.renderPairsList && diff --git a/web/src/PairComponent.js b/web/src/PairComponent.js index e6dd674d..7987ff92 100644 --- a/web/src/PairComponent.js +++ b/web/src/PairComponent.js @@ -3,14 +3,14 @@ import React, { Component } from 'react'; export default class PairComponent extends Component{ constructor(props) { super(props); - this.state = {pairName: this.props.pair}; + this.state = {pairName: this.props.pair, index: this.props.index}; } render(){ return (
-
{this.state.pairName.name1} - {this.state.pairName.name2}
+
{this.state.index+1}. {this.state.pairName.name1} - {this.state.pairName.name2}
) diff --git a/web/src/PairsListComponent.js b/web/src/PairsListComponent.js index 9002b638..18032d0f 100644 --- a/web/src/PairsListComponent.js +++ b/web/src/PairsListComponent.js @@ -7,7 +7,7 @@ export default class PairsListComponent extends Component{
{ this.props.pairs.map((pair, index) => - ()) + ()) }
) From a27e604c51d1abfabc2380d58e978bc1b5f3dd48 Mon Sep 17 00:00:00 2001 From: GotPPay Date: Wed, 25 Oct 2017 01:03:41 +0200 Subject: [PATCH 2/6] . --- backend/.env | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/.env b/backend/.env index dd63b23b..f5d15c46 100644 --- a/backend/.env +++ b/backend/.env @@ -1,3 +1,2 @@ PEOPLE_DB=https://docs.google.com/spreadsheets/d/1s4Ytz7mf-YpszVTMTTrYd5iG_dsTGjrCpDQbpIx7zkU/edit#gid=1116948122 -PAIRS_LIST=https://docs.google.com/spreadsheets/d/1JXtDjajJLZb_iXvDYfBEVYdCfehF_URHeeO7_hBXLrI/edit#gid=0 - +PAIRS_LIST=https://docs.google.com/spreadsheets/d/1gPuRhTry3YoJ_ibI2BfL1ue2_YLlhtW56OP39ADJY_4/edit#gid=0 From c28efc7e9d97032a7bd67ba0cc23150d1faf6bbb Mon Sep 17 00:00:00 2001 From: GotPPay Date: Wed, 25 Oct 2017 20:39:14 +0200 Subject: [PATCH 3/6] izmjena algoritma --- .vscode/launch.json | 14 +++++++++ backend/.env | 2 +- backend/app.js | 73 +++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..d6e74d64 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,14 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Launch Program", + "program": "${workspaceFolder}/backend/app.js" + } + ] +} \ No newline at end of file diff --git a/backend/.env b/backend/.env index f5d15c46..19703772 100644 --- a/backend/.env +++ b/backend/.env @@ -1,2 +1,2 @@ PEOPLE_DB=https://docs.google.com/spreadsheets/d/1s4Ytz7mf-YpszVTMTTrYd5iG_dsTGjrCpDQbpIx7zkU/edit#gid=1116948122 -PAIRS_LIST=https://docs.google.com/spreadsheets/d/1gPuRhTry3YoJ_ibI2BfL1ue2_YLlhtW56OP39ADJY_4/edit#gid=0 +PAIRS_LIST=https://docs.google.com/spreadsheets/d/1gPuRhTry3YoJ_ibI2BfL1ue2_YLlhtW56OP39ADJY_4/edit diff --git a/backend/app.js b/backend/app.js index 7a8f53f9..0c2979e8 100644 --- a/backend/app.js +++ b/backend/app.js @@ -322,6 +322,70 @@ function MakePairs(callback){ }); } +function MakePairsV2(callback){ + executeAPI(getAvailableNames, function(names){ + executeAPI(getPairs, function(pairs){ + const AllPairs = []; + const BatchPairs = []; + + for(let i=0;i{ + if (((pair.name1 == names[i])&&(pair.name2 == names[j]))||((pair.name1==names[j])&&(pair.name2==names[i]))){ + exist=true; + return; + } + }); + if (!exist){ + AllPairs.push({name1: names[i], name2: names[j]}); + } + } + } + + while(AllPairs.length>0){ + + BatchPairs.push(AllPairs[0]); + + let tmpNames = []; + let indexToRemove = []; + + tmpNames.push(AllPairs[0].name1); + tmpNames.push(AllPairs[0].name2); + + for (let i=0;i=0;i--){ + AllPairs.splice(indexToRemove[i],1); + } + + } + + + for(let i=0;i{ pairsForSave=[]; lastRow=null; - MakePairs(resp); + MakePairsV2(resp); +}); + +app.get('/getAllPairs',(req,resp)=>{ + MakePairsV2(resp); }); app.get('/savePairs', (req,resp)=>{ @@ -398,7 +466,6 @@ app.get('/savePairs', (req,resp)=>{ //resp.send({result:true}); }); - app.listen(3005, function () { - console.log('Server running - port 3005'); + console.log("Server running - Port 3005"); }) \ No newline at end of file From f78e6201d603d5868cb495616b25439dbd1f7e6a Mon Sep 17 00:00:00 2001 From: GotPPay Date: Sun, 29 Oct 2017 13:18:00 +0100 Subject: [PATCH 4/6] Ispravan algoritam --- backend/.env | 4 +- backend/app.js | 140 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 140 insertions(+), 4 deletions(-) diff --git a/backend/.env b/backend/.env index 19703772..689f0626 100644 --- a/backend/.env +++ b/backend/.env @@ -1,2 +1,2 @@ -PEOPLE_DB=https://docs.google.com/spreadsheets/d/1s4Ytz7mf-YpszVTMTTrYd5iG_dsTGjrCpDQbpIx7zkU/edit#gid=1116948122 -PAIRS_LIST=https://docs.google.com/spreadsheets/d/1gPuRhTry3YoJ_ibI2BfL1ue2_YLlhtW56OP39ADJY_4/edit +PEOPLE_DB=https://docs.google.com/spreadsheets/d/1s4Ytz7mf-YpszVTMTTrYd5iG_dsTGjrCpDQbpIx7zkU/edit#gid=0 +PAIRS_LIST=https://docs.google.com/spreadsheets/d/1gPuRhTry3YoJ_ibI2BfL1ue2_YLlhtW56OP39ADJY_4/edit#gid=0 diff --git a/backend/app.js b/backend/app.js index 0c2979e8..93e545ad 100644 --- a/backend/app.js +++ b/backend/app.js @@ -386,6 +386,142 @@ function MakePairsV2(callback){ }); } +var matrix = []; +var tree = []; +let done = false; + +function count_pairs(row, col, cntr){ + if (done) return; + + matrix[row][col] = 2; + + //oznaci zauzeta polja zbog izbora para + for(let i=0;i{ + + let name1_id = names.indexOf(pair.name1); + let name2_id = names.indexOf(pair.name2); + + if (name1_id != -1 && name2_id != -1){ + if (name1_id > name2_id){ + matrix[name1_id][name2_id] = 3; + }else{ + matrix[name2_id][name1_id] = 3; + } + } + }); + + + + tree = []; + done=false; + + for (let i=0;i tree[max_count_index].length) + max_count_index = i; + } + + let result_pairs = []; + if (tree.length > 0){ + for (let i=0;i{ + if (a>b) return -1; else return 1; + }); + + for (let i=0;i{ pairsForSave=[]; lastRow=null; - MakePairsV2(resp); + MakePairsV3(resp); }); app.get('/getAllPairs',(req,resp)=>{ - MakePairsV2(resp); + MakePairsV3(resp); }); app.get('/savePairs', (req,resp)=>{ From e73c8e0f67ad628a5dfe2d7542a1c7eb97bd4152 Mon Sep 17 00:00:00 2001 From: GotPPay Date: Sun, 29 Oct 2017 13:42:15 +0100 Subject: [PATCH 5/6] code fix --- backend/app.js | 261 +++---------------------------------------------- 1 file changed, 14 insertions(+), 247 deletions(-) diff --git a/backend/app.js b/backend/app.js index 93e545ad..065c511d 100644 --- a/backend/app.js +++ b/backend/app.js @@ -88,7 +88,7 @@ function storeToken(token) { try { fs.mkdirSync(TOKEN_DIR); } catch (err) { - if (err.code != 'EEXIST') { + if (err.code !== 'EEXIST') { throw err; } } @@ -152,7 +152,7 @@ function getAvailableNames(callback){ try{ let name = result.valueRanges[0].values[i][0]; let available = result.valueRanges[1].values[i][0]; - if (name && (available=='x')){ + if (name && (available==='x')){ names.push(name); } }catch(err){ @@ -164,228 +164,6 @@ function getAvailableNames(callback){ }); } -function getRandomInt(min, max) { - return Math.floor(Math.random() * (max - min + 1)) + min; -} - -function MakePairs(callback){ - executeAPI(getAvailableNames,function(names){ - executeAPI(getPairs, function(pairs){ - const numOfPairs = Math.floor(names.length / 2); - const left_side = []; - const right_side = []; - - const newPairs = []; - - for (let i=0;i{ - if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){ - exist = true; - return; - } - }); - if (!exist){ - newPairs.push({name1:tmpName1, name2:tmpName2}); - left_side.splice(i,1); - right_side.splice(j,1); - i=-1; - break; - } - } - } - - //make pairs from names on left side - for (let i=0;i{ - if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){ - exist = true; - return; - } - }); - if (!exist){ - newPairs.push({name1:tmpName1, name2:tmpName2}); - left_side.splice(i,1); - if (i>j) - left_side.splice(j,1); - else - left_side.splice(j-1,1); - i=-1; - break; - } - } - } - - //make pairs from names on right side - for (let i=0;i{ - if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){ - exist = true; - return; - } - }); - if (!exist){ - newPairs.push({name1:tmpName1, name2:tmpName2}); - right_side.splice(i,1); - if (i>j) - right_side.splice(j,1); - else - right_side.splice(j-1,1); - i=-1; - break; - } - } - } - - //try to make pair using unused name from list of names and names on left side - if (names.length>0){ - let tmpName1 = names[0]; - for (let i=0;i{ - if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){ - exist = true; - return; - } - }); - if (!exist){ - newPairs.push({name1:tmpName1, name2:tmpName2}); - names=[]; - left_side.splice(i,1); - break; - } - } - } - - //try to make pair using unused name from list of names and names on right side - if (names.length>0){ - let tmpName1 = names[0]; - for (let i=0;i{ - if (((pair.name1 == tmpName1)&&(pair.name2==tmpName2))||((pair.name1==tmpName2)&&(pair.name2==tmpName1))){ - exist = true; - return; - } - }); - if (!exist){ - newPairs.push({name1:tmpName1, name2:tmpName2}); - names=[]; - right_side.splice(i,1); - break; - } - } - } - - pairsForSave = newPairs; - - let withoutPair = []; - for (let i=0;i0) - withoutPair.push(names[0]); - - if (withoutPair.length==0) withoutPair=null; - - callback.send({pairs: newPairs, left: withoutPair }); - }); - }); -} - -function MakePairsV2(callback){ - executeAPI(getAvailableNames, function(names){ - executeAPI(getPairs, function(pairs){ - const AllPairs = []; - const BatchPairs = []; - - for(let i=0;i{ - if (((pair.name1 == names[i])&&(pair.name2 == names[j]))||((pair.name1==names[j])&&(pair.name2==names[i]))){ - exist=true; - return; - } - }); - if (!exist){ - AllPairs.push({name1: names[i], name2: names[j]}); - } - } - } - - while(AllPairs.length>0){ - - BatchPairs.push(AllPairs[0]); - - let tmpNames = []; - let indexToRemove = []; - - tmpNames.push(AllPairs[0].name1); - tmpNames.push(AllPairs[0].name2); - - for (let i=0;i=0;i--){ - AllPairs.splice(indexToRemove[i],1); - } - - } - - - for(let i=0;i{ let name1_id = names.indexOf(pair.name1); let name2_id = names.indexOf(pair.name2); - if (name1_id != -1 && name2_id != -1){ + if (name1_id !== -1 && name2_id !== -1){ if (name1_id > name2_id){ matrix[name1_id][name2_id] = 3; }else{ @@ -480,12 +258,6 @@ function MakePairsV3(callback){ } if (done) break; } - - /* - for (let i=0;i{ MakePairsV3(resp); }); -app.get('/getAllPairs',(req,resp)=>{ - MakePairsV3(resp); -}); - app.get('/savePairs', (req,resp)=>{ SavePairs(resp); - //resp.send({result:true}); }); app.listen(3005, function () { From 2278c0c7caca04902eb2614a1ddd425edccff42b Mon Sep 17 00:00:00 2001 From: GotPPay Date: Sun, 29 Oct 2017 14:06:34 +0100 Subject: [PATCH 6/6] added error handling --- backend/app.js | 27 ++++++++++++++++++--------- web/src/App.js | 8 +++++++- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/backend/app.js b/backend/app.js index 065c511d..4935d25a 100644 --- a/backend/app.js +++ b/backend/app.js @@ -109,7 +109,7 @@ function getPairs(callback){ if(err) { // Handle error console.log(err); - return null; + callback(null, true); } else { const pairs = []; @@ -126,7 +126,7 @@ function getPairs(callback){ pairs.push({name1:name1,name2:name2}); } } - callback(pairs); + callback(pairs,false); } }); } @@ -143,7 +143,7 @@ function getAvailableNames(callback){ if(err) { // Handle error console.log(err); - return null; + callback(null, true); } else { const names = []; @@ -159,7 +159,7 @@ function getAvailableNames(callback){ } } - callback(names); + callback(names,false); } }); } @@ -218,8 +218,18 @@ function count_pairs(row, col, cntr){ } function MakePairsV3(callback){ - executeAPI(getAvailableNames,function(names){ - executeAPI(getPairs, function(pairs){ + executeAPI(getAvailableNames,function(names,error){ + if (error){ + console.log("Error - could not load names"); + callback.send({pairs: null, left: null, error: true, error_message: 'Could not load names list'}); + return; + } + executeAPI(getPairs, function(pairs,error){ + if (error){ + console.log("Error - could not load pairs"); + callback.send({pairs: null, left: null, error: true, error_message: 'Could not load pairs list'}); + return; + } max_pairs = Math.floor(names.length/2); matrix=[]; @@ -244,8 +254,6 @@ function MakePairsV3(callback){ } }); - - tree = []; done=false; @@ -289,9 +297,10 @@ function MakePairsV3(callback){ if (names.length === 0) names=null; pairsForSave = result_pairs; - callback.send({pairs: result_pairs, left: names}); + callback.send({pairs: result_pairs, left: names, error:false}); }); }); + } function SavePairs(callback){ diff --git a/web/src/App.js b/web/src/App.js index b79f0af2..6e8163fa 100644 --- a/web/src/App.js +++ b/web/src/App.js @@ -21,7 +21,7 @@ class App extends Component { this.setState({waitingPairs:true, renderFinish:false, waitingSave:true}); fetch(url, {}).then(function(response) { return response.json(); }).then(function(data) { - this.setState({pairs : data.pairs, left:data.left, renderPairsList:true, waitingPairs:false, waitingSave:false}); + this.setState({pairs : data.pairs, left:data.left, renderPairsList:!data.error, waitingPairs:false, waitingSave:false, error: data.error, error_message: data.error_message}); }.bind(this)); @@ -46,6 +46,12 @@ class App extends Component {
+ { + this.state.error && +
+

Error - {this.state.error_message}

+
+ } { this.state.renderPairsList &&