Package edu.brown.benchmark.tpce.generators

Source Code of edu.brown.benchmark.tpce.generators.CETxnInputGenerator

package edu.brown.benchmark.tpce.generators;

import java.util.Arrays;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.concurrent.atomic.AtomicLong;

import org.voltdb.types.TimestampType;

import edu.brown.benchmark.tpce.TPCEConstants;

import edu.brown.benchmark.tpce.util.*;
import edu.brown.benchmark.tpce.generators.CustomerSelection.TierId;
import edu.brown.benchmark.tpce.generators.StatusTypeGenerator.StatusTypeId;
import edu.brown.benchmark.tpce.generators.TPCEGenerator.InputFile;
import edu.brown.benchmark.tpce.generators.TradeGenerator.TradeType;


public class CETxnInputGenerator {
 
   
    public CETxnInputGenerator( TPCEGenerator inputFiles, long configuredCustomerCount, long activeCustomerCount,
                    int scaleFactor, int hoursOfInitialTrades, BaseLogger logger, TDriverCETxnSettings driverCETxnSettings){
      inputFiles.parseInputFiles();
        rnd = new EGenRandom(EGenRandom.RNG_SEED_BASE_TXN_MIX_GENERATOR);
        person = new PersonHandler(inputFiles.getInputFile(InputFile.LNAME), inputFiles.getInputFile(InputFile.FEMFNAME), inputFiles.getInputFile(InputFile.MALEFNAME));
        customerSelection = new CustomerSelection(rnd, TPCEConstants.DEFAULT_START_CUSTOMER_ID, TPCEConstants.ACTIVECUSTOMERCOUNT);
        account = (CustomerAccountsGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_CUSTOMER_ACCOUNT, null);
        accountPerms = (AccountPermsGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_ACCOUNT_PERMISSION, null);
        holdings = new HoldingsAndTrades(inputFiles);
        brokers = (BrokerGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_BROKER, null);
        companies = (CompanyGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_COMPANY, null);
        securities = new SecurityHandler(inputFiles);
        industries = inputFiles.getInputFile(InputFile.INDUSTRY);
        sectors = inputFiles.getInputFile(InputFile.SECTOR);
        statusType = inputFiles.getInputFile(InputFile.STATUS);
        tradeType = inputFiles.getInputFile(InputFile.TRADETYPE);
        this.driverCETxnSettings = driverCETxnSettings;
        this.logger = logger;
        this.configuredCustomerCount = configuredCustomerCount;
        this.activeCustomerCount = activeCustomerCount;
        startingCustomerID = TPCEConstants.DEFAULT_START_CUSTOMER_ID;
        this.myCustomerCount = activeCustomerCount;
        partitionPercent = 100;
        this.scaleFactor = scaleFactor;
        this.hoursOfInitialTrades = hoursOfInitialTrades;
       
        initialize();
    }

   
      public CETxnInputGenerator( TPCEGenerator inputFiles, long configuredCustomerCount, long activeCustomerCount,
                        int scaleFactor, int hoursOfInitialTrades, long RNGSeed, BaseLogger logger,
                        TDriverCETxnSettings driverCETxnSettings){
      inputFiles.parseInputFiles();
      rnd = new EGenRandom(RNGSeed);   //initialize with a default seed
        person = new PersonHandler(inputFiles.getInputFile(InputFile.LNAME), inputFiles.getInputFile(InputFile.FEMFNAME), inputFiles.getInputFile(InputFile.MALEFNAME));
        customerSelection = new CustomerSelection(rnd, TPCEConstants.DEFAULT_START_CUSTOMER_ID, TPCEConstants.ACTIVECUSTOMERCOUNT);   
        account = (CustomerAccountsGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_CUSTOMER_ACCOUNT, null);
        accountPerms = (AccountPermsGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_ACCOUNT_PERMISSION, null);
        holdings = new HoldingsAndTrades(inputFiles);
        brokers = (BrokerGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_BROKER, null)
        companies = (CompanyGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_COMPANY, null);
        securities = new SecurityHandler(inputFiles);
        industries = inputFiles.getInputFile(InputFile.INDUSTRY);
        sectors = inputFiles.getInputFile(InputFile.SECTOR);
        statusType = inputFiles.getInputFile(InputFile.STATUS);
        tradeType = inputFiles.getInputFile(InputFile.TRADETYPE);
        this.driverCETxnSettings = driverCETxnSettings;
        this.logger = logger;
        this.configuredCustomerCount = configuredCustomerCount;
        this.activeCustomerCount = activeCustomerCount;
        startingCustomerID = TPCEConstants.DEFAULT_START_CUSTOMER_ID;
        this.myCustomerCount = activeCustomerCount;
        partitionPercent = 100;
        this.scaleFactor = scaleFactor;
        this.hoursOfInitialTrades = hoursOfInitialTrades;
       
        initialize();
    }
       
  
      public CETxnInputGenerator( TPCEGenerator inputFiles, long configuredCustomerCount, long activeCustomerCount,
                        int scaleFactor, int hoursOfInitialTrades,  long startingCustomerID, long myCustomerCount, int partitionPercent,
                        BaseLogger logger, TDriverCETxnSettings driverCETxnSettings){
        inputFiles.parseInputFiles();
        rnd = new EGenRandom(EGenRandom.RNG_SEED_BASE_TXN_MIX_GENERATOR);   //initialize with a default seed
          person = new PersonHandler(inputFiles.getInputFile(InputFile.LNAME), inputFiles.getInputFile(InputFile.FEMFNAME), inputFiles.getInputFile(InputFile.MALEFNAME));
          customerSelection = new CustomerSelection(rnd, TPCEConstants.DEFAULT_START_CUSTOMER_ID, TPCEConstants.ACTIVECUSTOMERCOUNT);
         
          account = (CustomerAccountsGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_CUSTOMER_ACCOUNT, null);
          accountPerms = (AccountPermsGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_ACCOUNT_PERMISSION, null);
          holdings = new HoldingsAndTrades(inputFiles);
         
          brokers = (BrokerGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_BROKER, null)
          companies = (CompanyGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_COMPANY, null);
          securities = new SecurityHandler(inputFiles);
          industries = inputFiles.getInputFile(InputFile.INDUSTRY);
          sectors = inputFiles.getInputFile(InputFile.SECTOR);
          statusType = inputFiles.getInputFile(InputFile.STATUS);
          tradeType = inputFiles.getInputFile(InputFile.TRADETYPE);
          this.driverCETxnSettings = driverCETxnSettings;
          this.logger = logger;
          this.configuredCustomerCount = configuredCustomerCount;
          this.activeCustomerCount = activeCustomerCount;
          this.startingCustomerID = startingCustomerID;
          this.myCustomerCount = myCustomerCount;
          this.partitionPercent = partitionPercent;
          this.scaleFactor = scaleFactor;
          this.hoursOfInitialTrades = hoursOfInitialTrades;
          initialize();
      }

   
      public CETxnInputGenerator( TPCEGenerator inputFiles, long configuredCustomerCount, long activeCustomerCount,
                        int scaleFactor, int hoursOfInitialTrades, long startingCustomerID, long myCustomerCount, int partitionPercent,
                        long RNGSeed, BaseLogger logger, TDriverCETxnSettings driverCETxnSettings){
        inputFiles.parseInputFiles();
        rnd = new EGenRandom(RNGSeed);   //initialize with a default seed
          person = new PersonHandler(inputFiles.getInputFile(InputFile.LNAME), inputFiles.getInputFile(InputFile.FEMFNAME), inputFiles.getInputFile(InputFile.MALEFNAME));
          customerSelection = new CustomerSelection(rnd, TPCEConstants.DEFAULT_START_CUSTOMER_ID, TPCEConstants.ACTIVECUSTOMERCOUNT);
         
          account = (CustomerAccountsGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_CUSTOMER_ACCOUNT, null);
          accountPerms = (AccountPermsGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_ACCOUNT_PERMISSION, null);
          holdings = new HoldingsAndTrades(inputFiles);
         
          brokers = (BrokerGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_BROKER, null);
          companies = (CompanyGenerator)inputFiles.getTableGen(TPCEConstants.TABLENAME_COMPANY, null);
          securities = new SecurityHandler(inputFiles);
          industries = inputFiles.getInputFile(InputFile.INDUSTRY);
          sectors = inputFiles.getInputFile(InputFile.SECTOR);
          statusType = inputFiles.getInputFile(InputFile.STATUS);
          tradeType = inputFiles.getInputFile(InputFile.TRADETYPE);
          this.driverCETxnSettings = driverCETxnSettings;
          this.logger = logger;
          this.configuredCustomerCount = configuredCustomerCount;
          this.activeCustomerCount = activeCustomerCount;
          this.startingCustomerID = startingCustomerID;
          this.myCustomerCount = myCustomerCount;
          this.partitionPercent = partitionPercent;
          this.scaleFactor = scaleFactor;
          this.hoursOfInitialTrades = hoursOfInitialTrades;
          initialize();
      }

