Files
email-tracker/external/duckdb/third_party/tpce-tool/include/main/Brokers.h
2025-10-24 19:21:19 -05:00

279 lines
8.7 KiB
C++

/*
* Legal Notice
*
* This document and associated source code (the "Work") is a part of a
* benchmark specification maintained by the TPC.
*
* The TPC reserves all right, title, and interest to the Work as provided
* under U.S. and international laws, including without limitation all patent
* and trademark rights therein.
*
* No Warranty
*
* 1.1 TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE INFORMATION
* CONTAINED HEREIN IS PROVIDED "AS IS" AND WITH ALL FAULTS, AND THE
* AUTHORS AND DEVELOPERS OF THE WORK HEREBY DISCLAIM ALL OTHER
* WARRANTIES AND CONDITIONS, EITHER EXPRESS, IMPLIED OR STATUTORY,
* INCLUDING, BUT NOT LIMITED TO, ANY (IF ANY) IMPLIED WARRANTIES,
* DUTIES OR CONDITIONS OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR
* PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OF
* WORKMANLIKE EFFORT, OF LACK OF VIRUSES, AND OF LACK OF NEGLIGENCE.
* ALSO, THERE IS NO WARRANTY OR CONDITION OF TITLE, QUIET ENJOYMENT,
* QUIET POSSESSION, CORRESPONDENCE TO DESCRIPTION OR NON-INFRINGEMENT
* WITH REGARD TO THE WORK.
* 1.2 IN NO EVENT WILL ANY AUTHOR OR DEVELOPER OF THE WORK BE LIABLE TO
* ANY OTHER PARTY FOR ANY DAMAGES, INCLUDING BUT NOT LIMITED TO THE
* COST OF PROCURING SUBSTITUTE GOODS OR SERVICES, LOST PROFITS, LOSS
* OF USE, LOSS OF DATA, OR ANY INCIDENTAL, CONSEQUENTIAL, DIRECT,
* INDIRECT, OR SPECIAL DAMAGES WHETHER UNDER CONTRACT, TORT, WARRANTY,
* OR OTHERWISE, ARISING IN ANY WAY OUT OF THIS OR ANY OTHER AGREEMENT
* RELATING TO THE WORK, WHETHER OR NOT SUCH AUTHOR OR DEVELOPER HAD
* ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.
*
* Contributors
* - Sergey Vasilevskiy
* - Doug Johnson
*/
/*
* Class representing the Brokers table.
*/
#ifndef BROKERS_H
#define BROKERS_H
#include <stdio.h> // for snprintf which is not part of the C++ headers
#include "EGenTables_common.h"
#include "CustomerAccountsAndPermissionsTable.h"
#include "input/DataFileManager.h"
#include "StatusTypeIDs.h"
namespace TPCE {
const TIdent iBrokerNameIDShift = 1000 * 1000; // starting ID to generate names from for brokers
const int iBrokerInitialTradesYTDMin = 10000;
const int iBrokerInitialTradesYTDMax = 100000;
const double fBrokerInitialCommissionYTDMin = 10000.0;
const double fBrokerInitialCommissionYTDMax = 100000.0;
class CBrokersTable : public TableTemplate<BROKER_ROW> {
TIdent m_iTotalBrokers; // total number of brokers rows to generate
TIdent m_iStartFromBroker;
TIdent m_iStartFromCustomer;
CPerson m_person;
const StatusTypeDataFile_t &m_StatusTypeFile; // STATUS_TYPE table from the flat file
int *m_pNumTrades; // array of B_NUM_TRADES values
double *m_pCommTotal; // array of B_COMM_TOTAL values
public:
/*
* Constructor for the BROKER table class.
*
* PARAMETERS:
* IN inputFiles - input flat files loaded in memory
* IN iCustomerCount - customer count
* IN iStartFromCustomer - starting customer id (1-based)
*
* RETURNS:
* not applicable.
*/
CBrokersTable(const DataFileManager &dfm, TIdent iCustomerCount, TIdent iStartFromCustomer)
: TableTemplate<BROKER_ROW>(), m_iTotalBrokers(iCustomerCount / iBrokersDiv),
m_iStartFromBroker((iStartFromCustomer / iBrokersDiv) + iStartingBrokerID + iTIdentShift),
m_iStartFromCustomer(iStartFromCustomer), m_person(dfm, iBrokerNameIDShift, true),
m_StatusTypeFile(dfm.StatusTypeDataFile()), m_pNumTrades(NULL), m_pCommTotal(NULL){};
/*
* Destructor.
*
* PARAMETERS:
* not applicable.
*
* RETURNS:
* not applicable.
*/
~CBrokersTable() {
if (m_pNumTrades != NULL) {
delete[] m_pNumTrades;
}
if (m_pCommTotal != NULL) {
delete[] m_pCommTotal;
}
}
/*
* Initialization method; required when generating data but not for
* run-time.
*
* It is called by CTradeGen at the beginning of every load unit.
*
* PARAMETERS:
* IN iCustomerCount - new customer count
* IN iStartFromCustomer - new starting customer id (1-based)
*
* RETURNS:
* none.
*/
void InitForGen(TIdent iCustomerCount, TIdent iStartFromCustomer) {
TIdent i;
if (m_iTotalBrokers != iCustomerCount / iBrokersDiv || m_pNumTrades == NULL || m_pCommTotal == NULL)
{
// Reallocate arrays for the new number of brokers
//
m_iTotalBrokers = iCustomerCount / iBrokersDiv;
if (m_pNumTrades != NULL) {
delete[] m_pNumTrades;
}
m_pNumTrades = new int[(size_t)m_iTotalBrokers];
if (m_pCommTotal != NULL) {
delete[] m_pCommTotal;
}
m_pCommTotal = new double[(size_t)m_iTotalBrokers];
}
// Initialize array to 0
//
if (m_pNumTrades != NULL) {
for (i = 0; i < m_iTotalBrokers; ++i) {
m_pNumTrades[i] = 0;
}
}
// Initialize array to 0
//
if (m_pCommTotal != NULL) {
for (i = 0; i < m_iTotalBrokers; ++i) {
m_pCommTotal[i] = 0.0;
}
}
if (m_iStartFromBroker != ((iStartFromCustomer / iBrokersDiv) + iStartingBrokerID + iTIdentShift)) {
// Multiplying by iBrokersDiv again to get 64-bit broker ids
// with 4.3bln IDENT_T shift value.
// Removing shift factor prior to arithmetic so that contiguous
// B_IDs values are obtained, and then add it back so that we
// get shifted values.
//
m_iStartFromBroker = (iStartFromCustomer / iBrokersDiv) + iStartingBrokerID + iTIdentShift;
}
m_iLastRowNumber = 0;
ClearRecord(); // this is needed for EGenTest to work
// Don't re-initialize the cache for the first load unit
if (m_iStartFromCustomer != iStartFromCustomer) {
m_person.InitNextLoadUnit(iDefaultLoadUnitSize / iBrokersDiv);
}
};
/*
* Increment year-to-date values for broker trades and commissions.
* Used to preserve consistency with initial trades.
*
* PARAMETERS:
* IN B_ID - broker for whom to update YTD
* values IN iTradeIncrement - number of trades to add IN
* fCommissionIncrement - amount of commission to add
*
* RETURNS:
* none.
*/
void UpdateTradeAndCommissionYTD(TIdent B_ID, int iTradeIncrement, double fCommissionIncrement) {
if ((B_ID >= m_iStartFromBroker) && (B_ID < (m_iStartFromBroker + m_iTotalBrokers))) {
m_pNumTrades[B_ID - m_iStartFromBroker] += iTradeIncrement;
m_pCommTotal[B_ID - m_iStartFromBroker] += fCommissionIncrement;
}
}
/*
* Generate random broker id.
* Exposed mostly for the driver to ensure unique
* broker names for Broker Volume.
* External RNG object is used in order to honor CCE autoseed behavior.
*
* PARAMETERS:
* IN rnd - external RNG
*
* RETURNS:
* random broker id
*/
TIdent GenerateRandomBrokerId(CRandom *pRnd) {
return pRnd->RndInt64Range(m_iStartFromBroker, m_iStartFromBroker + m_iTotalBrokers - 1);
}
/*
* Generate broker name into the provided buffer.
* Exposed mostly for the driver (Broker Volume).
*
* PARAMETERS:
* IN B_ID - broker id
* IN B_NAME - buffer for broker name
* IN B_NAME_len - length of the name buffer
*
* RETURNS:
* none.
*/
void GenerateBrokerName(TIdent B_ID, char *B_NAME, size_t B_NAME_len) {
snprintf(B_NAME, B_NAME_len, "%s %c. %s", m_person.GetFirstName(B_ID + iBrokerNameIDShift).c_str(),
m_person.GetMiddleName(B_ID + iBrokerNameIDShift),
m_person.GetLastName(B_ID + iBrokerNameIDShift).c_str());
}
/*
* Return total broker count.
* Exposed mostly for the driver (Broker Volume).
*
* PARAMETERS:
* none.
*
* RETURNS:
* total number of brokers in the table
*/
TIdent GetBrokerCount() {
return m_iTotalBrokers;
}
/*
* Generates all column values for the next row
* and store them in the internal record structure.
* Increments the number of rows generated.
*
* PARAMETERS:
* none.
*
* RETURNS:
* TRUE, if there are more records in the ADDRESS table; FALSE
* othewise.
*/
bool GenerateNextRecord() {
m_row.B_ID = m_iStartFromBroker + m_iLastRowNumber;
strncpy(m_row.B_ST_ID, m_StatusTypeFile[eActive].ST_ID_CSTR(), sizeof(m_row.B_ST_ID));
GenerateBrokerName(m_row.B_ID, m_row.B_NAME, static_cast<int>(sizeof(m_row.B_NAME)));
m_row.B_NUM_TRADES = m_pNumTrades[m_row.B_ID - m_iStartFromBroker];
m_row.B_COMM_TOTAL = m_pCommTotal[m_row.B_ID - m_iStartFromBroker];
// Update state info
++m_iLastRowNumber;
m_bMoreRecords = m_iLastRowNumber < m_iTotalBrokers;
// Return false if all the rows have been generated
return (MoreRecords());
}
};
} // namespace TPCE
#endif // BROKERS_H