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");
}