20111006-1
@@ -5994,7 +5994,177 @@ | ||
5994 | 5994 | } |
5995 | 5995 | |
5996 | 5996 | |
5997 | + | |
5998 | + | |
5999 | + | |
6000 | + | |
6001 | + | |
6002 | + | |
5997 | 6003 | /** |
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 | + /** | |
5998 | 6168 | * MasterNodeからTagとKey格納bucketのIndexを使用してKey値配列を取得する.<br> |
5999 | 6169 | * 本メソッドは、OkuyamaTagKeysResultSetクラスからの利用を想定して作成されているため、 |
6000 | 6170 | * それ以外の部分からの呼び出しは推奨しない.<br> |
@@ -6,11 +6,11 @@ | ||
6 | 6 | import okuyama.imdst.client.*; |
7 | 7 | |
8 | 8 | /** |
9 | - * OkuyamaClientのgetMultiTagKeyResultで取得可能なクラス<br> | |
10 | - * 以下のような構文にてTagを利用して全ての紐付くKeyとValueを取得する<br> | |
9 | + * OkuyamaClientのgetMultiTagKeysResultで取得可能なクラス<br> | |
10 | + * 以下のような構文にてTagを利用して全ての紐付くKeyを取得する<br> | |
11 | 11 | * その際に複数のTagを指定してAND,ORのどちらかを指定可能<br> |
12 | 12 | * ----------------------------------------------------------------- |
13 | - * OkuyamaResultSet resultSet = client.getTagKeyResult(<String[]>tagStrList, true); | |
13 | + * OkuyamaResultSet resultSet = client.getMultiTagKeysResult(tagStrList, true); | |
14 | 14 | * |
15 | 15 | * while(resultSet.next()) { |
16 | 16 | * System.out.println("Key=" + (Object)resultSet.getKey()); |
@@ -111,7 +111,6 @@ | ||
111 | 111 | Map equalTagGroupMap = (Map)obj.getValue(); |
112 | 112 | this.indexQueue.put(equalTagGroupMap); |
113 | 113 | } |
114 | - System.out.println(this.indexQueue); | |
115 | 114 | |
116 | 115 | } catch (Exception e){} |
117 | 116 | } |
@@ -120,17 +119,19 @@ | ||
120 | 119 | |
121 | 120 | try { |
122 | 121 | while (true) { |
123 | - | |
124 | 122 | if (this.keyValueQueue.size() > 0) { |
125 | 123 | String[] keyValue = (String[])this.keyValueQueue.take(); |
126 | 124 | this.nowKey = keyValue[0]; |
127 | 125 | this.nowValue = keyValue[1]; |
126 | + | |
128 | 127 | return true; |
129 | 128 | } |
130 | 129 | |
131 | 130 | while (this.keyQueue.size() > 0) { |
131 | + | |
132 | 132 | List keys = new ArrayList(maxMultiGetSize); |
133 | 133 | for (int idx = 0; idx < maxMultiGetSize; idx++) { |
134 | + | |
134 | 135 | String tmpKey = (String)this.keyQueue.poll(); |
135 | 136 | if (tmpKey == null) break; |
136 | 137 | keys.add(tmpKey); |
@@ -137,11 +138,14 @@ | ||
137 | 138 | } |
138 | 139 | |
139 | 140 | if (keys.size() > 0) { |
141 | + | |
140 | 142 | String[] getMultiKeys = new String[keys.size()]; |
141 | 143 | |
142 | 144 | for (int idx = 0; idx < keys.size(); idx++) { |
145 | + | |
143 | 146 | getMultiKeys[idx] = (String)keys.get(idx); |
144 | 147 | } |
148 | + | |
145 | 149 | Map keyValueRetMap = null; |
146 | 150 | if (getMultiKeys.length > 1) { |
147 | 151 | keyValueRetMap = this.client.getMultiValue(getMultiKeys, encoding); |
@@ -153,6 +157,7 @@ | ||
153 | 157 | } |
154 | 158 | } |
155 | 159 | |
160 | + | |
156 | 161 | if (keyValueRetMap != null && keyValueRetMap.size() > 0) { |
157 | 162 | |
158 | 163 |
@@ -171,38 +176,51 @@ | ||
171 | 176 | |
172 | 177 | if (this.keyValueQueue.size() > 0) break; |
173 | 178 | } |
179 | + | |
174 | 180 | if (this.keyValueQueue.size() > 0) continue; |
175 | 181 | |
176 | 182 | while (this.indexQueue.size() > 0) { |
177 | - | |
183 | + | |
178 | 184 | Map buketIdxStrMap = (Map)this.indexQueue.take(); |
185 | + | |
179 | 186 | // ANDの場合はどれか一つでも対象のTagが含まれていない場合はここでcontiune; |
180 | - if (buketIdxStrMap.size() != this.tagStrList.length) continue; | |
181 | - | |
187 | + if (this.margeType == true && buketIdxStrMap.size() != this.tagStrList.length) continue; | |
188 | + | |
182 | 189 | // AND,ORに合わせてそれにマッチするKeyのみが格納されたMap<String, null> |
183 | 190 | Map margeKeyMap = new HashMap(1000); |
184 | - | |
191 | + Map tmpMargeMap = null; | |
185 | 192 | for (int idx = 0; idx < this.tagStrList.length; idx++) { |
193 | + | |
186 | 194 | if (this.margeType) { |
187 | 195 | // AND |
196 | + tmpMargeMap = new HashMap(100); | |
188 | 197 | Object[] bucketKeysRet = this.client.getTargetIndexTagKeys(this.tagStrList[idx], (String)buketIdxStrMap.get(this.tagStrList[idx])); |
189 | 198 | if (bucketKeysRet[0].equals("true")) { |
190 | 199 | String[] keysStrList = (String[])bucketKeysRet[1]; |
191 | 200 | for (int buketIdx = 0; buketIdx < keysStrList.length; buketIdx++) { |
201 | + | |
192 | 202 | if (idx == 0) { |
193 | - margeKeyMap.put(keysStrList[buketIdx], null); | |
203 | + tmpMargeMap.put(keysStrList[buketIdx], null); | |
194 | 204 | } else { |
195 | - if (!margeKeyMap.containsKey(keysStrList[buketIdx])) margeKeyMap.remove(keysStrList[buketIdx]); | |
205 | + if (margeKeyMap.containsKey(keysStrList[buketIdx])) { | |
206 | + tmpMargeMap.put(keysStrList[buketIdx], null); | |
207 | + } | |
196 | 208 | } |
197 | 209 | } |
198 | 210 | } |
211 | + margeKeyMap = tmpMargeMap; | |
199 | 212 | } else { |
200 | 213 | // 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 | + } | |
206 | 224 | } |
207 | 225 | } |
208 | 226 | } |
@@ -225,6 +243,7 @@ | ||
225 | 243 | } catch (Exception e) { |
226 | 244 | throw new OkuyamaClientException(e); |
227 | 245 | } |
246 | + | |
228 | 247 | return false; |
229 | 248 | } |
230 | 249 |
@@ -9,7 +9,7 @@ | ||
9 | 9 | * OkuyamaClientのgetTagKeyResultで取得可能なクラス<br> |
10 | 10 | * 以下のような構文にてTagを利用して全ての紐付くKeyとValueを取得する<br> |
11 | 11 | * ----------------------------------------------------------------- |
12 | - * OkuyamaResultSet resultSet = client.getTagKeyResult(tagStr); | |
12 | + * OkuyamaResultSet resultSet = client.getTagKeysResult(tagStr); | |
13 | 13 | * |
14 | 14 | * while(resultSet.next()) { |
15 | 15 | * System.out.println("Key=" + (Object)resultSet.getKey()); |