Skip to content

Commit

Permalink
http-service: optimize bulk item price lookup
Browse files Browse the repository at this point in the history
  • Loading branch information
Adam- committed May 13, 2018
1 parent c80b822 commit eed7601
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,8 @@
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;
Expand Down Expand Up @@ -199,31 +196,20 @@ public ItemPrice[] prices(@RequestParam("id") int[] itemIds)
itemIds = Arrays.copyOf(itemIds, MAX_BATCH_LOOKUP);
}

Set<Integer> seen = new HashSet<>();
List<ItemPrice> itemPrices = new ArrayList<>(itemIds.length);
for (int itemId : itemIds)
{
if (seen.contains(itemId))
{
continue;
}
seen.add(itemId);

ItemEntry item = itemService.getItem(itemId);
PriceEntry priceEntry = itemService.getPrice(itemId, null);
List<PriceEntry> prices = itemService.getPrices(itemIds);

if (item == null || priceEntry == null)
return prices.stream()
.map(priceEntry ->
{
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()]);
Item item = new Item();
item.setId(priceEntry.getItem()); // fake item

ItemPrice itemPrice = new ItemPrice();
itemPrice.setItem(item);
itemPrice.setPrice(priceEntry.getPrice());
itemPrice.setTime(priceEntry.getTime());
return itemPrice;
})
.toArray(ItemPrice[]::new);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,10 @@
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;
Expand Down Expand Up @@ -123,23 +125,57 @@ public ItemEntry getItem(int itemId)
}
}

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 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 getPrice(con, itemId, time);
}
}

public List<PriceEntry> getPrices(int... itemIds)
{
try (Connection con = sql2o.open())
{
Set<Integer> seen = new HashSet<>();
List<PriceEntry> priceEntries = new ArrayList<>(itemIds.length);

for (int itemId : itemIds)
{
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;
}
}

Expand Down

0 comments on commit eed7601

Please sign in to comment.