private List match()

in business-model/src/main/java/com/google/cloud/orderbook/Matcher.java [152:205]


  private List<OrderBookEvent> match(Order o) {
    if (!isActive) {
      return Arrays.asList();
    }

    ArrayList<OrderBookEvent> matches = new ArrayList<>();

    // Get the right iterator to match against
    Iterator<Map.Entry<OrderKey, Order>> it;
    if (o.getSide() == Side.BUY) {
      it = askOrderList.entrySet().iterator();
    } else {
      it = bidOrderList.entrySet().iterator();
    }

    // Keep finding orders
    while (o.getQuantityRemaining() > 0 && it.hasNext()) {
      Map.Entry<OrderKey, Order> entry = it.next();

      // Stop if the price doesn't match
      if (o.getSide() == Side.BUY) {
        if (o.getPrice() < entry.getKey().price) {
          break;
        }
      } else {
        if (o.getPrice() > entry.getKey().price) {
          break;
        }
      }

      // Calculate the fill amount
      long fillQty = Math.min(o.getQuantityRemaining(),
          entry.getValue().getQuantityRemaining());

      // Reduce quantity on each order
      entry.getValue().fillOrder(fillQty);
      o.fillOrder(fillQty);

      // Create an execution event (passive side only)
      matches.add(buildEvent(Type.EXECUTED, entry.getValue())
          .setQuantityFilled(fillQty)
          .setMatchNumber(matchId)
          .build());

      matchId++;

      // Remove order if fully matched
      if (entry.getValue().getQuantityRemaining() == 0) {
        it.remove();
      }
    }

    return matches;
  }