diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/util/ProductUtil.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/util/ProductUtil.java index c77016523dfd1161343e576eb1ff5493963f951e..40ba1f50447d72116d2e8def8b1051b41006fcf4 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/util/ProductUtil.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/util/ProductUtil.java @@ -4,7 +4,9 @@ import ntnu.idatt2016.v233.SmartMat.entity.product.Product; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.Optional; +import java.util.regex.Matcher; import java.util.regex.Pattern; /** @@ -16,52 +18,33 @@ import java.util.regex.Pattern; public class ProductUtil { - private static final String[] VOLUME_UNITS = {"ml", "cl", "dl", "l", "g", "kg"}; + private static final String VOLUME_REGEX = "(\\d+(\\.\\d+)?)\\s*(mls?|centiliters?|deciliters?|liters?|grams?|kilograms?)"; + private static final Map<String, List<String>> VOLUME_UNIT_VARIATIONS = Map.of( + "ml", List.of("ml", "milliliters", "millilitres"), + "cl", List.of("cl", "centiliters", "centilitres"), + "dl", List.of("dl", "deciliters", "decilitres"), + "l", List.of("l", "liters", "litres"), + "g", List.of("g", "grams"), + "kg", List.of("kg", "kilograms") + ); - /** - * Gets the volume of a product, if it exists - * By looking at the name and description of the product - * it will try to first find the volume in the name, and then in the description - * It uses pre defined volume units to find the volume - * Todo: Make it be able to find volume if the size is definde by count - * @param product The product to get the volume from - * @return The volume of the product, if it exists - */ public static Optional<List<String>> getVolumeFromProduct(Product product) { - for (String desc : Arrays.asList(product.getName(), product.getDescription())) { - List<String> words = List.of(desc.split(" ")); - if (words.size() > 1) { - String volume = ""; - for (String unit : VOLUME_UNITS) { - int i = words.indexOf(unit); - if (i != -1) { - return Optional.of(List.of(words.get(i - 1), unit)); - } - } - - volume = words.stream().map(word -> Arrays.stream(VOLUME_UNITS).map(unit -> { - int index = word.indexOf(unit); - if (index == -1) { - if (!Pattern.matches("[a-zA-Z]+", word) && ProductUtil.hasNumbers(word)) { - return word; - } - return ""; - } - return word.substring(0, index) + " " + word.substring(index); - }).findAny().orElse("")) - .filter(ProductUtil::hasNumbers) - .findAny() - .orElse(""); - if (!volume.equals("")){ - return Optional.of(List.of(volume.split(" "))); + String desc = product.getName() + " " + product.getDescription(); + Matcher matcher = Pattern.compile(VOLUME_REGEX).matcher(desc); + if (matcher.find()) { + String volumeString = matcher.group(1); + double volume = Double.parseDouble(volumeString); + String unitString = matcher.group(3); + for (Map.Entry<String, List<String>> entry : VOLUME_UNIT_VARIATIONS.entrySet()) { + if (entry.getValue().contains(unitString)) { + return Optional.of(List.of(String.valueOf(volume), entry.getKey())); } } } - - return Optional.empty(); } + /** * Checks if a string contains any numbers * @param s The string to check diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/util/StatisticUtil.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/util/StatisticUtil.java index a05b097bdbf468b08e4ff719eb7a40541a8a0345..9bc24cb424e394e59165ffb9351771a74a0f4fd4 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/util/StatisticUtil.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/util/StatisticUtil.java @@ -113,7 +113,7 @@ public class StatisticUtil { case "ml" -> sum += waste.getAmount() * 0.000998; case "cl" -> sum += waste.getAmount() * 0.00998; case "dl" -> sum += waste.getAmount() * 0.0998; - default -> sum += 0.1; + default -> sum += 0.1 * waste.getAmount(); } } return sum; diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/product/ProductServiceTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/product/ProductServiceTest.java index 3e63f644f1131ff2d1d222386beaa6398b00a65c..42595c72ca2cd9065873429645914e5d5c1b9810 100644 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/product/ProductServiceTest.java +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/product/ProductServiceTest.java @@ -134,7 +134,7 @@ public class ProductServiceTest { // Verify that the service returns the correct volume Optional<List<String>> returnedVolume = productService.getProductVolume(productId); assertTrue(returnedVolume.isPresent()); - assertEquals(List.of("500", "ml"), returnedVolume.get()); + assertEquals(List.of("500.0", "ml"), returnedVolume.get()); } @Test diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/util/ProductUtilTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/util/ProductUtilTest.java index 0164ae29d869b4a85b47dab4cdd82d95c78d8b1e..2ee4467a78d2727454b1cd6a497527973dca9bac 100644 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/util/ProductUtilTest.java +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/util/ProductUtilTest.java @@ -22,7 +22,7 @@ class ProductUtilTest { @Test void getVolumeFromProduct() { - assertEquals(List.of("24x500", "ml"), ProductUtil.getVolumeFromProduct(product).get()); + assertEquals(List.of("500.0", "ml"), ProductUtil.getVolumeFromProduct(product).get()); this.product = Product.builder() .ean(123456789) @@ -30,7 +30,7 @@ class ProductUtilTest { .description("Pepsi Original 24x500 ml") .build(); - assertEquals(List.of("24x500", "ml"), ProductUtil.getVolumeFromProduct(product).get()); + assertEquals(List.of("500.0", "ml"), ProductUtil.getVolumeFromProduct(product).get()); this.product = Product.builder() .ean(123456789) @@ -39,7 +39,7 @@ class ProductUtilTest { .build(); - assertEquals(List.of("24x500", "ml"), ProductUtil.getVolumeFromProduct(product).get()); + assertEquals(List.of("500.0", "ml"), ProductUtil.getVolumeFromProduct(product).get()); this.product = Product.builder() .ean(123456789) @@ -48,6 +48,6 @@ class ProductUtilTest { .build(); - assertEquals(List.of("24x500", "ml"), ProductUtil.getVolumeFromProduct(product).get()); + assertEquals(List.of("500.0", "ml"), ProductUtil.getVolumeFromProduct(product).get()); } } \ No newline at end of file