    public void initialize(){
        activeCompanyCount = companies.getCompanyCount();
        activeSecurityCount = SecurityHandler.getSecurityNum(myCustomerCount);
        industryCount = industries.getMaxKey();
        sectorCount = sectors.getMaxKey();
        startFromCompany = companies.generateCompId();

        maxActivePrePopulatedTradeID = (int)(( hoursOfInitialTrades * EGenDate.SecondsPerHour * ( activeCustomerCount / scaleFactor )) * TPCEConstants.AbortTrade / 100 );
        currentTradeID = new AtomicLong(maxActivePrePopulatedTradeID + 1);
        startTime = EGenDate.getDateFromTime(
            TPCEConstants.initialTradePopulationBaseYear,
            TPCEConstants.initialTradePopulationBaseMonth,
            TPCEConstants.initialTradePopulationBaseDay,
            TPCEConstants.initialTradePopulationBaseHour,
            TPCEConstants.initialTradePopulationBaseMinute,
            TPCEConstants.initialTradePopulationBaseSecond,
            TPCEConstants.initialTradePopulationBaseFraction );
    }

  
    public long getRNGSeed(){
        return( rnd.getSeed() );
    }

   
    public void setRNGSeed( long RNGSeed ){
        rnd.setSeed( RNGSeed );
    }

