diff --git a/build.gradle b/build.gradle index 92d317df95ca..0f04c9d56119 100644 --- a/build.gradle +++ b/build.gradle @@ -67,6 +67,7 @@ dependencies { implementation group: 'com.sun.xml.bind', name: 'jaxb-core', version: '2.3.0' implementation group: 'javax.activation', name: 'activation', version: '1.1.1' + implementation 'me.xdrop:fuzzywuzzy:1.2.0' implementation group: 'org.mindrot', name: 'jbcrypt', version: '0.4' diff --git a/src/main/java/seedu/address/logic/commands/machine/FindMachineCommand.java b/src/main/java/seedu/address/logic/commands/machine/FindMachineCommand.java index 0d81f2b5d032..113611faed4e 100644 --- a/src/main/java/seedu/address/logic/commands/machine/FindMachineCommand.java +++ b/src/main/java/seedu/address/logic/commands/machine/FindMachineCommand.java @@ -8,8 +8,7 @@ import seedu.address.logic.commands.CommandResult; import seedu.address.model.Model; import seedu.address.model.machine.MachineNameContainsKeywordsPredicate; - - +import seedu.address.model.machine.MachineNameFuzzyWuzzyPredicate; /** @@ -26,15 +25,21 @@ public class FindMachineCommand extends Command { + "Example: " + COMMAND_WORD + " machine1 machine2 machine3"; private final MachineNameContainsKeywordsPredicate predicate; + private final MachineNameFuzzyWuzzyPredicate fuzzyWuzzyPredicate; - public FindMachineCommand(MachineNameContainsKeywordsPredicate predicate) { + public FindMachineCommand(MachineNameContainsKeywordsPredicate predicate, + MachineNameFuzzyWuzzyPredicate fuzzyWuzzyPredicate) { this.predicate = predicate; + this.fuzzyWuzzyPredicate = fuzzyWuzzyPredicate; } @Override public CommandResult execute(Model model, CommandHistory history) { requireNonNull(model); model.updateFilteredMachineList(predicate); + if (model.getFilteredMachineList().size() < predicate.getNumberOfKeywords()) { + model.updateFilteredMachineList(fuzzyWuzzyPredicate); + } return new CommandResult( String.format(Messages.MESSAGE_MACHINE_LISTED_OVERVIEW, model.getFilteredMachineList().size())); } diff --git a/src/main/java/seedu/address/logic/commands/machine/ManageMachineCommand.java b/src/main/java/seedu/address/logic/commands/machine/ManageMachineCommand.java index 8dc2afadd33c..886b9fe3c043 100644 --- a/src/main/java/seedu/address/logic/commands/machine/ManageMachineCommand.java +++ b/src/main/java/seedu/address/logic/commands/machine/ManageMachineCommand.java @@ -104,11 +104,7 @@ public CommandResult execute(Model model, CommandHistory history) throws Command return new CommandResult(String.format(MESSAGE_MACHINE_NOT_FLUSHED, machineToManage)); } } else if (flushAutoOption.equals(OPTION_FLUSH_AUTO)) { - Machine mostFreeMachine = model.getMostFreeMachine(); - if (mostFreeMachine.equals(machineToManage)) { - throw new CommandException(MESSAGE_NO_MORE_MACHINES); - } - model.autoMoveJobs(machineToManage, mostFreeMachine); + model.autoMoveJobs(machineToManage); model.updateFilteredMachineList(PREDICATE_SHOW_ALL_MACHINES); model.updateFilteredJobListInAllMachines(PREDICATE_SHOW_ALL_JOBS); return new CommandResult(String.format(MESSAGE_AUTO_FLUSHING_MACHINE, machineToManage)); diff --git a/src/main/java/seedu/address/logic/parser/machine/FindMachineCommandParser.java b/src/main/java/seedu/address/logic/parser/machine/FindMachineCommandParser.java index bb2264cdcf0d..222703f15e5e 100644 --- a/src/main/java/seedu/address/logic/parser/machine/FindMachineCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/machine/FindMachineCommandParser.java @@ -8,6 +8,7 @@ import seedu.address.logic.parser.Parser; import seedu.address.logic.parser.exceptions.ParseException; import seedu.address.model.machine.MachineNameContainsKeywordsPredicate; +import seedu.address.model.machine.MachineNameFuzzyWuzzyPredicate; /** * Parses input arguments and creates a new FindMachineCommand object @@ -28,7 +29,8 @@ public FindMachineCommand parse(String args) throws ParseException { String[] nameKeywords = trimmedArgs.split("\\s+"); - return new FindMachineCommand(new MachineNameContainsKeywordsPredicate(Arrays.asList(nameKeywords))); + return new FindMachineCommand(new MachineNameContainsKeywordsPredicate(Arrays.asList(nameKeywords)), + new MachineNameFuzzyWuzzyPredicate(Arrays.asList(nameKeywords))); } } diff --git a/src/main/java/seedu/address/model/Model.java b/src/main/java/seedu/address/model/Model.java index 907be574b11c..f9172da7542d 100644 --- a/src/main/java/seedu/address/model/Model.java +++ b/src/main/java/seedu/address/model/Model.java @@ -3,6 +3,7 @@ import java.util.function.Predicate; import javafx.collections.ObservableList; +import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.model.admin.Admin; import seedu.address.model.admin.Username; import seedu.address.model.job.Job; @@ -94,7 +95,7 @@ public interface Model { void moveJobToMachine(Job job, Machine targetMachine); - void autoMoveJobs(Machine currentMachine, Machine targetMachine); + void autoMoveJobs(Machine currentMachine) throws CommandException; // ============================== Machine methods ======================================= // /** diff --git a/src/main/java/seedu/address/model/ModelManager.java b/src/main/java/seedu/address/model/ModelManager.java index 239794bdfdfc..496a9e6581f7 100644 --- a/src/main/java/seedu/address/model/ModelManager.java +++ b/src/main/java/seedu/address/model/ModelManager.java @@ -2,6 +2,7 @@ import static java.util.Objects.requireNonNull; import static seedu.address.commons.util.CollectionUtil.requireAllNonNull; +import static seedu.address.logic.commands.machine.ManageMachineCommand.MESSAGE_NO_MORE_MACHINES; import java.util.Timer; import java.util.TimerTask; @@ -18,6 +19,7 @@ import seedu.address.commons.events.model.AdminListChangedEvent; import seedu.address.commons.events.model.JobListChangedEvent; import seedu.address.commons.events.model.MachineListChangedEvent; +import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.model.admin.Admin; import seedu.address.model.admin.Username; import seedu.address.model.job.Job; @@ -259,9 +261,13 @@ public void moveJobToMachine(Job job, Machine targetMachine) { } @Override - public void autoMoveJobs(Machine currentMachine, Machine targetMachine) { + public void autoMoveJobs(Machine currentMachine) throws CommandException { for (Job j : currentMachine.getJobs()) { - moveJobToMachine(j, targetMachine); + Machine mostFreeMachine = getMostFreeMachine(); + if (mostFreeMachine.equals(currentMachine)) { + throw new CommandException(MESSAGE_NO_MORE_MACHINES); + } + moveJobToMachine(j, mostFreeMachine); } flushMachine(currentMachine); indicateMachineListChanged(); diff --git a/src/main/java/seedu/address/model/machine/MachineNameContainsKeywordsPredicate.java b/src/main/java/seedu/address/model/machine/MachineNameContainsKeywordsPredicate.java index df5aa49ee8c6..9e033a63b4ba 100644 --- a/src/main/java/seedu/address/model/machine/MachineNameContainsKeywordsPredicate.java +++ b/src/main/java/seedu/address/model/machine/MachineNameContainsKeywordsPredicate.java @@ -11,14 +11,19 @@ public class MachineNameContainsKeywordsPredicate implements Predicate { private final List keywords; + public MachineNameContainsKeywordsPredicate(List keywords) { this.keywords = keywords; } + public Integer getNumberOfKeywords () { + return keywords.size(); + } + @Override public boolean test(Machine machine) { return keywords.stream() - .anyMatch(keyword -> StringUtil.containsWordIgnoreCase(machine.getName().fullName, keyword)); + .anyMatch(keyword -> StringUtil.containsWordIgnoreCase(machine.getName().fullName, keyword)); } @Override diff --git a/src/main/java/seedu/address/model/machine/MachineNameFuzzyWuzzyPredicate.java b/src/main/java/seedu/address/model/machine/MachineNameFuzzyWuzzyPredicate.java new file mode 100644 index 000000000000..a4c94384897f --- /dev/null +++ b/src/main/java/seedu/address/model/machine/MachineNameFuzzyWuzzyPredicate.java @@ -0,0 +1,31 @@ +package seedu.address.model.machine; + +import java.util.List; +import java.util.function.Predicate; + +import me.xdrop.fuzzywuzzy.FuzzySearch; + +/** + * Tests that a {@code Machines}'s {@code Name} fufills the fuzzywuzzy minimum ration. + */ +public class MachineNameFuzzyWuzzyPredicate implements Predicate { + + private final List keywords; + + public MachineNameFuzzyWuzzyPredicate(List keywords) { + this.keywords = keywords; + } + + @Override + public boolean test(Machine machine) { + return keywords.stream() + .anyMatch(keyword -> FuzzySearch.partialRatio(machine.getName().fullName, keyword) > 50); + } + + @Override + public boolean equals(Object other) { + return other == this // short circuit if same object + || (other instanceof MachineNameFuzzyWuzzyPredicate // instanceof handles nulls + && keywords.equals(((MachineNameFuzzyWuzzyPredicate) other).keywords)); // state check + } +} diff --git a/src/test/java/seedu/address/logic/commands/AddCommandTest.java b/src/test/java/seedu/address/logic/commands/AddCommandTest.java index 40b00c459ff4..779845bd2bf0 100644 --- a/src/test/java/seedu/address/logic/commands/AddCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/AddCommandTest.java @@ -179,7 +179,7 @@ public void moveJobToMachine(Job job, Machine targetMachine) { } @Override - public void autoMoveJobs(Machine currentMachine, Machine targetMachine) { + public void autoMoveJobs(Machine currentMachine) { } diff --git a/src/test/java/seedu/address/logic/commands/admin/AddAdminCommandTest.java b/src/test/java/seedu/address/logic/commands/admin/AddAdminCommandTest.java index d3c7933a0238..448a9df68d5b 100644 --- a/src/test/java/seedu/address/logic/commands/admin/AddAdminCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/admin/AddAdminCommandTest.java @@ -207,7 +207,7 @@ public void moveJobToMachine(Job job, Machine targetMachine) { } @Override - public void autoMoveJobs(Machine currentMachine, Machine targetMachine) { + public void autoMoveJobs(Machine currentMachine) { } diff --git a/src/test/java/seedu/address/logic/commands/admin/LoginCommandTest.java b/src/test/java/seedu/address/logic/commands/admin/LoginCommandTest.java index a4344d0cbb82..2aa4152c718a 100644 --- a/src/test/java/seedu/address/logic/commands/admin/LoginCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/admin/LoginCommandTest.java @@ -158,7 +158,7 @@ public void moveJobToMachine(Job job, Machine targetMachine) { } @Override - public void autoMoveJobs(Machine currentMachine, Machine targetMachine) { + public void autoMoveJobs(Machine currentMachine) { } diff --git a/src/test/java/seedu/address/logic/commands/admin/LogoutCommandTest.java b/src/test/java/seedu/address/logic/commands/admin/LogoutCommandTest.java index 5591129dd087..89d984e93743 100644 --- a/src/test/java/seedu/address/logic/commands/admin/LogoutCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/admin/LogoutCommandTest.java @@ -144,7 +144,7 @@ public void moveJobToMachine(Job job, Machine targetMachine) { } @Override - public void autoMoveJobs(Machine currentMachine, Machine targetMachine) { + public void autoMoveJobs(Machine currentMachine) { } diff --git a/src/test/java/seedu/address/logic/commands/admin/RemoveAdminCommandTest.java b/src/test/java/seedu/address/logic/commands/admin/RemoveAdminCommandTest.java index fea1e66d2238..dcfda5f3e138 100644 --- a/src/test/java/seedu/address/logic/commands/admin/RemoveAdminCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/admin/RemoveAdminCommandTest.java @@ -197,7 +197,7 @@ public void moveJobToMachine(Job job, Machine targetMachine) { } @Override - public void autoMoveJobs(Machine currentMachine, Machine targetMachine) { + public void autoMoveJobs(Machine currentMachine) { } diff --git a/src/test/java/seedu/address/logic/commands/admin/UpdatePasswordCommandTest.java b/src/test/java/seedu/address/logic/commands/admin/UpdatePasswordCommandTest.java index 1acf6f6686ae..d018a97d4ca3 100644 --- a/src/test/java/seedu/address/logic/commands/admin/UpdatePasswordCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/admin/UpdatePasswordCommandTest.java @@ -219,7 +219,7 @@ public void moveJobToMachine(Job job, Machine targetMachine) { } @Override - public void autoMoveJobs(Machine currentMachine, Machine targetMachine) { + public void autoMoveJobs(Machine currentMachine) { } diff --git a/src/test/java/seedu/address/logic/commands/machine/AddMachineCommandTest.java b/src/test/java/seedu/address/logic/commands/machine/AddMachineCommandTest.java index d0e4f4ba730d..18e887e28c17 100644 --- a/src/test/java/seedu/address/logic/commands/machine/AddMachineCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/machine/AddMachineCommandTest.java @@ -180,7 +180,7 @@ public void moveJobToMachine(Job job, Machine targetMachine) { } @Override - public void autoMoveJobs(Machine currentMachine, Machine targetMachine) { + public void autoMoveJobs(Machine currentMachine) { }