package edu.brown.benchmark.tpce.generators;
import java.util.List;
import org.voltdb.catalog.Table;
import edu.brown.benchmark.tpce.TPCEConstants;
import edu.brown.benchmark.tpce.TPCEConstants.eStatusTypeID;
import edu.brown.benchmark.tpce.generators.CustomerSelection.TierId;
import edu.brown.benchmark.tpce.util.*;
import edu.brown.benchmark.tpce.generators.TPCEGenerator.InputFile;
public class DM {
private DriverGlobalSettings driverGlobalSettings;
private DriverDMSettings driverDMSettings;
private EGenRandom rnd;
private CustomerSelection customerSelection;
private CustomerAccountsGenerator account;
private SecurityHandler securities;
private CompanyGenerator companies;
private InputFileHandler taxRatesDivision;
private InputFileHandler statusType;
private long securityCount;
private long companyCount;
private long startFromCompany;
private int divisionTaxCount;
private long startFromCustomer;
private long myCustomerCount;
private int dataMaintenanceTableNum;
private TDataMaintenanceTxnInput txnInput;
private TTradeCleanupTxnInput cleanupTxnInput;
private DMSUTInterface sut;
private BaseLogger logger;
public static final int iDataMaintenanceTableCount = 12;
public static String DataMaintenanceTableName[] = {
"ACCOUNT_PERMISSION",
"ADDRESS",
"COMPANY",
"CUSTOMER",
"CUSTOMER_TAXRATE",
"DAILY_MARKET",
"EXCHANGE",
"FINANCIAL",
"NEWS_ITEM",
"SECURITY",
"TAXRATE",
"WATCH_ITEM"
};
private void autoSetRNGSeeds( long uniqueID ){
int baseYear, baseMonth, baseDay, millisec;
baseYear = EGenDate.getYear();
baseMonth = EGenDate.getMonth();
baseDay = EGenDate.getDay();
millisec = (EGenDate.getHour() * EGenDate.MinutesPerHour + EGenDate.getMinute()) * EGenDate.SecondsPerMinute + EGenDate.getSecond();
baseYear -= ( baseYear % 5 );
long Seed;
Seed = millisec / 100;
Seed <<= 11;
Seed += EGenDate.getDayNo(baseYear, baseMonth, baseDay) - EGenDate.getDayNo(baseYear, 1, 1);
Seed <<= 33;
rnd.setSeed( Seed );
driverDMSettings.cur_RNGSeed = Seed;
}
private long generateRandomCustomerId(){
return rnd.int64Range(startFromCustomer,
startFromCustomer + driverGlobalSettings.cur_iActiveCustomerCount - 1);
}
private long generateRandomCustomerAccountId(){
long iCustomerId;
TierId iCustomerTier;
Object[] customerId;
customerId = customerSelection.genRandomCustomer();
iCustomerId = Long.parseLong(customerId[0].toString());
iCustomerTier = (TierId)customerId[0];
return( account.genRandomAccId(rnd, iCustomerId, iCustomerTier)[0]);
}
private long generateRandomCompanyId(){
return rnd.int64Range(startFromCompany, startFromCompany + companyCount - 1);
}
private long generateRandomSecurityId(){
return rnd.int64Range(0, securityCount-1);
}
private void initialize(){
logger.sendToLogger(driverGlobalSettings);
securityCount = SecurityHandler.getSecurityNum(myCustomerCount);
companyCount = companies.getCompanyCount();
startFromCompany = companies.generateCompId();
divisionTaxCount = taxRatesDivision.getRecordsNum();
startFromCustomer = TPCEConstants.DEFAULT_START_CUSTOMER_ID + TPCEConstants.IDENT_SHIFT;
}
public DM( DMSUTInterface pSUT, BaseLogger pLogger, TPCEGenerator inputFiles, long iConfiguredCustomerCount, long iActiveCustomerCount, int iScaleFactor, int iDaysOfInitialTrades, long uniqueID ){
driverGlobalSettings = new DriverGlobalSettings( iConfiguredCustomerCount, iActiveCustomerCount, iScaleFactor, iDaysOfInitialTrades );
driverDMSettings = new DriverDMSettings( uniqueID, 0 );
rnd = new EGenRandom();
customerSelection = new CustomerSelection(rnd, TPCEConstants.DEFAULT_START_CUSTOMER_ID, TPCEConstants.ACTIVECUSTOMERCOUNT);
account = (CustomerAccountsGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_CUSTOMER_ACCOUNT, null);
securities = new SecurityHandler(inputFiles);
companies = (CompanyGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_COMPANY, null);
taxRatesDivision = inputFiles.getInputFile(InputFile.TAXDIV);
statusType = inputFiles.getInputFile(InputFile.STATUS);
divisionTaxCount = 0;
dataMaintenanceTableNum = 0;
sut = pSUT;
logger = pLogger ;
myCustomerCount = iActiveCustomerCount;
logger.sendToLogger("DM object constructed using constructor 1 (valid for publication: YES).");
initialize();
autoSetRNGSeeds( uniqueID );
logger.sendToLogger(driverDMSettings);
}
public DM( DMSUTInterface pSUT, BaseLogger pLogger, TPCEGenerator inputFiles, long iConfiguredCustomerCount, long iActiveCustomerCount, int iScaleFactor,
int iDaysOfInitialTrades, long uniqueID, long RNGSeed ){
driverGlobalSettings = new DriverGlobalSettings( iConfiguredCustomerCount, iActiveCustomerCount, iScaleFactor, iDaysOfInitialTrades );
driverDMSettings = new DriverDMSettings( uniqueID, RNGSeed );
customerSelection = new CustomerSelection(rnd, TPCEConstants.DEFAULT_START_CUSTOMER_ID, TPCEConstants.ACTIVECUSTOMERCOUNT);
account = (CustomerAccountsGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_CUSTOMER_ACCOUNT, null);
rnd = new EGenRandom(RNGSeed);
securities = new SecurityHandler(inputFiles);
companies = (CompanyGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_COMPANY, null);
taxRatesDivision = inputFiles.getInputFile(InputFile.TAXDIV);
statusType = inputFiles.getInputFile(InputFile.STATUS);
divisionTaxCount = 0;
dataMaintenanceTableNum = 0;
sut = pSUT;
logger = pLogger ;
logger.sendToLogger("DM object constructed using constructor 1 (valid for publication: YES).");
initialize();
logger.sendToLogger(driverDMSettings);
}
public long getRNGSeed(){
return( rnd.getSeed() );
}
public void DoTxn(){
txnInput = new TDataMaintenanceTxnInput();
txnInput.setTableName(DataMaintenanceTableName[dataMaintenanceTableNum]);
switch( dataMaintenanceTableNum ){
case 0: // ACCOUNT_PERMISSION
txnInput.setAcctId(generateRandomCustomerAccountId());
break;
case 1: // ADDRESS
if (rnd.rndPercent(67)){
txnInput.setCId( generateRandomCustomerId());
}
else{
txnInput.setCoId(generateRandomCompanyId());
}
break;
case 2: // COMPANY
txnInput.setCoId(generateRandomCompanyId());
break;
case 3: // CUSTOMER
txnInput.setCId(generateRandomCustomerId());
break;
case 4: // CUSTOMER_TAXRATE
txnInput.setCId(generateRandomCustomerId());
break;
case 5: // DAILY_MARKET
txnInput.setSymbol(securities.createSymbol( generateRandomSecurityId(), txnInput.getSymbol().length()));
txnInput.setDayOfMonth(rnd.intRange(1, 31));
txnInput.setVolIncr(rnd.intRange(-2, 3));
if (txnInput.getVolIncr() == 0)
{
txnInput.setVolIncr(-3);
}
break;
case 6: // EXCHANGE
break;
case 7: // FINANCIAL
txnInput.setCoId(generateRandomCompanyId());
break;
case 8: // NEWS_ITEM
txnInput.setCoId(generateRandomCompanyId());
break;
case 9: // SECURITY
txnInput.setSymbol(securities.createSymbol( generateRandomSecurityId(), txnInput.getSymbol().length()));
break;
case 10: // TAXRATE
List<String[]> pRates;
int threshold;
pRates = taxRatesDivision.getTuplesByIndex(rnd.intRange(0, divisionTaxCount - 1));
threshold = rnd.intRange(0, pRates.size()-1);
txnInput.setTxId(pRates.get(threshold)[0]);
break;
case 11: // WATCH_ITEM
txnInput.setCId(generateRandomCustomerId());
break;
default:
assert(false);
}
sut.DataMaintenance( txnInput );
dataMaintenanceTableNum = (dataMaintenanceTableNum + 1) % iDataMaintenanceTableCount;
}
public void DoCleanupTxn(){
cleanupTxnInput = new TTradeCleanupTxnInput();
cleanupTxnInput.start_trade_id =
(long)((( driverGlobalSettings.cur_iDaysOfInitialTrades * EGenDate.HoursPerWorkDay * EGenDate.SecondsPerHour * ( driverGlobalSettings.cur_iActiveCustomerCount / driverGlobalSettings.cur_iScaleFactor )) * TPCEConstants.AbortTrade / 100 ) + 1);
System.arraycopy(statusType.getTupleByKey(eStatusTypeID.ePending.getVal())[0], 0, cleanupTxnInput.st_pending_id, 0, TableConsts.cST_ID_len);
System.arraycopy(statusType.getTupleByKey(eStatusTypeID.eSubmitted.getVal())[0], 0, cleanupTxnInput.st_submitted_id, 0, TableConsts.cST_ID_len);
System.arraycopy(statusType.getTupleByKey(eStatusTypeID.eCanceled.getVal())[0], 0, cleanupTxnInput.st_canceled_id, 0, TableConsts.cST_ID_len);
sut.TradeCleanup( cleanupTxnInput );
}
}