    public void updateTunables(){
     
        tradeLookupFrame2MaxTimeInMilliSeconds = (long)(( hoursOfInitialTrades * EGenDate.SecondsPerHour ) - ( driverCETxnSettings.TL_settings.cur_BackOffFromEndTimeFrame2 )) * EGenDate.MsPerSecond;
        tradeLookupFrame3MaxTimeInMilliSeconds = (long)(( hoursOfInitialTrades * EGenDate.SecondsPerHour ) - ( driverCETxnSettings.TL_settings.cur_BackOffFromEndTimeFrame3 )) * EGenDate.MsPerSecond;
        tradeLookupFrame4MaxTimeInMilliSeconds = (long)(( hoursOfInitialTrades * EGenDate.SecondsPerHour ) - ( driverCETxnSettings.TL_settings.cur_BackOffFromEndTimeFrame4 )) * EGenDate.MsPerSecond;

        tradeUpdateFrame2MaxTimeInMilliSeconds = (long)(( hoursOfInitialTrades * EGenDate.SecondsPerHour ) - ( driverCETxnSettings.TU_settings.cur_BackOffFromEndTimeFrame2 )) * EGenDate.MsPerSecond;
        tradeUpdateFrame3MaxTimeInMilliSeconds = (long)(( hoursOfInitialTrades * EGenDate.SecondsPerHour ) - ( driverCETxnSettings.TU_settings.cur_BackOffFromEndTimeFrame3 )) * EGenDate.MsPerSecond;

        endTime = startTime;
        endTime = EGenDate.AddWorkMs( endTime, (long)(hoursOfInitialTrades * EGenDate.SecondsPerHour + 15 * EGenDate.SecondsPerMinute) * EGenDate.MsPerSecond );

        tradeOrderRollbackLimit = driverCETxnSettings.TxnMixGenerator_settings.cur_TradeOrderMixLevel;
        tradeOrderRollbackLevel = driverCETxnSettings.TO_settings.cur_rollback;

        logger.sendToLogger(driverCETxnSettings.BV_settings);
        logger.sendToLogger(driverCETxnSettings.CP_settings);
        logger.sendToLogger(driverCETxnSettings.MW_settings);
        logger.sendToLogger(driverCETxnSettings.SD_settings);
        logger.sendToLogger(driverCETxnSettings.TL_settings);
        logger.sendToLogger(driverCETxnSettings.TO_settings);
        logger.sendToLogger(driverCETxnSettings.TU_settings);
    }

    public long generateRandomCustomerAccountId(){
        long          customerID;
        long          customerAccountId;
        TierId        tierID;
        Object[] customer = new Object[2];

        customer = customerSelection.genRandomCustomer();      
        customerID = Long.parseLong(customer[0].toString());
        tierID = (TierId)customer[1];
       
        customerAccountId = account.genRandomAccId( rnd, customerID, tierID)[0];

        return(customerAccountId);
    }

    public long generateNonUniformTradeID( int aValue, int sValue ){
      long tradeID;

        tradeID = rnd.rndNU( 1, maxActivePrePopulatedTradeID, aValue, sValue );
        if ( HoldingsAndTrades.isAbortedTrade(tradeID) ){
            tradeID++;
        }
        tradeID += TPCEConstants.TRADE_SHIFT;
        return( tradeID );
    }

    public TimestampType generateNonUniformTradeDTS( long maxTimeInMS, int aValue, int sValue ){
      GregorianCalendar tradeTime = new GregorianCalendar(TPCEConstants.initialTradePopulationBaseYear,
                                  TPCEConstants.initialTradePopulationBaseMonth,
                                  TPCEConstants.initialTradePopulationBaseDay,
                                  TPCEConstants.initialTradePopulationBaseHour,
                                  TPCEConstants.initialTradePopulationBaseMinute,
                                  TPCEConstants.initialTradePopulationBaseSecond );  
        long tradeTimeOffset;

        tradeTimeOffset = rnd.rndNU( 1, maxTimeInMS, aValue, sValue );
        return EGenDate.getTimeStamp(EGenDate.AddWorkMs( tradeTime.getTime(), tradeTimeOffset ));
       
    }

