Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add sort function #78

Merged
merged 3 commits into from
Mar 26, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/main/java/seedu/address/logic/LogicManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public CommandResult execute(String commandText) throws CommandException, ParseE
}

if (bookShelfModified) {
logger.info("Address book modified, saving to file.");
logger.info("Bookshelf modified, saving to file.");
try {
storage.saveBookShelf(model.getBookShelf());
} catch (IOException ioe) {
Expand Down
39 changes: 39 additions & 0 deletions src/main/java/seedu/address/logic/commands/SortBookCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package seedu.address.logic.commands;

import static java.util.Objects.requireNonNull;

import seedu.address.logic.CommandHistory;
import seedu.address.model.Model;

/**
* Sort all books in provided order.
*/
public class SortBookCommand extends Command {

public static final String COMMAND_WORD = "sortBook";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": sort all books in certain order"
+ "the specified keywords (case-insensitive).\n"
+ "Parameters: [st/TYPE]...[o/ORDER]...\n"
+ "Example: " + COMMAND_WORD + " st/rating o/asc";

public static final String MESSAGE_SUCCESS = "sorted successfully";

private final String type;

private final String order;

public SortBookCommand(String type, String order) {
this.type = type;
this.order = order;
}

@Override
public CommandResult execute(Model model, CommandHistory history) {
requireNonNull(model);

model.sortBook(type, order);
model.commitBookShelf();
return new CommandResult(MESSAGE_SUCCESS);
}
}
58 changes: 31 additions & 27 deletions src/main/java/seedu/address/logic/parser/BookShelfParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import seedu.address.logic.commands.ListReviewCommand;
import seedu.address.logic.commands.RedoCommand;
import seedu.address.logic.commands.SelectCommand;
import seedu.address.logic.commands.SortBookCommand;
import seedu.address.logic.commands.UndoCommand;
import seedu.address.logic.parser.exceptions.ParseException;

Expand Down Expand Up @@ -54,59 +55,62 @@ public Command parseCommand(String userInput) throws ParseException {
final String arguments = matcher.group("arguments");
switch (commandWord) {

case AddCommand.COMMAND_WORD:
return new AddCommandParser().parse(arguments);

case AddBookCommand.COMMAND_WORD:
return new AddBookCommandParser().parse(arguments);

case EditBookCommand.COMMAND_WORD:
return new EditBookCommandParser().parse(arguments);
case AddCommand.COMMAND_WORD:
return new AddCommandParser().parse(arguments);

case EditCommand.COMMAND_WORD:
return new EditCommandParser().parse(arguments);
case AddReviewCommand.COMMAND_WORD:
return new AddReviewCommandParser().parse(arguments);

case SelectCommand.COMMAND_WORD:
return new SelectCommandParser().parse(arguments);
case ClearCommand.COMMAND_WORD:
return new ClearCommand();

case DeleteBookCommand.COMMAND_WORD:
return new DeleteBookCommandParser().parse(arguments);

case AddReviewCommand.COMMAND_WORD:
return new AddReviewCommandParser().parse(arguments);

case DeleteCommand.COMMAND_WORD:
return new DeleteCommandParser().parse(arguments);

case ClearCommand.COMMAND_WORD:
return new ClearCommand();
case EditBookCommand.COMMAND_WORD:
return new EditBookCommandParser().parse(arguments);

case EditCommand.COMMAND_WORD:
return new EditCommandParser().parse(arguments);

case ExitCommand.COMMAND_WORD:
return new ExitCommand();

case FindCommand.COMMAND_WORD:
return new FindCommandParser().parse(arguments);

case ListCommand.COMMAND_WORD:
return new ListCommand();
case HelpCommand.COMMAND_WORD:
return new HelpCommand();

case HistoryCommand.COMMAND_WORD:
return new HistoryCommand();

case RedoCommand.COMMAND_WORD:
return new RedoCommand();

case ListBookCommand.COMMAND_WORD:
return new ListBookCommandParser().parse(arguments);

case ListCommand.COMMAND_WORD:
return new ListCommand();

case ListReviewCommand.COMMAND_WORD:
return new ListReviewCommandParser().parse(arguments);

case HistoryCommand.COMMAND_WORD:
return new HistoryCommand();

case ExitCommand.COMMAND_WORD:
return new ExitCommand();

case HelpCommand.COMMAND_WORD:
return new HelpCommand();

case UndoCommand.COMMAND_WORD:
return new UndoCommand();

case RedoCommand.COMMAND_WORD:
return new RedoCommand();
case SelectCommand.COMMAND_WORD:
return new SelectCommandParser().parse(arguments);

case SortBookCommand.COMMAND_WORD:
return new SortBookCommandParser().parse(arguments);

default:
throw new ParseException(MESSAGE_UNKNOWN_COMMAND);
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/seedu/address/logic/parser/CliSyntax.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,6 @@ public class CliSyntax {
public static final Prefix PREFIX_TAG = new Prefix("t/");
public static final Prefix PREFIX_REVIEW = new Prefix("r/");
public static final Prefix PREFIX_REVIEWTITLE = new Prefix("rt/");
public static final Prefix PREFIX_SORTTYPE = new Prefix("st/");
public static final Prefix PREFIX_ORDER = new Prefix("o/");
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package seedu.address.logic.parser;

import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
import static seedu.address.logic.parser.CliSyntax.PREFIX_ORDER;
import static seedu.address.logic.parser.CliSyntax.PREFIX_SORTTYPE;

import java.util.stream.Stream;

import seedu.address.logic.commands.SortBookCommand;
import seedu.address.logic.parser.exceptions.ParseException;


/**
* Parses input arguments and creates a new SortBookCommand object
*/
public class SortBookCommandParser implements Parser<SortBookCommand> {
/**
* Parses the given {@code String} of arguments in the context of the SortBookCommand
* and returns an SortBookCommand object for execution.
* @throws ParseException if the user input does not conform the expected format
*/
public SortBookCommand parse(String args) throws ParseException {
ArgumentMultimap argMultimap =
ArgumentTokenizer.tokenize(args, PREFIX_SORTTYPE, PREFIX_ORDER);

if (!arePrefixesPresent(argMultimap, PREFIX_SORTTYPE, PREFIX_ORDER)
|| !argMultimap.getPreamble().isEmpty()
&& (!argMultimap.getValue(PREFIX_ORDER).get().toUpperCase().equals("ASC")
|| !argMultimap.getValue(PREFIX_ORDER).get().toUpperCase().equals("DES"))) {
throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortBookCommand.MESSAGE_USAGE));
}

String sortType = argMultimap.getValue(PREFIX_SORTTYPE).get();
String orderType = argMultimap.getValue(PREFIX_ORDER).get();

return new SortBookCommand(sortType, orderType);
}

/**
* Returns true if none of the prefixes contains empty {@code Optional} values in the given
* {@code ArgumentMultimap}.
*/
private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {
return Stream.of(prefixes).allMatch(prefix -> argumentMultimap.getValue(prefix).isPresent());
}
}
17 changes: 17 additions & 0 deletions src/main/java/seedu/address/model/BookShelf.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public class BookShelf implements ReadOnlyBookShelf {
private final UniqueBookList books;
private final InvalidationListenerManager invalidationListenerManager = new InvalidationListenerManager();


/*
* The 'unusual' code block below is an non-static initialization block, sometimes used to avoid duplication
* between constructors. See https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
Expand Down Expand Up @@ -190,6 +191,22 @@ public void removeTag(Tag tag) {
}
}

/**
* Sort {@code books} in with {@code order}
* @param type
* @param order
* @throws Exception
*/

public void sort(String type, String order) {
try {
books.sortBooks(type, order);
} catch (Exception e) {
e.printStackTrace();
}
indicateModified();
}

@Override
public void addListener(InvalidationListener listener) {
invalidationListenerManager.addListener(listener);
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/seedu/address/model/Model.java
Original file line number Diff line number Diff line change
Expand Up @@ -185,4 +185,9 @@ public interface Model {
* Delete the tag{@code tag} of all contacts in the phone book
*/
void deleteTag(Tag tag);

/**
* Sort the Book list into different order
*/
void sortBook(String type, String order);
}
6 changes: 6 additions & 0 deletions src/main/java/seedu/address/model/ModelManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,12 @@ public void deleteTag(Tag tag) {
versionedBookShelf.removeTag(tag);
}

@Override
public void sortBook(String type, String order) {
versionedBookShelf.sort(type, order);
}


//=========== Filtered Person List Accessors =============================================================

/**
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/seedu/address/model/book/Book.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import seedu.address.model.tag.Tag;

/**
* Represents a Book in the address book.
* Represents a Book in the bookShelf.
* Guarantees: details are present and not null, field values are validated, immutable.
*/
public class Book {
Expand Down
45 changes: 44 additions & 1 deletion src/main/java/seedu/address/model/book/UniqueBookList.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static java.util.Objects.requireNonNull;
import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;

import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

Expand All @@ -25,7 +26,7 @@
*/
public class UniqueBookList implements Iterable<Book> {

private final ObservableList<Book> internalList = FXCollections.observableArrayList();
private ObservableList<Book> internalList = FXCollections.observableArrayList();
private final ObservableList<Book> internalUnmodifiableList =
FXCollections.unmodifiableObservableList(internalList);

Expand Down Expand Up @@ -98,6 +99,48 @@ public void setBooks(List<Book> books) {
internalList.setAll(books);
}

/**
* Sort the books with {@code type} in {@code order}.
* @param type sorting type
* @param order order of sorting
*/
public void sortBooks(String type, String order) throws Exception {
requireAllNonNull(type, order);
type = type.toUpperCase();
order = order.toUpperCase();

switch (type) {
case "AUTHOR":
if (order.equals("ASC")) {
internalList.sort(Comparator.comparing(a -> a.getAuthor().toString().toLowerCase()));
} else if (order.equals("DES")) {
internalList.sort((a, b)
-> b.getAuthor().toString().toLowerCase().compareTo(a.getAuthor().toString().toLowerCase()));
}
break;

case "NAME":
if (order.equals("ASC")) {
internalList.sort(Comparator.comparing(a -> a.getBookName().toString().toLowerCase()));
} else if (order.equals("DES")) {
internalList.sort((a, b)
-> b.getBookName().toString().toLowerCase().compareTo(a.getBookName().toString().toLowerCase()));
}
break;

case "RATING":
if (order.equals("ASC")) {
FXCollections.sort(internalList, Comparator.comparingInt(a -> Integer.valueOf(a.getRating().value)));
} else if (order.equals("DES")) {
FXCollections.sort(internalList, (a, b)
-> Integer.valueOf(b.getRating().value) - Integer.valueOf(a.getRating().value));
}
break;
default:
throw new Exception("Unknown sorting type");
}
}

/**
* Returns the backing list as an unmodifiable {@code ObservableList}.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,11 @@ public void setSelectedBook(Book book) {
public void deleteTag(Tag tag) {
throw new AssertionError("This method should not be called.");
}

@Override
public void sortBook(String type, String order) {
throw new AssertionError("This method should not be called.");
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,11 @@ public void setSelectedBook(Book book) {
public void deleteTag(Tag tag) {
throw new AssertionError("This method should not be called.");
}

@Override
public void sortBook(String type, String order) {
throw new AssertionError("This method should not be called.");
}
}

/**
Expand Down