From 2b86edc4f543fcf80c54108fa0ee10699bb1ab1f Mon Sep 17 00:00:00 2001 From: deoraanmol Date: Sun, 6 Sep 2020 19:09:02 +0530 Subject: [PATCH] Mile5 --- .classpath | 20 +++ .idea/workspace.xml | 165 +++++++----------- Project Team Formation Mileston1.eml | 20 +++ README.md | 5 + rmit.userlibraries | 60 +++++++ .../java/controllers/OrmFxController.java | 67 +++++-- src/main/java/enums/SuggestionMode.java | 6 + .../java/hibernate/OrmSuggestedTeams.java | 99 +++++++++++ src/main/java/hibernate/OrmTeams.java | 18 ++ .../java/hibernate/dao/PreferenceDao.java | 12 +- .../java/hibernate/dao/SuggestedTeamsDao.java | 44 +++++ src/main/java/hibernate/dao/TeamsDao.java | 19 +- src/main/java/services/OrmChartsService.java | 5 +- src/main/java/services/SuggestionService.java | 158 +++++++++++++++++ src/main/java/services/TeamBoxService.java | 15 +- src/main/java/sources/DatafileIOclass.java | 2 +- src/main/java/sources/Teams.java | 6 +- src/main/java/utils/FxErrorMessages.java | 2 + src/main/resources/fx_samples/sample.fxml | 6 +- src/main/resources/hibernate.cfg.xml | 1 + .../mysql_scripts/10_INSERT_TEAMS.sql | 10 +- .../mysql_scripts/11_CONSOLIDATED_INSERTS.txt | 10 +- .../mysql_scripts/1_CREATE_TABLES.sql | 18 ++ .../classes/controllers/OrmFxController.class | Bin 7575 -> 8732 bytes target/classes/enums/SuggestionMode.class | Bin 0 -> 947 bytes target/classes/fx_samples/sample.fxml | 6 +- target/classes/hibernate.cfg.xml | 1 + .../classes/hibernate/OrmSuggestedTeams.class | Bin 0 -> 3221 bytes target/classes/hibernate/OrmTeams.class | Bin 2186 -> 3280 bytes .../classes/hibernate/dao/PreferenceDao.class | Bin 1716 -> 2253 bytes .../hibernate/dao/SuggestedTeamsDao.class | Bin 0 -> 2394 bytes target/classes/hibernate/dao/TeamsDao.class | Bin 6516 -> 6906 bytes .../classes/mysql_scripts/10_INSERT_TEAMS.sql | 10 +- .../mysql_scripts/11_CONSOLIDATED_INSERTS.txt | 10 +- .../classes/mysql_scripts/1_CREATE_TABLES.sql | 18 ++ .../classes/services/OrmChartsService.class | Bin 4107 -> 4206 bytes .../classes/services/SuggestionService.class | Bin 0 -> 8051 bytes target/classes/services/TeamBoxService.class | Bin 7490 -> 7701 bytes target/classes/sources/DatafileIOclass.class | Bin 7597 -> 7533 bytes target/classes/sources/Teams.class | Bin 12392 -> 12391 bytes target/classes/utils/FxErrorMessages.class | Bin 1350 -> 1585 bytes 41 files changed, 655 insertions(+), 158 deletions(-) create mode 100644 src/main/java/enums/SuggestionMode.java create mode 100644 src/main/java/hibernate/OrmSuggestedTeams.java create mode 100644 src/main/java/hibernate/dao/SuggestedTeamsDao.java create mode 100644 src/main/java/services/SuggestionService.java create mode 100644 target/classes/enums/SuggestionMode.class create mode 100644 target/classes/hibernate/OrmSuggestedTeams.class create mode 100644 target/classes/hibernate/dao/SuggestedTeamsDao.class create mode 100644 target/classes/services/SuggestionService.class diff --git a/.classpath b/.classpath index 894f51d..f4072d6 100644 --- a/.classpath +++ b/.classpath @@ -20,5 +20,25 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/.idea/workspace.xml b/.idea/workspace.xml index ff01b5d..d3077ba 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,82 +2,43 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - + - - + + + + + + - - - + - - - - + + + + + - + + + + + + + + - - - + - - - - + + - + + + - + - - + + @@ -215,8 +179,8 @@ - + @@ -243,7 +207,8 @@ - + + @@ -273,11 +238,15 @@ - + + + + + - + @@ -287,46 +256,46 @@ - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + @@ -340,16 +309,16 @@ - + - - + + - + @@ -359,10 +328,10 @@ - + - + \ No newline at end of file diff --git a/Project Team Formation Mileston1.eml b/Project Team Formation Mileston1.eml index 80ff6f7..15b7e70 100644 --- a/Project Team Formation Mileston1.eml +++ b/Project Team Formation Mileston1.eml @@ -31,5 +31,25 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/README.md b/README.md index 5447b16..b8ca3e0 100644 --- a/README.md +++ b/README.md @@ -38,3 +38,8 @@ Database - MySQL (8.0.21) 2. OSX - `MySQL is installed but is not starting.` Use MySQL Preference Pane (`https://dev.mysql.com/doc/mysql-osx-excerpt/5.7/en/osx-installation-prefpane.html`) to Start MySQL server. + +3. MySQL commands: + Create Schema: `create schema milestone4;` + Drop Schema: `drop schema milestone4;` + Use Schema: `use milestone4;` diff --git a/rmit.userlibraries b/rmit.userlibraries index 6534bf2..46b6c49 100644 --- a/rmit.userlibraries +++ b/rmit.userlibraries @@ -45,6 +45,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/controllers/OrmFxController.java b/src/main/java/controllers/OrmFxController.java index ed4a130..a23ddb2 100644 --- a/src/main/java/controllers/OrmFxController.java +++ b/src/main/java/controllers/OrmFxController.java @@ -1,5 +1,6 @@ package controllers; +import enums.SuggestionMode; import hibernate.OrmStudents; import hibernate.OrmTeams; import hibernate.dao.StudentsDao; @@ -8,16 +9,10 @@ import interfaces.ITeams; import javafx.event.ActionEvent; import javafx.fxml.FXML; -import javafx.scene.control.Alert; -import javafx.scene.control.CheckBox; -import javafx.scene.control.TextField; -import javafx.scene.control.TextFormatter; +import javafx.scene.control.*; import javafx.scene.layout.HBox; import models.TeamSelection; -import services.ChartsService; -import services.FxCrudService; -import services.OrmChartsService; -import services.TeamBoxService; +import services.*; import sources.DatafileIOclass; import sources.Teams; import utils.FileNames; @@ -41,11 +36,20 @@ public class OrmFxController { @FXML public TextField studentInput; @FXML + public Button addBtn; + @FXML + public Button swapBtn; + @FXML + public Button suggestionBtn; + @FXML + public Button undoSuggestionBtn; + @FXML Alert alert = new Alert(Alert.AlertType.ERROR); @FXML Alert success = new Alert(Alert.AlertType.INFORMATION); @FXML public Map selection = new HashMap<>(); + private TeamBoxService teamBoxesService; private OrmChartsService ormChartsService; StudentsDao studentsDao = new StudentsDao(); @@ -71,8 +75,8 @@ public void addMemberToTeam(ActionEvent actionEvent) { } else { // actual member addition to teams table in database OrmTeamsService.addMemberToTeam(this.selection, student, teamsDao); - updateTextFields(FxErrorMessages.STUDENT_ADDED); - drawCharts(); + updateTextFields(FxErrorMessages.STUDENT_ADDED, SuggestionMode.DISABLED); + drawCharts(SuggestionMode.DISABLED); } } } @@ -88,8 +92,8 @@ public void swapMembers(ActionEvent actionEvent) { List ormTeams = teamsDao.getAllTeamsById(selectedTeamIds); if (ormStudents != null && ormStudents.size() == 2) { teamsDao.swapMembersInTeams(this.selection, selectedStudentIds, ormTeams); - drawCharts(); - updateTextFields(FxErrorMessages.STUDENTS_SWAPPED); + drawCharts(SuggestionMode.DISABLED); + updateTextFields(FxErrorMessages.STUDENTS_SWAPPED, SuggestionMode.DISABLED); } else { alert.setContentText(FxErrorMessages.INVALID_STUDENTS_SELECTED); alert.show(); @@ -97,6 +101,20 @@ public void swapMembers(ActionEvent actionEvent) { } } + public void suggestTeams(ActionEvent actionEvent) { + toggleButtons(SuggestionMode.ENABLED); + SuggestionService.suggestTeams(teamsDao, 5); + updateTextFields(FxErrorMessages.TEAMS_SUGGESTED, SuggestionMode.ENABLED); + drawCharts(SuggestionMode.ENABLED); + } + + public void undoSuggestion(ActionEvent actionEvent) { + toggleButtons(SuggestionMode.DISABLED); + SuggestionService.suggestTeams(teamsDao, 5); + updateTextFields(FxErrorMessages.UNDO_SUGGESTION, SuggestionMode.DISABLED); + drawCharts(SuggestionMode.DISABLED); + } + public void updateSelection(ActionEvent actionEvent) { boolean isSelected = ((CheckBox) actionEvent.getTarget()).isSelected(); String sourceId = ((CheckBox) actionEvent.getSource()).getId(); @@ -116,7 +134,8 @@ public void initialize() { return change; })); createTeamBoxes(); - drawCharts(); + toggleButtons(SuggestionMode.DISABLED); + drawCharts(SuggestionMode.DISABLED); } private void createTeamBoxes() { @@ -126,14 +145,28 @@ private void createTeamBoxes() { teamBoxesService = teamBoxService; } - private void drawCharts() { + private void drawCharts(SuggestionMode suggestionMode) { ormChartsService = new OrmChartsService(teamsDao); - chartsContainer.getChildren().setAll(ormChartsService.drawCharts()); + chartsContainer.getChildren().setAll(ormChartsService.drawCharts(suggestionMode)); } - private void updateTextFields(String successMessage) { - teamBoxesService.populateMemberIdsWithOrm(5, false); + private void updateTextFields(String successMessage, SuggestionMode suggestionMode) { + teamBoxesService.populateMemberIdsWithOrm(5, false, suggestionMode); success.setContentText(successMessage); success.show(); } + + private void toggleButtons(SuggestionMode suggestionMode) { + if (suggestionMode == SuggestionMode.ENABLED) { + this.addBtn.setDisable(true); + this.swapBtn.setDisable(true); + this.suggestionBtn.setDisable(true); + this.undoSuggestionBtn.setDisable(false); + } else { + this.addBtn.setDisable(false); + this.swapBtn.setDisable(false); + this.suggestionBtn.setDisable(false); + this.undoSuggestionBtn.setDisable(true); + } + } } diff --git a/src/main/java/enums/SuggestionMode.java b/src/main/java/enums/SuggestionMode.java new file mode 100644 index 0000000..cc097f9 --- /dev/null +++ b/src/main/java/enums/SuggestionMode.java @@ -0,0 +1,6 @@ +package enums; + +public enum SuggestionMode { + ENABLED, + DISABLED +} diff --git a/src/main/java/hibernate/OrmSuggestedTeams.java b/src/main/java/hibernate/OrmSuggestedTeams.java new file mode 100644 index 0000000..d6f50f2 --- /dev/null +++ b/src/main/java/hibernate/OrmSuggestedTeams.java @@ -0,0 +1,99 @@ +package hibernate; + +import interfaces.ITeams; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "suggested_teams") +public class OrmSuggestedTeams implements ITeams { + + public static List fromOrmTeams(List ormTeamsList) { + List suggestedTeams = new ArrayList<>(); + for(OrmTeams ormTeam: ormTeamsList) { + OrmSuggestedTeams ormSuggestedTeam = new OrmSuggestedTeams(); + ormSuggestedTeam.setId(ormTeam.getId()); + ormSuggestedTeam.setProject(ormTeam.getProject()); + ormSuggestedTeam.setStudent1(ormTeam.getStudent1()); + ormSuggestedTeam.setStudent2(ormTeam.getStudent2()); + ormSuggestedTeam.setStudent3(ormTeam.getStudent3()); + ormSuggestedTeam.setStudent4(ormTeam.getStudent4()); + suggestedTeams.add(ormSuggestedTeam); + } + return suggestedTeams; + } + + @Id + @Column(name = "id") + private int id; + + @OneToOne(targetEntity = OrmProjects.class) + @JoinColumn(name="project_id", unique = true) + private OrmProjects project; + + @OneToOne(targetEntity = OrmStudents.class) + @JoinColumn(name="student_id_1") + private OrmStudents student1; + + @OneToOne(targetEntity = OrmStudents.class) + @JoinColumn(name="student_id_2") + private OrmStudents student2; + + @OneToOne(targetEntity = OrmStudents.class) + @JoinColumn(name="student_id_3") + private OrmStudents student3; + + @OneToOne(targetEntity = OrmStudents.class) + @JoinColumn(name="student_id_4") + private OrmStudents student4; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public OrmProjects getProject() { + return project; + } + + public void setProject(OrmProjects project) { + this.project = project; + } + + public OrmStudents getStudent1() { + return student1; + } + + public void setStudent1(OrmStudents student1) { + this.student1 = student1; + } + + public OrmStudents getStudent2() { + return student2; + } + + public void setStudent2(OrmStudents student2) { + this.student2 = student2; + } + + public OrmStudents getStudent3() { + return student3; + } + + public void setStudent3(OrmStudents student3) { + this.student3 = student3; + } + + public OrmStudents getStudent4() { + return student4; + } + + public void setStudent4(OrmStudents student4) { + this.student4 = student4; + } +} diff --git a/src/main/java/hibernate/OrmTeams.java b/src/main/java/hibernate/OrmTeams.java index 0730112..e784531 100644 --- a/src/main/java/hibernate/OrmTeams.java +++ b/src/main/java/hibernate/OrmTeams.java @@ -4,10 +4,28 @@ import utils.Validators; import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; @Entity @Table(name = "teams") public class OrmTeams implements ITeams { + + public static List fromSuggestedTeams(List ormSuggestedTeamsList) { + List ormTeams = new ArrayList<>(); + for(OrmSuggestedTeams ormSuggestedTeam: ormSuggestedTeamsList) { + OrmTeams ormTeam = new OrmTeams(); + ormTeam.setId(ormSuggestedTeam.getId()); + ormTeam.setProject(ormSuggestedTeam.getProject()); + ormTeam.setStudent1(ormSuggestedTeam.getStudent1()); + ormTeam.setStudent2(ormSuggestedTeam.getStudent2()); + ormTeam.setStudent3(ormSuggestedTeam.getStudent3()); + ormTeam.setStudent4(ormSuggestedTeam.getStudent4()); + ormTeams.add(ormTeam); + } + return ormTeams; + } + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; diff --git a/src/main/java/hibernate/dao/PreferenceDao.java b/src/main/java/hibernate/dao/PreferenceDao.java index 274c652..093e2f1 100644 --- a/src/main/java/hibernate/dao/PreferenceDao.java +++ b/src/main/java/hibernate/dao/PreferenceDao.java @@ -2,7 +2,6 @@ import hibernate.HibernateUtil; import hibernate.OrmPreference; -import hibernate.OrmStudentInfo; import org.hibernate.Session; import org.hibernate.query.Query; import utils.Validators; @@ -29,4 +28,15 @@ public OrmPreference getPreference(String studentId) { session.close(); } } + + public List getPreferenceListFromStudentIds(List studentIds) { + Session session = HibernateUtil.getSessionFactory().openSession(); + try { + Query query = session.createQuery("FROM OrmPreference s where s.studentId in :studentIds"); + query.setParameter("studentIds", studentIds); + return query.list(); + } finally { + session.close(); + } + } } diff --git a/src/main/java/hibernate/dao/SuggestedTeamsDao.java b/src/main/java/hibernate/dao/SuggestedTeamsDao.java new file mode 100644 index 0000000..00fe29a --- /dev/null +++ b/src/main/java/hibernate/dao/SuggestedTeamsDao.java @@ -0,0 +1,44 @@ +package hibernate.dao; + +import hibernate.*; +import hibernate.services.OrmTeamsService; +import models.TeamSelection; +import org.hibernate.Session; +import org.hibernate.query.Query; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class SuggestedTeamsDao { + + public List getAllTeams() { + Session session = HibernateUtil.getSessionFactory().openSession(); + try { + List teamsList = (List) session.createQuery( + "FROM OrmTeams s ORDER BY s.id ASC").list(); + return teamsList; + } finally { + session.close(); + } + } + + public void insertTeams(List ormTeams) { + Session localSession = HibernateUtil.getSessionFactory().openSession(); + try { + // clear previous suggestions + localSession.beginTransaction(); + Query deleteQuery = localSession.createQuery("DELETE FROM OrmSuggestedTeams"); + deleteQuery.executeUpdate(); + // set new suggestions + List ormSuggestedTeams = OrmSuggestedTeams.fromOrmTeams(ormTeams); + for(OrmSuggestedTeams ormSuggestedTeam: ormSuggestedTeams) { + localSession.save("OrmSuggestedTeams", ormSuggestedTeam); + } + localSession.getTransaction().commit(); + } finally { + localSession.close(); + } + } +} diff --git a/src/main/java/hibernate/dao/TeamsDao.java b/src/main/java/hibernate/dao/TeamsDao.java index 3e12606..b64c134 100644 --- a/src/main/java/hibernate/dao/TeamsDao.java +++ b/src/main/java/hibernate/dao/TeamsDao.java @@ -1,9 +1,7 @@ package hibernate.dao; -import hibernate.HibernateUtil; -import hibernate.OrmStudentInfo; -import hibernate.OrmStudents; -import hibernate.OrmTeams; +import enums.SuggestionMode; +import hibernate.*; import hibernate.services.OrmTeamsService; import models.TeamSelection; import org.hibernate.Session; @@ -14,12 +12,17 @@ public class TeamsDao { - public List getAllTeams() { + public List getAllTeams(SuggestionMode suggestionMode) { Session session = HibernateUtil.getSessionFactory().openSession(); try { - List teamsList = (List) session.createQuery( - "FROM OrmTeams s ORDER BY s.id ASC").list(); - return teamsList; + if(suggestionMode == SuggestionMode.DISABLED) { + List teamsList = (List) session.createQuery( + "FROM OrmTeams s ORDER BY s.id ASC").list(); + return teamsList; + } else { + List suggestedTeams = session.createQuery("FROM OrmSuggestedTeams s ORDER BY s.id ASC").list(); + return OrmTeams.fromSuggestedTeams(suggestedTeams); + } } finally { session.close(); } diff --git a/src/main/java/services/OrmChartsService.java b/src/main/java/services/OrmChartsService.java index eec041c..26c6028 100644 --- a/src/main/java/services/OrmChartsService.java +++ b/src/main/java/services/OrmChartsService.java @@ -1,5 +1,6 @@ package services; +import enums.SuggestionMode; import hibernate.OrmTeams; import hibernate.dao.TeamsDao; import javafx.scene.chart.BarChart; @@ -20,9 +21,9 @@ public class OrmChartsService { public OrmChartsService(TeamsDao teamsDao) { this.teamsDao = teamsDao; } - public List> drawCharts() { + public List> drawCharts(SuggestionMode suggestionMode) { List> charts = new ArrayList<>(); - List ormTeams = teamsDao.getAllTeams().stream().limit(5).collect(Collectors.toList()); + List ormTeams = teamsDao.getAllTeams(suggestionMode).stream().limit(5).collect(Collectors.toList()); // 1st chart PrefPercentageChartService percentageChartService = new PrefPercentageChartService(null, ormTeams); charts.add(percentageChartService.createChart(teamsDao)); diff --git a/src/main/java/services/SuggestionService.java b/src/main/java/services/SuggestionService.java new file mode 100644 index 0000000..1de3399 --- /dev/null +++ b/src/main/java/services/SuggestionService.java @@ -0,0 +1,158 @@ +package services; + +import enums.SuggestionMode; +import hibernate.OrmPreference; +import hibernate.OrmStudents; +import hibernate.OrmTeams; +import hibernate.dao.PreferenceDao; +import hibernate.dao.SuggestedTeamsDao; +import hibernate.dao.TeamsDao; +import hibernate.services.OrmTeamsService; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +public class SuggestionService { + /* + Algo for Heuristic Completion which lowers the Standard Devation of all charts + 1. It saves the suggestion state in `suggested_teams` table, from which we show/dont show the records depending on user's selection. + */ + public static void suggestTeams(TeamsDao teamsDao, int size) { + List allTeams = teamsDao.getAllTeams(SuggestionMode.DISABLED).stream().limit(size).collect(Collectors.toList()); + + Map> teamsByPercentages = new HashMap<>(); + for (OrmTeams team : allTeams) { + BigDecimal percentage = OrmTeamsService.getPercentageForTeam(team, teamsDao); + if (teamsByPercentages.get(percentage) != null) { + teamsByPercentages.get(percentage).add(team); + } else { + List percTeams = new ArrayList<>(); + percTeams.add(team); + teamsByPercentages.put(percentage, percTeams); + } + } + Set percentages = teamsByPercentages.keySet(); + BigDecimal minPercentage = percentages.stream().min(Comparator.naturalOrder()).orElse(BigDecimal.ZERO); + List minimumPercentageTeams = teamsByPercentages.get(minPercentage); // 25 percent + List heavyWeightTeams = new ArrayList<>(); // 75 percent + for(BigDecimal key: percentages) { + if (minPercentage.compareTo(key) != 0) { + heavyWeightTeams.addAll(teamsByPercentages.get(key)); + } + } + for(OrmTeams heavyTeam: heavyWeightTeams) { + // diff is 75-25= 50 + BigDecimal diff = OrmTeamsService.getPercentageForTeam(heavyTeam, teamsDao).subtract(minPercentage); + int numberOfSwappings = numberOfSwappings(diff); + List studentsAddedToLightTeam = new ArrayList<>(); + for (int i=0; i heavyWeightStudents = getMatchingStudentIds(heavyTeam); + for(String heavyStudentId: heavyWeightStudents) { + if(!isStudentMatching(heavyStudentId, minPercTeam)) { + List lightWeightStudents = getNonMatchingStudentIds(minPercTeam, studentsAddedToLightTeam); + for(String lightStudentId: lightWeightStudents) { + if(!isStudentMatching(lightStudentId, heavyTeam)) { + Map lightStudent = findStudentNumber(minPercTeam, lightStudentId); + Map heavyStudent = findStudentNumber(heavyTeam, heavyStudentId); + setStudentWithNumber((Integer) heavyStudent.keySet().toArray()[0], (OrmStudents)lightStudent.values().toArray()[0], heavyTeam); + studentsAddedToLightTeam.add(((OrmStudents)heavyStudent.values().toArray()[0]).getId()); + setStudentWithNumber((Integer) lightStudent.keySet().toArray()[0], (OrmStudents)heavyStudent.values().toArray()[0], minPercTeam); + break; + } + } + break; + } + } + } + } + SuggestedTeamsDao suggestedTeamsDao = new SuggestedTeamsDao(); + suggestedTeamsDao.insertTeams(allTeams); + } + + public static void setStudentWithNumber(Integer studentNumber, OrmStudents newStudent, OrmTeams team) { + switch (studentNumber) { + case 1: + team.setStudent1(newStudent); + break; + case 2: + team.setStudent2(newStudent); + break; + case 3: + team.setStudent3(newStudent); + break; + case 4: + team.setStudent4(newStudent); + } + } + + public static Map findStudentNumber(OrmTeams team, String studentId) { + HashMap map = new HashMap<>(); + if(team.getStudent1().getId().equalsIgnoreCase(studentId)) { + map.put(1, team.getStudent1()); + } else if(team.getStudent2().getId().equalsIgnoreCase(studentId)) { + map.put(2, team.getStudent2()); + } else if(team.getStudent3().getId().equalsIgnoreCase(studentId)) { + map.put(3, team.getStudent3()); + } else if(team.getStudent4().getId().equalsIgnoreCase(studentId)) { + map.put(4, team.getStudent4()); + } + return map; + } + + public static int numberOfSwappings(BigDecimal diff) { + Integer diffInInteger = new Integer(diff.intValue()); + switch (diffInInteger) { + case 25: + return 1; + case 50: + return 2; + case 75: + return 3; + default: + return 0; + } + } + + public static List getNonMatchingStudentIds(OrmTeams team, List studentsJustAdded) { + List studentIds = OrmTeamsService.getAllStudentIdsFromTeam(team); + String projectId = team.getProject().getId(); + PreferenceDao preferenceDao = new PreferenceDao(); + List projectPreferenceList = preferenceDao.getPreferenceListFromStudentIds(studentIds); + List nonMatchedStudentIds = new ArrayList<>(); + for(OrmPreference preference: projectPreferenceList) { + if(!preference.getPreference1().equalsIgnoreCase(projectId) + && !preference.getPreference2().equalsIgnoreCase(projectId) + && !(studentsJustAdded.contains(preference.getStudentId()))) { + nonMatchedStudentIds.add(preference.getStudentId()); + } + } + return nonMatchedStudentIds; + } + + public static List getMatchingStudentIds(OrmTeams team) { + List studentIds = OrmTeamsService.getAllStudentIdsFromTeam(team); + String projectId = team.getProject().getId(); + PreferenceDao preferenceDao = new PreferenceDao(); + List projectPreferenceList = preferenceDao.getPreferenceListFromStudentIds(studentIds); + List matchedStudentIds = new ArrayList<>(); + for(OrmPreference preference: projectPreferenceList) { + if(preference.getPreference1().equalsIgnoreCase(projectId) + || preference.getPreference2().equalsIgnoreCase(projectId)) { + matchedStudentIds.add(preference.getStudentId()); + } + } + return matchedStudentIds; + } + + public static boolean isStudentMatching(String studentId, OrmTeams lightTeam) { + PreferenceDao preferenceDao = new PreferenceDao(); + OrmPreference preference = preferenceDao.getPreference(studentId); + if(preference.getPreference1().equalsIgnoreCase(lightTeam.getProject().getId()) + || preference.getPreference2().equalsIgnoreCase(lightTeam.getProject().getId())) { + return true; + } + return false; + } +} diff --git a/src/main/java/services/TeamBoxService.java b/src/main/java/services/TeamBoxService.java index 1b09acd..61772ee 100644 --- a/src/main/java/services/TeamBoxService.java +++ b/src/main/java/services/TeamBoxService.java @@ -1,5 +1,6 @@ package services; +import enums.SuggestionMode; import hibernate.OrmTeams; import hibernate.dao.TeamsDao; import hibernate.services.OrmTeamsService; @@ -24,18 +25,20 @@ public class TeamBoxService { private FxCrudService fxCrudService; TeamsDao teamsDao = new TeamsDao(); private List teamsFromDatabase; + private Integer studentsPerTeam; public TeamBoxService(HBox teamBoxContainer, EventHandler value, FxCrudService fxCrudService) { this.teamBoxContainer = teamBoxContainer; this.checkboxAction = value; this.fxCrudService = fxCrudService; + this.studentsPerTeam = 4; } public TeamBoxService() {} public void createTeamBoxes(int size, boolean initFromDatabase) { - this.teamsFromDatabase = teamsDao.getAllTeams().stream().limit(size).collect(Collectors.toList()); + this.teamsFromDatabase = teamsDao.getAllTeams(SuggestionMode.DISABLED).stream().limit(size).collect(Collectors.toList()); for (Integer i=1; i<=size; i++) { VBox teamBox = new VBox(); teamBox.setStyle("-fx-background-color: "+ Colors.boxColors[i-1] + "; -fx-text-fill: black"); @@ -47,12 +50,14 @@ public void createTeamBoxes(int size, boolean initFromDatabase) { teamBoxContainer.getChildren().addAll(teamBox); } if (initFromDatabase) { - this.populateMemberIdsWithOrm(size, true); + this.populateMemberIdsWithOrm(size, true, SuggestionMode.DISABLED); } } - public void populateMemberIdsWithOrm(int teamsToShowOnUI, boolean useCache) { - List allTeams = useCache ? this.teamsFromDatabase : teamsDao.getAllTeams().stream().limit(teamsToShowOnUI).collect(Collectors.toList()); + public void populateMemberIdsWithOrm(int teamsToShowOnUI, boolean useCache, SuggestionMode suggestionMode) { + List allTeams = useCache + ? this.teamsFromDatabase + : teamsDao.getAllTeams(suggestionMode).stream().limit(teamsToShowOnUI).collect(Collectors.toList()); this.teamsFromDatabase = allTeams; for (int i=0; i getSelectedStudentIds(List teamSelections) { private List getTeamBoxFields(String teamNum) { List fields = new ArrayList<>(); - for (Integer i=1; i<=this.teamsFromDatabase.size(); i++) { + for (Integer i=1; i<=this.studentsPerTeam; i++) { HBox teamBox = new HBox(); teamBox.setPadding(new Insets(10, 10, 10, 10)); teamBox.getChildren().addAll(getTextField(), getCheckbox(teamNum, i.toString())); diff --git a/src/main/java/sources/DatafileIOclass.java b/src/main/java/sources/DatafileIOclass.java index 744aef1..9d4fbed 100644 --- a/src/main/java/sources/DatafileIOclass.java +++ b/src/main/java/sources/DatafileIOclass.java @@ -146,7 +146,7 @@ public String fetchObjectById(String filename, String objectId) { if (object != null) { return object; } else { - System.out.println("Object doesnt exist in file: " + filename); + //System.out.println("Object doesnt exist in file: " + filename); return null; } } diff --git a/src/main/java/sources/Teams.java b/src/main/java/sources/Teams.java index ec93849..d83b68a 100644 --- a/src/main/java/sources/Teams.java +++ b/src/main/java/sources/Teams.java @@ -1,10 +1,12 @@ package sources; +import exceptions.EmptyListException; import exceptions.NoLeaderException; import exceptions.PersonalityImbalanceException; import interfaces.ITeams; import utils.FileNames; import utils.Personalities; +import utils.StandardDeviationService; import utils.Validators; import java.io.File; @@ -93,11 +95,11 @@ public static Teams fileRowToTeams(String row) { return team; } - public static void displayTeamPreference(List teams) { + public static void displayTeamPreference(List teams){ int i = 1; for (Teams team: teams) { System.out.println("---------%AGE OF PREFERENCES FOR TEAM: " + i + "---------------"); - System.out.println("Percentage of Students in this Team who had this .Project in their first 2 preferences: " + getPercentage(team, textfileN1) + "%"); + System.out.println("Percentage of Students in this Team who had this Project in their first 2 preferences: " + getPercentage(team, textfileN1) + "%"); System.out.println("------------------------"); i++; } diff --git a/src/main/java/utils/FxErrorMessages.java b/src/main/java/utils/FxErrorMessages.java index e55aac1..beac550 100644 --- a/src/main/java/utils/FxErrorMessages.java +++ b/src/main/java/utils/FxErrorMessages.java @@ -10,4 +10,6 @@ public class FxErrorMessages { public static String INVALID_STUDENTS_SELECTED = "One of the selected studentIds do not exist in database"; public static String STUDENT_ADDED = "Student was successfully added at the checked spot"; public static String STUDENTS_SWAPPED = "Selected students were successfully swapped"; + public static String TEAMS_SUGGESTED = "Suggested teams updated, click 'Undo' to show original teams"; + public static String UNDO_SUGGESTION = "Showing original results, click 'Suggestion' to see balanced teams"; } diff --git a/src/main/resources/fx_samples/sample.fxml b/src/main/resources/fx_samples/sample.fxml index 93d82cb..19c5bbe 100644 --- a/src/main/resources/fx_samples/sample.fxml +++ b/src/main/resources/fx_samples/sample.fxml @@ -28,8 +28,10 @@ - - + + + + diff --git a/src/main/resources/hibernate.cfg.xml b/src/main/resources/hibernate.cfg.xml index 0105de1..b984e2d 100644 --- a/src/main/resources/hibernate.cfg.xml +++ b/src/main/resources/hibernate.cfg.xml @@ -19,6 +19,7 @@ + diff --git a/src/main/resources/mysql_scripts/10_INSERT_TEAMS.sql b/src/main/resources/mysql_scripts/10_INSERT_TEAMS.sql index fa7b124..b72371e 100644 --- a/src/main/resources/mysql_scripts/10_INSERT_TEAMS.sql +++ b/src/main/resources/mysql_scripts/10_INSERT_TEAMS.sql @@ -1,5 +1,5 @@ -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr1','S1','S6',NULL,NULL); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr2','S2','S7',NULL,NULL); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr3','S3','S8',NULL,NULL); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr4','S4','S9','S11',NULL); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr5','S5','S10',NULL,NULL); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (1,'pr1','S1','S6','S21','S13'); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (2,'pr2','S2','S7','S20','S14'); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (3,'pr3','S3','S8','S22','S15'); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (4,'pr4','S4','S9','S11','S16'); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (5,'pr5','S5','S10','S12','S17'); diff --git a/src/main/resources/mysql_scripts/11_CONSOLIDATED_INSERTS.txt b/src/main/resources/mysql_scripts/11_CONSOLIDATED_INSERTS.txt index 2f44a5a..424d472 100644 --- a/src/main/resources/mysql_scripts/11_CONSOLIDATED_INSERTS.txt +++ b/src/main/resources/mysql_scripts/11_CONSOLIDATED_INSERTS.txt @@ -124,8 +124,8 @@ INSERT INTO project_preference(student_id,preferences_string,preference1,prefere INSERT INTO project_preference(student_id,preferences_string,preference1,preference2) VALUES ('S18','PR9 3 PR10 1 PR8 2 PR4 4','PR4','PR9'); INSERT INTO project_preference(student_id,preferences_string,preference1,preference2) VALUES ('S19','PR9 3 PR10 1 PR8 2 PR4 4','PR4','PR9'); INSERT INTO project_preference(student_id,preferences_string,preference1,preference2) VALUES ('S20','PR9 3 PR10 1 PR8 2 PR5 4','PR5','PR9'); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr1','S1','S6',NULL,NULL); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr2','S2','S7',NULL,NULL); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr3','S3','S8',NULL,NULL); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr4','S4','S9','S11',NULL); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr5','S5','S10',NULL,NULL); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (1,'pr1','S1','S6','S21','S13'); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (2,'pr2','S2','S7','S20','S14'); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (3,'pr3','S3','S8','S22','S15'); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (4,'pr4','S4','S9','S11','S16'); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (5,'pr5','S5','S10','S12','S17'); diff --git a/src/main/resources/mysql_scripts/1_CREATE_TABLES.sql b/src/main/resources/mysql_scripts/1_CREATE_TABLES.sql index 0e3b7ea..39d1a62 100644 --- a/src/main/resources/mysql_scripts/1_CREATE_TABLES.sql +++ b/src/main/resources/mysql_scripts/1_CREATE_TABLES.sql @@ -103,3 +103,21 @@ create table teams foreign key (student_id_4) references students(id) ); -- TEAMS END -- + +-- SUGGESTED_TEAMS -- +create table suggested_teams +( + id int not null, + project_id varchar(5) unique not null, + student_id_1 varchar(5), + student_id_2 varchar(5), + student_id_3 varchar(5), + student_id_4 varchar(5), + foreign key (id) references teams(id), + foreign key (project_id) references projects(id), + foreign key (student_id_1) references students(id), + foreign key (student_id_2) references students(id), + foreign key (student_id_3) references students(id), + foreign key (student_id_4) references students(id) +); +-- SUGGESTED_TEAMS END -- diff --git a/target/classes/controllers/OrmFxController.class b/target/classes/controllers/OrmFxController.class index 2b47560bcc0c3dab7c5daabe59d04ec3c2d9fb06..3fd5a2b03e7a999b1008298c6e9e43965d5cc745 100644 GIT binary patch delta 4076 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 A2><{9 delta 3002 zcmZWr33yaj75>l6ByaNOl1wJ)3|R<}1V|=?urFZ=d)X59B`pX82@sk9B?(ZLPRowA zSbc3Nf{JaGs;EF*zKZDARNvQicvhLuDf1h8{+miY zZ{u6|wo>0w>bpvP&!(F1>u^<1{6Kj>RMkK7;m3HvhZpe^8$ZQMKKu+nx9|%aGw`yi zd?mn0Usd*N>eTOi7!<|tmHdM$`J)bhvhip9#ll~0jKSY@@pq;E;l)2~ypDfa__vK3 z{6}rQp~E!`{|!L!wv8!xN29y0zTL0{bV?)um!#1JN!P)$#A~BgGIY<*z>s?J*Wq{yIMdK;|8 zIwO5_xgP5T*&8BTBUSBfP0dv^BCYFdBbyDHu)%4`D01J8EzXgQf@mw+3>wgANnazy zQesJ|k$%$Ok^x4_u-8aAP8tbgtC0#BXrxkkgQUvHVC=PIh>@W(%*b%Eu}el68L8CA zc?ciVL!G?{MX zc9|~lPu{ett+j1SWOHp}+xkrnty$?Z!!I+l(qxujW*eC!wMOb>u910qXud2kvQQQo zS*%VkQGfG{ER|(~UTS9Tc4vS$%X!JR3m=hsBX`K1MwUy7Kz3OYGO|Jlb*^*Pof}Yy zR~lI*5hJT*rl8pA>n$##3v2xNl-h1kkwznHWu3tZY!!r@SKJ}q#u}{h%X+%mNBr4bF4H-nT`K+$V%-AGPCghJ=T)+j%QELJl}XLa%ua3i>%$Lm_8L zDASqPvou=IHU${|nVB2`W+q3`AUH-yr*mE%=MjVV@R)bE@Sr*T9v-v#7M`GKDmJh` z-bLjuG{4K3OH(b*C#0MKW_x^QwsX#)G8PrbZO*p5rn%e6D`wvV`oe<}WT6!Ks6ZJi zF%ngngkhM2;kbtqhNpmK*nyp#1-r0Y^^lwdH%|j6oT~id-aEtR;lGGp#}FdrJBOke z3Y3bW@Dx@!oAXPeV+N8DyokOjq2il`@>NA;LZl>o4yB#w7w$y=vozv{Iz0>8M@Q53 zF?6~bc^FIg$Iq-8NgyYYC8+vO_Kg|MIt6@rTx*o8_Lu3%6MRkhsA85qOhx_3)m!Vpk?sOx6= zY7d2id7c=CRi{-xi}K1YKC4JOiQc-Q8V2U2#iAIYa1z;(MD`SNxxtGX)qMwwv?q>q zH6K+F7#j=tNG(JW7W3^{!uM<`lWiGg>T!Ve@GxWU865cz{$I#m}d3KcB??L2~tW5=xGwlzcFy<48)!L)4+S zQx1304c=9{g%4Tyumvae18yMdhbyr|S$*Pk z*l*z@HX}REig#(H@(Mj%GsO$(Sm-jQ)L&v@pcB(#n9h{A{r^?wir;;J;@U!Ts31fI z1>|gTq z+{xf}qmb3um(HrmU_w>WWRTtHqwI7-F5lXu!6k|4P#V6BTD2JLMBN3B+xpqX*C%PGjxuT|5RPGS3`+=93`=8J7Cw^# zE8+PTwx(A2S!3Nm1#k*aQO?V{{j}<)*Pn@>`z$`me#kEG=I7lMJjvF14qhpom?!tk fe%ZtIFDclE`@iD<*Z2*7o21^vTS^I^RPp=|SsFF< diff --git a/target/classes/enums/SuggestionMode.class b/target/classes/enums/SuggestionMode.class new file mode 100644 index 0000000000000000000000000000000000000000..e0205351e0f54ea4a7ce7388f0a339b64631a268 GIT binary patch literal 947 zcmZ`%?@!ZE6g_W!Tf0&=7&siFD5ADQH%ai*76QUdNb2}dSwj5O%{oiEF6j^cE**&& zjfT(uQO5haMY_1XCVjc@o_o)^=e^&5zW)NShnIP9Y^!*Jr!tmhJX4`T7e7P6qDo0a zAgT(AV&9SRoI!524_}+DV}`Qn`0*gDTXDbdgpoV+-wr=G4F=`-#F}8_?arZj*0LDZ z-p_;QE^RM%LWYWN%mwiy>djCzUEgWPgRT?2v%4Oh$Vv6-M~13yUf7p*-Lw6E-HHO& z?>CHjq$P9Mv%QWTxT4LZ7x(P}wJiPLhauN=eK*>tv1ibn7##*4eR64vyyfIm#BGB=PuQ^atG{<$P45x$JI34RZm zNjL>zy&@tg}+ND+8Bij){{KBK`6nv3yD5JuI_AHBljgqr|E9XW!x9i@gTu$ zLcv39PK2~+5V2}Mz|TvvbPeSS`6N(z5-enYQc4=p>p15lELc}yf^9rpArZmJq%294 ONZgp^5m_Pzdi)nSvBO;e literal 0 HcmV?d00001 diff --git a/target/classes/fx_samples/sample.fxml b/target/classes/fx_samples/sample.fxml index 93d82cb..19c5bbe 100644 --- a/target/classes/fx_samples/sample.fxml +++ b/target/classes/fx_samples/sample.fxml @@ -28,8 +28,10 @@ - - + + + + diff --git a/target/classes/hibernate.cfg.xml b/target/classes/hibernate.cfg.xml index 0105de1..b984e2d 100644 --- a/target/classes/hibernate.cfg.xml +++ b/target/classes/hibernate.cfg.xml @@ -19,6 +19,7 @@ + diff --git a/target/classes/hibernate/OrmSuggestedTeams.class b/target/classes/hibernate/OrmSuggestedTeams.class new file mode 100644 index 0000000000000000000000000000000000000000..402f3ff7a7da4317ee5b368fbb0fa3f92be00b84 GIT binary patch literal 3221 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 F`Ue5LkNp4u delta 479 zcmXYs$4(0UA6_GC7zf*ksn^9LxeHM}xr<(w9dpBvS!Q8)gi%hPm7HrBjwL%o~2?lm)|L_MaQAD5Ko4WJ$7YSh1|KcIA!tCoJo1 z7&a|iY+H5$+q`9$Jxhvx^;ix_TMjvLsL9^AHFr;5#!b;eiJlvLE)MD!hINXI9dUm5 z1I}&kxWfqx)?6oSBtok=riQqZW6CC# zOi9m(kLCKU`H%QSd`44l*D(3=4oIyhPx&+r>hjco{=Gk#B62(0_jiLIH0zIAWC))5 m6>U|tO-dB+jhG>7h`lmuX#c>+Gjtd_CF2;nlkW89TE-rMsJc_)q)= zeYH$p&g3c4qF}x%Zqi_fG!$_xC>lT*I?CMzIvfGCogW1z*JQ zWdb*FGl5%JRkNJ>ti|w^vfPfNAL|Kxjc*djV?%v5HEhLjN4ecqpX~$+*wL`7;hsQr z*{WLJia_`D4408xc1a5K=dG&TtW^%Avtt~TX&K7fMWcMra4fYBj1lk9as?*xhZa4n zh9@&6!_E|HrYT)dmUg63aaRp{Ng!cL??$=oTNrJ6CjZEIYGi7jRnFus*P~0Xr`**- zVBqw&=1SMK?5aRAZ#!nDm9x;;V2H6W$`?mXq*ER7mfIk2ITat)(h4J-D|kln@rH5a zQ}k8Z)9@|P6)cksYYxSjJ_Y}+@e)?mm5vwi9-i*Nv7|&Fu$@XsGl7d?e4$-e$yt(R z>B+k_>AVm)-yz5oWzP7U^d0OB&nt`37GToL>ShBC1u`87JD7DKSy|F>U&8|p-wDig zvgHwvTT8p? zt?kv^cKYW1w7X!H(l-jXH03D?4 z?9OsP-VbU1KzcrZ28bUZ~;V7wLM%ywZ#_{~u^s%B>E z;E^n{BSz1xd4b`U>&~HLKWnsWU%0yjQsLum6~b<8Ij?)tF+AI0leIwJZg%%ByOku_ z%0aoT8AUp?0@Lh>aE7o4%kaYg?X#loBUwGE!qnU1soF0(l21)g`+ic0|(NysymKRb;-tmU@o4@-nPvM=j3x)ta)qzfs2qrR~Z?{cm;9B>{NxMG*$61~*nKRNbroO_L~I=Th&vqOb4>8u1TOny#Lqd27;S^x9p-n05JzcGVw~dy z#~J2Sc+#YhM4a|CV=;Sxtk;h=NrabaRj3^61T}}W3G;vz~0W3U^0FOUCbq#;3dh6OmKG%wMY)f&^3_U08K^kN?-)0?pTu^~SACTx2uH!>S ziYUT?kZQI_8~<4O+J1ydqEeEMacuZs3;Y+EUHIZIB67@-QD5ATsjr4lG;s1M@DDB@ W^G>@@_I&N*f%w-M;WI|>LiRtDxJ(TI literal 0 HcmV?d00001 diff --git a/target/classes/hibernate/dao/TeamsDao.class b/target/classes/hibernate/dao/TeamsDao.class index 7db47cedcf1abf1fa733cc533d54e4a74f205fa4..67f6712c5abf2119dbfcb2a366cff2fcb7245d5f 100644 GIT binary patch delta 3065 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 Xc}S^p7U}gIkZbPaH2MTSi5vb0j*`&z diff --git a/target/classes/mysql_scripts/10_INSERT_TEAMS.sql b/target/classes/mysql_scripts/10_INSERT_TEAMS.sql index fa7b124..b72371e 100644 --- a/target/classes/mysql_scripts/10_INSERT_TEAMS.sql +++ b/target/classes/mysql_scripts/10_INSERT_TEAMS.sql @@ -1,5 +1,5 @@ -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr1','S1','S6',NULL,NULL); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr2','S2','S7',NULL,NULL); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr3','S3','S8',NULL,NULL); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr4','S4','S9','S11',NULL); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr5','S5','S10',NULL,NULL); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (1,'pr1','S1','S6','S21','S13'); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (2,'pr2','S2','S7','S20','S14'); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (3,'pr3','S3','S8','S22','S15'); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (4,'pr4','S4','S9','S11','S16'); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (5,'pr5','S5','S10','S12','S17'); diff --git a/target/classes/mysql_scripts/11_CONSOLIDATED_INSERTS.txt b/target/classes/mysql_scripts/11_CONSOLIDATED_INSERTS.txt index 2f44a5a..424d472 100644 --- a/target/classes/mysql_scripts/11_CONSOLIDATED_INSERTS.txt +++ b/target/classes/mysql_scripts/11_CONSOLIDATED_INSERTS.txt @@ -124,8 +124,8 @@ INSERT INTO project_preference(student_id,preferences_string,preference1,prefere INSERT INTO project_preference(student_id,preferences_string,preference1,preference2) VALUES ('S18','PR9 3 PR10 1 PR8 2 PR4 4','PR4','PR9'); INSERT INTO project_preference(student_id,preferences_string,preference1,preference2) VALUES ('S19','PR9 3 PR10 1 PR8 2 PR4 4','PR4','PR9'); INSERT INTO project_preference(student_id,preferences_string,preference1,preference2) VALUES ('S20','PR9 3 PR10 1 PR8 2 PR5 4','PR5','PR9'); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr1','S1','S6',NULL,NULL); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr2','S2','S7',NULL,NULL); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr3','S3','S8',NULL,NULL); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr4','S4','S9','S11',NULL); -INSERT INTO teams(project_id,student_id_1,student_id_2,student_id_3,student_id_4) VALUES ('pr5','S5','S10',NULL,NULL); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (1,'pr1','S1','S6','S21','S13'); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (2,'pr2','S2','S7','S20','S14'); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (3,'pr3','S3','S8','S22','S15'); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (4,'pr4','S4','S9','S11','S16'); +INSERT INTO teams (`id`,`project_id`,`student_id_1`,`student_id_2`,`student_id_3`,`student_id_4`) VALUES (5,'pr5','S5','S10','S12','S17'); diff --git a/target/classes/mysql_scripts/1_CREATE_TABLES.sql b/target/classes/mysql_scripts/1_CREATE_TABLES.sql index 0e3b7ea..39d1a62 100644 --- a/target/classes/mysql_scripts/1_CREATE_TABLES.sql +++ b/target/classes/mysql_scripts/1_CREATE_TABLES.sql @@ -103,3 +103,21 @@ create table teams foreign key (student_id_4) references students(id) ); -- TEAMS END -- + +-- SUGGESTED_TEAMS -- +create table suggested_teams +( + id int not null, + project_id varchar(5) unique not null, + student_id_1 varchar(5), + student_id_2 varchar(5), + student_id_3 varchar(5), + student_id_4 varchar(5), + foreign key (id) references teams(id), + foreign key (project_id) references projects(id), + foreign key (student_id_1) references students(id), + foreign key (student_id_2) references students(id), + foreign key (student_id_3) references students(id), + foreign key (student_id_4) references students(id) +); +-- SUGGESTED_TEAMS END -- diff --git a/target/classes/services/OrmChartsService.class b/target/classes/services/OrmChartsService.class index 389b1eb2b7fd3a40f9db0ebc57c3ac86f526a791..4e35bb1bdcd9b4656e9f8e9285b15bca341a4864 100644 GIT binary patch delta 1064 zcmZ{j>2p(67{-71-rRedo70sNjf%|(NSY=_(1NDof(ljIMnR=@s|Au8NE%k2Wi|D7LyZlJ%FI zPaah~=+f$ETFEK$F71BMPR?Z;+g;XBXp?4-xRg?q6%#HOGT6YRzdsseiXA?4X9JJ< znO!cAvs*E(cw*+%=?$@1Uv_+Atd!a~F*=$pmGi~%{^HhbPiNn@k;#$NL^)qb_2oY}b6uCyGxs zCpqQC)$+h;gAVUotD~}8MNH=mpBb$8{s_js?}AH>&nv$Me>OrD%~|F&17y6PLfuBy zYu7&-=e*zbzTiRvgb8w=T1+<0(^@OFrR_w-u9p`4U23nD7N(s<#Hp9URi=Ge z;*1!u=#uqPF$NJDxPVSBlE=Ga80m$z>AB2rOp>hG@%N zAxcv^Y@}O|CI4PlvPy={2>&Xs#+F`fq|)@@aE-{rBB)DO|0BItq}NH!%|UH5*akzyj8?PIe#la*NooY2sGai`MV1B~!2U399$(Z*glkG|;?mvP-Nb zSSF+Rqs1kHSWPcL&~4ma>kwmu3}x1GcL=h$Q?P}xOqRO@%6ZC(A@)r98lU7wIn6KR T0%v6(le}+aT)0IZ;^Dsly~WAo delta 981 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 literal 0 HcmV?d00001 diff --git a/target/classes/services/TeamBoxService.class b/target/classes/services/TeamBoxService.class index f20f256de3ea3f2fe3f9314591e9d9b3006e9e24..96e0eeba38cb5029d32498059ec0847618cd53b4 100644 GIT binary patch literal 7701 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 hMX>qgoVv++?}Pt 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 Yx=?LVn|Y}Fs+Ll0+W~wX-@rHj3kbHHQUCw| diff --git a/target/classes/sources/DatafileIOclass.class b/target/classes/sources/DatafileIOclass.class index 6517e023ae6ded0aa76111df37ac57d771cd1672..5e21caf37a95b068474606527ac9666c3a5ab548 100644 GIT binary patch delta 2516 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 delta 682 zcmWNOYfO!C9LGQZbA*iJMJlaxQnaP1a|&S;6*ZR_bE_uGHC+&Mi6%_B&v-T>qud%R zmz@zK!rYQI2Zc8kwX8SZ@rwEGxBd1!&;RrP{4P&l?$6vi6%LbWRXXC0+uP`<9clut ztkCpfK@1=me@5aU#HtT1FitDjndBFa9}!lTGu=d5HO@4@v3ifT`kgJYF$^Y_;kXGP zjzGri{sa=3NTPBMlgMW>1x%rsB&*x?D=J6S;)IbK(Is&VCEV>M3J2wlrc*0El( zkqs1)Zacr zRa(b6;yJHXRFlpH=5SGCT~fswRjgJ0%an7416-5fx=!o#^#)hDsi%7725xhU2g*I% z^`=El^eew7{e9^hiPC|Ghx#**)a7H9Xp;Vkw)a%4YS!@2*voVE`9e*+6#a_ViZf)YXa-aI|60phQM9rrocVrmcX|1zQ6?N^>S z)`44ZSaz-cKKhZHsN0pN?t$B=R&BR#TMQG8nzeVj;Ox~Bi@oF5kx#xehhIiE$r(1E zA)g!D{0jNe*yOY1Z==NL$QiynB9Ub%Cv!ZTyydg}DlLEDWu7B{^40z|Ro-%Y?Y19x z{g&+d-pg3_UbQ@$Ez4#nXugp7M%aq-vKz_xS@c>)M?pIXz0P2>iFwsy$E8vbw*Oa; z{J7WY#%E3b9TG(0pq1~-!?f4&!sh9@CKl*g=1{Spp}zo(BL&JyqZBBomU3z-r=kLGIF93QtNRVO8U_C~PhC$QWGT3ky25o1@pzG`z zY&y3L`p#{G9p}Jc*SQyA7-9eJ^2^?+TbaYWP4sb?qoQzVA9QZ7bwkEcvG;l?6ZBIL zWRg~;BUO4LN70l!UYy!TY0ETcAJUf@nwE-i*6n5XRb}?Ol%J)1JP`BaKYYb-FT=eI z_cGkea4&$Bkarh33)umJC9Y*(2dJUW&S3ffEb9xu1GMZ@&>S0a TqTp`V5!;`j7Avf<(^&ljsXZ(e