    /*
    *  Generate Broker-Volume transaction input.
    *
    *  PARAMETERS:
    *           OUT inputStructure                  - input parameter structure filled in for the transaction.
    *
    *  RETURNS:
    *           none.
    */
    public void generateBrokerVolumeInput(TBrokerVolumeTxnInput inputStructure){
      int           numBrokers;
        int           count, i;
        long[]        brokerID = new long [TxnHarnessStructs.max_broker_list_len];
        int           sectorIndex;
       
        numBrokers = rnd.intRange(TxnHarnessStructs.min_broker_list_len, TxnHarnessStructs.max_broker_list_len);
       
        inputStructure.setBrokerList(numBrokers);
    for (i = 0; i < numBrokers; ++i){
      inputStructure.getBrokerList()[i] = new String();
        }
   
        if (numBrokers > brokers.GetBrokerCount()){
            numBrokers = (int)brokers.GetBrokerCount();
        }
        count = 0;
        do{
            brokerID[count] = brokers.GenerateRandomBrokerId(rnd);
            for (i = 0; (i < count) && (brokerID[i] != brokerID[count]); ++i) { };
            if (i == count){
              inputStructure.getBrokerList()[i] = brokers.generateBrokerName(brokerID[count]);
                ++count;
            }
        } while (count < numBrokers);

        sectorIndex = rnd.intRange(0, sectorCount-1);
        inputStructure.setSectorName((String)sectors.getTupleByIndex(sectorIndex)[1].toString());
    }


    /*
    *  Generate Customer-Position transaction input.
    *
    *  PARAMETERS:
    *           OUT inputStructure                  - input parameter structure filled in for the transaction.
    *
    *  RETURNS:
    *           none.
    */
    public void generateCustomerPositionInput(TCustomerPositionTxnInput inputStructure){
        Object[] customer = new Object[2];
        customer = customerSelection.genRandomCustomer();
        long customerID = Long.parseLong(customer[0].toString());
        TierId tierID = (TierId)customer[1];
       
        if (rnd.rndPercent(driverCETxnSettings.CP_settings.cur_by_tax_id)){
         
          inputStructure.setTaxId( person.getTaxID(customerID));
            inputStructure.setCustId(0);
        }
        else{
            inputStructure.setCustId(customerID);
            inputStructure.setTaxId(new String());
        }

        boolean get_history = rnd.rndPercent(driverCETxnSettings.CP_settings.cur_get_history);
        if( get_history ){
          inputStructure.setHistory(1);
            inputStructure.setAcctIdIndex(rnd.intRange( 0, (int)account.genRandomAccId(rnd, customerID, tierID)[1] - 1));
        }
        else{
          inputStructure.setHistory(0);
            inputStructure.setAcctIdIndex(-1);
        }
    }

    /*
    *  Generate Market-Watch transaction input.
    *
    *  PARAMETERS:
    *           OUT inputStructure                  - input parameter structure filled in for the transaction.
    *
    *  RETURNS:
    *           none.
    */
    public void generateMarketWatchInput(TMarketWatchTxnInput inputStructure){
        long          customerID;
        TierId        tierID;
        int           threshold;
        int           week;
        int           dailyMarketDay;
        Object[] customer = new Object[2];
        Date date = EGenDate.getDateFromTime(TPCEConstants.dailyMarketBaseYear, TPCEConstants.dailyMarketBaseMonth,
                        TPCEConstants.dailyMarketBaseDay, TPCEConstants.dailyMarketBaseHour,
                        TPCEConstants.dailyMarketBaseMinute, TPCEConstants.dailyMarketBaseSecond, TPCEConstants.dailyMarketBaseMsec);
        threshold = rnd.rndPercentage();
        if (threshold <= driverCETxnSettings.MW_settings.cur_by_industry){
           
          inputStructure.setIndustryName(industries.getTupleByIndex(rnd.intRange(0, industryCount-1))[1]);
            inputStructure.setCId(0);
            inputStructure.setAcctId(0);

            if( TxnHarnessStructs.iBaseCompanyCount < activeCompanyCount ){
                inputStructure.setStartingCoId(rnd.int64Range( startFromCompany, startFromCompany + activeCompanyCount - ( TxnHarnessStructs.iBaseCompanyCount - 1 )));
                inputStructure.setEndingCoId(inputStructure.getStartingCoId() + ( TxnHarnessStructs.iBaseCompanyCount - 1 ));
            }
            else{
              inputStructure.setStartingCoId(startFromCompany);
                inputStructure.setEndingCoId(startFromCompany + activeCompanyCount - 1);
            }
        }
        else{
          inputStructure.setStartingCoId(0);
          inputStructure.setEndingCoId(0);
          inputStructure.setIndustryName(new String());
     
            customer = customerSelection.genRandomCustomer();
           
            if (threshold <= (driverCETxnSettings.MW_settings.cur_by_industry + driverCETxnSettings.MW_settings.cur_by_watch_list)){
                tierID = (TierId)customer[1];
                inputStructure.setCId(Long.parseLong(customer[0].toString()));
               
                inputStructure.setAcctId(0);
            }
            else{
              customerID = Long.parseLong(customer[0].toString());
              tierID = (TierId)customer[1];
              inputStructure.setAcctId(account.genRandomAccId(rnd, customerID, tierID, inputStructure.getAcctId(), -1)[0]);
                inputStructure.setCId(0);
            }
        }

        week = (int)rnd.rndNU(0, 255, 255, 0) + 5;
      
        threshold = rnd.rndPercentage();
        if (threshold > 40){
            dailyMarketDay = week * EGenDate.DaysPerWeek + 4;
        }
        else{
            if (threshold <= 20){
                dailyMarketDay = week * EGenDate.DaysPerWeek;
            }
            else{
                if (threshold <= 27){
                    dailyMarketDay = week * EGenDate.DaysPerWeek + 1;
                }
                else{
                    if (threshold <= 33){
                        dailyMarketDay = week * EGenDate.DaysPerWeek + 2;
                    }
                    else{
                        dailyMarketDay = week * EGenDate.DaysPerWeek + 3;
                    }
                }
            }
        }
        date = EGenDate.addDaysMsecs(date, dailyMarketDay, 0, false);

        inputStructure.setStartDay(EGenDate.getTimeStamp(date));
    }

