diff --git a/src/main/java/com/google/sps/data/Meal.java b/src/main/java/com/google/sps/data/Meal.java index 3027684..c3afcac 100644 --- a/src/main/java/com/google/sps/data/Meal.java +++ b/src/main/java/com/google/sps/data/Meal.java @@ -15,6 +15,7 @@ package com.google.sps.data; import java.util.ArrayList; +import java.util.List; public class Meal { private final Long id; @@ -50,4 +51,28 @@ public ArrayList getIngredients() { public String getType() { return this.type; } + + /** + * Counts the number of keywords that are matching in recipe. + * @param params list of strings with keywords, that describe search request. + * @return amount of occurrences of keywords from params in this meal. + */ + public int getFrequency(List params) { + int frequency = 0; + for (String param : params) { + if (title.contains(param) || + description.contains(param) || + type.contains(param)) { + frequency++; + continue; + } + for (String ingredient : ingredients) { + if (ingredient.contains(param)) { + frequency++; + continue; + } + } + } + return frequency; + } } diff --git a/src/main/java/com/google/sps/servlets/MealServlet.java b/src/main/java/com/google/sps/servlets/MealServlet.java index a926a32..f9c145e 100644 --- a/src/main/java/com/google/sps/servlets/MealServlet.java +++ b/src/main/java/com/google/sps/servlets/MealServlet.java @@ -34,6 +34,7 @@ import java.util.Collection; import java.util.List; import java.util.Random; +import java.util.TreeMap; import java.util.stream.Collectors; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -97,9 +98,19 @@ private void getMealList(HttpServletRequest request, HttpServletResponse respons // Every object Meal adds if it contains at least one keyword in at least one field // (type, title, description, ingredients). List searchedMeal = new ArrayList<>(); + TreeMap> sortedMeal = new TreeMap<>(); for (Meal meal : meals) { - if (isResultOfSearch(meal, params)) { - searchedMeal.add(meal); + int frequency = meal.getFrequency(params); + if (frequency > 0) { + sortedMeal.putIfAbsent(frequency, new ArrayList<>()); + List list = sortedMeal.get(frequency); + list.add(meal); + } + } + for (int key : sortedMeal.descendingKeySet()) { + List list = sortedMeal.get(key); + if (list != null) { + searchedMeal.addAll(list); } } response.setContentType("application/json"); @@ -187,25 +198,6 @@ private Meal pickRandomMeal(List mealList) { return (Meal)mealList.get(index); } - private Boolean isResultOfSearch(Meal meal, List params) { - for (String param : params) { - if (meal.getTitle().contains(param)) { - return true; - } - if (meal.getDescription().contains(param)) { - return true; - } - if (meal.getType().contains(param)) { - return true; - } - for (String ingredient : meal.getIngredients()) { - if (ingredient.contains(param)) { - return true; - } - } - } - return false; - } private String getParameter(HttpServletRequest request, String name, String defaultValue) { String value = request.getParameter(name); if (value == null) { diff --git a/src/test/java/com/google/sps/MealServletTest.java b/src/test/java/com/google/sps/MealServletTest.java index 8b142ee..f6c91aa 100644 --- a/src/test/java/com/google/sps/MealServletTest.java +++ b/src/test/java/com/google/sps/MealServletTest.java @@ -173,10 +173,11 @@ public void getMealListTest() throws IOException, ServletException { // Get a list of objects Meal from datastore by search request "potato onion". // (Check if meal that has both occurrences of searching keywords would be added only once). - // Expected result: a JSON String of list with one object MEAL_1. + // Expected result: a JSON String of list with objects in order: MEAL_1, PIZZA_2. @Test public void getMealListWithTwoKeyWordsTest() throws IOException, ServletException { DatastoreService ds = DatastoreServiceFactory.getDatastoreService(); + ds.put(DataConverter.createMealEntity(PIZZA_2)); ds.put(DataConverter.createMealEntity(MEAL_1)); ds.put(DataConverter.createMealEntity(MEAL_2)); @@ -188,6 +189,7 @@ public void getMealListWithTwoKeyWordsTest() throws IOException, ServletExceptio List meals = new ArrayList<>(); meals.add(MEAL_1); + meals.add(PIZZA_2); Gson gson = new Gson(); String expected = gson.toJson(meals); String actual = response.getContentAsString().trim();