Skip to content

Commit

Permalink
Edited parser to enable enhanced search function
Browse files Browse the repository at this point in the history
  • Loading branch information
gary-tang committed Oct 25, 2016
1 parent 14910f7 commit 194917f
Show file tree
Hide file tree
Showing 15 changed files with 218 additions and 34 deletions.
81 changes: 73 additions & 8 deletions src/main/java/seedu/manager/logic/commands/FindCommand.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,25 @@
package seedu.manager.logic.commands;

import java.util.HashMap;
import java.util.Optional;
import java.util.Set;
import java.util.Map.Entry;

import seedu.manager.commons.core.Messages;
import seedu.manager.commons.core.UnmodifiableObservableList;
import seedu.manager.commons.exceptions.IllegalValueException;
import seedu.manager.model.task.Desc;
import seedu.manager.model.task.Done;
import seedu.manager.model.task.EndTime;
import seedu.manager.model.task.Priority;
import seedu.manager.model.task.ReadOnlyTask;
import seedu.manager.model.task.StartTime;
import seedu.manager.model.task.Task;
import seedu.manager.model.task.TaskProperty;
import seedu.manager.model.task.UniqueTaskList;
import seedu.manager.model.task.Venue;
import seedu.manager.model.task.Task.TaskProperties;
import seedu.manager.model.task.UniqueTaskList.TaskNotFoundException;

