• R/O
  • SSH
  • HTTPS

okuyama: 提交


Commit MetaInfo

修訂790 (tree)
時間2011-10-06 17:41:51
作者okuyamaoo

Log Message

20111006-1

Change Summary

差異

--- trunk/src/okuyama/imdst/client/OkuyamaClient.java (revision 789)
+++ trunk/src/okuyama/imdst/client/OkuyamaClient.java (revision 790)
@@ -5994,7 +5994,177 @@
59945994 }
59955995
59965996
5997+
5998+
5999+
6000+
6001+
6002+
59976003 /**
6004+ * MasterNodeからTagを複数を指定することで紐付くKeyが取得可能な、OkuyamaResultSetを取得する.<br>
6005+ * Tagは打たれているが実際は既に存在しないValueが紐付くKey値は取得出来ない.<br>
6006+ * またANDとORを指定可能であり、getMultiTagKeysと同じように動くが、こちらを使えば一度にメモリ上に展開出来ないような、<br>
6007+ * 大量のTagに紐付くデータを対象にする場合に向いている。少量のデータに対して複数Tagで取得したい場合は、従来通りgetMultiTagKeysを使うことを推奨する.<br>
6008+ *
6009+ * @param tagList Tag値の配列
6010+ * @return OkuyamaResultSet 結果のOkuyamaResultSet Tagがそもそも存在しない場合はnullが返る
6011+ * @throws OkuyamaClientException
6012+ */
6013+ public OkuyamaResultSet getMultiTagKeysResult(String[] tagList) throws OkuyamaClientException {
6014+ return this.getMultiTagKeysResult(tagList, true);
6015+ }
6016+
6017+
6018+ /**
6019+ * MasterNodeからTagを複数を指定することで紐付くKeyが取得可能な、OkuyamaResultSetを取得する.<br>
6020+ * Tagは打たれているが実際は既に存在しないValueが紐付くKey値は取得出来ない.<br>
6021+ * またANDとORを指定可能であり、getMultiTagKeysと同じように動くが、こちらを使えば一度にメモリ上に展開出来ないような、<br>
6022+ * 大量のTagに紐付くデータを対象にする場合に向いている。少量のデータに対して複数Tagで取得したい場合は、従来通りgetMultiTagKeysを使うことを推奨する.<br>
6023+ *
6024+ * @param tagList Tag値の配列
6025+ * @param margeType 取得方法指定(true = AND、false=OR)
6026+ * @return OkuyamaResultSet 結果のOkuyamaResultSet Tagがそもそも存在しない場合はnullが返る
6027+ * @throws OkuyamaClientException
6028+ */
6029+ public OkuyamaResultSet getMultiTagKeysResult(String[] tagList, boolean margeType) throws OkuyamaClientException {
6030+ OkuyamaResultSet okuyamaResultSet = null;
6031+ String serverRetStr = null;
6032+ String[] serverRet = null;
6033+
6034+ StringBuilder serverRequestBuf = null;
6035+
6036+ try {
6037+ if (this.socket == null) throw new OkuyamaClientException("No ServerConnect!!");
6038+
6039+ if (0.90 > this.okuyamaVersionNo) {
6040+ throw new OkuyamaClientException("The version of the server is old [The 'searchValue' method can be used since version 0.9.0]");
6041+ }
6042+
6043+ String encoding = platformDefaultEncoding;
6044+
6045+ // エラーチェック
6046+ // Keyに対する無指定チェック
6047+ if (tagList == null || tagList.length < 2) {
6048+ throw new OkuyamaClientException("The blank is not admitted on a tag");
6049+ }
6050+
6051+ // Tagに対するLengthチェック
6052+ for (int idx = 0; idx < tagList.length; idx++) {
6053+ if (tagList[idx].getBytes().length > maxKeySize) throw new OkuyamaClientException("Save Tag Max Size " + maxKeySize + " Byte");
6054+ }
6055+
6056+ Map resultSetParameterMap = new HashMap(tagList.length);
6057+ for (int idx = 0; idx < tagList.length; idx++) {
6058+ // 文字列バッファ初期化
6059+ serverRequestBuf = new StringBuilder(ImdstDefine.stringBufferSmallSize);
6060+
6061+
6062+ // 処理番号連結
6063+ serverRequestBuf.append("45");
6064+ // セパレータ連結
6065+ serverRequestBuf.append(OkuyamaClient.sepStr);
6066+
6067+ // tag値連結(Keyはデータ送信時には必ず文字列が必要)
6068+ serverRequestBuf.append(new String(this.dataEncoding(tagList[idx].getBytes())));
6069+
6070+
6071+ // サーバ送信
6072+ pw.println(serverRequestBuf.toString());
6073+ pw.flush();
6074+
6075+ // サーバから結果受け取り
6076+ serverRetStr = br.readLine();
6077+ serverRet = serverRetStr.split(OkuyamaClient.sepStr);
6078+
6079+
6080+ // 処理の妥当性確
6081+ if (serverRet[0].equals("45")) {
6082+ if (serverRet[1].equals("true")) {
6083+
6084+ // データ有り
6085+ String indexListStr= serverRet[2];
6086+
6087+ if (!indexListStr.trim().equals("")) {
6088+
6089+ String[] indexList = indexListStr.split(ImdstDefine.imdstTagKeyAppendSep);
6090+ resultSetParameterMap.put(tagList[idx], indexList);
6091+ }
6092+ } else if(serverRet[1].equals("false")) {
6093+
6094+ // データなし
6095+ if (margeType == true) return null;
6096+ } else if(serverRet[1].equals("error")) {
6097+
6098+ // エラー発生
6099+ throw new OkuyamaClientException("Execute Error [" + serverRet[1] + "]");
6100+ }
6101+ } else {
6102+
6103+ // 妥当性違反
6104+ throw new OkuyamaClientException("Execute Violation of validity [" + serverRet[0] + "]");
6105+ }
6106+ }
6107+
6108+ OkuyamaClient retSetClient = new OkuyamaClient(maxKeySize);
6109+ if (this.useAutoConnect) {
6110+ retSetClient.setConnectionInfos(this.initParamMasterNodes);
6111+ retSetClient.autoConnect();
6112+ } else {
6113+ retSetClient.connect(this.initParamServer, this.initParamPort, this.initParamEncoding, this.initParamOpenTimeout, this.initParamConnectionTimeout);
6114+ }
6115+ okuyamaResultSet = new OkuyamaMultiTagKeysResultSet(retSetClient, tagList, resultSetParameterMap, encoding, margeType);
6116+
6117+ } catch (OkuyamaClientException ice) {
6118+ throw ice;
6119+ } catch (ConnectException ce) {
6120+ if (this.masterNodesList != null && masterNodesList.size() > 1) {
6121+ try {
6122+ this.autoConnect();
6123+ okuyamaResultSet = this.getMultiTagKeysResult(tagList, margeType);
6124+ } catch (Exception e) {
6125+ throw new OkuyamaClientException(ce);
6126+ }
6127+ } else {
6128+ throw new OkuyamaClientException(ce);
6129+ }
6130+ } catch (SocketException se) {
6131+ if (this.masterNodesList != null && masterNodesList.size() > 1) {
6132+ try {
6133+ this.autoConnect();
6134+ okuyamaResultSet = this.getMultiTagKeysResult(tagList, margeType);
6135+ } catch (Exception e) {
6136+ throw new OkuyamaClientException(se);
6137+ }
6138+ } else {
6139+ throw new OkuyamaClientException(se);
6140+ }
6141+ } catch (Throwable e) {
6142+ if (this.masterNodesList != null && masterNodesList.size() > 1) {
6143+ try {
6144+ this.autoConnect();
6145+ okuyamaResultSet = this.getMultiTagKeysResult(tagList, margeType);
6146+ } catch (Exception ee) {
6147+ throw new OkuyamaClientException(e);
6148+ }
6149+ } else {
6150+ throw new OkuyamaClientException(e);
6151+ }
6152+ }
6153+ return okuyamaResultSet;
6154+ }
6155+
6156+
6157+
6158+
6159+
6160+
6161+
6162+
6163+
6164+
6165+
6166+
6167+ /**
59986168 * MasterNodeからTagとKey格納bucketのIndexを使用してKey値配列を取得する.<br>
59996169 * 本メソッドは、OkuyamaTagKeysResultSetクラスからの利用を想定して作成されているため、
60006170 * それ以外の部分からの呼び出しは推奨しない.<br>
--- trunk/src/okuyama/imdst/client/result/OkuyamaMultiTagKeysResultSet.java (revision 789)
+++ trunk/src/okuyama/imdst/client/result/OkuyamaMultiTagKeysResultSet.java (revision 790)
@@ -6,11 +6,11 @@
66 import okuyama.imdst.client.*;
77
88 /**
9- * OkuyamaClientのgetMultiTagKeyResultで取得可能なクラス<br>
10- * 以下のような構文にてTagを利用して全ての紐付くKeyとValueを取得する<br>
9+ * OkuyamaClientのgetMultiTagKeysResultで取得可能なクラス<br>
10+ * 以下のような構文にてTagを利用して全ての紐付くKeyを取得する<br>
1111 * その際に複数のTagを指定してAND,ORのどちらかを指定可能<br>
1212 * -----------------------------------------------------------------
13- * OkuyamaResultSet resultSet = client.getTagKeyResult(<String[]>tagStrList, true);
13+ * OkuyamaResultSet resultSet = client.getMultiTagKeysResult(tagStrList, true);
1414 *
1515 * while(resultSet.next()) {
1616 * System.out.println("Key=" + (Object)resultSet.getKey());
@@ -111,7 +111,6 @@
111111 Map equalTagGroupMap = (Map)obj.getValue();
112112 this.indexQueue.put(equalTagGroupMap);
113113 }
114- System.out.println(this.indexQueue);
115114
116115 } catch (Exception e){}
117116 }
@@ -120,17 +119,19 @@
120119
121120 try {
122121 while (true) {
123-
124122 if (this.keyValueQueue.size() > 0) {
125123 String[] keyValue = (String[])this.keyValueQueue.take();
126124 this.nowKey = keyValue[0];
127125 this.nowValue = keyValue[1];
126+
128127 return true;
129128 }
130129
131130 while (this.keyQueue.size() > 0) {
131+
132132 List keys = new ArrayList(maxMultiGetSize);
133133 for (int idx = 0; idx < maxMultiGetSize; idx++) {
134+
134135 String tmpKey = (String)this.keyQueue.poll();
135136 if (tmpKey == null) break;
136137 keys.add(tmpKey);
@@ -137,11 +138,14 @@
137138 }
138139
139140 if (keys.size() > 0) {
141+
140142 String[] getMultiKeys = new String[keys.size()];
141143
142144 for (int idx = 0; idx < keys.size(); idx++) {
145+
143146 getMultiKeys[idx] = (String)keys.get(idx);
144147 }
148+
145149 Map keyValueRetMap = null;
146150 if (getMultiKeys.length > 1) {
147151 keyValueRetMap = this.client.getMultiValue(getMultiKeys, encoding);
@@ -153,6 +157,7 @@
153157 }
154158 }
155159
160+
156161 if (keyValueRetMap != null && keyValueRetMap.size() > 0) {
157162
158163
@@ -171,38 +176,51 @@
171176
172177 if (this.keyValueQueue.size() > 0) break;
173178 }
179+
174180 if (this.keyValueQueue.size() > 0) continue;
175181
176182 while (this.indexQueue.size() > 0) {
177-
183+
178184 Map buketIdxStrMap = (Map)this.indexQueue.take();
185+
179186 // ANDの場合はどれか一つでも対象のTagが含まれていない場合はここでcontiune;
180- if (buketIdxStrMap.size() != this.tagStrList.length) continue;
181-
187+ if (this.margeType == true && buketIdxStrMap.size() != this.tagStrList.length) continue;
188+
182189 // AND,ORに合わせてそれにマッチするKeyのみが格納されたMap<String, null>
183190 Map margeKeyMap = new HashMap(1000);
184-
191+ Map tmpMargeMap = null;
185192 for (int idx = 0; idx < this.tagStrList.length; idx++) {
193+
186194 if (this.margeType) {
187195 // AND
196+ tmpMargeMap = new HashMap(100);
188197 Object[] bucketKeysRet = this.client.getTargetIndexTagKeys(this.tagStrList[idx], (String)buketIdxStrMap.get(this.tagStrList[idx]));
189198 if (bucketKeysRet[0].equals("true")) {
190199 String[] keysStrList = (String[])bucketKeysRet[1];
191200 for (int buketIdx = 0; buketIdx < keysStrList.length; buketIdx++) {
201+
192202 if (idx == 0) {
193- margeKeyMap.put(keysStrList[buketIdx], null);
203+ tmpMargeMap.put(keysStrList[buketIdx], null);
194204 } else {
195- if (!margeKeyMap.containsKey(keysStrList[buketIdx])) margeKeyMap.remove(keysStrList[buketIdx]);
205+ if (margeKeyMap.containsKey(keysStrList[buketIdx])) {
206+ tmpMargeMap.put(keysStrList[buketIdx], null);
207+ }
196208 }
197209 }
198210 }
211+ margeKeyMap = tmpMargeMap;
199212 } else {
200213 // OR
201- Object[] bucketKeysRet = this.client.getTargetIndexTagKeys(this.tagStrList[idx], (String)buketIdxStrMap.get(this.tagStrList[idx]));
202- if (bucketKeysRet[0].equals("true")) {
203- String[] keysStrList = (String[])bucketKeysRet[1];
204- for (int buketIdx = 0; buketIdx < keysStrList.length; buketIdx++) {
205- margeKeyMap.put(keysStrList[buketIdx], null);
214+
215+ if (buketIdxStrMap.containsKey(this.tagStrList[idx])) {
216+ Object[] bucketKeysRet = this.client.getTargetIndexTagKeys(this.tagStrList[idx], (String)buketIdxStrMap.get(this.tagStrList[idx]));
217+ if (bucketKeysRet[0].equals("true")) {
218+ String[] keysStrList = (String[])bucketKeysRet[1];
219+ for (int buketIdx = 0; buketIdx < keysStrList.length; buketIdx++) {
220+
221+
222+ margeKeyMap.put(keysStrList[buketIdx], null);
223+ }
206224 }
207225 }
208226 }
@@ -225,6 +243,7 @@
225243 } catch (Exception e) {
226244 throw new OkuyamaClientException(e);
227245 }
246+
228247 return false;
229248 }
230249
--- trunk/src/okuyama/imdst/client/result/OkuyamaTagKeysResultSet.java (revision 789)
+++ trunk/src/okuyama/imdst/client/result/OkuyamaTagKeysResultSet.java (revision 790)
@@ -9,7 +9,7 @@
99 * OkuyamaClientのgetTagKeyResultで取得可能なクラス<br>
1010 * 以下のような構文にてTagを利用して全ての紐付くKeyとValueを取得する<br>
1111 * -----------------------------------------------------------------
12- * OkuyamaResultSet resultSet = client.getTagKeyResult(tagStr);
12+ * OkuyamaResultSet resultSet = client.getTagKeysResult(tagStr);
1313 *
1414 * while(resultSet.next()) {
1515 * System.out.println("Key=" + (Object)resultSet.getKey());
Show on old repository browser