    /*
    *  Generate Security-Detail transaction input.
    *
    *  PARAMETERS:
    *           OUT inputStructure                  - input parameter structure filled in for the transaction.
    *
    *  RETURNS:
    *           none.
    */
    public void generateSecurityDetailInput(TSecurityDetailTxnInput inputStructure){
      Date date = EGenDate.getDateFromTime(TPCEConstants.dailyMarketBaseYear, TPCEConstants.dailyMarketBaseMonth,
          TPCEConstants.dailyMarketBaseDay, TPCEConstants.dailyMarketBaseHour,
        TPCEConstants.dailyMarketBaseMinute, TPCEConstants.dailyMarketBaseSecond, TPCEConstants.dailyMarketBaseMsec);
        int startDay;

        char[] tmp = securities.createSymbol( rnd.int64Range(0, activeSecurityCount-1), TableConsts.cSYMBOL_len).toCharArray();
       
        inputStructure.setSymbol(String.copyValueOf(tmp, 0, tmp.length));

        if(rnd.rndPercent( driverCETxnSettings.SD_settings.cur_LOBAccessPercentage ))
          inputStructure.setAccessLobFlag(1);
        else inputStructure.setAccessLobFlag(0);

        inputStructure.setMaxRowsToReturn(rnd.intRange(TPCEConstants.iSecurityDetailMinRows, TPCEConstants.iSecurityDetailMaxRows));

        startDay = rnd.intRange(0, DailyMarketGenerator.iDailyMarketTotalRows - inputStructure.getMaxRowsToReturn());

        date = EGenDate.addDaysMsecs(date, startDay, 0, false);
        inputStructure.setStartDay(EGenDate.getTimeStamp(date));
    }

    /*
    *  Generate Trade-Lookup transaction input.
    *
    *  PARAMETERS:
    *           OUT inputStructure                  - input parameter structure filled in for the transaction.
    *
    *  RETURNS:
    *           none.
    */
    public void generateTradeLookupInput(TTradeLookupTxnInput inputStructure){
        int           threshold;
        threshold = rnd.rndPercentage();

        if( threshold <= driverCETxnSettings.TL_settings.cur_do_frame1 ){ 
            inputStructure.setFrameToExecute(1);
            inputStructure.setMaxTrades(driverCETxnSettings.TL_settings.cur_MaxRowsFrame1);

            int     i, j;
            boolean    accepted;
            long  tradeID;

            for( i = 0; i < inputStructure.getMaxTrades(); i++ ){
                accepted = false;
                while( ! accepted ){
                    tradeID = generateNonUniformTradeID(TPCEConstants.TradeLookupAValueForTradeIDGenFrame1,
                        TPCEConstants.TradeLookupSValueForTradeIDGenFrame1);
                    j = 0;
                    while( j < i && inputStructure.getTradeId()[j] != tradeID ){
                        j++;
                    }
                    if( j == i ){
                        inputStructure.getTradeId()[i] = tradeID;
                        accepted = true;
                    }
                }
            }
       
            inputStructure.setAcctId(0);                                         
            inputStructure.setMaxAcctId(0);                                     
            inputStructure.setSymbol(new String());                  
           
            GregorianCalendar date = new GregorianCalendar(0,0,0,0,0);       
            inputStructure.setStartTradeDts(new TimestampType(date.getTime()))
            inputStructure.setEndTradeDts(new TimestampType(date.getTime()))
        }
        else if( threshold <=  driverCETxnSettings.TL_settings.cur_do_frame1 + driverCETxnSettings.TL_settings.cur_do_frame2 ){
            inputStructure.setFrameToExecute(2);
            inputStructure.setAcctId(generateRandomCustomerAccountId());
            inputStructure.setMaxTrades(driverCETxnSettings.TL_settings.cur_MaxRowsFrame2);

            inputStructure.setStartTradeDts(generateNonUniformTradeDTS( tradeLookupFrame2MaxTimeInMilliSeconds, TPCEConstants.TradeLookupAValueForTimeGenFrame2, TPCEConstants.TradeLookupSValueForTimeGenFrame2 ));
           
            inputStructure.setEndTradeDts(EGenDate.getTimeStamp( endTime));

            inputStructure.setMaxAcctId(0);
            inputStructure.setSymbol( new String());
            Arrays.fill(inputStructure.getTradeId(), 0);
        }
        else if( threshold <=  driverCETxnSettings.TL_settings.cur_do_frame1 + driverCETxnSettings.TL_settings.cur_do_frame2 + driverCETxnSettings.TL_settings.cur_do_frame3 ){

          inputStructure.setFrameToExecute(3);
          inputStructure.setMaxTrades(driverCETxnSettings.TL_settings.cur_MaxRowsFrame3);

            inputStructure.setSymbol(securities.createSymbol( rnd.rndNU( 0, activeSecurityCount-1,
                TPCEConstants.TradeLookupAValueForSymbolFrame3,
                TPCEConstants.TradeLookupSValueForSymbolFrame3 ),TableConsts.cSYMBOL_len));

            inputStructure.setStartTradeDts(generateNonUniformTradeDTS( tradeLookupFrame3MaxTimeInMilliSeconds, TPCEConstants.TradeLookupAValueForTimeGenFrame3, TPCEConstants.TradeLookupSValueForTimeGenFrame3 ));

            inputStructure.setEndTradeDts(EGenDate.getTimeStamp(endTime));

            inputStructure.setMaxAcctId(CustomerAccountsGenerator.getEndtingAccId( activeCustomerCount ));
    
            inputStructure.setAcctId(0);
            Arrays.fill(inputStructure.getTradeId(), 0);
        }
        else{
          inputStructure.setFrameToExecute(4);
            inputStructure.setAcctId(generateRandomCustomerAccountId());
            inputStructure.setStartTradeDts(generateNonUniformTradeDTS( tradeLookupFrame4MaxTimeInMilliSeconds, TPCEConstants.TradeLookupAValueForTimeGenFrame4, TPCEConstants.TradeLookupSValueForTimeGenFrame4 ));
            inputStructure.setMaxTrades(0);                                 
            inputStructure.setMaxAcctId(0);
            inputStructure.setSymbol(new String());
            Arrays.fill(inputStructure.getTradeId(), 0);
        }
    }

