User Guide
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
-
Features
- Viewing help:
help
- Adding a stall:
sadd
- Adding a review:
radd
- Listing all stalls:
slist
- Listing all reviews:
rlist
- Deleting a stall:
sdel
- Deleting a review:
rdel
- Editing a stall:
sedit
- Editing a review:
redit
- Finding a stall:
sfind
- Finding a review:
rfind
- Sorting stall list:
ssort
- Sorting review list:
rsort
- Clearing all entries:
clear
- Exiting the program:
exit
- Duplicate checking
- Saving the data
- Editing the data file
- Viewing help:
- FAQ
- Command summary
- Accepted command arguments
- Stored data format
- Future features (unimplemented)
Quick start
-
Ensure you have Java
11
or above installed in your Computer. -
Download the latest
FoodWhere.jar
from here. -
Copy the file to the folder you want to use as the home folder for your application.
-
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.
-
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. -
sadd
n/John Doe Eatery a/Blk 123 Bedok South t/halal
: Adds a food stall named John Doe Eatery to the list of food stalls. -
sdel
3
: Deletes the 3rd food stall shown in the current list. -
exit
: Exits the app.
-
-
Refer to the Features below for details of each command.
Features
Notes about the command format:
-
Words in
UPPER_CASE
are the parameters to be supplied by the user.
e.g. insadd n/NAME a/ADDRESS
,NAME
andADDRESS
are parameters which can be used assadd n/John Doe Eatery a/ABC Ave
. -
Items in square brackets are optional.
e.gn/NAME [t/TAGS]
can be used asn/John Doe Eatery t/opendaily
or asn/John Doe
. -
Items with
…
after them can be used multiple times including zero times.
e.g.[t/TAGS]…
can be used ast/opendaily
,t/petfriendly
etc. -
Parameters can be in any order.
e.g. if the command specifiesn/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 specifyn/John Doe Eatery n/Jane Doe Eatery
, onlyn/Jane Doe Eatery
will be taken. -
Extraneous parameters for commands that do not take in parameters (such as
help
,slist
,rlist
,exit
andclear
) will be ignored.
e.g. if the command specifieshelp 123
, it will be interpreted ashelp
. -
Extraneous parameters for commands that take in parameters (such as
sadd
,rdel
,sedit
andrsort
) 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 commandssort name n/Eatery
fails as the preamble is interpreted to bename n/Eatery
, which is not a valid criterion.
e.g. a commandsadd n/Finnish Delights p/Alex Jones a/Blk 23 North View Road
fails as the name is interpreted to beFinnish 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 commandsadd
, 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.
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 beJohn Doe Eatery
andBlk 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 beJane 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 beFood was decent.
and3
respectively. -
redit 2 d/20/09/2022
edits the date of the 2nd review to be20/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 matchEatery
- The order of the keywords does not matter e.g.
Johns Eatery
will matchEatery Johns
- Using
n/
andt/
will search name and tag fields of stall respectively. - Only full words will be matched e.g.
Joh
will not matchJohn
,table
ortableFor
will not matchtableFor4
- Stalls matching at least one keyword in each respective field will be returned (i.e. OR search) e.g.
n/John Doe
will returnJohn Eatery
,Doe Restaurant
Examples:
-
sfind n/eatery
returnsJohns eatery
andDoe eatery
. -
sfind t/opensDaily veryNice
returns all stalls that have the tagopensdaily
ORverynice
. -
sfind n/eatery t/opensDaily
returns all stalls where the name includeseatery
OR has the tagopensdaily
.
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 matchEatery
- The order of the keywords does not matter e.g.
Johns Eatery
will matchEatery Johns
- Using
n/
andt/
will search name and tag fields of review respectively. - Only full words will be matched e.g.
Joh
will not matchJohn
,table
ortableFor
will not matchtableFor4
- Reviews matching at least one keyword in each respective field will be returned (i.e. OR search) e.g.
n/John Doe
will returnJohn Eatery
,Doe Restaurant
Examples:
-
rfind n/eatery
returns reviewsJohns eatery
andDoe eatery
. -
rfind t/opensDaily veryNice
returns all reviews that have the tagopensdaily
ORverynice
. -
rfind n/eatery t/opensDaily
returns all reviews where the name includeseatery
OR has the tagopensdaily
.
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.

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.

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