FoodWhere (FW) is a desktop app for managing food reviews, optimized for use via a Command Line Interface (CLI) while still having the benefits of a Graphical User Interface (GUI). FW can get your tasks done faster than traditional GUI apps if you can type fast.


Quick start

  1. Ensure you have Java 11 or above installed in your Computer.

  2. Download the latest FoodWhere.jar from here.

  3. Copy the file to the folder you want to use as the home folder for your application.

  4. On Windows and Mac, double-click the file to start the app. The application can also be started by running java -jar FoodWhere.jar in the terminal. The GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.
    Ui

  5. Type the command in the command box and press Enter to execute it. e.g. typing help and pressing Enter will open the help window.
    Some example commands you can try:

    • slist : Lists all food stalls.

    • saddn/John Doe Eatery a/Blk 123 Bedok South t/halal: Adds a food stall named John Doe Eatery to the list of food stalls.

    • sdel3 : Deletes the 3rd food stall shown in the current list.

    • exit : Exits the app.

  6. Refer to the Features below for details of each command.


Features

:information_source: Notes about the command format:

  • Words in UPPER_CASE are the parameters to be supplied by the user.
    e.g. in sadd n/NAME a/ADDRESS, NAME and ADDRESS are parameters which can be used as sadd n/John Doe Eatery a/ABC Ave.

  • Items in square brackets are optional.
    e.g n/NAME [t/TAGS] can be used as n/John Doe Eatery t/opendaily or as n/John Doe.

  • Items with ​ after them can be used multiple times including zero times.
    e.g. [t/TAGS]…​ can be used as   (i.e. 0 times), t/opendaily, t/petfriendly etc.

  • Parameters can be in any order.
    e.g. if the command specifies n/NAME a/ADDRESS, a/ADDRESS n/NAME is also acceptable.

  • If a parameter is expected only once in the command but you specified it multiple times, only the last occurrence of the parameter will be taken unless specified otherwise.
    e.g. if you specify n/John Doe Eatery n/Jane Doe Eatery, only n/Jane Doe Eatery will be taken.

  • Extraneous parameters for commands that do not take in parameters (such as help, slist, rlist, exit and clear) will be ignored.
    e.g. if the command specifies help 123, it will be interpreted as help.

  • Extraneous parameters for commands that take in parameters (such as sadd, rdel, sedit and rsort) will be interpreted as part of the command preamble if there are no parameters specified before it, and part of the previous parameter otherwise.
    e.g. a command ssort name n/Eatery fails as the preamble is interpreted to be name n/Eatery, which is not a valid criterion.
    e.g. a command sadd n/Finnish Delights p/Alex Jones a/Blk 23 North View Road fails as the name is interpreted to be Finnish Delights p/Alex Jones, which is not a valid name as it contains a slash.

  • Not all mistakes may be reported for an invalid command.
    e.g. given an invalid command sadd, the user would be informed of one of the mistakes, in this case, missing name or missing address. There is no guarantee which mistake will be reported if multiple mistakes are present.

Viewing help: help

Shows a message explaining how to access the help page.

help message

Format: help

Adding a stall: sadd

Adds a stall.

Format: sadd n/NAME a/ADDRESS [t/TAGS]…

Example:

  • sadd n/John Doe Eatery a/Blk 123 Bedok South t/verynice

Adding a review: radd

Adds a review.

Format: radd s/STALL_INDEX d/DATE c/CONTENT r/RATING [t/TAGS]…

Example:

  • radd s/3 d/20/09/2022 c/The food was good, the chicken rice was fresh. r/4

Listing all stalls: slist

Shows a list of all stalls in the application.

Format: slist

Listing all reviews: rlist

Shows a list of all reviews in the application.

Format: rlist

Deleting a stall: sdel

Deletes the specified stall from the application at the specified STALL_INDEX.

Format: sdel STALL_INDEX

  • The index refers to the index number shown in the displayed stalls list.
  • The index must be a positive integer 1, 2, 3, …​

Example:

  • sdel 2 deletes the 2nd stall in the application.

Deleting a review: rdel

Deletes a review at the specified REVIEW_INDEX.

Format: rdel REVIEW_INDEX

  • The index refers to the index number shown in the displayed reviews list.
  • The index must be a positive integer 1, 2, 3, …​

Example:

  • rdel 2 deletes the 2nd review in the application.

Editing a stall: sedit

Edits an existing stall at the specified STALL_INDEX.

Format: sedit STALL_INDEX [n/NAME] [a/ADDRESS] [t/EDIT_TAG]…

  • The index refers to the index number shown in the displayed stalls list.
  • The index must be a positive integer 1, 2, 3, …​
  • Editing stalls is flexible in FoodWhere. For example, you can update just the stall name or perhaps just the address and tags of the stall only.
  • At least one of the optional fields must be provided.
  • Existing values will be updated to the input values.
  • When editing tags, the existing tags of the stall will be removed i.e adding of tags is not cumulative
  • You can remove all of the stall’s tags by using the t/ parameter exactly once.
  • All reviews that are associated to the edited stall will be updated to reflect the new changes of the stall.
  • No 2 stalls should have the same name and address.
  • If the name and/or address is updated, the previous reviews of the stall would be added to the end of the list of reviews.