    /*
    *  Generate Trade-Order transaction input.
    *
    *  PARAMETERS:
    *           OUT inputStructure         - input parameter structure filled in for the transaction.
    *           OUT TradeType              - integer representation of generated trade type (as eTradeTypeID enum).
    *           OUT executorIsAccountOwner - whether Trade-Order frame 2 should (FALSE) or shouldn't (TRUE) be called.
    *
    *  RETURNS:
    *           none.
    */
    public void generateTradeOrderInput(TTradeOrderTxnInput inputStructure, int iTradeType, boolean executorIsAccountOwner){
        long          customerID;
        TierId       tierID;
        boolean       bMarket;
        int           additionalPerms;
        int           secAcct;
        long          secFlatFileIndex;
        String[]      flTaxId;
        TradeType    eTradeType;
        inputStructure.setTradeID(currentTradeID.getAndIncrement());
        Object[] customer = new Object[2];

        customer = customerSelection.genRandomCustomer();
       
        customerID = Long.parseLong(customer[0].toString());
        tierID = (TierId)customer[1];
       
        long[] randomAccSecurity = holdings.generateRandomAccSecurity(customerID, tierID);

        inputStructure.setAcctId(randomAccSecurity[0]);
        secFlatFileIndex = randomAccSecurity[2];
        secAcct = (int)randomAccSecurity[1];
        additionalPerms = accountPerms.getNumPermsForAcc(inputStructure.getAcctId());
        if (additionalPerms == 1){
          flTaxId = person.getFirstNameLastNameTaxID(customerID);
         
            executorIsAccountOwner = true;
        }
        else{
            int exec_is_owner = (driverCETxnSettings.TO_settings.cur_exec_is_owner - AccountPermsGenerator.percentAccountAdditionalPermissions_0) * 100 / (100 - AccountPermsGenerator.percentAccountAdditionalPermissions_0);

            if ( rnd.rndPercent(exec_is_owner) ){
                flTaxId = person.getFirstNameLastNameTaxID(customerID);

                executorIsAccountOwner = true;
            }
            else{
              accountPerms.generateCids(customerID, additionalPerms, inputStructure.getAcctId());
                if (additionalPerms == 2){

                  flTaxId = person.getFirstNameLastNameTaxID(accountPerms.permCids[1]);
                }
                else{
                  flTaxId = person.getFirstNameLastNameTaxID(accountPerms.permCids[2]);
                }

                executorIsAccountOwner = false;
            }
        }
       
        inputStructure.setExecFirstName(flTaxId[0]);
      inputStructure.setExecLastName(flTaxId[1]);
      inputStructure.setExecTaxId(flTaxId[2]);

        if (rnd.rndPercent(driverCETxnSettings.TO_settings.cur_security_by_symbol)){
          char[] tmp = securities.createSymbol(secFlatFileIndex, TableConsts.cSYMBOL_len).toCharArray();
           
            inputStructure.setSymbol(String.copyValueOf(tmp, 0, tmp.length));
            inputStructure.setCoNmae(new String());
            inputStructure.setIssue(new String());
        }
        else{
          inputStructure.setCoNmae(companies.generateCompanyName( securities.getCompanyIndex( secFlatFileIndex )));

          char[] tmp = securities.getSecRecord(secFlatFileIndex)[3].toCharArray();
         
          inputStructure.setIssue(String.copyValueOf(tmp, 0, tmp.length));

          inputStructure.setSymbol(new String());
        }

        inputStructure.setTradeQty(HoldingsAndTrades.TRADE_QTY_SIZES[rnd.intRange(0, HoldingsAndTrades.TRADE_QTY_SIZES.length - 1)]);
        inputStructure.setRequestedPrice(rnd.doubleIncrRange(HoldingsAndTrades.fMinSecPrice, HoldingsAndTrades.fMaxSecPrice, 0.01));

        bMarket = rnd.rndPercent(driverCETxnSettings.TO_settings.cur_market);

        if (rnd.rndPercent(driverCETxnSettings.TO_settings.cur_buy_orders)){
            if (bMarket){
                eTradeType = TradeType.eMarketBuy;
            }
            else{
                eTradeType = TradeType.eLimitBuy;
            }
           
            if (rnd.rndPercent(
                    driverCETxnSettings.TO_settings.cur_type_is_margin *
                    100 /
                    driverCETxnSettings.TO_settings.cur_buy_orders)){
              inputStructure.setTypeIsMargin(1);
            }
            else inputStructure.setTypeIsMargin(0);
           
        }
        else{
            if (bMarket){
                eTradeType = TradeType.eMarketSell;
            }
            else{
                if (rnd.rndPercent(driverCETxnSettings.TO_settings.cur_stop_loss)){
                    eTradeType = TradeType.eStopLoss;
                }
                else{
                    eTradeType = TradeType.eLimitSell;
                }
            }

            inputStructure.setTypeIsMargin(0);
        }
        iTradeType = eTradeType.ordinal();
       
        if (rnd.rndPercent(driverCETxnSettings.TO_settings.cur_lifo)){
          inputStructure.setIsLifo(1);
        }
        else inputStructure.setIsLifo(0);

        char[] tmp = (tradeType.getTupleByIndex(eTradeType.ordinal()))[0].toCharArray();
        inputStructure.setTradeTypeId(String.copyValueOf(tmp, 0, tmp.length));

        tmp = (statusType.getTupleByIndex(StatusTypeId.E_PENDING.ordinal()))[0].toCharArray();
        inputStructure.setStPendingId(String.copyValueOf(tmp, 0, tmp.length));
        tmp = (statusType.getTupleByIndex(StatusTypeId.E_SUBMITTED.ordinal()))[0].toCharArray();
        inputStructure.setStSubmittedId(String.copyValueOf(tmp, 0, tmp.length));
       
        if ( tradeOrderRollbackLevel >= rnd.intRange( 1, tradeOrderRollbackLimit )){
          inputStructure.setRollItBack(1);
        }
        else inputStructure.setRollItBack(0);
    }

