MUSASHI C source: mssAgg.h


構造体、共用体、列挙体
enum MssAggType struct RBAGkey struct RBAGnode struct mssAggDat


DEFINE,マクロ
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*/