/* * mk_store_sales */ static void mk_master (void *row, ds_key_t index) { struct W_STORE_SALES_TBL *r; static decimal_t dMin, dMax; static int bInit = 0, nMaxItemCount; static ds_key_t kNewDateIndex = 0; if (row == NULL) r = &g_w_store_sales; else r = row; if (!bInit) { strtodec (&dMin, "1.00"); strtodec (&dMax, "100000.00"); nMaxItemCount = 20; jDate = skipDays(STORE_SALES, &kNewDateIndex); pItemPermutation = makePermutation(NULL, nItemCount = (int)getIDCount(ITEM), SS_PERMUTATION); bInit = 1; } while (index > kNewDateIndex) /* need to move to a new date */ { jDate += 1; kNewDateIndex += dateScaling(STORE_SALES, jDate); } r->ss_sold_store_sk = mk_join (SS_SOLD_STORE_SK, STORE, 1); r->ss_sold_time_sk = mk_join (SS_SOLD_TIME_SK, TIME, 1); r->ss_sold_date_sk = mk_join (SS_SOLD_DATE_SK, DATE, 1); r->ss_sold_customer_sk = mk_join (SS_SOLD_CUSTOMER_SK, CUSTOMER, 1); r->ss_sold_cdemo_sk = mk_join (SS_SOLD_CDEMO_SK, CUSTOMER_DEMOGRAPHICS, 1); r->ss_sold_hdemo_sk = mk_join (SS_SOLD_HDEMO_SK, HOUSEHOLD_DEMOGRAPHICS, 1); r->ss_sold_addr_sk = mk_join (SS_SOLD_ADDR_SK, CUSTOMER_ADDRESS, 1); r->ss_ticket_number = index; genrand_integer(&nItemIndex, DIST_UNIFORM, 1, nItemCount, 0, SS_SOLD_ITEM_SK); return; }
/* * Routine: * Purpose: * Algorithm: * Data Structures: * * Params: * Returns: * Called By: * Calls: * Assumptions: * Side Effects: * TODO: None */ int vld_web_sales(int nTable, ds_key_t kRow, int *Permutation) { int nLineitem, nMaxLineitem, i; row_skip(nTable, kRow - 1); row_skip(WEB_RETURNS, (kRow - 1) ); jDate = skipDays(WEB_SALES, &kNewDateIndex); mk_master(NULL, kRow); genrand_integer(&nMaxLineitem, DIST_UNIFORM, 8, 16, 9, WS_ORDER_NUMBER); genrand_integer(&nLineitem, DIST_UNIFORM, 1, nMaxLineitem, 0, WS_PRICING_QUANTITY); for (i = 1; i < nLineitem; i++) { mk_detail(NULL, 0); } mk_detail(NULL, 1); return(0); }
/* * the validation process requires generating a single lineitem * so the main mk_xxx routine has been split into a master record portion * and a detail/lineitem portion. */ static void mk_master (void *row, ds_key_t index) { static decimal_t dMin, dMax; int nGiftPct; struct W_WEB_SALES_TBL *r; static int bInit = 0, nItemCount; if (row == NULL) r = &g_w_web_sales; else r = row; if (!bInit) { strtodec (&dMin, "1.00"); strtodec (&dMax, "100000.00"); jDate = skipDays(WEB_SALES, &kNewDateIndex); nItemCount = (int)getIDCount(ITEM); bInit = 1; } /*** * some attributes reamin the same for each lineitem in an order; others are different * for each lineitem. Since the number of lineitems per order is static, we can use a * modulo to determine when to change the semi-static values */ while (index > kNewDateIndex) /* need to move to a new date */ { jDate += 1; kNewDateIndex += dateScaling(WEB_SALES, jDate); } r->ws_sold_date_sk = mk_join (WS_SOLD_DATE_SK, DATE, 1); r->ws_sold_time_sk = mk_join(WS_SOLD_TIME_SK, TIME, 1); r->ws_bill_customer_sk = mk_join (WS_BILL_CUSTOMER_SK, CUSTOMER, 1); r->ws_bill_cdemo_sk = mk_join (WS_BILL_CDEMO_SK, CUSTOMER_DEMOGRAPHICS, 1); r->ws_bill_hdemo_sk = mk_join (WS_BILL_HDEMO_SK, HOUSEHOLD_DEMOGRAPHICS, 1); r->ws_bill_addr_sk = mk_join (WS_BILL_ADDR_SK, CUSTOMER_ADDRESS, 1); /* most orders are for the ordering customers, some are not */ genrand_integer(&nGiftPct, DIST_UNIFORM, 0, 99, 0, WS_SHIP_CUSTOMER_SK); if (nGiftPct > WS_GIFT_PCT) { r->ws_ship_customer_sk = mk_join (WS_SHIP_CUSTOMER_SK, CUSTOMER, 2); r->ws_ship_cdemo_sk = mk_join (WS_SHIP_CDEMO_SK, CUSTOMER_DEMOGRAPHICS, 2); r->ws_ship_hdemo_sk = mk_join (WS_SHIP_HDEMO_SK, HOUSEHOLD_DEMOGRAPHICS, 2); r->ws_ship_addr_sk = mk_join (WS_SHIP_ADDR_SK, CUSTOMER_ADDRESS, 2); } else { r->ws_ship_customer_sk = r->ws_bill_customer_sk; r->ws_ship_cdemo_sk = r->ws_bill_cdemo_sk; r->ws_ship_hdemo_sk = r->ws_bill_hdemo_sk; r->ws_ship_addr_sk = r->ws_bill_addr_sk; } r->ws_order_number = index; genrand_integer(&nItemIndex, DIST_UNIFORM, 1, nItemCount, 0, WS_ITEM_SK); return; }
static void mk_detail (void *row, int bPrint) { static int *pItemPermutation, nItemCount, bInit = 0; struct W_WEB_SALES_TBL *r; int nShipLag, nTemp; struct W_WEB_RETURNS_TBL w_web_returns; tdef *pT = getSimpleTdefsByNumber(WEB_SALES); if (!bInit) { jDate = skipDays(WEB_SALES, &kNewDateIndex); pItemPermutation = makePermutation(NULL, nItemCount = (int)getIDCount(ITEM), WS_PERMUTATION); bInit = 1; } if (row == NULL) r = &g_w_web_sales; else r = row; nullSet(&pT->kNullBitMap, WS_NULLS); /* orders are shipped some number of days after they are ordered, * and not all lineitems ship at the same time */ genrand_integer (&nShipLag, DIST_UNIFORM, WS_MIN_SHIP_DELAY, WS_MAX_SHIP_DELAY, 0, WS_SHIP_DATE_SK); r->ws_ship_date_sk = r->ws_sold_date_sk + nShipLag; if (++nItemIndex > nItemCount) nItemIndex = 1; r->ws_item_sk = matchSCDSK(getPermutationEntry(pItemPermutation, nItemIndex), r->ws_sold_date_sk, ITEM); /* the web page needs to be valid for the sale date */ r->ws_web_page_sk = mk_join (WS_WEB_PAGE_SK, WEB_PAGE, r->ws_sold_date_sk); r->ws_web_site_sk = mk_join (WS_WEB_SITE_SK, WEB_SITE, r->ws_sold_date_sk); r->ws_ship_mode_sk = mk_join (WS_SHIP_MODE_SK, SHIP_MODE, 1); r->ws_warehouse_sk = mk_join (WS_WAREHOUSE_SK, WAREHOUSE, 1); r->ws_promo_sk = mk_join (WS_PROMO_SK, PROMOTION, 1); set_pricing(WS_PRICING, &r->ws_pricing); /** * having gone to the trouble to make the sale, now let's see if it gets returned */ if (!is_set("FILTER") || is_set("_CHILD_ONLY")) { genrand_integer(&nTemp, DIST_UNIFORM, 0, 99, 0, WR_IS_RETURNED); if (nTemp < WR_RETURN_PCT) { mk_w_web_returns(&w_web_returns, 1); if (bPrint) pr_w_web_returns(&w_web_returns); } } /** * now we print out the order and lineitem together as a single row */ if (bPrint && (!is_set("FILTER") || !is_set("_CHILD_ONLY"))) pr_w_web_sales(NULL); return; }