    /*
    *  Generate Trade-Status transaction input.
    *
    *  PARAMETERS:
    *           OUT inputStructure                  - input parameter structure filled in for the transaction.
    *
    *  RETURNS:
    *           none.
    */
    public void generateTradeStatusInput(TTradeStatusTxnInput inputStructure){
        long          customerID;
        TierId       tierID;

        Object[] customer = new Object[2];
        customer = customerSelection.genRandomCustomer();
        customerID = Long.parseLong(customer[0].toString());
        tierID = (TierId)customer[1];
        inputStructure.setAcctId(account.genRandomAccId(rnd, customerID, tierID, inputStructure.getAcctId(), -1)[0]);
    }

    /*
    *  Generate Trade-Update transaction input.
    *
    *  PARAMETERS:
    *           OUT inputStructure                  - input parameter structure filled in for the transaction.
    *
    *  RETURNS:
    *           none.
    */
    public void generateTradeUpdateInput(TTradeUpdateTxnInput inputStructure){
        int           threshold;

        threshold = rnd.rndPercentage();

        if( threshold <= driverCETxnSettings.TU_settings.cur_do_frame1 ){
          inputStructure.setFrameToExecute(1);
            inputStructure.setMaxTrades(driverCETxnSettings.TU_settings.cur_MaxRowsFrame1);
            inputStructure.setMaxUpdates(driverCETxnSettings.TU_settings.cur_MaxRowsToUpdateFrame1);

            int     i, j;
            boolean    accepted;
            long  tradeID;

            for( i = 0; i < inputStructure.getMaxTrades(); i++ ){
                accepted = false;
                while( ! accepted ){
                    tradeID = generateNonUniformTradeID(TPCEConstants.TradeUpdateAValueForTradeIDGenFrame1, TPCEConstants.TradeUpdateSValueForTradeIDGenFrame1);
                    j = 0;
                    while( j < i && inputStructure.getTradeId()[j] != tradeID ){
                        j++;
                    }
                    if( j == i ){
                        inputStructure.getTradeId()[i] = tradeID;
                        accepted = true;
                    }
                }
            }
            inputStructure.setAcctId(0);                                         
            inputStructure.setMaxAcctId(0);                                     
            inputStructure.setSymbol(new String())
           
            GregorianCalendar date = new GregorianCalendar(0,0,0,0,0);    
            inputStructure.setStartTradeDts(new TimestampType(date.getTime()))
            inputStructure.setEndTradeDts(new TimestampType(date.getTime()));
        }
        else if( threshold <=  driverCETxnSettings.TU_settings.cur_do_frame1 +
                                driverCETxnSettings.TU_settings.cur_do_frame2 ){
          inputStructure.setFrameToExecute(2);
            inputStructure.setMaxTrades(driverCETxnSettings.TU_settings.cur_MaxRowsFrame2);
            inputStructure.setMaxUpdates(driverCETxnSettings.TU_settings.cur_MaxRowsToUpdateFrame2);
            inputStructure.setAcctId(generateRandomCustomerAccountId());
      inputStructure.setStartTradeDts(generateNonUniformTradeDTS( tradeUpdateFrame2MaxTimeInMilliSeconds,
                                        TPCEConstants.TradeUpdateAValueForTimeGenFrame2, TPCEConstants.TradeUpdateSValueForTimeGenFrame2 ));
      inputStructure.setEndTradeDts(EGenDate.getTimeStamp(endTime));

      inputStructure.setMaxAcctId(0);                                     
            inputStructure.setSymbol(new String());
            Arrays.fill( inputStructure.getTradeId(), 0);
           
        }
        else{
          inputStructure.setFrameToExecute(3);
          inputStructure.setMaxTrades(driverCETxnSettings.TU_settings.cur_MaxRowsFrame3);
            inputStructure.setMaxUpdates(driverCETxnSettings.TU_settings.cur_MaxRowsToUpdateFrame3);
           
            inputStructure.setSymbol( securities.createSymbol( rnd.rndNU( 0, activeSecurityCount-1,
                TPCEConstants.TradeLookupAValueForSymbolFrame3, TPCEConstants.TradeLookupSValueForSymbolFrame3 ),TableConsts.cSYMBOL_len));

            inputStructure.setStartTradeDts(generateNonUniformTradeDTS(tradeUpdateFrame3MaxTimeInMilliSeconds,
                                        TPCEConstants.TradeLookupAValueForTimeGenFrame3, TPCEConstants.TradeLookupSValueForTimeGenFrame3 ));

            inputStructure.setEndTradeDts(EGenDate.getTimeStamp(endTime));

            inputStructure.setMaxAcctId(CustomerAccountsGenerator.getEndtingAccId( activeCustomerCount ));
            inputStructure.setAcctId(0);                                    
            Arrays.fill( inputStructure.getTradeId(), 0);

        }
    }
   
