package com.yahoo.ycsb.db.tpcc.helper; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.thrift.TSerializer; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.yahoo.ycsb.db.tpcc.helper.random.RandomGenerator; import com.yahoo.ycsb.db.tpcc.helper.rows.*; public class TPCCLoaderGenerator { private RandomGenerator generator = new RandomGenerator(0); static List<String> lastNameStrings = Lists.newArrayList("BAR", "OUGHT", "ABLE", "PRI", "PRES", "ESE", "ANTI", "CALLY", "ATION", "EING"); private String generateZipCode() { return generator.nstring(4, 4)+"11111"; } private String generateDataString() { String data = generator.astring(26, 50); // should insert "ORIGINAL" if(generator.nextDouble() < .1) { int originalIndex = generator.number(0, data.length()-9); data = data.substring(0, originalIndex)+"ORIGINAL"+data.substring(originalIndex+8); } return data; } private String generateLastName(int customerNo) { if(customerNo > 999) return Integer.toString(generator.NURand(255, 0, 999)); else return lastNameStrings.get(customerNo % 10) + lastNameStrings.get(customerNo/10 % 10) + lastNameStrings.get(customerNo/100 % 10); } ThreadLocal<TSerializer> serializer = new ThreadLocal<TSerializer>() { @Override protected TSerializer initialValue() { return new TSerializer(); } }; private ItemRow generateItemRow() { return new ItemRow(// i_im_id generator.number(0, 10000), // i_name generator.astring(14, 24), // i_price generator.fixedPoint(2, 1, 100), // i_data, generateDataString()); } private WarehouseRow generateWarehouseRow() { return new WarehouseRow(// w_name generator.astring(6, 10), // w_street_1, generator.astring(6, 10), // w_street_2, generator.astring(6, 10), // w_city, generator.astring(10, 20), // w_state, generator.astring(2,2), // w_zip generateZipCode(), // w_tax generator.fixedPoint(4, 0, .2), // w_ytd 300000.0); } private StockRow generateStockRow() { return new StockRow(// s_quantity (short) generator.number(10, 100), // s_dist{1-10}, generator.astring(24, 24), generator.astring(24, 24), generator.astring(24, 24), generator.astring(24, 24), generator.astring(24, 24), generator.astring(24, 24), generator.astring(24, 24), generator.astring(24, 24), generator.astring(24, 24), generator.astring(24, 24), // s_ytd, 0, // s_order_cnt, 0, // s_remote_cnt, 0, // s_data generateDataString()); } private DistrictRow generateDistrictRow() { return new DistrictRow(// d_name generator.astring(6, 10), // d_street_1 generator.astring(10, 20), // d_street_2 generator.astring(10, 20), // d_city generator.astring(10, 20), // d_state generator.astring(2, 2), // d_zip generateZipCode(), // d_tax generator.fixedPoint(4, 0, .2), 30000); } private CustomerRow generateCustomerRow(int c_id) { return new CustomerRow(// c_last generateLastName(c_id), // c_middle "OE", // c_first generator.astring(8, 16), // c_street_1 generator.astring(10, 20), // c_street_2 generator.astring(10, 20), // c_city generator.astring(10, 20), // c_state generator.astring(2, 2), // c_zip generateZipCode(), // c_phone generator.nstring(16, 16), // c_since Long.toString(System.currentTimeMillis()), // c_credit generator.nextDouble() < .1 ? "BC" : "GC", // c_credit_lim 50000.0, // c_discount, generator.fixedPoint(4, 0, .5), // c_balance, -10.0, // c_ytd_payment 10.0, // c_payment_cnt 1, // c_delivery_cnt 1, // c_data generator.astring(300, 500)); } private HistoryRow generateHistoryRow() { return new HistoryRow(// h_amount 10.0, // h_data generator.astring(12, 24)); } private OrderRow generateOrderRow(long o_id, int o_ol_count, int o_c_id, String date) { return new OrderRow(// o_c_id o_c_id, // o_entry_d date, // o_carrier_id o_id < 2101 ? generator.number(1, 10) : -1, // o_ol_cnt o_ol_count, // o_all_local (short) 1); } private OrderLineRow generateOrderLineRow(long o_id, String o_date, long ol_number, int w_id) { return new OrderLineRow(// ol_supply_w_id w_id, // ol_delivery_d o_id < 2101 ? o_date : "", // ol_quantity (short) 5, // ol_amount o_id < 2101 ? 0.0 : generator.fixedPoint(2, .01, 9999.99), // ol_dist_info generator.astring(24, 24)); } private NewOrderRow generateNewOrderRow() { return new NewOrderRow(); } public Map<String, byte[]> getData() throws Exception { Map<String, byte[]> ret = Maps.newHashMap(); for(int i_id = 1; i_id < 100001; ++i_id) { ret.put(TPCCConstants.getItemKey(i_id), serializer.get().serialize(generateItemRow())); } // warehouses for(int w_id = 1; w_id < 11; ++w_id) { System.out.printf("Creating warehouse ID %d\n", w_id); ret.put(TPCCConstants.getWarehouseKey(w_id), serializer.get().serialize(generateWarehouseRow())); for(int s_i_id = 1; s_i_id < 100001; ++s_i_id) { ret.put(TPCCConstants.getStockKey(w_id, s_i_id), serializer.get().serialize(generateStockRow())); } // districts for(int d_id = 1; d_id < 11; ++d_id) { System.out.printf("Creating district ID %d (warehouse: %d)\n", d_id, w_id); ret.put(TPCCConstants.getDistrictKey(w_id, d_id), serializer.get().serialize(generateDistrictRow())); // customers for(int c_id = 1; c_id < 3001; ++c_id) { ret.put(TPCCConstants.getCustomerKey(w_id, d_id, c_id), serializer.get().serialize(generateCustomerRow(c_id))); ret.put(TPCCConstants.getHistoryKey(w_id, d_id, c_id, System.currentTimeMillis()), serializer.get().serialize(generateHistoryRow())); } // scramble customer ids List<Integer> c_id_ordered = Lists.newArrayList(); for(int c_id = 1; c_id < 3001; ++c_id) { c_id_ordered.add(c_id); } List<Integer> c_id_random = Lists.newArrayList(); for(int i = 0; i < 3000; ++i) { c_id_random.add(c_id_ordered.remove(generator.number(0, c_id_ordered.size()-1))); } // orders for(long o_id = 1; o_id < 3001; ++o_id) { String orderDate = Long.toString(System.currentTimeMillis()); int orderCount = generator.number(5, 15); ret.put(TPCCConstants.getOrderKey(w_id, d_id, o_id), serializer.get().serialize(generateOrderRow(o_id, orderCount, c_id_random.get((int) o_id-1), orderDate))); for(int ol_number = 0; ol_number < orderCount; ++ol_number) { ret.put(TPCCConstants.getOrderLineKey(w_id, d_id, o_id, ol_number), serializer.get().serialize(generateOrderLineRow(o_id, orderDate, ol_number, w_id))); } if(o_id > 2101) ret.put(TPCCConstants.getNewOrderKey(w_id, d_id, o_id), serializer.get().serialize(generateNewOrderRow())); } } } return ret; } }