構造体、共用体、列挙体 DEFINE,マクロ
enum MssAggType
struct RBAGkey
struct RBAGnode
struct mssAggDat
MaxMemA
PWayA
0001: /**
0002: * # CHAPTER #
0003: * ============================================================================
0004: * 集計(aggregate)処理関連のヘッダーファイル
0005: * ============================================================================
0006: */
0007:
0008: #include <mssConfig.h>
0009: #include <mssValue.h>
0010: #include <mssHeader.h>
0011: #include <mssInput.h>
0012: #include <mssOutput.h>
0013: #include <stdio.h>
0014:
0015: #ifndef _MSSPREAGG_H
0016: #define _MSSPREAGG_H
0017:
0018: /**
0019: * # DEFINE #
0020: * マージソート集計を行う際に、何個までのファイルを同時に併合させるか
0021: */
0022: #define PWayA 25
0023:
0024: /**
0025: * # DEFINE #
0026: * 赤黒木で使用するメモリ量上限値
0027: */
0028: #define MaxMemA 2048000
0029:
0030:
0031: /**
0032: * # ENUM #
0033: *集計方法の列挙体
0034: */
0035: enum MssAggType {
0036: aggSUM, /*合計*/
0037: aggAVG, /*平均*/
0038: aggAVG2, /*併合時の平均*/
0039: aggCNT, /*件数*/
0040: aggMAX, /*最大値*/
0041: aggMIN, /*最小値*/
0042: aggSTD, /*標準偏差 s=sqrt{(1/(n-1))*((x1-x)^2+(x2-x)^2+...+(xn-x)^2)} */
0043: aggSTDP, /*標準偏差 s=sqrt{(1/n)*((x1-x)^2+(x2-x)^2+...+(xn-x)^2)} */
0044: aggVAR, /*分散 s^2=(1/(n-1))*((x1-x)^2+(x2-x)^2+...+(xn-x)^2) */
0045: aggVARP, /*分散 s^2=(1/n)*((x1-x)^2+(x2-x)^2+...+(xn-x)^2) */
0046: };
0047:
0048: /**
0049: * # STRUCT #
0050: * 赤黒木で集計するための構造体
0051: */
0052: struct mssAggDat {
0053: int fldCnt; /*データ一行の項目数*/
0054: MssOptKEY * optKey; /*キー項目オプション*/
0055: MssOptFLD * optFld; /*項目オプション*/
0056: enum MssAggType aggType; /*0:シーケンシャル集計,1:RBtree*/
0057:
0058: MssValue * val; /*読みこんだ文字項目保管用(一時的)*/
0059: int valCnt; /*その数(fldCnt*利用するval数)*/
0060: int procType; /*0:シーケンシャル集計,1:RBtree*/
0061:
0062: /* シーケンシャル集計用関連*/
0063: MssValue * aggVal; /*集計された値の保管用(一時的)*/
0064:
0065: /* 内部sort+集計用関連*/
0066: struct RBAGnode *rb; /*赤黒木プライオリティキュー*/
0067: struct mssFPR *iFile[PWayA]; /*入力ワークファイルポインタ(text部)*/
0068: FILE *vFile[PWayA]; /*入力ワークファイルポインタ(val部)*/
0069: char prefixTxt[MssFileNameMaxLen];/*一時Fileのプレフィックス(text部)*/
0070: char prefixVal[MssFileNameMaxLen];/*一時Fileのプレフィックス(val部)*/
0071: struct mssFldRec *fr[PWayA]; /*入力ワークファイル読み込みバッファ*/
0072: char *tmpDir; /*ワークファイルのパス*/
0073: int iStart; /*開始入力ファイル番号*/
0074: int iEnd; /*終了入力ファイル番号*/
0075: int *inCnt; /*入力データのカウンタへのポインタ*/
0076: };
0077:
0078: /**
0079: * # STRUCT #
0080: * 赤黒木のノードで利用するキー構造体
0081: */
0082: struct RBAGkey {
0083: char *str; //項目が\0で区切られた一レコード
0084: char **fld; //strの各項目へのポインタ
0085: MssValue *val; //値を二次元配列で持つための変数
0086: int *bkt; //集計されたバケットの番号
0087: int bktCnt; //その時までに集計されたバケットの数
0088: };
0089:
0090: /**
0091: * # STRUCT #
0092: * 赤黒木のノード構造体
0093: */
0094: struct RBAGnode {
0095: struct RBAGkey *key;
0096: struct RBAGnode *parent, *left, *right;
0097: int rank;
0098: };
0099:
0100: /**
0101: * # PROTOTYPE #
0102: */
0103: struct mssAggDat * mssInitAggDat(int fldCnt, MssOptKEY *optKey, MssOptFLD *optFld, char *aggTypeChr, char *tmpDir, int *inCnt);
0104: void mssFreeAggDat(struct mssAggDat *ad);
0105: void mssPreAgg(struct mssAggDat *ad, struct mssFPR *fpr);
0106: void mssClearAggVal(MssValue *val, enum MssAggType aggType, int fc);
0107: void mssCalAggVal(MssValue *val, enum MssAggType aggType, MssValue *val2);
0108: void mssWriteAggFld(char **fld, MssValue *val, enum MssAggType aggType, struct mssFPW *fpw);
0109: int mssReadWriteAgg(struct mssAggDat *ad, struct mssFPW *fpw);
0110: void mssSetAggVal(MssValue *val, char **str);
0111:
0112: #endif /*_PREAGG_H*/