diff --git a/docs/DeveloperGuide.adoc b/docs/DeveloperGuide.adoc index eac0f60d18dc..e54b84fdcdcc 100644 --- a/docs/DeveloperGuide.adoc +++ b/docs/DeveloperGuide.adoc @@ -386,52 +386,19 @@ image::UndoRedoActivityDiagram.png[width="650"] // tag::findCommand-yinya998[] -=== Find feature +=== Find command ==== Current Implementation -The mechanism is facilitated by `findCommand`, `findCommandParser` and different Predicates classes. It allows user to find a person with 3 different search patterns. During the execution of find command, 3 search patterns will be executed one by one. +The mechanism is facilitated by `findCommand`, `findCommandParser` and different predicates class. It allows user to find a person with 3 different search patterns. During the execution of find command, 3 search patterns will be executed one by one. Given below is the process of executing find command: -Step 1. The exact search: This is a base method of matching string. It's implemented by String.equals(). +Step 1. The exact matching: This is a base method of matching string, it's implemented by String.equals(). -Step 2. The fuzzy search: This is based on similarity comparison. First edit distance between input keywords and string in people's fields is calculated based on levenshtein distance algorithm. Subsequently, similarity is calculated by s = 1 - Levenshtein_Distance/Max_Length_Of_Two_Strings. The similarity threshold is set to 0.7. If a person’s fields contain keyword which have more than 0.7 similarity comparing to the input keywords, he or she will be returned in fuzzy search result. +Step 2. The fuzzy matching: This is based on similarity comparison. First levenshtein distance is used to calculate the edit distance between input keywords and string in people's fields. Subsequently, similarity is calculated by s = 1 - Levenshtein_Distance/Max_Length_Of_Two_Strings. The similarity threshold is set to 0.7. If a person’s fields contain keyword which have more than 0.7 similarity comparing to the input keywords, he or she will be returned as fuzzy search result. -Step 3. The wildcard search: This is based on regular expression. It could recognize character \*. the character \* could match any number of characters of 0-9,a-z or A-Z. +Step 1. The exact matching: This is based on regular expression. It could recognize character *. the character * could match any number of characters. -* The following code snippet is from TagsContainsKeywordPredicate class. It shows an example of how predicate class works: - -[source,java] ----- - @Override - public boolean test(Person person) { - return keywords.stream() - .anyMatch(keyword -> { - String name = person.getName().fullName; - String tags = person.getTagsAsStringNoBracket(); - if (StringUtil.containsWordIgnoreCase(tags, keyword)) { - if (!exactSearchList.contains(name)) { - exactSearchList.add(name); - } - return true; - } - if (StringUtil.matchFuzzySearch(tags, keyword)) { - if (!fuzzySearchList.contains(name)) { - fuzzySearchList.add(name); - } - return true; - } - if (StringUtil.matchWildcardSearch(tags, keyword)) { - if (!wildcardSearchList.contains(name)) { - wildcardSearchList.add(name); - } - return true; - } - return false; - }); - } - ----- ==== Design Considerations @@ -442,11 +409,7 @@ Step 3. The wildcard search: This is based on regular expression. It could recog ** Cons: Less easy to implement. * **Alternative 2:** Use edit distance to compare the keywords ** Pros: Easy to implement. -** Cons: Lower accuracy especially when the string is short. - -[NOTE] -Different search patterns optimize the 'find' command for different kind of user. They help with user who cannot remember the exact spelling or who are prone to typos. - +** Cons: Lower accuracy. // end::findCommand-yinya998[] @@ -456,11 +419,9 @@ Different search patterns optimize the 'find' command for different kind of user === Photo feature ==== Current Implementation -The mechanism is facilitated by `Photo`, `PhotoCommand` class. It allows user to add a photo to the person in the contact list. +The mechanism is facilitated by `Photo`, `PhotoCommand` and `PhotoCommandParser` class. It allows user to add a photo to the person in the contact list. -Given below is the process of executing photo command: - -Step 1. The command will be checked whether it contains sub command `clear`. If it is a photo clear command, the photo of the contact list will be set to default photo. The photo command execution is finished. Else, following steps will be executed. +Given below is an example usage scenario and how the photo mechanism behaves at each step. Step 1. The input file path will be checked whether the file exists. @@ -471,46 +432,16 @@ Step 3. The size the of photo will be checked whether it is within the range (sm Step 4. The photo will be copied to the program and it is saved to the target person. -* The following code snippet is from PhotoCommand class. It shows an example of how photo command executes: - -[source,java] ----- -if (photo.getPath().equals(COMMAND_SUB)) { - photo.setPath(DEFAULT_PHOTOPATH); - Person personToEdit = lastShownList.get(targetIndex.getZeroBased()); - String path = personToEdit.getPhoto().getPath(); - File file = new File(path); - file.delete(); - - } else { - if (!isValidPhotoPath(photo.getPath())) { - return new CommandResult(MESSAGE_INVALID_PHOTOPATH); - } - if (!isImage(photo.getPath())) { - return new CommandResult(MESSAGE_FILE_NOT_IMAGE); - } - if (!isPhotoSizeWithinRange(photo.getPath())) { - return new CommandResult(MESSAGE_SIZE_EXCEED); - } - - String user = System.getProperty("user.name"); - String dir = "data/"; - String copyPath = FileUtil.copyFile(photo.getPath(), String.format(dir, user)); - photo.setPath(copyPath); - } - ----- - ==== Design Considerations -===== Aspect: How photo is stored in UniLA +===== Aspect: How photo is loaded * **Alternative 1 (current choice):** Copy the photo to the program. -** Pros: The address book will not be affect if user moves, renames or deletes the photo in the original path. Stability of the program is ensured. +** Pros: The address book will not be affect if user moves, renames or deletes the photo in the original path. ** Cons: Consume more memory because the photo is copied to the program. -* **Alternative 2:** Save the path and load the photo from the path every time when user opens the app. +* **Alternative 2:** Save the original path ** Pros: Use less memory. Easy to implement. -** Cons: The photo will be not be displayed if user moves, renames or deletes the photo in the original path. +** Cons: The photo will be lost if user moves, renames or deletes the photo in the original path. // end::photoCommand-yinya998[] diff --git a/docs/UserGuide.adoc b/docs/UserGuide.adoc index 2e02ff6806b6..f0a6f8d08aad 100644 --- a/docs/UserGuide.adoc +++ b/docs/UserGuide.adoc @@ -110,7 +110,7 @@ Edits the name of the 2nd person to be `Betsy Crower` and clears all existing ta // tag::upgradefindcommand-yinya998[] === Locating persons by any field: `find` -Finds persons whose fields contain any of the given keywords. +Finds persons whose fields contain any of the given keywords. + User can search with or without prefix. When search without prefix, any person whose fields contain any keywords will be returned. When search with prefix, person who contains all keywords in his or her corresponding fields will be returned. @@ -132,9 +132,9 @@ These are 3 search pattern that user can search with `find` command: + 2. Fuzzy keyword match - Matches the input keyword to people's fields that have higher than 0.7 similarity. The similarity is calculated based on Levenshtein Distance. Further explanation is in developer guide. -3. Wildcard keyword match – Matches the input keyword with wildcard character *. * represents any number of characters of 0-9, a-z or A-Z. +3. Wildcard keyword match – Matches the input keyword with wildcard character *. * represents any number of characters. -*Searching results are displayed in the following format:* + +*Search results are displayed in the following format:* + n persons listed: + Exact Search: + [NAME]… + @@ -144,14 +144,14 @@ n persons listed: + [NAME]… + [TIP] - There are three parts of executing 'find' command. The input keywords are first searched with exact string match, then fuzzy search, and finally wildcard search. + There are three parts of executing 'find' command. First The input keywords are searched with exact string match. If it is not matched, then they are processed by fuzzy search. If fuzzy search still not matches, they will be searched by wildcard match. Any results displayed in the previous searching stage will not be shown in the next searching stage. + - For example, if person Alice is found in exact string match, she will not be displayed in fuzzy search result. This is to avoid message duplication. + For example, if person Alice is found in exact string match, she will be displayed in exact search result and will not be displayed in fuzzy search result. This is to avoid message duplication. Examples: * `find victoria` + -In exact search: Returns any person whose fields contain keyword `victoria` in exact search. For example, person whose name is `Victoria` or person who lives in `Victoria Street`. + +In exact search: Returns any person whose fields contain keyword `victoria` in exact search. For example, person whose name is Victoria or person who live in Victoria Street. + In fuzzy search: Returns any person whose fields have keywords similar to `victoria`. For example, person whose tags contain keyword Victory. + * `find Serangon firends` + @@ -162,10 +162,13 @@ In fuzzy search: Returns any person whose fields have keywords similar to `Seran In exact search: Returns any person whose tags contain keywords `owemoney` **or** `friends` + In fuzzy search: Returns any person whose tags have keywords similar to to `owemoney` **or** `friends` + -* `find \*@gmail.com` + -In exact search: Returns any person whose fields contain keywords `\*@gmail.com` + -In fuzzy search: Returns any person whose fields have keywords similar to `\*@gmail.com` + -In wildcard search: Returns any person whose fields have keywords that match regex `\*@gmail.com` + +* `find *@gmail.com` + +In exact search: Returns any person whose fields contain keywords `*@gmail.com` + +In fuzzy search: Returns any person whose fields have keywords similar to `*@gmail.com` + +In wildcard search: Returns any person whose fields have keywords that match regex `*@gmail.com` + + +[NOTE] +Different search patterns optimize the 'find' command for different kind of user. They help with user who cannot remember the exact spelling or who are prone to typos. // end::upgradefindcommand-yinya998[] @@ -301,9 +304,8 @@ Format1: `photo INDEX clear`+ **** * The index refers to the index number shown in the most recent listing. -* The index must be a positive integer 1, 2, 3, ... +* The index *must be a positive integer* 1, 2, 3, ... * The given path must be a valid image path. -* The size of the photo should be smaller than 20MB. **** Examples: @@ -312,11 +314,9 @@ Examples: `photo 3 /users/alice/desktop/photo.png` (in mac) + `photo 3 C:\Users\william\Desktop\photo.jpg` (in windows) + Adds photo to the 3rd person in the UniLA. + -`photo 3 clear` + +`photo 3 clear` (in mac) + Clear photo to the 3rd person in the UniLA. Photo is set to the default photo. -[TIP] -The added photo will be copied to the program. Thus, if you move, rename or delete the photo in the input path, UniLA will not be affected. // end::photocommand-yinya998[] @@ -463,10 +463,14 @@ Edits the venue of the 2nd event to be `com2 level4`. // tag::findEcommand-yinya998[] === Locating events by any field: `findE` -Finds events whose fields contain any of the given keywords. -User can search with or without prefix. When search without prefix, any event whose fields contain any keywords will be returned. When search with prefix, event which contains all keywords in the corresponding fields will be returned. +There are three search pattern for `findE` command. -Format1: `find KEYWORD [MORE_KEYWORDS]` + +* * 1. Finds events whose fields contain any of the given keywords. + +User can search with or without prefix. +When search without prefix, any events whose fields contain any keywords will be returned. +When search with prefix, event which contains all keywords in the corresponding fields will be returned. + +Format1: `find KEYWORD [MORE_KEYWORDS]` Format2: `find prefix/KEYWORD, [MORE KEYWORDS]` **** @@ -479,18 +483,18 @@ Format2: `find prefix/KEYWORD, [MORE KEYWORDS]` Examples: -* `findE google` + -Returns any events having fields contain keywords `meeting`. For example, event whose name is 'Google talk' or event whose venue is 'group meeting' will be returned. +* `findE meeting` + +Returns any events having fields contain keywords `meeting`. For example, events 'company meeting' and 'group meeting' will be returned. * `findE pgp library` + Returns any events having fields contain keywords `pgp` or `library`. For example, events with venue 'pgp' or 'central library'. * `findE l/important` + Returns any event having label contains keyword `important`. -There are two sub command of `findE` command which are `findE time/` and `findE duration/`: + -*1. `findE time/` finds events whose starting date before, equal to or after the searching date. Alternatively user can use ytd, today or tmr to search for events whose starting date is yesterday, today or tomorrow.* +There are two sub command of `findE` command which is `findE time/` and `findE duration/`: +* * 2. `findE time/` finds events whose starting date before, equal to or after the searching date. Alternatively user can use ytd, today or tmr to search for events whose starting date is yesterday, today or tomorrow. -Format3: `findE time/operatorDATE` + +Format3: `findE time/operatorDATE` Format4: `findE time/alias(ytd, today or tmr)` **** @@ -502,15 +506,17 @@ Format4: `findE time/alias(ytd, today or tmr)` Examples: -* `findE time/>2019-04-01` + -Returns all the events whose starting dates are after 2019,4,1 * `findE time/tmr` + Returns all the events start in tomorrow +* `findE time/<2019-04-30` + +Returns all the events whose starting dates are before 2019,4,30 +* `findE time/=2019–04-01` + +Returns all the events whose starting dates are 2019,4,30 -*3. `findE duration/` finds events whose duration is smaller, equal to or larger than the searching period.* +* * 3. `findE duration/` finds events whose duration is smaller, equal to or larger than the searching period -Format5: `findE duration/operatorHOURS` +Format4: `findE duration/operatorHOURS` **** * operator should be of type ‘<‘, ‘=‘ or ‘>’ diff --git a/docs/team/yinya998.adoc b/docs/team/yinya998.adoc index 8d9538c540c7..523ccf6096a6 100644 --- a/docs/team/yinya998.adoc +++ b/docs/team/yinya998.adoc @@ -14,15 +14,15 @@ UniLA is a desktop utilities application designed for typing oriented university == Summary of contributions -* *Major enhancement*: upgrade *find command* and implement *findE command* - -** What it does: These two commands support different search patterns. `find` command allows the user to search for people in contact list easily. User can search a person through exact keyword match, fuzzy keyword match and wildcard keyword match. -The `findE` command allows the user to search for events in event list. User can search an event through exact keyword match, search the event before, happens on or after certain date, and search the event with a certain duration. +* *Major enhancement*: upgrade *find command and implement *findE to support different search patterns in searching contact list and event list* +** What it does: The `find` command allows the user to search for a person in contact list easily. User can search a person through exact keyword match, fuzzy keyword match or wildcard keyword match. +The `findE` command allows the user to search for an event in contact list. User can search an event through exact keyword match, search the event on today, tomorrow and yesterday, and search the event with a certain duration. ** Justification: This feature is significant and efficient for user to manage a large list of contacts and events. -** Highlights: The enhancement and implementation involves reorganizing parse class and adding new predicates classes. The implementation is challenging because different search pattern is used and optimal algorithm is chosen after detailed analysis of the alternatives. -** Credits: levenshtein distance is used to calculate similarity between keywords. [https://www.cnblogs.com/ivanyb/archive/2011/11/25/2263356.html[Original Blogger]] +** Highlights: The enhancement and implementation involves reorganizing parse class and adding new predicates and several other class. The implementation is challenging because different search pattern is used and optimal algorithm is chosen after detailed analysis of the alternatives. +** Credits: levenshtein distance is used to calculate similarity between keywords. +[https://www.cnblogs.com/ivanyb/archive/2011/11/25/2263356.html[Original Blogger]] -* *Minor enhancement*: + +* *Minor enhancement*: **Implement photo command which allows user to add photo to the person in the contact list. **Implement personInfo fxml to display personal information on contact list. @@ -33,12 +33,10 @@ The `findE` command allows the user to search for events in event list. User can ** Project Management: *** Setup netlify test +*** Managed releases `v1.2` on GitHub *** Added issues to issue tracker -*** Updated User Guide, Developer Guide, About Us pages -*** Helped teammates with their problems ????? -** Community: -*** PRs reviewed (with non-trivial review comments): https://github.com/CS2103-AY1819S2-W16-1/main/pull/117[#117], https://github.com/CS2103-AY1819S2-W16-1/main/pull/210[#210] +*** PRs reviewed (with non-trivial review comments): https://github.com/CS2103-AY1819S2-W16-1/main/pull/117[#117] *** Reported bugs and suggestions for other teams in the class (examples: https://github.com[1], https://github.com[2], https://github.com[3]) diff --git a/src/main/java/seedu/address/commons/util/StringUtil.java b/src/main/java/seedu/address/commons/util/StringUtil.java index a604bf9df5e9..6acf1a1fee7b 100644 --- a/src/main/java/seedu/address/commons/util/StringUtil.java +++ b/src/main/java/seedu/address/commons/util/StringUtil.java @@ -47,7 +47,7 @@ public static boolean containsWordIgnoreCase(String sentence, String word) { * * @param sentence * @param word - * @return true is fuzzysearch is matched + * @return */ public static boolean matchFuzzySearch(String sentence, String word) { requireNonNull(sentence); @@ -70,11 +70,11 @@ public static boolean matchFuzzySearch(String sentence, String word) { * * @param str1 * @param str2 - * @return similarity of two strings + * @return */ public static double similarity(String str1, String str2) { try { - double levenshteinDistance = (double) getLevenshteinDistance(str1, str2); + double levenshteinDistance = (double) findLevenshteinDistance(str1, str2); return (1 - levenshteinDistance / (double) Math.max(str1.length(), str2.length())); } catch (Exception e) { return 0.1; @@ -86,7 +86,7 @@ public static double similarity(String str1, String str2) { * * @param sentence * @param word - * @return true is wildcard search is matched + * @return */ public static boolean matchWildcardSearch(String sentence, String word) { requireNonNull(sentence); @@ -105,7 +105,7 @@ public static boolean matchWildcardSearch(String sentence, String word) { } /** - * wildcard match. * matched any number of a-z,0-9. + * wildcard match. * * @param sentence * @param word @@ -120,7 +120,7 @@ public static boolean match(String sentence, String word) { } /** - * get min of three numbers + * get min similarity. * * @param one * @param two @@ -139,13 +139,13 @@ private static int min(int one, int two, int three) { } /** - * get Levenshtein distance. + * Levenshtein distance. * * @param str1 * @param str2 - * @return levenshtein distance of two strings + * @return */ - public static int getLevenshteinDistance(String str1, String str2) { + public static int findLevenshteinDistance(String str1, String str2) { int n = str1.length(); int m = str2.length(); int i; diff --git a/src/main/java/seedu/address/logic/commands/PhotoCommand.java b/src/main/java/seedu/address/logic/commands/PhotoCommand.java index 98458dcda9a8..9ad9348b42c1 100644 --- a/src/main/java/seedu/address/logic/commands/PhotoCommand.java +++ b/src/main/java/seedu/address/logic/commands/PhotoCommand.java @@ -51,7 +51,7 @@ public class PhotoCommand extends Command { public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds photo to the person identified by the index number used in the last person listing.\n" + "Parameters: INDEX PHOTO_PATH\n" - + "Example: " + COMMAND_WORD + " 2 /users/alice/desktop/photo.jpeg"; + + "Example: " + COMMAND_WORD + " 3 Myphoto.png"; public static final String MESSAGE_INVALID_PHOTOPATH = "The path of the photo is invalid"; public static final String MESSAGE_SIZE_EXCEED = "The size of the photo should below 20MB"; public static final String MESSAGE_FILE_NOT_IMAGE = "The file is not an image"; @@ -110,20 +110,33 @@ public CommandResult execute(Model model, CommandHistory history, WindowViewStat String path = personToEdit.getPhoto().getPath(); File file = new File(path); file.delete(); + + } else { if (!isValidPhotoPath(photo.getPath())) { return new CommandResult(MESSAGE_INVALID_PHOTOPATH); } + + File f = new File(photo.getPath()); + double sizeInMb = ((double) f.length()) / 1024 / 1024; + if (sizeInMb > 20) { + return new CommandResult(MESSAGE_SIZE_EXCEED); + } + if (!isImage(photo.getPath())) { return new CommandResult(MESSAGE_FILE_NOT_IMAGE); } - if (!isPhotoSizeWithinRange(photo.getPath())) { - return new CommandResult(MESSAGE_SIZE_EXCEED); - } + String user = System.getProperty("user.name"); + String dir = "data/"; + //String dir = "src/main/resources/images/userPhoto/"; String copyPath = FileUtil.copyFile(photo.getPath(), String.format(dir, user)); photo.setPath(copyPath); + + //String dir = "src/main/resources/images/userPhoto/"; + //String copyPath = FileUtil.copyFile(photo.getPath(), dir); + //photo.setPath(copyPath); } editPersonDescriptor.setPhoto(photo); @@ -137,10 +150,10 @@ public CommandResult execute(Model model, CommandHistory history, WindowViewStat model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS); model.commitAddressBook(); - if (photo.getPath().equals(DEFAULT_PHOTOPATH)) { - return new CommandResult(MESSAGE_CLEAR_PHOTO_SUCCESS); - } else { + if (!photo.getPath().equals(DEFAULT_PHOTOPATH)) { return new CommandResult(String.format(MESSAGE_ADD_PHOTO_SUCCESS, photo)); + } else { + return new CommandResult(MESSAGE_CLEAR_PHOTO_SUCCESS); } } catch (IOException e) { @@ -165,32 +178,20 @@ public static boolean isImage(String pathName) { } /** - * check path whether or not valid. + * checking path whether or not valid. * - * @param pathName + * @param trimmedPhoto * @return */ - public static boolean isValidPhotoPath(String pathName) { - if (pathName.equals("data/DEFAULT_PHOTO.png")) { + public static boolean isValidPhotoPath(String trimmedPhoto) { + if (trimmedPhoto.equals("data/DEFAULT_PHOTO.png")) { return true; } - requireNonNull(pathName); - File f = new File(pathName); + requireNonNull(trimmedPhoto); + File f = new File(trimmedPhoto); return f.exists(); } - /** - * check the size of the file is within range - * - * @param pathName - * @return - */ - public static boolean isPhotoSizeWithinRange(String pathName) { - File file = new File(pathName); - double sizeInMb = ((double) file.length()) / 1024 / 1024; - return sizeInMb < 20; - } - /** * create person object. * diff --git a/src/main/java/seedu/address/model/person/Photo.java b/src/main/java/seedu/address/model/person/Photo.java index f1221f1a866c..a07a1c41698e 100644 --- a/src/main/java/seedu/address/model/person/Photo.java +++ b/src/main/java/seedu/address/model/person/Photo.java @@ -8,7 +8,7 @@ * Represents a Photo in the address book. */ public class Photo { - public static final String MESSAGE_CONSTRAINTS = "Cannot add photo to person"; + public static final String MESSAGE_CONSTRAINTS = "Invalid path of photo"; public static final String DEFAULT_PHOTOPATH = "data/DEFAULT_PHOTO.png"; // file path of image private String path; diff --git a/src/main/java/seedu/address/model/util/SampleDataUtil.java b/src/main/java/seedu/address/model/util/SampleDataUtil.java index 927ef3c44a2f..712a365839e2 100644 --- a/src/main/java/seedu/address/model/util/SampleDataUtil.java +++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java @@ -46,30 +46,26 @@ public static Person[] getSamplePersons() { new Photo("data/DEFAULT_PHOTO.png"), getTagSet("victory")), new Person(new Name("Trump Clinton"), new Phone("92624417"), new Email("trumpcli@usa.com"), - new Address("pgp, blk764, #13-07"), + new Address("pgp, bik764, #13-07"), new Photo("data/DEFAULT_PHOTO.png"), getTagSet("owesMoney")), - new Person(new Name("Alice Cullen"), new Phone("91251313"), new Email("alice@gmail.com"), - new Address("ntu, blk56, #09-08"), - new Photo("data/DEFAULT_PHOTO.png"), - getTagSet("teammate")), }; } public static Event[] getSampleEvent() { return new Event[]{ - new Event(new seedu.address.model.event.Name("Google talk"), new Description("info session"), + new Event(new seedu.address.model.event.Name("Google talk"), new Description("Google info session"), new Venue("com1 level2"), new DateTime("2019-03-12 14:30:00"), new DateTime("2019-03-25 16:00:00"), new Label("important")), new Event(new seedu.address.model.event.Name("CS2103 project meeting"), new Description("quick meeting"), - new Venue("central library"), new DateTime("2019-04-16 16:00:00"), - new DateTime("2019-04-16 17:00:00"), new Label("urgent")), + new Venue("central library"), new DateTime("2019-04-04 16:00:00"), + new DateTime("2019-04-04 17:00:00"), new Label("urgent")), new Event(new seedu.address.model.event.Name("wine appreciation"), new Description("workshop"), - new Venue("pgp blk78"), new DateTime("2019-04-17 15:00:00"), - new DateTime("2019-04-17 17:00:00"), new Label("fun")), + new Venue("pgp blk78"), new DateTime("2019-04-05 15:00:00"), + new DateTime("2019-04-05 17:00:00"), new Label("fun")), new Event(new seedu.address.model.event.Name("Sea Interview"), new Description("Software engineering"), - new Venue("google building"), new DateTime("2019-04-18 10:00:00"), - new DateTime("2019-04-18 13:00:00"), new Label("urgent")), + new Venue("marina bay"), new DateTime("2019-04-06 10:00:00"), + new DateTime("2019-04-06 13:00:00"), new Label("urgent")), new Event(new seedu.address.model.event.Name("Biz presentation"), new Description("CCA"), new Venue("LT13"), new DateTime("2019-05-10 09:30:00"), new DateTime("2019-05-10 11:00:00"), new Label("urgent")),