    private EGenRandom                                rnd;
  private PersonHandler                             person;
  private CustomerSelection                         customerSelection;
  private AccountPermsGenerator            accountPerms;
  private CustomerAccountsGenerator                 account;
  private HoldingsAndTrades                         holdings;
  private BrokerGenerator                           brokers;
  private CompanyGenerator                          companies;
  private SecurityHandler                           securities; 
  private InputFileHandler                          industries;
  private InputFileHandler                   sectors;
  private InputFileHandler                          statusType;
  private InputFileHandler                          tradeType;
  private TDriverCETxnSettings                      driverCETxnSettings;
  private BaseLogger                                logger;

  private long                                      configuredCustomerCount;
  private long                                      activeCustomerCount;
  private long                                      startingCustomerID;
  private long                                      myCustomerCount;
  private int                                       partitionPercent;
  private int                                       scaleFactor;
  private int                                       hoursOfInitialTrades;
  private int                                       maxActivePrePopulatedTradeID;
  static private AtomicLong              currentTradeID;
  private long                                      tradeLookupFrame2MaxTimeInMilliSeconds;
  private long                                      tradeLookupFrame3MaxTimeInMilliSeconds;
  private long                                      tradeLookupFrame4MaxTimeInMilliSeconds;
  private long                                      tradeUpdateFrame2MaxTimeInMilliSeconds;
  private long                                      tradeUpdateFrame3MaxTimeInMilliSeconds;
  private long                                      activeSecurityCount;
  private long                                      activeCompanyCount;
  private int                                       industryCount;
  private int                                       sectorCount;
  private long                                      startFromCompany;
  private int                                       tradeOrderRollbackLimit;
  private int                                       tradeOrderRollbackLevel;
  private Date                      startTime;
  private Date                      endTime;

}
TOP

Related Classes of edu.brown.benchmark.tpce.generators.CETxnInputGenerator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.