PageRenderTime 82ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/tags/release-0.0.0-rc0/hive/external/ql/src/java/org/apache/hadoop/hive/ql/exec/KeyWrapperFactory.java

#
Java | 238 lines | 184 code | 33 blank | 21 comment | 22 complexity | 21abe04d3a0f005d4a6b7f5cad461e62 MD5 | raw file
Possible License(s): Apache-2.0, BSD-3-Clause, JSON, CPL-1.0
  1. /**
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. package org.apache.hadoop.hive.ql.exec;
  19. import java.util.Arrays;
  20. import org.apache.hadoop.hive.ql.metadata.HiveException;
  21. import org.apache.hadoop.hive.serde2.objectinspector.ListObjectsEqualComparer;
  22. import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
  23. import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
  24. import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils.ObjectInspectorCopyOption;
  25. import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;
  26. import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
  27. import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
  28. import org.apache.hadoop.io.Text;
  29. public class KeyWrapperFactory {
  30. public KeyWrapperFactory(ExprNodeEvaluator[] keyFields, ObjectInspector[] keyObjectInspectors,
  31. ObjectInspector[] currentKeyObjectInspectors) {
  32. this.keyFields = keyFields;
  33. this.keyObjectInspectors = keyObjectInspectors;
  34. this.currentKeyObjectInspectors = currentKeyObjectInspectors;
  35. }
  36. public KeyWrapper getKeyWrapper() {
  37. if (keyFields.length == 1
  38. && TypeInfoUtils.getTypeInfoFromObjectInspector(keyObjectInspectors[0]).equals(
  39. TypeInfoFactory.stringTypeInfo)) {
  40. assert(TypeInfoUtils.getTypeInfoFromObjectInspector(currentKeyObjectInspectors[0]).equals(
  41. TypeInfoFactory.stringTypeInfo));
  42. soi_new = (StringObjectInspector) keyObjectInspectors[0];
  43. soi_copy = (StringObjectInspector) currentKeyObjectInspectors[0];
  44. return new TextKeyWrapper(false);
  45. } else {
  46. currentStructEqualComparer = new ListObjectsEqualComparer(currentKeyObjectInspectors, currentKeyObjectInspectors);
  47. newKeyStructEqualComparer = new ListObjectsEqualComparer(currentKeyObjectInspectors, keyObjectInspectors);
  48. return new ListKeyWrapper(false);
  49. }
  50. }
  51. transient ExprNodeEvaluator[] keyFields;
  52. transient ObjectInspector[] keyObjectInspectors;
  53. transient ObjectInspector[] currentKeyObjectInspectors;
  54. transient ListObjectsEqualComparer currentStructEqualComparer;
  55. transient ListObjectsEqualComparer newKeyStructEqualComparer;
  56. class ListKeyWrapper extends KeyWrapper {
  57. int hashcode;
  58. Object[] keys;
  59. // decide whether this is already in hashmap (keys in hashmap are deepcopied
  60. // version, and we need to use 'currentKeyObjectInspector').
  61. ListObjectsEqualComparer equalComparer;
  62. public ListKeyWrapper(boolean isCopy) {
  63. this(-1, new Object[keyFields.length], isCopy);
  64. }
  65. private ListKeyWrapper(int hashcode, Object[] copiedKeys,
  66. boolean isCopy) {
  67. super();
  68. this.hashcode = hashcode;
  69. keys = copiedKeys;
  70. setEqualComparer(isCopy);
  71. }
  72. private void setEqualComparer(boolean copy) {
  73. if (!copy) {
  74. equalComparer = newKeyStructEqualComparer;
  75. } else {
  76. equalComparer = currentStructEqualComparer;
  77. }
  78. }
  79. @Override
  80. public int hashCode() {
  81. return hashcode;
  82. }
  83. @Override
  84. public boolean equals(Object obj) {
  85. Object[] copied_in_hashmap = ((ListKeyWrapper) obj).keys;
  86. return equalComparer.areEqual(copied_in_hashmap, keys);
  87. }
  88. @Override
  89. public void setHashKey() {
  90. hashcode = Arrays.hashCode(keys);
  91. }
  92. @Override
  93. public void getNewKey(Object row, ObjectInspector rowInspector) throws HiveException {
  94. // Compute the keys
  95. for (int i = 0; i < keyFields.length; i++) {
  96. keys[i] = keyFields[i].evaluate(row);
  97. }
  98. }
  99. @Override
  100. public KeyWrapper copyKey() {
  101. Object[] newDefaultKeys = deepCopyElements(keys, keyObjectInspectors,
  102. ObjectInspectorCopyOption.WRITABLE);
  103. return new ListKeyWrapper(hashcode, newDefaultKeys, true);
  104. }
  105. @Override
  106. public void copyKey(KeyWrapper oldWrapper) {
  107. ListKeyWrapper listWrapper = (ListKeyWrapper) oldWrapper;
  108. hashcode = listWrapper.hashcode;
  109. equalComparer = currentStructEqualComparer;
  110. deepCopyElements(listWrapper.keys, keyObjectInspectors, keys,
  111. ObjectInspectorCopyOption.WRITABLE);
  112. }
  113. @Override
  114. public Object[] getKeyArray() {
  115. return keys;
  116. }
  117. private Object[] deepCopyElements(Object[] keys,
  118. ObjectInspector[] keyObjectInspectors,
  119. ObjectInspectorCopyOption copyOption) {
  120. Object[] result = new Object[keys.length];
  121. deepCopyElements(keys, keyObjectInspectors, result, copyOption);
  122. return result;
  123. }
  124. private void deepCopyElements(Object[] keys,
  125. ObjectInspector[] keyObjectInspectors, Object[] result,
  126. ObjectInspectorCopyOption copyOption) {
  127. for (int i = 0; i < keys.length; i++) {
  128. result[i] = ObjectInspectorUtils.copyToStandardObject(keys[i],
  129. keyObjectInspectors[i], copyOption);
  130. }
  131. }
  132. }
  133. transient Object[] singleEleArray = new Object[1];
  134. transient StringObjectInspector soi_new, soi_copy;
  135. class TextKeyWrapper extends KeyWrapper {
  136. int hashcode;
  137. Object key;
  138. boolean isCopy;
  139. public TextKeyWrapper(boolean isCopy) {
  140. this(-1, null, isCopy);
  141. }
  142. private TextKeyWrapper(int hashcode, Object key,
  143. boolean isCopy) {
  144. super();
  145. this.hashcode = hashcode;
  146. this.key = key;
  147. this.isCopy = isCopy;
  148. }
  149. @Override
  150. public int hashCode() {
  151. return hashcode;
  152. }
  153. @Override
  154. public boolean equals(Object other) {
  155. Object obj = ((TextKeyWrapper) other).key;
  156. Text t1;
  157. Text t2;
  158. if (isCopy) {
  159. t1 = soi_copy.getPrimitiveWritableObject(key);
  160. t2 = soi_copy.getPrimitiveWritableObject(obj);
  161. } else {
  162. t1 = soi_new.getPrimitiveWritableObject(key);
  163. t2 = soi_copy.getPrimitiveWritableObject(obj);
  164. }
  165. if (t1 == null && t2 == null) {
  166. return true;
  167. } else if (t1 == null || t2 == null) {
  168. return false;
  169. } else {
  170. return t1.equals(t2);
  171. }
  172. }
  173. @Override
  174. public void setHashKey() {
  175. if (key == null) {
  176. hashcode = 0;
  177. } else{
  178. hashcode = key.hashCode();
  179. }
  180. }
  181. @Override
  182. public void getNewKey(Object row, ObjectInspector rowInspector) throws HiveException {
  183. // Compute the keys
  184. key = keyFields[0].evaluate(row);
  185. }
  186. @Override
  187. public KeyWrapper copyKey() {
  188. return new TextKeyWrapper(hashcode, ObjectInspectorUtils.copyToStandardObject(key,
  189. soi_new, ObjectInspectorCopyOption.WRITABLE), true);
  190. }
  191. @Override
  192. public void copyKey(KeyWrapper oldWrapper) {
  193. TextKeyWrapper textWrapper = (TextKeyWrapper) oldWrapper;
  194. hashcode = textWrapper.hashcode;
  195. isCopy = true;
  196. key = ObjectInspectorUtils.copyToStandardObject(textWrapper.key,
  197. soi_new, ObjectInspectorCopyOption.WRITABLE);
  198. }
  199. @Override
  200. public Object[] getKeyArray() {
  201. singleEleArray[0] = key;
  202. return singleEleArray;
  203. }
  204. }
  205. }