package design.model.course_search; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import design.persistence.MasterDatabase; /* * Represents the state of our current search. */ public class CurrentSearchQuery { public static final CurrentSearchQuery INSTANCE = new CurrentSearchQuery(); MasterDatabase db = MasterDatabase.INSTANCE; private CourseList query = db.getCourseList(); private final List filters = new ArrayList(); // add a new filter public void addFilter(CourseSorter filter) { filters.add(filter); } // clear the filters public void clearFilters() { filters.clear(); } // print out the filters ( this is for the model checking used filters ) public String printFilters() { String filterResult = ""; // no filters? let the user know. if(filters.size() == 0) { return "nothing"; } for( CourseSorter f : filters) { filterResult += f.toString() + " --> "; } // very silly way of removing the last arrow from our filter list. it's kind of dumb but it works fine. filterResult = filterResult.substring(0, filterResult.length() - 5); filterResult += "\n"; return filterResult; } // get all the filters public List getFilters() { return filters; } // get our current query. public CourseList getQueryResult() { return query; } public void search(String searchQuery) { List courses = db.getCourseList().getCourses().stream() .filter(s -> s != null && s.toString().toLowerCase().contains(searchQuery.toLowerCase())) .collect(Collectors.toList()); // Start with filtered base CourseList current = new CourseList(); current.setCourses(courses); // Sequentially apply filters for (CourseSorter filter : filters) { current.setSorter(filter); current = current.groupByCurrentSorter(); // regroup after each } query = current; } }