OSDN Git Service

ver1.1
[nysol/mining.git] / include / kgFldHash.h
diff --git a/include/kgFldHash.h b/include/kgFldHash.h
new file mode 100644 (file)
index 0000000..6e15942
--- /dev/null
@@ -0,0 +1,98 @@
+/* ////////// LICENSE INFO ////////////////////
+
+ * Copyright (C) 2013 by NYSOL CORPORATION
+ *
+ * Unless you have received this program directly from NYSOL pursuant
+ * to the terms of a commercial license agreement with NYSOL, then
+ * this program is licensed to you under the terms of the GNU Affero General
+ * Public License (AGPL) as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF 
+ * NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Please refer to the AGPL (http://www.gnu.org/licenses/agpl-3.0.txt)
+ * for more details.
+
+ ////////// LICENSE INFO ////////////////////*/
+// =============================================================================
+// kgFldHash.h 項目ハッシュ(hashavg,hashsumで使用)
+// =============================================================================
+#pragma once
+#include <vector>
+#include <kgCSV.h>
+#include <kgArgFld.h>
+#include <kgMethod.h>
+
+namespace kglib {////////////////////////////////////////////// namespace start
+
+class kgFldHashNode;
+
+class kgFldHash 
+{
+               int _hashVal;                 // hashのバケットサイズ
+               int _cnt;                     // 現在登録されている値の数
+               vector<kgFldHashNode*> _node; // バッケトへのポインタ
+               kgCSVfld* _csv;
+               kgArgFld* _key;
+               kgArgFld* _fld;
+
+               unsigned int calHashVal(const char** flds);
+
+       public:
+               // コンストラクタ パラメータ省略時のバケット数は199999
+               kgFldHash(int hashVal, kgCSVfld* csv, kgArgFld* key, kgArgFld* fld);
+
+               // デストラクタ
+               ~kgFldHash(void);
+
+               // 挿入
+               kgFldHashNode* insert(const char** flds);
+               kgFldHashNode* node(int num) const { return _node.at(num); }
+
+               int recLen(void)  { return _csv->recLen(); }    // レコード長
+               int csvSize(void) { return _csv->fldSize(); }   // データ項目数
+               char* csv(int num){ return _csv->getVal(num); } // データのnum番目項目
+               
+               int key(int num) { return _key->num(num);} // k=で指定した第num番目項目番号
+               int keySize(void) { return _key->size(); } // k=で指定した項目数
+               int fldSize(void) { return _fld->size(); } // f=で指定した項目数
+
+               int hashVal(void){ return  _hashVal;}
+};
+
+
+class kgFldHashNode 
+{
+       kgFldHash*        _hash;
+       kgAutoPtr2<char>  _ap1;  // _bufをラッピングするsmart pointer
+       char*             _buf;  // 一行まるまま登録領域
+       kgAutoPtr2<char*> _ap2;  // _idxをラッピングするsmart pointer
+       char**            _idx;  // 登録されたデータの各項目へのポインタ
+       vector<double>    _cnt;  // null以外件数
+       vector<double>    _sum;  // 合計
+       vector<bool>      _nul;  // nullが一行でもあればtrue
+       kgFldHashNode*    _next; // 次nodeへのリンク
+
+       public:
+       // コンストラクタ
+       kgFldHashNode(const char** flds, kgFldHash* hash);
+       virtual ~kgFldHashNode(void) {};
+
+       // keyの比較
+       bool keycmp(const char** flds);
+
+       void next(kgFldHashNode* next) {_next=next;}
+       void cnt(int num, double v) { _cnt.at(num)+=v;}  // f=num番目の項目cnt up
+       void sum(int num, double v) { _sum.at(num)+=v;}  // f=num番目の項目sum up
+       void nul(int num, bool   v) { _nul.at(num) =v;}
+
+       // accessors(get)
+       kgFldHashNode* next(void) const {return _next;}
+       char* idx(int num) const { return *(_idx+num); }
+       double cnt(int num) const {return _cnt.at(num);} // f=num番目の件数を返す
+       double sum(int num) const {return _sum.at(num);} // f=num番目の合計を返す
+       bool   nul(int num) const {return _nul.at(num);}
+};
+}////////////////////////////////////////////// namespace end