From 8dda4998747342f67a59e4ed8d895be6a3694d6b Mon Sep 17 00:00:00 2001 From: sandatsian Date: Fri, 18 Sep 2020 16:33:21 +0000 Subject: [PATCH 1/6] Update search --- .../com/google/sps/servlets/MealServlet.java | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/google/sps/servlets/MealServlet.java b/src/main/java/com/google/sps/servlets/MealServlet.java index a926a32..a724acd 100644 --- a/src/main/java/com/google/sps/servlets/MealServlet.java +++ b/src/main/java/com/google/sps/servlets/MealServlet.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Random; import java.util.stream.Collectors; @@ -97,8 +98,24 @@ 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<>(); + HashMap> sortedMeal = new HashMap<>(); for (Meal meal : meals) { - if (isResultOfSearch(meal, params)) { + int count = isResultOfSearch(meal, params); + if (count > 0) { + List list = new ArrayList<>(); + if (sortedMeal.get(count) != null) { + list = sortedMeal.get(count); + } + list.add(meal); + sortedMeal.put(count, list); + } + } + for (int i = params.size(); i > 0; i --) { + if (sortedMeal.get(i) == null) { + continue; + } + List list = sortedMeal.get(i); + for (Meal meal : list) { searchedMeal.add(meal); } } @@ -187,24 +204,23 @@ private Meal pickRandomMeal(List mealList) { return (Meal)mealList.get(index); } - private Boolean isResultOfSearch(Meal meal, List params) { + private int isResultOfSearch(Meal meal, List params) { + int counter = 0; for (String param : params) { - if (meal.getTitle().contains(param)) { - return true; - } - if (meal.getDescription().contains(param)) { - return true; + if (meal.getTitle().contains(param) || + meal.getDescription().contains(param) || + meal.getType().contains(param)) { + counter ++; + break; } - if (meal.getType().contains(param)) { - return true; - } for (String ingredient : meal.getIngredients()) { if (ingredient.contains(param)) { - return true; + counter ++; + break; } } } - return false; + return counter; } private String getParameter(HttpServletRequest request, String name, String defaultValue) { String value = request.getParameter(name); From 813affa5ed03c57adb977cc83ee8a7130c12c0e3 Mon Sep 17 00:00:00 2001 From: Polina S Date: Mon, 21 Sep 2020 15:49:49 +0300 Subject: [PATCH 2/6] Rename and fix --- .../com/google/sps/servlets/MealServlet.java | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/google/sps/servlets/MealServlet.java b/src/main/java/com/google/sps/servlets/MealServlet.java index a724acd..764a73b 100644 --- a/src/main/java/com/google/sps/servlets/MealServlet.java +++ b/src/main/java/com/google/sps/servlets/MealServlet.java @@ -100,23 +100,22 @@ private void getMealList(HttpServletRequest request, HttpServletResponse respons List searchedMeal = new ArrayList<>(); HashMap> sortedMeal = new HashMap<>(); for (Meal meal : meals) { - int count = isResultOfSearch(meal, params); - if (count > 0) { + int frequence = getFrequence(meal, params); + if (frequence > 0) { List list = new ArrayList<>(); - if (sortedMeal.get(count) != null) { - list = sortedMeal.get(count); + if (sortedMeal.get(frequence) != null) { + list = sortedMeal.get(frequence); } list.add(meal); - sortedMeal.put(count, list); + sortedMeal.put(frequence, list); } } for (int i = params.size(); i > 0; i --) { - if (sortedMeal.get(i) == null) { - continue; - } List list = sortedMeal.get(i); - for (Meal meal : list) { - searchedMeal.add(meal); + if (list != null) { + for (Meal meal : list) { + searchedMeal.add(meal); + } } } response.setContentType("application/json"); @@ -204,23 +203,23 @@ private Meal pickRandomMeal(List mealList) { return (Meal)mealList.get(index); } - private int isResultOfSearch(Meal meal, List params) { - int counter = 0; + private int getFrequence(Meal meal, List params) { + int frequence = 0; for (String param : params) { if (meal.getTitle().contains(param) || meal.getDescription().contains(param) || meal.getType().contains(param)) { - counter ++; + frequence++; break; } for (String ingredient : meal.getIngredients()) { if (ingredient.contains(param)) { - counter ++; + frequence++; break; } } } - return counter; + return frequence; } private String getParameter(HttpServletRequest request, String name, String defaultValue) { String value = request.getParameter(name); From 8e5b4513b209e5720978af0d58dc193590d2002f Mon Sep 17 00:00:00 2001 From: Polina S Date: Mon, 21 Sep 2020 15:52:51 +0300 Subject: [PATCH 3/6] Rename and fix --- .../com/google/sps/servlets/MealServlet.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/google/sps/servlets/MealServlet.java b/src/main/java/com/google/sps/servlets/MealServlet.java index 764a73b..801dc8f 100644 --- a/src/main/java/com/google/sps/servlets/MealServlet.java +++ b/src/main/java/com/google/sps/servlets/MealServlet.java @@ -100,14 +100,14 @@ private void getMealList(HttpServletRequest request, HttpServletResponse respons List searchedMeal = new ArrayList<>(); HashMap> sortedMeal = new HashMap<>(); for (Meal meal : meals) { - int frequence = getFrequence(meal, params); - if (frequence > 0) { + int frequency = getFrequency(meal, params); + if (frequency > 0) { List list = new ArrayList<>(); - if (sortedMeal.get(frequence) != null) { - list = sortedMeal.get(frequence); + if (sortedMeal.get(frequency) != null) { + list = sortedMeal.get(frequency); } list.add(meal); - sortedMeal.put(frequence, list); + sortedMeal.put(frequency, list); } } for (int i = params.size(); i > 0; i --) { @@ -203,23 +203,23 @@ private Meal pickRandomMeal(List mealList) { return (Meal)mealList.get(index); } - private int getFrequence(Meal meal, List params) { - int frequence = 0; + private int getFrequency(Meal meal, List params) { + int frequency = 0; for (String param : params) { if (meal.getTitle().contains(param) || meal.getDescription().contains(param) || meal.getType().contains(param)) { - frequence++; + frequency++; break; } for (String ingredient : meal.getIngredients()) { if (ingredient.contains(param)) { - frequence++; + frequency++; break; } } } - return frequence; + return frequency; } private String getParameter(HttpServletRequest request, String name, String defaultValue) { String value = request.getParameter(name); From 3675bf680bb1784b01cca55ee2148c3cc4446843 Mon Sep 17 00:00:00 2001 From: sandatsian Date: Tue, 22 Sep 2020 13:23:13 +0000 Subject: [PATCH 4/6] Use TreeMap --- .../com/google/sps/servlets/MealServlet.java | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/google/sps/servlets/MealServlet.java b/src/main/java/com/google/sps/servlets/MealServlet.java index 801dc8f..a241b79 100644 --- a/src/main/java/com/google/sps/servlets/MealServlet.java +++ b/src/main/java/com/google/sps/servlets/MealServlet.java @@ -32,9 +32,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.HashMap; 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; @@ -98,24 +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<>(); - HashMap> sortedMeal = new HashMap<>(); + TreeMap> sortedMeal = new TreeMap<>(); for (Meal meal : meals) { int frequency = getFrequency(meal, params); if (frequency > 0) { - List list = new ArrayList<>(); - if (sortedMeal.get(frequency) != null) { - list = sortedMeal.get(frequency); - } + sortedMeal.putIfAbsent(frequency, new ArrayList<>()); + List list = sortedMeal.get(frequency); list.add(meal); - sortedMeal.put(frequency, list); } } - for (int i = params.size(); i > 0; i --) { - List list = sortedMeal.get(i); + for (int key : sortedMeal.descendingKeySet()) { + List list = sortedMeal.get(key); if (list != null) { - for (Meal meal : list) { - searchedMeal.add(meal); - } + searchedMeal.addAll(list); } } response.setContentType("application/json"); @@ -203,6 +198,12 @@ private Meal pickRandomMeal(List mealList) { return (Meal)mealList.get(index); } + /** + * Counts the number of keywords that are matching in recipe. + * @param meal object of class Meal which is checking. + * @param params list of strings with keywords, that describe search request. + * @return amount of occurrences of keywords from params in this meal. + */ private int getFrequency(Meal meal, List params) { int frequency = 0; for (String param : params) { @@ -210,17 +211,18 @@ private int getFrequency(Meal meal, List params) { meal.getDescription().contains(param) || meal.getType().contains(param)) { frequency++; - break; + continue; } for (String ingredient : meal.getIngredients()) { if (ingredient.contains(param)) { frequency++; - break; + continue; } } } return frequency; } + private String getParameter(HttpServletRequest request, String name, String defaultValue) { String value = request.getParameter(name); if (value == null) { From e521d97f32df62449b9b4f71798462bba241b48c Mon Sep 17 00:00:00 2001 From: sandatsian Date: Tue, 22 Sep 2020 13:44:43 +0000 Subject: [PATCH 5/6] Move getFrequency method --- src/main/java/com/google/sps/data/Meal.java | 25 +++++++++++++++++ .../com/google/sps/servlets/MealServlet.java | 27 +------------------ 2 files changed, 26 insertions(+), 26 deletions(-) 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 a241b79..f9c145e 100644 --- a/src/main/java/com/google/sps/servlets/MealServlet.java +++ b/src/main/java/com/google/sps/servlets/MealServlet.java @@ -100,7 +100,7 @@ private void getMealList(HttpServletRequest request, HttpServletResponse respons List searchedMeal = new ArrayList<>(); TreeMap> sortedMeal = new TreeMap<>(); for (Meal meal : meals) { - int frequency = getFrequency(meal, params); + int frequency = meal.getFrequency(params); if (frequency > 0) { sortedMeal.putIfAbsent(frequency, new ArrayList<>()); List list = sortedMeal.get(frequency); @@ -198,31 +198,6 @@ private Meal pickRandomMeal(List mealList) { return (Meal)mealList.get(index); } - /** - * Counts the number of keywords that are matching in recipe. - * @param meal object of class Meal which is checking. - * @param params list of strings with keywords, that describe search request. - * @return amount of occurrences of keywords from params in this meal. - */ - private int getFrequency(Meal meal, List params) { - int frequency = 0; - for (String param : params) { - if (meal.getTitle().contains(param) || - meal.getDescription().contains(param) || - meal.getType().contains(param)) { - frequency++; - continue; - } - for (String ingredient : meal.getIngredients()) { - if (ingredient.contains(param)) { - frequency++; - continue; - } - } - } - return frequency; - } - private String getParameter(HttpServletRequest request, String name, String defaultValue) { String value = request.getParameter(name); if (value == null) { From 6408e5f016ba7480056816fa3ce52c17a70686a3 Mon Sep 17 00:00:00 2001 From: sandatsian Date: Tue, 22 Sep 2020 13:47:50 +0000 Subject: [PATCH 6/6] Change test --- src/test/java/com/google/sps/MealServletTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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();