diff --git a/http-service/src/main/java/net/runelite/http/service/item/ItemController.java b/http-service/src/main/java/net/runelite/http/service/item/ItemController.java index d98f8ede54..3ede99631e 100644 --- a/http-service/src/main/java/net/runelite/http/service/item/ItemController.java +++ b/http-service/src/main/java/net/runelite/http/service/item/ItemController.java @@ -28,11 +28,8 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import java.time.Duration; import java.time.Instant; -import java.util.ArrayList; import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; @@ -199,31 +196,20 @@ public class ItemController itemIds = Arrays.copyOf(itemIds, MAX_BATCH_LOOKUP); } - Set seen = new HashSet<>(); - List itemPrices = new ArrayList<>(itemIds.length); - for (int itemId : itemIds) - { - if (seen.contains(itemId)) + List prices = itemService.getPrices(itemIds); + + return prices.stream() + .map(priceEntry -> { - continue; - } - seen.add(itemId); + Item item = new Item(); + item.setId(priceEntry.getItem()); // fake item - ItemEntry item = itemService.getItem(itemId); - PriceEntry priceEntry = itemService.getPrice(itemId, null); - - if (item == null || priceEntry == null) - { - continue; - } - - ItemPrice itemPrice = new ItemPrice(); - itemPrice.setItem(item.toItem()); - itemPrice.setPrice(priceEntry.getPrice()); - itemPrice.setTime(priceEntry.getTime()); - itemPrices.add(itemPrice); - } - - return itemPrices.toArray(new ItemPrice[itemPrices.size()]); + ItemPrice itemPrice = new ItemPrice(); + itemPrice.setItem(item); + itemPrice.setPrice(priceEntry.getPrice()); + itemPrice.setTime(priceEntry.getTime()); + return itemPrice; + }) + .toArray(ItemPrice[]::new); } } diff --git a/http-service/src/main/java/net/runelite/http/service/item/ItemService.java b/http-service/src/main/java/net/runelite/http/service/item/ItemService.java index ff2fdbdb72..e9e26d1772 100644 --- a/http-service/src/main/java/net/runelite/http/service/item/ItemService.java +++ b/http-service/src/main/java/net/runelite/http/service/item/ItemService.java @@ -30,8 +30,10 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.time.Instant; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentLinkedQueue; import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.RuneLiteAPI; @@ -123,23 +125,57 @@ public class ItemService } } + private PriceEntry getPrice(Connection con, int itemId, Instant time) + { + if (time != null) + { + return con.createQuery("select item, price, time, fetched_time from prices where item = :item and time <= :time order by time desc limit 1") + .addParameter("item", itemId) + .addParameter("time", time.toString()) + .executeAndFetchFirst(PriceEntry.class); + } + else + { + return con.createQuery("select item, price, time, fetched_time from prices where item = :item order by time desc limit 1") + .addParameter("item", itemId) + .executeAndFetchFirst(PriceEntry.class); + } + } + public PriceEntry getPrice(int itemId, Instant time) { try (Connection con = sql2o.open()) { - if (time != null) + return getPrice(con, itemId, time); + } + } + + public List getPrices(int... itemIds) + { + try (Connection con = sql2o.open()) + { + Set seen = new HashSet<>(); + List priceEntries = new ArrayList<>(itemIds.length); + + for (int itemId : itemIds) { - return con.createQuery("select item, price, time, fetched_time from prices where item = :item and time <= :time order by time desc limit 1") - .addParameter("item", itemId) - .addParameter("time", time.toString()) - .executeAndFetchFirst(PriceEntry.class); - } - else - { - return con.createQuery("select item, price, time, fetched_time from prices where item = :item order by time desc limit 1") - .addParameter("item", itemId) - .executeAndFetchFirst(PriceEntry.class); + if (seen.contains(itemId)) + { + continue; + } + seen.add(itemId); + + PriceEntry priceEntry = getPrice(con, itemId, null); + + if (priceEntry == null) + { + continue; + } + + priceEntries.add(priceEntry); } + + return priceEntries; } }