private void newOrder()

in benchmarks/tpcc/src/main/java/com/google/cloud/pgadapter/tpcc/AbstractBenchmarkRunner.java [150:284]


  private void newOrder() throws SQLException {
    LOG.debug("Executing new_order");

    long warehouseId = Long.reverse(random.nextInt(tpccConfiguration.getWarehouses()));
    long districtId = Long.reverse(random.nextInt(tpccConfiguration.getDistrictsPerWarehouse()));
    long customerId = Long.reverse(random.nextInt(tpccConfiguration.getCustomersPerDistrict()));

    int orderLineCount = random.nextInt(5, 16);
    long[] itemIds = new long[orderLineCount];
    long[] supplyWarehouses = new long[orderLineCount];
    int[] quantities = new int[orderLineCount];
    int rollback = random.nextInt(100);
    int allLocal = 1;

    for (int line = 0; line < orderLineCount; line++) {
      if (rollback == 1 && line == orderLineCount - 1) {
        itemIds[line] = Long.reverse(Long.MAX_VALUE);
      } else {
        itemIds[line] = Long.reverse(random.nextInt(tpccConfiguration.getItemCount()));
      }
      if (random.nextInt(100) == 50) {
        supplyWarehouses[line] = getOtherWarehouseId(warehouseId);
        allLocal = 0;
      } else {
        supplyWarehouses[line] = warehouseId;
      }
      quantities[line] = random.nextInt(1, 10);
    }

    Object[] row;
    executeStatement("begin transaction");
    row =
        paramQueryRow(
            "SELECT c_discount, c_last, c_credit, w_tax "
                + "FROM customer c, warehouse w "
                + "WHERE w.w_id = ? AND c.w_id = w.w_id AND c.d_id = ? AND c.c_id = ? FOR UPDATE",
            new Object[] {warehouseId, districtId, customerId});
    BigDecimal discount = (BigDecimal) row[0];
    String last = (String) row[1];
    String credit = (String) row[2];
    BigDecimal warehouseTax = (BigDecimal) row[3];

    row =
        paramQueryRow(
            "SELECT d_next_o_id, d_tax "
                + "FROM district "
                + "WHERE w_id = ? AND d_id = ? FOR UPDATE",
            new Object[] {warehouseId, districtId});
    long districtNextOrderId = (long) row[0];
    BigDecimal districtTax = (BigDecimal) row[1];

    executeParamStatement(
        "UPDATE district " + "SET d_next_o_id = ? " + "WHERE d_id = ? AND w_id= ?",
        new Object[] {districtNextOrderId + 1L, districtId, warehouseId});
    executeParamStatement(
        "INSERT INTO orders (o_id, d_id, w_id, c_id, o_entry_d, o_ol_cnt, o_all_local) "
            + "VALUES (?,?,?,?,CURRENT_TIMESTAMP,?,?)",
        new Object[] {
          districtNextOrderId, districtId, warehouseId, customerId, orderLineCount, allLocal
        });
    executeParamStatement(
        "INSERT INTO new_orders (o_id, c_id, d_id, w_id) " + "VALUES (?,?,?,?)",
        new Object[] {districtNextOrderId, customerId, districtId, warehouseId});

    for (int line = 0; line < orderLineCount; line++) {
      long orderLineSupplyWarehouseId = supplyWarehouses[line];
      long orderLineItemId = itemIds[line];
      int orderLineQuantity = quantities[line];

      try {
        row =
            paramQueryRow(
                "SELECT i_price, i_name, i_data FROM item WHERE i_id = ?",
                new Object[] {orderLineItemId});
      } catch (RowNotFoundException ignore) {
        // TODO: Record deliberate rollback
        LOG.info("Rolling back new_order transaction");
        executeStatement("rollback transaction");
        return;
      }
      BigDecimal itemPrice = (BigDecimal) row[0];
      String itemName = (String) row[1];
      String itemData = (String) row[2];

      row =
          paramQueryRow(
              "SELECT s_quantity, s_data, s_dist_01, s_dist_02, s_dist_03, s_dist_04, s_dist_05, s_dist_06, s_dist_07, s_dist_08, s_dist_09, s_dist_10 "
                  + "FROM stock "
                  + "WHERE s_i_id = ? AND w_id= ? FOR UPDATE",
              new Object[] {orderLineItemId, orderLineSupplyWarehouseId});
      long stockQuantity = (long) row[0];
      String stockData = (String) row[1];
      String[] stockDistrict = new String[10];
      for (int i = 2; i < stockDistrict.length + 2; i++) {
        stockDistrict[i - 2] = (String) row[i];
      }
      String orderLineDistrictInfo =
          stockDistrict[(int) (Long.reverse(districtId) % stockDistrict.length)];
      if (stockQuantity > orderLineQuantity) {
        stockQuantity = stockQuantity - orderLineQuantity;
      } else {
        stockQuantity = stockQuantity - orderLineQuantity + 91;
      }

      executeParamStatement(
          "UPDATE stock " + "SET s_quantity = ? " + "WHERE s_i_id = ? AND w_id= ?",
          new Object[] {stockQuantity, orderLineItemId, orderLineSupplyWarehouseId});

      BigDecimal totalTax = BigDecimal.ONE.add(warehouseTax).add(districtTax);
      BigDecimal discountFactor = BigDecimal.ONE.subtract(discount);
      BigDecimal orderLineAmount =
          BigDecimal.valueOf(orderLineQuantity)
              .multiply(itemPrice)
              .multiply(totalTax)
              .multiply(discountFactor);
      executeParamStatement(
          "INSERT INTO order_line (o_id, c_id, d_id, w_id, ol_number, ol_i_id, ol_supply_w_id, ol_quantity, ol_amount, ol_dist_info) "
              + "VALUES (?,?,?,?,?,?,?,?,?,?)",
          new Object[] {
            districtNextOrderId,
            customerId,
            districtId,
            warehouseId,
            line,
            orderLineItemId,
            orderLineSupplyWarehouseId,
            orderLineQuantity,
            orderLineAmount,
            orderLineDistrictInfo
          });
    }

    LOG.debug("Committing new_order transaction");
    executeStatement("commit");
  }