Examples:

  • sedit 1 n/John Doe Eatery a/Blk 123 Bedok South edits the name and address of the 1st stall to be John Doe Eatery and Blk 123 Bedok South respectively. All reviews that are associated to the 1st stall will be updated to reflect the new changes of the stall and moved to the back of the review list.
  • sedit 2 n/Jane Doe Bakery edits the name of the 2nd stall to be Jane Doe Bakery. All reviews that are associated to the 2nd stall will be updated to reflect the new changes of the stall and moved to the back of the review list.
  • sedit 2 t/ Clears all existing tags of the 2nd stall.

Editing a review: redit

Edits an existing review at the specified REVIEW_INDEX.

Format: redit REVIEW_INDEX [d/DATE] [c/CONTENT] [r/RATING] [t/EDIT_TAG]…

  • The index refers to the index number shown in the displayed reviews list.
  • The index must be a positive integer 1, 2, 3, …​
  • Editing reviews is flexible in FoodWhere. For example, you can update just the review content or perhaps just the date and rating of the review only.
  • At least one of the optional fields must be provided.
  • Existing values will be updated to the input values.
  • When editing tags, the existing tags of the review will be removed i.e adding of tags is not cumulative
  • You can remove all of the review’s tags by using the t/ parameter exactly once.
  • No 2 reviews should have the same date, content, rating and tags.
  • The previous review would be deleted and the edited version is added to the end of the list of reviews.

Examples:

  • redit 1 c/Food was decent. r/3 edits the content and rating of the 1st review to be Food was decent. and 3 respectively.
  • redit 2 d/20/09/2022 edits the date of the 2nd review to be 20/09/2022.
  • redit 2 t/ Clears all existing tags of the 2nd review.

Finding a stall: sfind

Finds stalls whose names or tags contain any of the given alphanumeric keywords.

Format: sfind n/[KEYWORD]… t/[KEYWORD]…

  • The search is case-insensitive e.g. eatery will match Eatery
  • The order of the keywords does not matter e.g. Johns Eatery will match Eatery Johns
  • Using n/ and t/ will search name and tag fields of stall respectively.
  • Only full words will be matched e.g. Joh will not match John, table or tableFor will not match tableFor4
  • Stalls matching at least one keyword in each respective field will be returned (i.e. OR search) e.g. n/John Doe will return John Eatery, Doe Restaurant

Examples:

  • sfind n/eatery returns Johns eatery and Doe eatery.
  • sfind t/opensDaily veryNice returns all stalls that have the tag opensdaily OR verynice.
  • sfind n/eatery t/opensDaily returns all stalls where the name includes eatery OR has the tag opensdaily.

Finding a review: rfind

Finds reviews whose names or tags contain any of the given alphanumeric keywords.

Format: rfind n/[KEYWORD]… t/[KEYWORD]…

  • The search is case-insensitive e.g. eatery will match Eatery
  • The order of the keywords does not matter e.g. Johns Eatery will match Eatery Johns
  • Using n/ and t/ will search name and tag fields of review respectively.
  • Only full words will be matched e.g. Joh will not match John, table or tableFor will not match tableFor4
  • Reviews matching at least one keyword in each respective field will be returned (i.e. OR search) e.g. n/John Doe will return John Eatery, Doe Restaurant

Examples:

  • rfind n/eatery returns reviews Johns eatery and Doe eatery.
  • rfind t/opensDaily veryNice returns all reviews that have the tag opensdaily OR verynice.
  • rfind n/eatery t/opensDaily returns all reviews where the name includes eatery OR has the tag opensdaily.

Sorting stall list: ssort

Sorts the stall list by the specified criterion.

Format: ssort CRITERION

  • The criterion must be provided and should not be blank.
  • The command will fail if two or more criteria are provided or any other criterion not listed is provided.
  • Below are the supported sorting criteria:
Criterion Notes
name Sorts from 0 to 9, then A to Z
reversedname Sorts from Z to A, then 9 to 0

Example:

  • ssort name

Sorting review list: rsort

Sorts the review list by the specified criterion.

Format: rsort CRITERION

  • The criterion must be provided and should not be blank.
  • The command will fail if two or more criteria are provided or any other criterion not listed is provided.
  • Below are the supported sorting criteria:
Criterion Notes
name Sorts from 0 to 9, then A to Z
reversedname Sorts from Z to A, then 9 to 0
date Sorts from oldest to newest
reverseddate Sorts from newest to oldest
rating Sorts from lowest to highest
reversedrating Sorts from highest to lowest