/**
* Finds and lists all tasks in task manager whose desc contains any of the argument keywords.
Expand All @@ -15,17 +34,63 @@ public class FindCommand extends Command {
+ "Parameters: KEYWORD [MORE_KEYWORDS]...\n"
+ "Example: " + COMMAND_WORD + " alice bob charlie";

private final Set<String> keywords;
public static final String MESSAGE_SUCCESS = "Found Task(s): %1$s";
public static final String MESSAGE_DUPLICATE_KEYWORDS = "There are 2 or more of the same keywords you have entered.";

public FindCommand(Set<String> keywords) {
this.keywords = keywords;
private final HashMap<TaskProperties, Optional<String>> foundProperties;

public FindCommand(HashMap<TaskProperties, Optional<String>> foundProperties)
throws IllegalValueException {
this.foundProperties = foundProperties;
}

@Override
public CommandResult execute() {
model.updateSortedFilteredTaskList(keywords);
model.unSortSortedFilteredTaskList();
try {
model.updateFilteredTaskList(buildProperties(foundProperties));
} catch (IllegalValueException e) {
return new CommandResult(e.getMessage());
}
return new CommandResult(getMessageForTaskListShownSummary(model.getSortedFilteredTaskList().size()));
}

}

private HashMap<TaskProperties, Optional<TaskProperty>> buildProperties(HashMap<TaskProperties, Optional<String>> propertiesStrings) throws IllegalValueException {
HashMap<TaskProperties, Optional<TaskProperty>> properties = new HashMap<>();
for (Entry<TaskProperties, Optional<String>> prop : propertiesStrings.entrySet()) {
Optional<TaskProperty> taskProperty = buildProperty(prop.getKey(), prop.getValue());
properties.put(prop.getKey(), taskProperty);
}

return properties;
}

/**
* Builds a TaskProperty object using a value from the TaskProperties enum and a value
* @param property that should be built
* @param value of the property
* @return
*/
private Optional<TaskProperty> buildProperty(TaskProperties property, Optional<String> value) throws IllegalValueException {
if (!value.isPresent()) {
return Optional.empty();
}
String stringValue = value.get();

switch (property) {
case DESC:
return Optional.of(new Desc(stringValue));
case VENUE:
return Optional.of(new Venue(stringValue));
case STARTTIME:
return Optional.of(new StartTime(stringValue));
case ENDTIME:
return Optional.of(new EndTime(stringValue));
case PRIORITY:
return Optional.of(new Priority(stringValue));
case DONE:
return Optional.of(new Done(stringValue));
default:
throw new IllegalValueException("Property not found");
}
}
}
22 changes: 13 additions & 9 deletions src/main/java/seedu/manager/logic/parser/Parser.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ public class Parser {
private static final Pattern EDIT_KEYWORDS_FORMAT =
Pattern.compile("(?<targetIndex>\\d+)\\s(?<arguments>.+)");

private static final Pattern FIND_KEYWORDS_FORMAT =
Pattern.compile("(?<arguments>.+)");

private static final ExtensionParser extParser = new ExtensionParser();

public Parser() {}
Expand Down Expand Up @@ -186,16 +189,17 @@ private Optional<Integer> parseIndex(String command) {
* @return the prepared command
*/
private Command prepareFind(String args) {
final Matcher matcher = KEYWORDS_ARGS_FORMAT.matcher(args.trim());
if (!matcher.matches()) {
return new IncorrectCommand(String.format(MESSAGE_INVALID_COMMAND_FORMAT,
FindCommand.MESSAGE_USAGE));
final Matcher matcher = FIND_KEYWORDS_FORMAT.matcher(args);
if(!matcher.matches()){
return new IncorrectCommand(
String.format(MESSAGE_INVALID_COMMAND_FORMAT, FindCommand.MESSAGE_USAGE));
}

try {
return new FindCommand(extParser.getTaskProperties(matcher.group("arguments")));
} catch (IllegalValueException e) {
return new IncorrectCommand(e.getMessage());
}

// keywords delimited by whitespace
final String[] keywords = matcher.group("keywords").split("\\s+");
final Set<String> keywordSet = new HashSet<>(Arrays.asList(keywords));
return new FindCommand(keywordSet);
}

}
7 changes: 7 additions & 0 deletions src/main/java/seedu/manager/model/Model.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package seedu.manager.model;

import java.util.HashMap;
import java.util.Optional;
import java.util.Set;

import seedu.manager.commons.core.UnmodifiableObservableList;
import seedu.manager.model.task.ReadOnlyTask;
import seedu.manager.model.task.Task;
import seedu.manager.model.task.TaskProperty;
import seedu.manager.model.task.UniqueTaskList;
import seedu.manager.model.task.Task.TaskProperties;

/**
* The API of the Model component.
Expand All @@ -32,6 +36,9 @@ public interface Model {
/** Updates the filter of the sorted and filtered task list to filter by the given keywords */
void updateSortedFilteredTaskList(Set<String> keywords);

/** Updates the filter of the sorted and filtered task list to filter by the given properties from the find function*/
void updateFilteredTaskList(HashMap<TaskProperties, Optional<TaskProperty>> propertiesToMatch);

/** Sorts the sorted and filtered task list by priority */
void sortSortedFilteredTaskListByPriority();

Expand Down
22 changes: 21 additions & 1 deletion src/main/java/seedu/manager/model/ModelManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@
import seedu.manager.model.task.ReadOnlyTask;
import seedu.manager.model.task.Task;
import seedu.manager.model.task.Task.TaskProperties;
import seedu.manager.model.task.TaskProperty;
import seedu.manager.model.task.UniqueTaskList;
import seedu.manager.model.task.UniqueTaskList.TaskNotFoundException;

import java.util.HashMap;
import java.util.Optional;
import java.util.Set;
import java.util.logging.Logger;

Expand Down Expand Up @@ -124,10 +127,14 @@ public void updateFilteredListToShowAll() {
filteredTasks.setPredicate(null);
}

public void updateFilteredTaskList(Set<String> keywords){
public void updateFilteredTaskList(Set<String> keywords) {
updateFilteredTaskList(new PredicateExpression(new DescQualifier(keywords)));
}

public void updateFilteredTaskList(HashMap<TaskProperties, Optional<TaskProperty>> propertiesToMatch) {
updateFilteredTaskList(new PredicateExpression(new EnhancedSearchQualifier(propertiesToMatch)));
}

private void updateFilteredTaskList(Expression expression) {
filteredTasks.setPredicate(expression::satisfies);
}
Expand Down Expand Up @@ -183,5 +190,18 @@ public String toString() {
return "desc=" + String.join(", ", descKeyWords);
}
}

private class EnhancedSearchQualifier implements Qualifier {
private HashMap<TaskProperties, Optional<TaskProperty>> propertiesToMatch;

public EnhancedSearchQualifier(HashMap<TaskProperties, Optional<TaskProperty>> propertiesToMatch) {
this.propertiesToMatch = propertiesToMatch;
}

@Override
public boolean run(ReadOnlyTask task) {
return task.matches(propertiesToMatch);
}
}

}
17 changes: 17 additions & 0 deletions src/main/java/seedu/manager/model/task/Desc.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package seedu.manager.model.task;

import seedu.manager.commons.exceptions.IllegalValueException;
import seedu.manager.commons.util.StringUtil;

/**
* Represents a Task's desc in the task manager.
Expand Down Expand Up @@ -37,6 +38,22 @@ public String getPrettyValue() {
return value;
}
}

/**
* Checks if any words from the task's venue matches that with the search function's input words
*/
@Override
public boolean matches(TaskProperty desc) {
assert desc instanceof Desc;

String[] arr = ((Desc) desc).value.split(" ");
for (String string : arr) {
if (StringUtil.containsIgnoreCase(this.value, string)) {
return true;
}
}
return false;
}

@Override
public boolean equals(Object other) {
Expand Down
9 changes: 4 additions & 5 deletions src/main/java/seedu/manager/model/task/Done.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,10 @@ public String toString() {
* Checks if the task property matches with that of the search function's input
*/
@Override
public boolean matches(Done done) {
if (done.equals("Yes")) {
return true;
}
return false;
public boolean matches(TaskProperty done) {
assert done instanceof Done;

return ((Done) done).equals(this);
}

@Override
Expand Down
11 changes: 10 additions & 1 deletion src/main/java/seedu/manager/model/task/EndTime.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package seedu.manager.model.task;


import seedu.manager.commons.exceptions.IllegalValueException;

/**
Expand All @@ -12,4 +11,14 @@ public class EndTime extends Time {
public EndTime(String endTime) throws IllegalValueException {
super(endTime);
}

/**
* Checks if the end time of a task is equal to or earlier than that of the search function's input
*/
@Override
public boolean matches(TaskProperty endTime) {
assert endTime instanceof EndTime;

return (!((EndTime) endTime).value.before(this.value));
}
}
11 changes: 4 additions & 7 deletions src/main/java/seedu/manager/model/task/Priority.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,10 @@ public String toString() {
* Checks if the task property matches with that of the search function's input
*/
@Override
public boolean matches(Priority priority) {
for (VALUES val : VALUES.values()) {
if (priority.equals(val.value)) {
return true;
}
}
return false;
public boolean matches(TaskProperty priority) {
assert priority instanceof Priority;

return ((Priority) priority).equals(this);
}

@Override
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/seedu/manager/model/task/ReadOnlyTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,4 +79,6 @@ default String getAsPrettyText() {
}

public int compareProperty(ReadOnlyTask other, TaskProperties property);

public boolean matches(HashMap<TaskProperties, Optional<TaskProperty>> other);
}
10 changes: 10 additions & 0 deletions src/main/java/seedu/manager/model/task/StartTime.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,14 @@ public class StartTime extends Time {
public StartTime(String startTime) throws IllegalValueException {
super(startTime);
}

/**
* Checks if the start time of a task is equal to or later than that of the search function's input
*/
@Override
public boolean matches(TaskProperty startTime) {
assert startTime instanceof StartTime;

return (!((StartTime) startTime).value.after(this.value));
}
}
14 changes: 14 additions & 0 deletions src/main/java/seedu/manager/model/task/Task.java
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,20 @@ public boolean equals(Object other) {
&& this.isSameStateAs((ReadOnlyTask) other));
}

@Override
public boolean matches(HashMap<TaskProperties, Optional<TaskProperty>> other) {
for (TaskProperties property : TaskProperties.values()) {
if (other.get(property).isPresent()) {
if (!this.properties.get(property).isPresent()) {
return false;
} else if (!this.properties.get(property).get().matches(other.get(property).get())){
return false;
}
}
}
return true;
}

@Override
public int compareProperty(ReadOnlyTask other, TaskProperties property) {
assert other != null;
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/seedu/manager/model/task/TaskProperty.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,4 +66,6 @@ public String toPrettyString() {
public int compareTo(TaskProperty other) {
return -1;
}
}

public abstract boolean matches(TaskProperty property);
}
11 changes: 9 additions & 2 deletions src/main/java/seedu/manager/model/task/Time.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public abstract class Time extends TaskProperty {
private static final PrettyTimeParser timeParser = new PrettyTimeParser();
private static final PrettyTime timePrettify = new PrettyTime();

private Date value;
protected Date value;

static {
DATE_FORMAT.setLenient(false);
Expand Down Expand Up @@ -80,7 +80,13 @@ public boolean equals(Object other) {
* @throws IllegalValueException
*/
private Date parseTime(String time) throws IllegalValueException {
List<Date> groups = timeParser.parse(time);
List<Date> groups;
try {
groups = timeParser.parse(time);
} catch (Exception e) {
throw new IllegalValueException("Invalid Time!");
}

if (groups.size() != 1) {
throw new IllegalValueException(MESSAGE_TIME_CONSTRAINTS);
}
Expand All @@ -90,4 +96,5 @@ private Date parseTime(String time) throws IllegalValueException {
public Date getTime() {
return value;
}

}

0 comments on commit 194917f

Please sign in to comment.