KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > h2 > test > bench > BenchCThread


1 /*
2  * Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
3  * Initial Developer: H2 Group
4  */

5 package org.h2.test.bench;
6
7 import java.math.BigDecimal JavaDoc;
8 import java.sql.PreparedStatement JavaDoc;
9 import java.sql.ResultSet JavaDoc;
10 import java.sql.Timestamp JavaDoc;
11 import java.util.HashMap JavaDoc;
12
13 public class BenchCThread {
14
15     private Database db;
16     private int warehouseId;
17     private int terminalId;
18     private HashMap JavaDoc prepared = new HashMap JavaDoc();
19     private static final int OP_NEW_ORDER = 0, OP_PAYMENT = 1,
20             OP_ORDER_STATUS = 2, OP_DELIVERY = 3,
21             OP_STOCK_LEVEL = 4;
22     private static final BigDecimal JavaDoc ONE = new BigDecimal JavaDoc("1");
23     private BenchCRandom random;
24     private BenchC bench;
25
26     BenchCThread(Database db, BenchC bench, BenchCRandom random, int terminal)
27             throws Exception JavaDoc {
28         this.db = db;
29         this.bench = bench;
30         this.terminalId = terminal;
31         db.setAutoCommit(false);
32         this.random = random;
33         warehouseId = random.getInt(1, bench.warehouses);
34     }
35
36     void process() throws Exception JavaDoc {
37         int[] deck = new int[] { OP_NEW_ORDER, OP_NEW_ORDER, OP_NEW_ORDER,
38                 OP_NEW_ORDER, OP_NEW_ORDER, OP_NEW_ORDER, OP_NEW_ORDER,
39                 OP_NEW_ORDER, OP_NEW_ORDER, OP_NEW_ORDER, OP_PAYMENT,
40                 OP_PAYMENT, OP_PAYMENT, OP_PAYMENT, OP_PAYMENT, OP_PAYMENT,
41                 OP_PAYMENT, OP_PAYMENT, OP_PAYMENT, OP_PAYMENT,
42                 OP_ORDER_STATUS, OP_DELIVERY, OP_STOCK_LEVEL };
43         int len = deck.length;
44         for (int i = 0; i < len; i++) {
45             int temp = deck[i];
46             int j = random.getInt(0, len);
47             deck[i] = deck[j];
48             deck[j] = temp;
49         }
50         for (int i = 0; i < len; i++) {
51             int op = deck[i];
52             switch (op) {
53             case OP_NEW_ORDER:
54                 processNewOrder();
55                 break;
56             case OP_PAYMENT:
57                 processPayment();
58                 break;
59             case OP_ORDER_STATUS:
60                 processOrderStatus();
61                 break;
62             case OP_DELIVERY:
63                 processDelivery();
64                 break;
65             case OP_STOCK_LEVEL:
66                 processStockLevel();
67                 break;
68             default:
69                 throw new Error JavaDoc("op=" + op);
70             }
71         }
72     }
73
74     private void processNewOrder() throws Exception JavaDoc {
75         int d_id = random.getInt(1, bench.districtsPerWarehouse);
76         int c_id = random.getNonUniform(1023, 1, bench.customersPerDistrict);
77         int o_ol_cnt = random.getInt(5, 15);
78         boolean rollback = random.getInt(1, 100) == 1;
79         int[] supply_w_id = new int[o_ol_cnt];
80         int[] item_id = new int[o_ol_cnt];
81         int[] quantity = new int[o_ol_cnt];
82         int o_all_local = 1;
83         for (int i = 0; i < o_ol_cnt; i++) {
84             int w;
85             if (bench.warehouses > 1 && random.getInt(1, 100) == 1) {
86                 do {
87                     w = random.getInt(1, bench.warehouses);
88                 } while (w != warehouseId);
89                 o_all_local = 0;
90             } else {
91                 w = warehouseId;
92             }
93             supply_w_id[i] = w;
94             int item;
95             if (rollback && i == o_ol_cnt - 1) {
96                 // unused order number
97
item = -1;
98             } else {
99                 item = random.getNonUniform(8191, 1, bench.items);
100             }
101             item_id[i] = item;
102             quantity[i] = random.getInt(1, 10);
103         }
104         char[] bg = new char[o_ol_cnt];
105         int[] stock = new int[o_ol_cnt];
106         BigDecimal JavaDoc[] amt = new BigDecimal JavaDoc[o_ol_cnt];
107         Timestamp JavaDoc datetime = new Timestamp JavaDoc(System.currentTimeMillis());
108         PreparedStatement JavaDoc prep;
109         ResultSet JavaDoc rs;
110
111         prep = prepare("UPDATE DISTRICT SET D_NEXT_O_ID=D_NEXT_O_ID+1 "
112                 + "WHERE D_ID=? AND D_W_ID=?");
113         prep.setInt(1, d_id);
114         prep.setInt(2, warehouseId);
115         db.update(prep);
116         prep = prepare("SELECT D_NEXT_O_ID, D_TAX FROM DISTRICT "
117                 + "WHERE D_ID=? AND D_W_ID=?");
118         prep.setInt(1, d_id);
119         prep.setInt(2, warehouseId);
120         rs = db.query(prep);
121         rs.next();
122         int o_id = rs.getInt(1) - 1;
123         BigDecimal JavaDoc d_tax = rs.getBigDecimal(2);
124         rs.close();
125         // TODO optimizer: such cases can be optimized! A=1 AND B=A means
126
// also B=1!
127
// prep = prepare("SELECT C_DISCOUNT, C_LAST, C_CREDIT, W_TAX "
128
// + "FROM CUSTOMER, WAREHOUSE "
129
// + "WHERE C_ID=? AND W_ID=? AND C_W_ID=W_ID AND C_D_ID=?");
130
prep = prepare("SELECT C_DISCOUNT, C_LAST, C_CREDIT, W_TAX "
131                 + "FROM CUSTOMER, WAREHOUSE "
132                 + "WHERE C_ID=? AND C_W_ID=? AND C_W_ID=W_ID AND C_D_ID=?");
133         prep.setInt(1, c_id);
134         prep.setInt(2, warehouseId);
135         prep.setInt(3, d_id);
136         rs = db.query(prep);
137         rs.next();
138         BigDecimal JavaDoc c_discount = rs.getBigDecimal(1);
139         rs.getString(2); // c_last
140
rs.getString(3); // c_credit
141
BigDecimal JavaDoc w_tax = rs.getBigDecimal(4);
142         rs.close();
143         BigDecimal JavaDoc total = new BigDecimal JavaDoc("0");
144         for (int ol_number = 1; ol_number <= o_ol_cnt; ol_number++) {
145             int ol_i_id = item_id[ol_number - 1];
146             int ol_supply_w_id = supply_w_id[ol_number - 1];
147             int ol_quantity = quantity[ol_number - 1];
148             prep = prepare("SELECT I_PRICE, I_NAME, I_DATA "
149                     + "FROM ITEM WHERE I_ID=?");
150             prep.setInt(1, ol_i_id);
151             rs = db.query(prep);
152             if (!rs.next()) {
153                 if (rollback) {
154                     // item not found - correct behavior
155
db.rollback();
156                     return;
157                 }
158                 throw new Exception JavaDoc("item not found: " + ol_i_id + " "
159                         + ol_supply_w_id);
160             }
161             BigDecimal JavaDoc i_price = rs.getBigDecimal(1);
162             rs.getString(2); // i_name
163
String JavaDoc i_data = rs.getString(3);
164             rs.close();
165             prep = prepare("SELECT S_QUANTITY, S_DATA, "
166                     + "S_DIST_01, S_DIST_02, S_DIST_03, S_DIST_04, S_DIST_05, "
167                     + "S_DIST_06, S_DIST_07, S_DIST_08, S_DIST_09, S_DIST_10 "
168                     + "FROM STOCK WHERE S_I_ID=? AND S_W_ID=?");
169             prep.setInt(1, ol_i_id);
170             prep.setInt(2, ol_supply_w_id);
171             rs = db.query(prep);
172             if (!rs.next()) {
173                 if (rollback) {
174                     // item not found - correct behavior
175
db.rollback();
176                     return;
177                 }
178                 throw new Exception JavaDoc("item not found: " + ol_i_id + " "
179                         + ol_supply_w_id);
180             }
181             int s_quantity = rs.getInt(1);
182             String JavaDoc s_data = rs.getString(2);
183             String JavaDoc[] s_dist = new String JavaDoc[10];
184             for (int i = 0; i < 10; i++) {
185                 s_dist[i] = rs.getString(3 + i);
186             }
187             rs.close();
188             String JavaDoc ol_dist_info = s_dist[d_id - 1];
189             stock[ol_number - 1] = s_quantity;
190             if ((i_data.indexOf("original") != -1)
191                     && (s_data.indexOf("original") != -1)) {
192                 bg[ol_number - 1] = 'B';
193             } else {
194                 bg[ol_number - 1] = 'G';
195             }
196             if (s_quantity > ol_quantity) {
197                 s_quantity = s_quantity - ol_quantity;
198             } else {
199                 s_quantity = s_quantity - ol_quantity + 91;
200             }
201             prep = prepare("UPDATE STOCK SET S_QUANTITY=? "
202                     + "WHERE S_W_ID=? AND S_I_ID=?");
203             prep.setInt(1, s_quantity);
204             prep.setInt(2, ol_supply_w_id);
205             prep.setInt(3, ol_i_id);
206             db.update(prep);
207             BigDecimal JavaDoc ol_amount = new BigDecimal JavaDoc(ol_quantity).multiply(
208                     i_price).multiply(ONE.add(w_tax).add(d_tax)).multiply(
209                     ONE.subtract(c_discount));
210             ol_amount = ol_amount.setScale(2, BigDecimal.ROUND_HALF_UP);
211             amt[ol_number - 1] = ol_amount;
212             total = total.add(ol_amount);
213             prep = prepare("INSERT INTO ORDER_LINE (OL_O_ID, OL_D_ID, OL_W_ID, OL_NUMBER, "
214                     + "OL_I_ID, OL_SUPPLY_W_ID, "
215                     + "OL_QUANTITY, OL_AMOUNT, OL_DIST_INFO) "
216                     + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
217             prep.setInt(1, o_id);
218             prep.setInt(2, d_id);
219             prep.setInt(3, warehouseId);
220             prep.setInt(4, ol_number);
221             prep.setInt(5, ol_i_id);
222             prep.setInt(6, ol_supply_w_id);
223             prep.setInt(7, ol_quantity);
224             prep.setBigDecimal(8, ol_amount);
225             prep.setString(9, ol_dist_info);
226             db.update(prep);
227         }
228         prep = prepare("INSERT INTO ORDERS (O_ID, O_D_ID, O_W_ID, O_C_ID, "
229                 + "O_ENTRY_D, O_OL_CNT, O_ALL_LOCAL) "
230                 + "VALUES (?, ?, ?, ?, ?, ?, ?)");
231         prep.setInt(1, o_id);
232         prep.setInt(2, d_id);
233         prep.setInt(3, warehouseId);
234         prep.setInt(4, c_id);
235         prep.setTimestamp(5, datetime);
236         prep.setInt(6, o_ol_cnt);
237         prep.setInt(7, o_all_local);
238         db.update(prep);
239         prep = prepare("INSERT INTO NEW_ORDER (NO_O_ID, NO_D_ID, NO_W_ID) "
240                 + "VALUES (?, ?, ?)");
241         prep.setInt(1, o_id);
242         prep.setInt(2, d_id);
243         prep.setInt(3, warehouseId);
244         db.update(prep);
245         db.commit();
246     }
247
248     private void processPayment() throws Exception JavaDoc {
249         int d_id = random.getInt(1, bench.districtsPerWarehouse);
250         int c_w_id, c_d_id;
251         if (bench.warehouses > 1 && random.getInt(1, 100) <= 15) {
252             do {
253                 c_w_id = random.getInt(1, bench.warehouses);
254             } while (c_w_id != warehouseId);
255             c_d_id = random.getInt(1, bench.districtsPerWarehouse);
256         } else {
257             c_w_id = warehouseId;
258             c_d_id = d_id;
259         }
260         boolean byname;
261         String JavaDoc c_last;
262         int c_id = 1;
263         if (random.getInt(1, 100) <= 60) {
264             byname = true;
265             c_last = random.getLastname(random.getNonUniform(255, 0, 999));
266         } else {
267             byname = false;
268             c_last = "";
269             c_id = random.getNonUniform(1023, 1, bench.customersPerDistrict);
270         }
271         BigDecimal JavaDoc h_amount = random.getBigDecimal(random.getInt(100, 500000),
272                 2);
273         Timestamp JavaDoc datetime = new Timestamp JavaDoc(System.currentTimeMillis());
274         PreparedStatement JavaDoc prep;
275         ResultSet JavaDoc rs;
276
277         prep = prepare("UPDATE DISTRICT SET D_YTD = D_YTD+? "
278                 + "WHERE D_ID=? AND D_W_ID=?");
279         prep.setBigDecimal(1, h_amount);
280         prep.setInt(2, d_id);
281         prep.setInt(3, warehouseId);
282         db.update(prep);
283         prep = prepare("UPDATE WAREHOUSE SET W_YTD=W_YTD+? WHERE W_ID=?");
284         prep.setBigDecimal(1, h_amount);
285         prep.setInt(2, warehouseId);
286         db.update(prep);
287         prep = prepare("SELECT W_STREET_1, W_STREET_2, W_CITY, W_STATE, W_ZIP, W_NAME "
288                 + "FROM WAREHOUSE WHERE W_ID=?");
289         prep.setInt(1, warehouseId);
290         rs = db.query(prep);
291         rs.next();
292         rs.getString(1); // w_street_1
293
rs.getString(2); // w_street_2
294
rs.getString(3); // w_city
295
rs.getString(4); // w_state
296
rs.getString(5); // w_zip
297
String JavaDoc w_name = rs.getString(6);
298         rs.close();
299         prep = prepare("SELECT D_STREET_1, D_STREET_2, D_CITY, D_STATE, D_ZIP, D_NAME "
300                 + "FROM DISTRICT WHERE D_ID=? AND D_W_ID=?");
301         prep.setInt(1, d_id);
302         prep.setInt(2, warehouseId);
303         rs = db.query(prep);
304         rs.next();
305         rs.getString(1); // d_street_1
306
rs.getString(2); // d_street_2
307
rs.getString(3); // d_city
308
rs.getString(4); // d_state
309
rs.getString(5); // d_zip
310
String JavaDoc d_name = rs.getString(6);
311         rs.close();
312         BigDecimal JavaDoc c_balance;
313         String JavaDoc c_credit;
314         if (byname) {
315             prep = prepare("SELECT COUNT(C_ID) FROM CUSTOMER "
316                     + "WHERE C_LAST=? AND C_D_ID=? AND C_W_ID=?");
317             prep.setString(1, c_last);
318             prep.setInt(2, c_d_id);
319             prep.setInt(3, c_w_id);
320             rs = db.query(prep);
321             rs.next();
322             int namecnt = rs.getInt(1);
323             rs.close();
324             if (namecnt == 0) {
325                 // TODO TPC-C: check if this can happen
326
db.rollback();
327                 return;
328             }
329             prep = prepare("SELECT C_FIRST, C_MIDDLE, C_ID, "
330                     + "C_STREET_1, C_STREET_2, C_CITY, C_STATE, C_ZIP, "
331                     + "C_PHONE, C_CREDIT, C_CREDIT_LIM, "
332                     + "C_DISCOUNT, C_BALANCE, C_SINCE FROM CUSTOMER "
333                     + "WHERE C_LAST=? AND C_D_ID=? AND C_W_ID=? "
334                     + "ORDER BY C_FIRST");
335             prep.setString(1, c_last);
336             prep.setInt(2, c_d_id);
337             prep.setInt(3, c_w_id);
338             rs = db.query(prep);
339             // locate midpoint customer
340
if (namecnt % 2 != 0) {
341                 namecnt++;
342             }
343             for (int n = 0; n < namecnt / 2; n++) {
344                 rs.next();
345             }
346             rs.getString(1); // c_first
347
rs.getString(2); // c_middle
348
c_id = rs.getInt(3);
349             rs.getString(4); // c_street_1
350
rs.getString(5); // c_street_2
351
rs.getString(6); // c_city
352
rs.getString(7); // c_state
353
rs.getString(8); // c_zip
354
rs.getString(9); // c_phone
355
c_credit = rs.getString(10);
356             rs.getString(11); // c_credit_lim
357
rs.getBigDecimal(12); // c_discount
358
c_balance = rs.getBigDecimal(13);
359             rs.getTimestamp(14); // c_since
360
rs.close();
361         } else {
362             prep = prepare("SELECT C_FIRST, C_MIDDLE, C_LAST, "
363                     + "C_STREET_1, C_STREET_2, C_CITY, C_STATE, C_ZIP, "
364                     + "C_PHONE, C_CREDIT, C_CREDIT_LIM, "
365                     + "C_DISCOUNT, C_BALANCE, C_SINCE FROM CUSTOMER "
366                     + "WHERE C_ID=? AND C_D_ID=? AND C_W_ID=?");
367             prep.setInt(1, c_id);
368             prep.setInt(2, c_d_id);
369             prep.setInt(3, c_w_id);
370             rs = db.query(prep);
371             rs.next();
372             rs.getString(1); // c_first
373
rs.getString(2); // c_middle
374
rs.getString(3); // c_last
375
rs.getString(4); // c_street_1
376
rs.getString(5); // c_street_2
377
rs.getString(6); // c_city
378
rs.getString(7); // c_state
379
rs.getString(8);// c_zip
380
rs.getString(9); // c_phone
381
c_credit = rs.getString(10);
382             rs.getString(11); // c_credit_lim
383
rs.getBigDecimal(12); // c_discount
384
c_balance = rs.getBigDecimal(13);
385             rs.getTimestamp(14); // c_since
386
rs.close();
387         }
388         c_balance = c_balance.add(h_amount);
389         if (c_credit.equals("BC")) {
390             prep = prepare("SELECT C_DATA INTO FROM CUSTOMER "
391                     + "WHERE C_ID=? AND C_D_ID=? AND C_W_ID=?");
392             prep.setInt(1, c_id);
393             prep.setInt(2, c_d_id);
394             prep.setInt(3, c_w_id);
395             rs = db.query(prep);
396             rs.next();
397             String JavaDoc c_data = rs.getString(1);
398             rs.close();
399             String JavaDoc c_new_data = "| " + c_id + " " + c_d_id + " " + c_w_id
400                     + " " + d_id + " " + warehouseId + " " + h_amount + " "
401                     + c_data;
402             if (c_new_data.length() > 500) {
403                 c_new_data = c_new_data.substring(0, 500);
404             }
405             prep = prepare("UPDATE CUSTOMER SET C_BALANCE=?, C_DATA=? "
406                     + "WHERE C_ID=? AND C_D_ID=? AND C_W_ID=?");
407             prep.setBigDecimal(1, c_balance);
408             prep.setString(2, c_new_data);
409             prep.setInt(3, c_id);
410             prep.setInt(4, c_d_id);
411             prep.setInt(5, c_w_id);
412             db.update(prep);
413         } else {
414             prep = prepare("UPDATE CUSTOMER SET C_BALANCE=? "
415                     + "WHERE C_ID=? AND C_D_ID=? AND C_W_ID=?");
416             prep.setBigDecimal(1, c_balance);
417             prep.setInt(2, c_id);
418             prep.setInt(3, c_d_id);
419             prep.setInt(4, c_w_id);
420             db.update(prep);
421         }
422         // MySQL bug?
423
// String h_data = w_name + " " + d_name;
424
String JavaDoc h_data = w_name + " " + d_name;
425         prep = prepare("INSERT INTO HISTORY (H_C_D_ID, H_C_W_ID, H_C_ID, H_D_ID, "
426                 + "H_W_ID, H_DATE, H_AMOUNT, H_DATA) "
427                 + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
428         prep.setInt(1, c_d_id);
429         prep.setInt(2, c_w_id);
430         prep.setInt(3, c_id);
431         prep.setInt(4, d_id);
432         prep.setInt(5, warehouseId);
433         prep.setTimestamp(6, datetime);
434         prep.setBigDecimal(7, h_amount);
435         prep.setString(8, h_data);
436         db.update(prep);
437         db.commit();
438     }
439
440     private void processOrderStatus() throws Exception JavaDoc {
441         int d_id = random.getInt(1, bench.districtsPerWarehouse);
442         boolean byname;
443         String JavaDoc c_last = null;
444         int c_id = -1;
445         if (random.getInt(1, 100) <= 60) {
446             byname = true;
447             c_last = random.getLastname(random.getNonUniform(255, 0, 999));
448         } else {
449             byname = false;
450             c_id = random.getNonUniform(1023, 1, bench.customersPerDistrict);
451         }
452         PreparedStatement JavaDoc prep;
453         ResultSet JavaDoc rs;
454
455         prep = prepare("UPDATE DISTRICT SET D_NEXT_O_ID=-1 WHERE D_ID=-1");
456         db.update(prep);
457         if (byname) {
458             prep = prepare("SELECT COUNT(C_ID) FROM CUSTOMER "
459                     + "WHERE C_LAST=? AND C_D_ID=? AND C_W_ID=?");
460             prep.setString(1, c_last);
461             prep.setInt(2, d_id);
462             prep.setInt(3, warehouseId);
463             rs = db.query(prep);
464             rs.next();
465             int namecnt = rs.getInt(1);
466             rs.close();
467             if (namecnt == 0) {
468                 // TODO TPC-C: check if this can happen
469
db.rollback();
470                 return;
471             }
472             prep = prepare("SELECT C_BALANCE, C_FIRST, C_MIDDLE, C_ID "
473                     + "FROM CUSTOMER "
474                     + "WHERE C_LAST=? AND C_D_ID=? AND C_W_ID=? "
475                     + "ORDER BY C_FIRST");
476             prep.setString(1, c_last);
477             prep.setInt(2, d_id);
478             prep.setInt(3, warehouseId);
479             rs = db.query(prep);
480             if (namecnt % 2 != 0) {
481                 namecnt++;
482             }
483             for (int n = 0; n < namecnt / 2; n++) {
484                 rs.next();
485             }
486             rs.getBigDecimal(1); // c_balance
487
rs.getString(2); // c_first
488
rs.getString(3); // c_middle
489
rs.close();
490         } else {
491             prep = prepare("SELECT C_BALANCE, C_FIRST, C_MIDDLE, C_LAST "
492                     + "FROM CUSTOMER "
493                     + "WHERE C_ID=? AND C_D_ID=? AND C_W_ID=?");
494             prep.setInt(1, c_id);
495             prep.setInt(2, d_id);
496             prep.setInt(3, warehouseId);
497             rs = db.query(prep);
498             rs.next();
499             rs.getBigDecimal(1); // c_balance
500
rs.getString(2); // c_first
501
rs.getString(3); // c_middle
502
rs.getString(4); // c_last
503
rs.close();
504         }
505         prep = prepare("SELECT MAX(O_ID) "
506                 + "FROM ORDERS WHERE O_C_ID=? AND O_D_ID=? AND O_W_ID=?");
507         prep.setInt(1, c_id);
508         prep.setInt(2, d_id);
509         prep.setInt(3, warehouseId);
510         rs = db.query(prep);
511         int o_id = -1;
512         if (rs.next()) {
513             o_id = rs.getInt(1);
514             if (rs.wasNull()) {
515                 o_id = -1;
516             }
517         }
518         rs.close();
519         if (o_id != -1) {
520             prep = prepare("SELECT O_ID, O_CARRIER_ID, O_ENTRY_D "
521                     + "FROM ORDERS WHERE O_ID=?");
522             prep.setInt(1, o_id);
523             rs = db.query(prep);
524             rs.next();
525             o_id = rs.getInt(1);
526             rs.getInt(2); // o_carrier_id
527
rs.getTimestamp(3); // o_entry_d
528
rs.close();
529             prep = prepare("SELECT OL_I_ID, OL_SUPPLY_W_ID, OL_QUANTITY, "
530                     + "OL_AMOUNT, OL_DELIVERY_D FROM ORDER_LINE "
531                     + "WHERE OL_O_ID=? AND OL_D_ID=? AND OL_W_ID=?");
532             prep.setInt(1, o_id);
533             prep.setInt(2, d_id);
534             prep.setInt(3, warehouseId);
535             rs = db.query(prep);
536             while (rs.next()) {
537                 rs.getInt(1); // o_i_id
538
rs.getInt(2); // ol_supply_w_id
539
rs.getInt(3); // ol_quantity
540
rs.getBigDecimal(4); // ol_amount
541
rs.getTimestamp(5); // ol_delivery_d
542
}
543             rs.close();
544         }
545         db.commit();
546     }
547
548     private void processDelivery() throws Exception JavaDoc {
549         int o_carrier_id = random.getInt(1, 10);
550         Timestamp JavaDoc datetime = new Timestamp JavaDoc(System.currentTimeMillis());
551         PreparedStatement JavaDoc prep;
552         ResultSet JavaDoc rs;
553
554         prep = prepare("UPDATE DISTRICT SET D_NEXT_O_ID=-1 WHERE D_ID=-1");
555         db.update(prep);
556         for (int d_id = 1; d_id <= bench.districtsPerWarehouse; d_id++) {
557             prep = prepare("SELECT MIN(NO_O_ID) FROM NEW_ORDER "
558                     + "WHERE NO_D_ID=? AND NO_W_ID=?");
559             prep.setInt(1, d_id);
560             prep.setInt(2, warehouseId);
561             rs = db.query(prep);
562             int no_o_id = -1;
563             if (rs.next()) {
564                 no_o_id = rs.getInt(1);
565                 if (rs.wasNull()) {
566                     no_o_id = -1;
567                 }
568             }
569             rs.close();
570             if (no_o_id != -1) {
571                 prep = prepare("DELETE FROM NEW_ORDER "
572                         + "WHERE NO_O_ID=? AND NO_D_ID=? AND NO_W_ID=?");
573                 prep.setInt(1, no_o_id);
574                 prep.setInt(2, d_id);
575                 prep.setInt(3, warehouseId);
576                 db.update(prep);
577                 prep = prepare("SELECT O_C_ID FROM ORDERS "
578                         + "WHERE O_ID=? AND O_D_ID=? AND O_W_ID=?");
579                 prep.setInt(1, no_o_id);
580                 prep.setInt(2, d_id);
581                 prep.setInt(3, warehouseId);
582                 rs = db.query(prep);
583                 rs.next();
584                 rs.getInt(1); // o_c_id
585
rs.close();
586                 prep = prepare("UPDATE ORDERS SET O_CARRIER_ID=? "
587                         + "WHERE O_ID=? AND O_D_ID=? AND O_W_ID=?");
588                 prep.setInt(1, o_carrier_id);
589                 prep.setInt(2, no_o_id);
590                 prep.setInt(3, d_id);
591                 prep.setInt(4, warehouseId);
592                 db.update(prep);
593                 prep = prepare("UPDATE ORDER_LINE SET OL_DELIVERY_D=? "
594                         + "WHERE OL_O_ID=? AND OL_D_ID=? AND OL_W_ID=?");
595                 prep.setTimestamp(1, datetime);
596                 prep.setInt(2, no_o_id);
597                 prep.setInt(3, d_id);
598                 prep.setInt(4, warehouseId);
599                 db.update(prep);
600                 prep = prepare("SELECT SUM(OL_AMOUNT) FROM ORDER_LINE "
601                         + "WHERE OL_O_ID=? AND OL_D_ID=? AND OL_W_ID=?");
602                 prep.setInt(1, no_o_id);
603                 prep.setInt(2, d_id);
604                 prep.setInt(3, warehouseId);
605                 rs = db.query(prep);
606                 rs.next();
607                 BigDecimal JavaDoc ol_amount = rs.getBigDecimal(1);
608                 rs.close();
609                 prep = prepare("UPDATE CUSTOMER SET C_BALANCE=C_BALANCE+? "
610                         + "WHERE C_ID=? AND C_D_ID=? AND C_W_ID=?");
611                 prep.setBigDecimal(1, ol_amount);
612                 prep.setInt(2, no_o_id);
613                 prep.setInt(3, d_id);
614                 prep.setInt(4, warehouseId);
615                 db.update(prep);
616             }
617         }
618         db.commit();
619     }
620
621     private void processStockLevel() throws Exception JavaDoc {
622         int d_id = (terminalId % bench.districtsPerWarehouse) + 1;
623         int threshold = random.getInt(10, 20);
624         PreparedStatement JavaDoc prep;
625         ResultSet JavaDoc rs;
626
627         prep = prepare("UPDATE DISTRICT SET D_NEXT_O_ID=-1 WHERE D_ID=-1");
628         db.update(prep);
629
630         prep = prepare("SELECT D_NEXT_O_ID FROM DISTRICT "
631                 + "WHERE D_ID=? AND D_W_ID=?");
632         prep.setInt(1, d_id);
633         prep.setInt(2, warehouseId);
634         rs = db.query(prep);
635         rs.next();
636         int o_id = rs.getInt(1);
637         rs.close();
638 // prep = prepare("SELECT COUNT(DISTINCT S_I_ID) "
639
// + "FROM ORDER_LINE, STOCK WHERE OL_W_ID=? AND "
640
// + "OL_D_ID=? AND OL_O_ID<? AND "
641
// + "OL_O_ID>=?-20 AND S_W_ID=? AND "
642
// + "S_I_ID=OL_I_ID AND S_QUANTITY<?");
643
// prep.setInt(1, warehouseId);
644
// prep.setInt(2, d_id);
645
// prep.setInt(3, o_id);
646
// prep.setInt(4, o_id);
647
prep = prepare("SELECT COUNT(DISTINCT S_I_ID) "
648                 + "FROM ORDER_LINE, STOCK WHERE OL_W_ID=? AND "
649                 + "OL_D_ID=? AND OL_O_ID<? AND "
650                 + "OL_O_ID>=? AND S_W_ID=? AND "
651                 + "S_I_ID=OL_I_ID AND S_QUANTITY<?");
652         prep.setInt(1, warehouseId);
653         prep.setInt(2, d_id);
654         prep.setInt(3, o_id);
655         prep.setInt(4, o_id-20);
656         prep.setInt(5, warehouseId);
657         prep.setInt(6, threshold);
658         // TODO this is where HSQLDB is very slow
659
rs = db.query(prep);
660         rs.next();
661         rs.getInt(1); // stockCount
662
rs.close();
663         db.commit();
664     }
665
666     private PreparedStatement JavaDoc prepare(String JavaDoc sql) throws Exception JavaDoc {
667         PreparedStatement JavaDoc prep = (PreparedStatement JavaDoc) prepared.get(sql);
668         if (prep == null) {
669             prep = db.prepare(sql);
670             prepared.put(sql, prep);
671         }
672         return prep;
673     }
674
675 }
676
Popular Tags