Example:

  • rsort name

Clearing all entries: clear

Clears FoodWhere by removing all stalls and the associated reviews.

Format: clear

Exiting the program: exit

Exits the program.

Format: exit

Duplicate checking

FoodWhere checks for duplicates to a limited extent.

  • Since food stalls may have generic names, stall duplicates are checked via name and address, that is if both the names and address are the same (case-insensitive).
    • e.g. The food stall named “PartyOuting” at address “North Street” and the food stall named “PartYouTing” at address “north street” are the same stall.
    • e.g. The food stall named “Mixed Veg Rice” at address “North Street” and the food stall named “Mixed Veg Rice” at address “South Street” are different stalls.
  • Reviews are considered duplicates if they are on the same stall and have the same content (case-sensitive), rating, date and set of tags.

Saving the data

FoodWhere data is saved in the hard disk automatically after any command that changes the data. There is no need to save manually.

:exclamation: Caution: If there are no commands entered, simply exiting the program will not generate a new JSON file if the file is not present.

Editing the data file

FoodWhere data are saved as a JSON file [JAR file location]/data/foodwhere.json. Advanced users are welcome to update data directly by editing that data file while FoodWhere is closed. The allowed format for the data file is outlined in the Developer Guide.

:exclamation: Caution: Should FoodWhere be unable to interpret the data file, FoodWhere will start with no data. Close FoodWhere without using the exit command to avoid overwriting the data file.

FAQ

Q: How do I transfer my data to another computer?
A: Install and run the app on the other computer. Overwrite the data file it creates with the foodwhere.json file that contains the data of your previous FoodWhere application.

Q: How do I backup my data?
A: Backup the foodwhere.json file in another directory.


Command summary

Action Format, Examples
exit exit
help help
clear clear
radd radd s/STALL_INDEX d/DATE c/CONTENT r/RATING [t/TAGS]…
e.g., radd s/3 d/20/09/2022 c/Great food! r/4
rdel rdel REVIEW_INDEX
redit redit REVIEW_INDEX [d/DATE] [c/CONTENT] [r/RATING] [t/EDIT_TAG]…
e.g., redit 1 d/20/09/2022 c/Great food!
rlist rlist
rfind rfind n/[KEYWORD]… t/[KEYWORD]…
e.g., rfind n/eatery
rsort rsort CRITERION
e.g., rsort rating
sadd sadd n/NAME a/ADDRESS [t/TAGS]…
e.g., sadd n/John Chicken Rice a/Blk 123 Bedok South
sdel sdel STALL_INDEX
sedit sedit STALL_INDEX [n/NAME] [a/ADDRESS] [t/EDIT_TAG]…
e.g., sedit 1 n/John Chicken Rice
slist slist
sfind sfind n/[KEYWORD]… t/[KEYWORD]…
e.g., sfind n/eatery
ssort ssort CRITERION
e.g., ssort reversedname

Accepted command arguments

Argument Format
ADDRESS Any nonempty ASCII text, case insensitive
CONTENT Any nonempty ASCII text
CRITERION Valid criteria are stated at the sfind, rfind commands
DATE A date in the format DD/MM/YYYY, D/MM/YYYY, DD/M/YYYY, D/M/YYYY, or with dashes instead of slashes
EDIT_TAG A possibly empty alphanumeric token without spaces, case insensitive
KEYWORD A nonempty alphanumeric token without spaces, case insensitive
NAME A nonempty alphanumeric string with spaces, case insensitive
RATING An integer from 0 to 5, inclusive
REVIEW_INDEX A positive integer from 1 to the number of reviews in the review list, inclusive
STALL_INDEX A positive integer from 1 to the number of stalls in the stall list, inclusive
TAGS A nonempty alphanumeric token without spaces, case insensitive

Stored data format

This table highlights how the various data of the stalls and reviews are stored in the application or data file. Note that this is not the only valid way the data can be stored in the data file.

Data field Format
Address Any nonempty ASCII text
Content Any nonempty ASCII text
Date DD/MM/YYYY
Name Nonempty alphanumeric string with spaces, no repeated spaces, capitalization preserved
Rating An integer from 0 to 5, inclusive
Tag Nonempty lowercase alphanumeric token without spaces

Future features (unimplemented)

Attempt to use the following features could result in user confusion, an error message or accidentally typing in an unexpected valid command.

  • Copying stall/review data using commands to allow them to be pasted in an external application.
    • This would need to be handled for each field, which would need significant additional effort.
  • Showing reviews/stalls that match more of the sfind/rfind search terms first
  • Finding reviews by rating
  • Finding reviews/stalls by address
  • A second window that gives more space for long text to be viewed completely
  • Undo previous command
  • Smarter error detection which detects the first error a user makes in a command
  • Clearing all reviews only