/***************************************************************************
* Copyright (C) 2012 by H-Store Project *
* Brown University *
* Massachusetts Institute of Technology *
* Yale University *
* *
* Alex Kalinin (akalinin@cs.brown.edu) *
* http://www.cs.brown.edu/~akalinin/ *
* *
* Permission is hereby granted, free of charge, to any person obtaining *
* a copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, sublicense, and/or sell copies of the Software, and to *
* permit persons to whom the Software is furnished to do so, subject to *
* the following conditions: *
* *
* The above copyright notice and this permission notice shall be *
* included in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR *
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
* OTHER DEALINGS IN THE SOFTWARE. *
***************************************************************************/
package edu.brown.benchmark.tpce.generators;
import org.voltdb.catalog.Table;
import org.voltdb.types.TimestampType;
import edu.brown.benchmark.tpce.TPCEConstants;
import edu.brown.benchmark.tpce.util.EGenDate;
import edu.brown.benchmark.tpce.util.EGenRandom;
/**
* @author akalinin
*
*/
public class SecurityGenerator extends TableGenerator {
private final double S_NUM_OUTMin = 4000000.0;
private final double S_NUM_OUTMax = 9500000000.0;
private final double S_PEMin = 1.0;
private final double S_PEMax = 120.0;
private final double S_DIVIDNonZeroMin = 0.01;
private final double S_DIVIDMax = 10.0;
private final double S_YIELDNonZeroMin = 0.01;
private final double S_YIELDMax = 120.0;
private final int percentCompaniesWithNonZeroDividend = 60;
private final int rngSkipOneRowSecurity = 11; // number of RNG calls for one row
private final EGenRandom rnd = new EGenRandom(EGenRandom.RNG_SEED_TABLE_DEFAULT);
private final long startSecurity;
private final long numSecurity;
private long counter;
private final SecurityHandler secHandle;
private final CompanyGenerator compGenerator;
private final int startDayMin;
private final int startDayMax;
private final int currDay;
/**
* @param catalog_tbl
* @param generator
*/
public SecurityGenerator(Table catalog_tbl, TPCEGenerator generator) {
super(catalog_tbl, generator);
secHandle = new SecurityHandler(generator);
startSecurity = SecurityHandler.getSecurityStart(generator.getStartCustomer());
numSecurity = SecurityHandler.getSecurityNum(generator.getCustomersNum());
counter = startSecurity;
compGenerator = (CompanyGenerator)generator.getTableGen(TPCEConstants.TABLENAME_COMPANY, null);
startDayMin = EGenDate.getDayNo(1900, 0, 1); // 01/01/1900
startDayMax = EGenDate.getDayNo(2000, 0, 2); // 01/02/2000
currDay = EGenDate.getDayNo(TPCEConstants.initialTradePopulationBaseYear,
TPCEConstants.initialTradePopulationBaseMonth,
TPCEConstants.initialTradePopulationBaseDay);
}
private void initNextLoadUnit() {
rnd.setSeedNth(EGenRandom.RNG_SEED_TABLE_DEFAULT, counter * rngSkipOneRowSecurity);
}
/* (non-Javadoc)
* @see java.util.Iterator#hasNext()
*/
@Override
public boolean hasNext() {
return counter < startSecurity + numSecurity;
}
public String createName(long index) {
long coId = secHandle.getCompanyId(index);
String[] secRow = secHandle.getSecRecord(index);
return secRow[3] + " of " +
compGenerator.generateCompanyName(coId - 1 - TPCEConstants.IDENT_SHIFT); // <issue> of <company name>
}
public long getNumSecurity(){
return numSecurity;
}
/* (non-Javadoc)
* @see java.util.Iterator#next()
*/
@Override
public Object[] next() {
if (counter % TPCEConstants.DEFAULT_SECURITIES_PER_UNIT == 0) {
initNextLoadUnit();
}
Object[] tuple = new Object[columnsNum];
String[] secRow = secHandle.getSecRecord(counter);
String secName = createName(counter);
tuple[0] = secHandle.createSymbol(counter, 15); // s_symb; CHAR(15)
tuple[1] = secRow[3]; // s_issue
tuple[2] = secRow[1]; // s_st_id
tuple[3] = secName; // s_name
tuple[4] = secRow[4].trim(); // s_ex_id; it seems there are whitespace characters present in the file???
tuple[5] = secHandle.getCompanyId(counter); // s_co_id
tuple[6] = (long)rnd.doubleIncrRange(S_NUM_OUTMin, S_NUM_OUTMax, 1.0); // s_num_out
// start date
int startDay = rnd.intRange(startDayMin, startDayMax);
tuple[7] = new TimestampType(EGenDate.getDateFromDayNo(startDay)); // s_start_date
// exchange date
int exDay = rnd.intRange(startDay, startDayMax);
tuple[8] = new TimestampType(EGenDate.getDateFromDayNo(exDay)); // s_exch_date
tuple[9] = rnd.doubleIncrRange(S_PEMin, S_PEMax, 0.01); // s_pe
// s_52wk_high
double wkHigh = rnd.doubleIncrRange(TPCEConstants.minSecPrice + ((TPCEConstants.maxSecPrice - TPCEConstants.minSecPrice) / 2),
TPCEConstants.maxSecPrice, 0.01);
int wkDay = rnd.intRange(currDay - 7 * 52, currDay); // 7 days per week, 52 weeks per year
tuple[10] = wkHigh; // s_52wk_high
tuple[11] = new TimestampType(EGenDate.getDateFromDayNo(wkDay)); // s_52wk_high_date
// s_52wk_low
double wkLow = rnd.doubleIncrRange(TPCEConstants.minSecPrice, wkHigh, 0.01);
wkDay = rnd.intRange(currDay - 7 * 52, currDay); // 7 days per week, 52 weeks per year
tuple[12] = wkLow; // s_52wk_low
tuple[13] = new TimestampType(EGenDate.getDateFromDayNo(wkDay)); // s_52wk_low_date
double yield, dividend;
if (rnd.rndPercent(percentCompaniesWithNonZeroDividend)) {
yield = rnd.doubleIncrRange(S_YIELDNonZeroMin, S_YIELDMax, 0.01);
dividend = rnd.doubleIncrRange(yield * 0.2, yield * 0.3, 0.01);
}
else {
yield = dividend = 0;
}
tuple[14] = dividend; // s_dividend
tuple[15] = yield; // s_yield
counter++;
return tuple;
}
}