PageRenderTime 34ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 1ms

/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/VectorExpressionWriterFactory.java

http://github.com/apache/hive
Java | 1941 lines | 1525 code | 230 blank | 186 comment | 373 complexity | aeafc65396011448ea9764da0e5b87d6 MD5 | raw file
Possible License(s): Apache-2.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.vector.expressions;
  19. import java.sql.Date;
  20. import java.sql.Timestamp;
  21. import java.util.ArrayList;
  22. import java.util.Arrays;
  23. import java.util.List;
  24. import java.util.Map;
  25. import org.apache.commons.lang3.ArrayUtils;
  26. import org.apache.commons.lang3.StringUtils;
  27. import org.apache.hadoop.hive.common.type.HiveChar;
  28. import org.apache.hadoop.hive.common.type.HiveDecimal;
  29. import org.apache.hadoop.hive.common.type.HiveIntervalDayTime;
  30. import org.apache.hadoop.hive.common.type.HiveIntervalYearMonth;
  31. import org.apache.hadoop.hive.common.type.HiveVarchar;
  32. import org.apache.hadoop.hive.ql.exec.vector.*;
  33. import org.apache.hadoop.hive.ql.metadata.HiveException;
  34. import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
  35. import org.apache.hadoop.hive.serde2.io.*;
  36. import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
  37. import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
  38. import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
  39. import org.apache.hadoop.hive.serde2.objectinspector.SettableListObjectInspector;
  40. import org.apache.hadoop.hive.serde2.objectinspector.SettableMapObjectInspector;
  41. import org.apache.hadoop.hive.serde2.objectinspector.SettableStructObjectInspector;
  42. import org.apache.hadoop.hive.serde2.objectinspector.SettableUnionObjectInspector;
  43. import org.apache.hadoop.hive.serde2.objectinspector.StandardStructObjectInspector;
  44. import org.apache.hadoop.hive.serde2.objectinspector.StructField;
  45. import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
  46. import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableBinaryObjectInspector;
  47. import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableBooleanObjectInspector;
  48. import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableByteObjectInspector;
  49. import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableDateObjectInspector;
  50. import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableDoubleObjectInspector;
  51. import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableFloatObjectInspector;
  52. import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableHiveCharObjectInspector;
  53. import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableHiveDecimalObjectInspector;
  54. import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableHiveIntervalDayTimeObjectInspector;
  55. import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableHiveIntervalYearMonthObjectInspector;
  56. import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableHiveVarcharObjectInspector;
  57. import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableIntObjectInspector;
  58. import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableLongObjectInspector;
  59. import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableTimestampObjectInspector;
  60. import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableShortObjectInspector;
  61. import org.apache.hadoop.hive.serde2.objectinspector.primitive.SettableStringObjectInspector;
  62. import org.apache.hadoop.hive.serde2.objectinspector.primitive.VoidObjectInspector;
  63. import org.apache.hadoop.hive.serde2.typeinfo.MapTypeInfo;
  64. import org.apache.hadoop.hive.serde2.typeinfo.StructTypeInfo;
  65. import org.apache.hadoop.hive.serde2.typeinfo.ListTypeInfo;
  66. import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
  67. import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
  68. import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
  69. import org.apache.hadoop.hive.serde2.typeinfo.UnionTypeInfo;
  70. import org.apache.hadoop.io.Text;
  71. /**
  72. * VectorExpressionWritableFactory helper class for generating VectorExpressionWritable objects.
  73. */
  74. public final class VectorExpressionWriterFactory {
  75. /**
  76. * VectorExpressionWriter base implementation, to be specialized for Long/Double/Bytes columns
  77. */
  78. private static abstract class VectorExpressionWriterBase implements VectorExpressionWriter {
  79. protected ObjectInspector objectInspector;
  80. /**
  81. * The object inspector associated with this expression. This is created from the expression
  82. * NodeDesc (compile metadata) not from the VectorColumn info and thus preserves the type info
  83. * lost by the vectorization process.
  84. */
  85. public ObjectInspector getObjectInspector() {
  86. return objectInspector;
  87. }
  88. public VectorExpressionWriter init(ObjectInspector objectInspector) throws HiveException {
  89. this.objectInspector = objectInspector;
  90. return this;
  91. }
  92. /**
  93. * The base implementation must be overridden by the Long specialization
  94. */
  95. @Override
  96. public Object writeValue(long value) throws HiveException {
  97. throw new HiveException("Internal error: should not reach here");
  98. }
  99. /**
  100. * The base implementation must be overridden by the Long specialization
  101. */
  102. public Object setValue(Object field, long value) throws HiveException {
  103. throw new HiveException("Internal error: should not reach here");
  104. }
  105. /**
  106. * The base implementation must be overridden by the Double specialization
  107. */
  108. @Override
  109. public Object writeValue(double value) throws HiveException {
  110. throw new HiveException("Internal error: should not reach here");
  111. }
  112. /**
  113. * The base implementation must be overridden by the Double specialization
  114. */
  115. public Object setValue(Object field, double value) throws HiveException {
  116. throw new HiveException("Internal error: should not reach here");
  117. }
  118. /**
  119. * The base implementation must be overridden by the Bytes specialization
  120. */
  121. @Override
  122. public Object writeValue(byte[] value, int start, int length) throws HiveException {
  123. throw new HiveException("Internal error: should not reach here");
  124. }
  125. /**
  126. * The base implementation must be overridden by the Bytes specialization
  127. */
  128. public Object setValue(Object field, byte[] value, int start, int length) throws HiveException {
  129. throw new HiveException("Internal error: should not reach here");
  130. }
  131. /**
  132. * The base implementation must be overridden by the Decimal specialization
  133. */
  134. @Override
  135. public Object writeValue(HiveDecimal value) throws HiveException {
  136. throw new HiveException("Internal error: should not reach here");
  137. }
  138. /**
  139. * The base implementation must be overridden by the Decimal specialization
  140. */
  141. @Override
  142. public Object writeValue(HiveDecimalWritable value) throws HiveException {
  143. throw new HiveException("Internal error: should not reach here");
  144. }
  145. /**
  146. * The base implementation must be overridden by the Decimal specialization
  147. */
  148. public Object setValue(Object field, HiveDecimalWritable value) throws HiveException {
  149. throw new HiveException("Internal error: should not reach here");
  150. }
  151. /**
  152. * The base implementation must be overridden by the Decimal specialization
  153. */
  154. public Object setValue(Object field, HiveDecimal value) throws HiveException {
  155. throw new HiveException("Internal error: should not reach here");
  156. }
  157. /**
  158. * The base implementation must be overridden by the Timestamp specialization
  159. */
  160. @Override
  161. public Object writeValue(Timestamp value) throws HiveException {
  162. throw new HiveException("Internal error: should not reach here");
  163. }
  164. /**
  165. * The base implementation must be overridden by the Timestamp specialization
  166. */
  167. @Override
  168. public Object writeValue(TimestampWritableV2 value) throws HiveException {
  169. throw new HiveException("Internal error: should not reach here");
  170. }
  171. /**
  172. * The base implementation must be overridden by the Timestamp specialization
  173. */
  174. public Object setValue(Object field, TimestampWritableV2 value) throws HiveException {
  175. throw new HiveException("Internal error: should not reach here");
  176. }
  177. /**
  178. * The base implementation must be overridden by the Timestamp specialization
  179. */
  180. public Object setValue(Object field, Timestamp value) throws HiveException {
  181. throw new HiveException("Internal error: should not reach here");
  182. }
  183. /**
  184. * The base implementation must be overridden by the HiveIntervalDayTime specialization
  185. */
  186. @Override
  187. public Object writeValue(HiveIntervalDayTimeWritable value) throws HiveException {
  188. throw new HiveException("Internal error: should not reach here");
  189. }
  190. /**
  191. * The base implementation must be overridden by the HiveIntervalDayTime specialization
  192. */
  193. @Override
  194. public Object writeValue(HiveIntervalDayTime value) throws HiveException {
  195. throw new HiveException("Internal error: should not reach here");
  196. }
  197. /**
  198. * The base implementation must be overridden by the HiveIntervalDayTime specialization
  199. */
  200. public Object setValue(Object field, HiveIntervalDayTimeWritable value) throws HiveException {
  201. throw new HiveException("Internal error: should not reach here");
  202. }
  203. /**
  204. * The base implementation must be overridden by the HiveIntervalDayTime specialization
  205. */
  206. public Object setValue(Object field, HiveIntervalDayTime value) throws HiveException {
  207. throw new HiveException("Internal error: should not reach here");
  208. }
  209. }
  210. /**
  211. * Specialized writer for LongVectorColumn expressions. Will throw cast exception
  212. * if the wrong vector column is used.
  213. */
  214. private static abstract class VectorExpressionWriterLong
  215. extends VectorExpressionWriterBase {
  216. @Override
  217. public Object writeValue(ColumnVector column, int row) throws HiveException {
  218. LongColumnVector lcv = (LongColumnVector) column;
  219. if (lcv.noNulls && !lcv.isRepeating) {
  220. return writeValue(lcv.vector[row]);
  221. } else if (lcv.noNulls && lcv.isRepeating) {
  222. return writeValue(lcv.vector[0]);
  223. } else if (!lcv.noNulls && !lcv.isRepeating && !lcv.isNull[row]) {
  224. return writeValue(lcv.vector[row]);
  225. } else if (!lcv.noNulls && !lcv.isRepeating && lcv.isNull[row]) {
  226. return null;
  227. } else if (!lcv.noNulls && lcv.isRepeating && !lcv.isNull[0]) {
  228. return writeValue(lcv.vector[0]);
  229. } else if (!lcv.noNulls && lcv.isRepeating && lcv.isNull[0]) {
  230. return null;
  231. }
  232. throw new HiveException(
  233. String.format(
  234. "Incorrect null/repeating: row:%d noNulls:%b isRepeating:%b isNull[row]:%b isNull[0]:%b",
  235. row, lcv.noNulls, lcv.isRepeating, lcv.isNull[row], lcv.isNull[0]));
  236. }
  237. @Override
  238. public Object setValue(Object field, ColumnVector column, int row) throws HiveException {
  239. LongColumnVector lcv = (LongColumnVector) column;
  240. if (lcv.noNulls && !lcv.isRepeating) {
  241. return setValue(field, lcv.vector[row]);
  242. } else if (lcv.noNulls && lcv.isRepeating) {
  243. return setValue(field, lcv.vector[0]);
  244. } else if (!lcv.noNulls && !lcv.isRepeating && !lcv.isNull[row]) {
  245. return setValue(field, lcv.vector[row]);
  246. } else if (!lcv.noNulls && !lcv.isRepeating && lcv.isNull[row]) {
  247. return null;
  248. } else if (!lcv.noNulls && lcv.isRepeating && !lcv.isNull[0]) {
  249. return setValue(field, lcv.vector[0]);
  250. } else if (!lcv.noNulls && lcv.isRepeating && lcv.isNull[0]) {
  251. return null;
  252. }
  253. throw new HiveException(
  254. String.format(
  255. "Incorrect null/repeating: row:%d noNulls:%b isRepeating:%b isNull[row]:%b isNull[0]:%b",
  256. row, lcv.noNulls, lcv.isRepeating, lcv.isNull[row], lcv.isNull[0]));
  257. }
  258. }
  259. /**
  260. * Specialized writer for DoubleColumnVector. Will throw cast exception
  261. * if the wrong vector column is used.
  262. */
  263. private static abstract class VectorExpressionWriterDouble extends VectorExpressionWriterBase {
  264. @Override
  265. public Object writeValue(ColumnVector column, int row) throws HiveException {
  266. DoubleColumnVector dcv = (DoubleColumnVector) column;
  267. if (dcv.noNulls && !dcv.isRepeating) {
  268. return writeValue(dcv.vector[row]);
  269. } else if (dcv.noNulls && dcv.isRepeating) {
  270. return writeValue(dcv.vector[0]);
  271. } else if (!dcv.noNulls && !dcv.isRepeating && !dcv.isNull[row]) {
  272. return writeValue(dcv.vector[row]);
  273. } else if (!dcv.noNulls && !dcv.isRepeating && dcv.isNull[row]) {
  274. return null;
  275. } else if (!dcv.noNulls && dcv.isRepeating && !dcv.isNull[0]) {
  276. return writeValue(dcv.vector[0]);
  277. } else if (!dcv.noNulls && dcv.isRepeating && dcv.isNull[0]) {
  278. return null;
  279. }
  280. throw new HiveException(
  281. String.format(
  282. "Incorrect null/repeating: row:%d noNulls:%b isRepeating:%b isNull[row]:%b isNull[0]:%b",
  283. row, dcv.noNulls, dcv.isRepeating, dcv.isNull[row], dcv.isNull[0]));
  284. }
  285. @Override
  286. public Object setValue(Object field, ColumnVector column, int row) throws HiveException {
  287. DoubleColumnVector dcv = (DoubleColumnVector) column;
  288. if (dcv.noNulls && !dcv.isRepeating) {
  289. return setValue(field, dcv.vector[row]);
  290. } else if (dcv.noNulls && dcv.isRepeating) {
  291. return setValue(field, dcv.vector[0]);
  292. } else if (!dcv.noNulls && !dcv.isRepeating && !dcv.isNull[row]) {
  293. return setValue(field, dcv.vector[row]);
  294. } else if (!dcv.noNulls && !dcv.isRepeating && dcv.isNull[row]) {
  295. return null;
  296. } else if (!dcv.noNulls && dcv.isRepeating && !dcv.isNull[0]) {
  297. return setValue(field, dcv.vector[0]);
  298. } else if (!dcv.noNulls && dcv.isRepeating && dcv.isNull[0]) {
  299. return null;
  300. }
  301. throw new HiveException(
  302. String.format(
  303. "Incorrect null/repeating: row:%d noNulls:%b isRepeating:%b isNull[row]:%b isNull[0]:%b",
  304. row, dcv.noNulls, dcv.isRepeating, dcv.isNull[row], dcv.isNull[0]));
  305. }
  306. }
  307. /**
  308. * Specialized writer for BytesColumnVector. Will throw cast exception
  309. * if the wrong vector column is used.
  310. */
  311. private static abstract class VectorExpressionWriterBytes extends VectorExpressionWriterBase {
  312. @Override
  313. public Object writeValue(ColumnVector column, int row) throws HiveException {
  314. BytesColumnVector bcv = (BytesColumnVector) column;
  315. if (bcv.noNulls && !bcv.isRepeating) {
  316. return writeValue(bcv.vector[row], bcv.start[row], bcv.length[row]);
  317. } else if (bcv.noNulls && bcv.isRepeating) {
  318. return writeValue(bcv.vector[0], bcv.start[0], bcv.length[0]);
  319. } else if (!bcv.noNulls && !bcv.isRepeating && !bcv.isNull[row]) {
  320. return writeValue(bcv.vector[row], bcv.start[row], bcv.length[row]);
  321. } else if (!bcv.noNulls && !bcv.isRepeating && bcv.isNull[row]) {
  322. return null;
  323. } else if (!bcv.noNulls && bcv.isRepeating && !bcv.isNull[0]) {
  324. return writeValue(bcv.vector[0], bcv.start[0], bcv.length[0]);
  325. } else if (!bcv.noNulls && bcv.isRepeating && bcv.isNull[0]) {
  326. return null;
  327. }
  328. throw new HiveException(
  329. String.format(
  330. "Incorrect null/repeating: row:%d noNulls:%b isRepeating:%b isNull[row]:%b isNull[0]:%b",
  331. row, bcv.noNulls, bcv.isRepeating, bcv.isNull[row], bcv.isNull[0]));
  332. }
  333. @Override
  334. public Object setValue(Object field, ColumnVector column, int row) throws HiveException {
  335. BytesColumnVector bcv = (BytesColumnVector) column;
  336. if (bcv.noNulls && !bcv.isRepeating) {
  337. return setValue(field, bcv.vector[row], bcv.start[row], bcv.length[row]);
  338. } else if (bcv.noNulls && bcv.isRepeating) {
  339. return setValue(field, bcv.vector[0], bcv.start[0], bcv.length[0]);
  340. } else if (!bcv.noNulls && !bcv.isRepeating && !bcv.isNull[row]) {
  341. return setValue(field, bcv.vector[row], bcv.start[row], bcv.length[row]);
  342. } else if (!bcv.noNulls && !bcv.isRepeating && bcv.isNull[row]) {
  343. return null;
  344. } else if (!bcv.noNulls && bcv.isRepeating && !bcv.isNull[0]) {
  345. return setValue(field, bcv.vector[0], bcv.start[0], bcv.length[0]);
  346. } else if (!bcv.noNulls && bcv.isRepeating && bcv.isNull[0]) {
  347. return null;
  348. }
  349. throw new HiveException(
  350. String.format(
  351. "Incorrect null/repeating: row:%d noNulls:%b isRepeating:%b isNull[row]:%b isNull[0]:%b",
  352. row, bcv.noNulls, bcv.isRepeating, bcv.isNull[row], bcv.isNull[0]));
  353. }
  354. }
  355. /**
  356. * Specialized writer for DecimalColumnVector. Will throw cast exception
  357. * if the wrong vector column is used.
  358. */
  359. private static abstract class VectorExpressionWriterDecimal extends VectorExpressionWriterBase {
  360. @Override
  361. public Object writeValue(ColumnVector column, int row) throws HiveException {
  362. if (column instanceof Decimal64ColumnVector) {
  363. Decimal64ColumnVector d64cv = (Decimal64ColumnVector) column;
  364. final long decimal64Long;
  365. if (d64cv.noNulls && !d64cv.isRepeating) {
  366. decimal64Long = d64cv.vector[row];
  367. } else if (d64cv.noNulls && d64cv.isRepeating) {
  368. decimal64Long = d64cv.vector[0];
  369. } else if (!d64cv.noNulls && !d64cv.isRepeating && !d64cv.isNull[row]) {
  370. decimal64Long = d64cv.vector[row];
  371. } else if (!d64cv.noNulls && !d64cv.isRepeating && d64cv.isNull[row]) {
  372. return null;
  373. } else if (!d64cv.noNulls && d64cv.isRepeating && !d64cv.isNull[0]) {
  374. decimal64Long = d64cv.vector[0];
  375. } else if (!d64cv.noNulls && d64cv.isRepeating && d64cv.isNull[0]) {
  376. return null;
  377. } else {
  378. throw new HiveException(
  379. String.format(
  380. "Incorrect null/repeating: row:%d noNulls:%b isRepeating:%b isNull[row]:%b isNull[0]:%b",
  381. row, d64cv.noNulls, d64cv.isRepeating, d64cv.isNull[row], d64cv.isNull[0]));
  382. }
  383. HiveDecimalWritable scratchHiveDecimalWritable = d64cv.getScratchWritable();
  384. scratchHiveDecimalWritable.deserialize64(decimal64Long, d64cv.scale);
  385. return writeValue(scratchHiveDecimalWritable);
  386. }
  387. DecimalColumnVector dcv = (DecimalColumnVector) column;
  388. if (dcv.noNulls && !dcv.isRepeating) {
  389. return writeValue(dcv.vector[row]);
  390. } else if (dcv.noNulls && dcv.isRepeating) {
  391. return writeValue(dcv.vector[0]);
  392. } else if (!dcv.noNulls && !dcv.isRepeating && !dcv.isNull[row]) {
  393. return writeValue(dcv.vector[row]);
  394. } else if (!dcv.noNulls && dcv.isRepeating && !dcv.isNull[0]) {
  395. return writeValue(dcv.vector[0]);
  396. } else if (!dcv.noNulls && dcv.isRepeating && dcv.isNull[0]) {
  397. return null;
  398. } else if (!dcv.noNulls && !dcv.isRepeating && dcv.isNull[row]) {
  399. return null;
  400. }
  401. throw new HiveException(
  402. String.format(
  403. "Incorrect null/repeating: row:%d noNulls:%b isRepeating:%b isNull[row]:%b isNull[0]:%b",
  404. row, dcv.noNulls, dcv.isRepeating, dcv.isNull[row], dcv.isNull[0]));
  405. }
  406. @Override
  407. public Object setValue(Object field, ColumnVector column, int row) throws HiveException {
  408. DecimalColumnVector dcv = (DecimalColumnVector) column;
  409. if (dcv.noNulls && !dcv.isRepeating) {
  410. return setValue(field, dcv.vector[row]);
  411. } else if (dcv.noNulls && dcv.isRepeating) {
  412. return setValue(field, dcv.vector[0]);
  413. } else if (!dcv.noNulls && !dcv.isRepeating && !dcv.isNull[row]) {
  414. return setValue(field, dcv.vector[row]);
  415. } else if (!dcv.noNulls && !dcv.isRepeating && dcv.isNull[row]) {
  416. return null;
  417. } else if (!dcv.noNulls && dcv.isRepeating && !dcv.isNull[0]) {
  418. return setValue(field, dcv.vector[0]);
  419. } else if (!dcv.noNulls && dcv.isRepeating && dcv.isNull[0]) {
  420. return null;
  421. }
  422. throw new HiveException(
  423. String.format(
  424. "Incorrect null/repeating: row:%d noNulls:%b isRepeating:%b isNull[row]:%b isNull[0]:%b",
  425. row, dcv.noNulls, dcv.isRepeating, dcv.isNull[row], dcv.isNull[0]));
  426. }
  427. }
  428. /**
  429. * Specialized writer for TimestampColumnVector. Will throw cast exception
  430. * if the wrong vector column is used.
  431. */
  432. private static abstract class VectorExpressionWriterTimestamp extends VectorExpressionWriterBase {
  433. @Override
  434. public Object writeValue(ColumnVector column, int row) throws HiveException {
  435. TimestampColumnVector dcv = (TimestampColumnVector) column;
  436. TimestampWritableV2 timestampWritable = (TimestampWritableV2) dcv.getScratchWritable();
  437. if (timestampWritable == null) {
  438. timestampWritable = new TimestampWritableV2();
  439. dcv.setScratchWritable(timestampWritable);
  440. }
  441. if (dcv.noNulls && !dcv.isRepeating) {
  442. return writeValue(TimestampUtils.timestampColumnVectorWritable(dcv, row, timestampWritable));
  443. } else if (dcv.noNulls && dcv.isRepeating) {
  444. return writeValue(TimestampUtils.timestampColumnVectorWritable(dcv, 0, timestampWritable));
  445. } else if (!dcv.noNulls && !dcv.isRepeating && !dcv.isNull[row]) {
  446. return writeValue(TimestampUtils.timestampColumnVectorWritable(dcv, row, timestampWritable));
  447. } else if (!dcv.noNulls && dcv.isRepeating && !dcv.isNull[0]) {
  448. return writeValue(TimestampUtils.timestampColumnVectorWritable(dcv, 0, timestampWritable));
  449. } else if (!dcv.noNulls && dcv.isRepeating && dcv.isNull[0]) {
  450. return null;
  451. } else if (!dcv.noNulls && !dcv.isRepeating && dcv.isNull[row]) {
  452. return null;
  453. }
  454. throw new HiveException(
  455. String.format(
  456. "Incorrect null/repeating: row:%d noNulls:%b isRepeating:%b isNull[row]:%b isNull[0]:%b",
  457. row, dcv.noNulls, dcv.isRepeating, dcv.isNull[row], dcv.isNull[0]));
  458. }
  459. @Override
  460. public Object setValue(Object field, ColumnVector column, int row) throws HiveException {
  461. TimestampColumnVector dcv = (TimestampColumnVector) column;
  462. TimestampWritableV2 timestampWritable = (TimestampWritableV2) dcv.getScratchWritable();
  463. if (timestampWritable == null) {
  464. timestampWritable = new TimestampWritableV2();
  465. dcv.setScratchWritable(timestampWritable);
  466. }
  467. if (dcv.noNulls && !dcv.isRepeating) {
  468. return setValue(field, TimestampUtils.timestampColumnVectorWritable(dcv, row, timestampWritable));
  469. } else if (dcv.noNulls && dcv.isRepeating) {
  470. return setValue(field, TimestampUtils.timestampColumnVectorWritable(dcv, 0, timestampWritable));
  471. } else if (!dcv.noNulls && !dcv.isRepeating && !dcv.isNull[row]) {
  472. return setValue(field, TimestampUtils.timestampColumnVectorWritable(dcv, row, timestampWritable));
  473. } else if (!dcv.noNulls && !dcv.isRepeating && dcv.isNull[row]) {
  474. return null;
  475. } else if (!dcv.noNulls && dcv.isRepeating && !dcv.isNull[0]) {
  476. return setValue(field, TimestampUtils.timestampColumnVectorWritable(dcv, 0, timestampWritable));
  477. } else if (!dcv.noNulls && dcv.isRepeating && dcv.isNull[0]) {
  478. return null;
  479. }
  480. throw new HiveException(
  481. String.format(
  482. "Incorrect null/repeating: row:%d noNulls:%b isRepeating:%b isNull[row]:%b isNull[0]:%b",
  483. row, dcv.noNulls, dcv.isRepeating, dcv.isNull[row], dcv.isNull[0]));
  484. }
  485. }
  486. /**
  487. * Specialized writer for IntervalDayTimeColumnVector. Will throw cast exception
  488. * if the wrong vector column is used.
  489. */
  490. private static abstract class VectorExpressionWriterIntervalDayTime extends VectorExpressionWriterBase {
  491. @Override
  492. public Object writeValue(ColumnVector column, int row) throws HiveException {
  493. IntervalDayTimeColumnVector dcv = (IntervalDayTimeColumnVector) column;
  494. HiveIntervalDayTimeWritable intervalDayTimeWritable = (HiveIntervalDayTimeWritable) dcv.getScratchWritable();
  495. if (intervalDayTimeWritable == null) {
  496. intervalDayTimeWritable = new HiveIntervalDayTimeWritable();
  497. dcv.setScratchWritable(intervalDayTimeWritable);
  498. }
  499. if (dcv.noNulls && !dcv.isRepeating) {
  500. return writeValue(TimestampUtils.intervalDayTimeColumnVectorWritable(dcv, row, intervalDayTimeWritable));
  501. } else if (dcv.noNulls && dcv.isRepeating) {
  502. return writeValue(TimestampUtils.intervalDayTimeColumnVectorWritable(dcv, 0, intervalDayTimeWritable));
  503. } else if (!dcv.noNulls && !dcv.isRepeating && !dcv.isNull[row]) {
  504. return writeValue(TimestampUtils.intervalDayTimeColumnVectorWritable(dcv, row, intervalDayTimeWritable));
  505. } else if (!dcv.noNulls && dcv.isRepeating && !dcv.isNull[0]) {
  506. return writeValue(TimestampUtils.intervalDayTimeColumnVectorWritable(dcv, 0, intervalDayTimeWritable));
  507. } else if (!dcv.noNulls && dcv.isRepeating && dcv.isNull[0]) {
  508. return null;
  509. } else if (!dcv.noNulls && !dcv.isRepeating && dcv.isNull[row]) {
  510. return null;
  511. }
  512. throw new HiveException(
  513. String.format(
  514. "Incorrect null/repeating: row:%d noNulls:%b isRepeating:%b isNull[row]:%b isNull[0]:%b",
  515. row, dcv.noNulls, dcv.isRepeating, dcv.isNull[row], dcv.isNull[0]));
  516. }
  517. @Override
  518. public Object setValue(Object field, ColumnVector column, int row) throws HiveException {
  519. IntervalDayTimeColumnVector dcv = (IntervalDayTimeColumnVector) column;
  520. HiveIntervalDayTimeWritable intervalDayTimeWritable = (HiveIntervalDayTimeWritable) dcv.getScratchWritable();
  521. if (intervalDayTimeWritable == null) {
  522. intervalDayTimeWritable = new HiveIntervalDayTimeWritable();
  523. dcv.setScratchWritable(intervalDayTimeWritable);
  524. }
  525. if (dcv.noNulls && !dcv.isRepeating) {
  526. return setValue(field, TimestampUtils.intervalDayTimeColumnVectorWritable(dcv, row, intervalDayTimeWritable));
  527. } else if (dcv.noNulls && dcv.isRepeating) {
  528. return setValue(field, TimestampUtils.intervalDayTimeColumnVectorWritable(dcv, 0, intervalDayTimeWritable));
  529. } else if (!dcv.noNulls && !dcv.isRepeating && !dcv.isNull[row]) {
  530. return setValue(field, TimestampUtils.intervalDayTimeColumnVectorWritable(dcv, row, intervalDayTimeWritable));
  531. } else if (!dcv.noNulls && !dcv.isRepeating && dcv.isNull[row]) {
  532. return null;
  533. } else if (!dcv.noNulls && dcv.isRepeating && !dcv.isNull[0]) {
  534. return setValue(field, TimestampUtils.intervalDayTimeColumnVectorWritable(dcv, 0, intervalDayTimeWritable));
  535. } else if (!dcv.noNulls && dcv.isRepeating && dcv.isNull[0]) {
  536. return null;
  537. }
  538. throw new HiveException(
  539. String.format(
  540. "Incorrect null/repeating: row:%d noNulls:%b isRepeating:%b isNull[row]:%b isNull[0]:%b",
  541. row, dcv.noNulls, dcv.isRepeating, dcv.isNull[row], dcv.isNull[0]));
  542. }
  543. }
  544. /**
  545. * Compiles the appropriate vector expression writer based on an expression info (ExprNodeDesc)
  546. */
  547. public static VectorExpressionWriter genVectorExpressionWritable(ExprNodeDesc nodeDesc)
  548. throws HiveException {
  549. ObjectInspector objectInspector = nodeDesc.getWritableObjectInspector();
  550. if (null == objectInspector) {
  551. objectInspector = TypeInfoUtils
  552. .getStandardWritableObjectInspectorFromTypeInfo(nodeDesc.getTypeInfo());
  553. }
  554. if (null == objectInspector) {
  555. throw new HiveException(String.format(
  556. "Failed to initialize VectorExpressionWriter for expr: %s",
  557. nodeDesc.getExprString()));
  558. }
  559. return genVectorExpressionWritable(objectInspector);
  560. }
  561. /**
  562. * Compiles the appropriate vector expression writer based on an expression info (ExprNodeDesc)
  563. */
  564. public static VectorExpressionWriter genVectorExpressionWritable(VectorExpression vecExpr)
  565. throws HiveException {
  566. TypeInfo outputTypeInfo = vecExpr.getOutputTypeInfo();
  567. ObjectInspector objectInspector =
  568. TypeInfoUtils.getStandardWritableObjectInspectorFromTypeInfo(
  569. outputTypeInfo);
  570. return genVectorExpressionWritable(objectInspector);
  571. }
  572. /**
  573. * Specialized writer for ListColumnVector. Will throw cast exception
  574. * if the wrong vector column is used.
  575. */
  576. private static abstract class VectorExpressionWriterList extends VectorExpressionWriterBase {
  577. // For now, we just use this to hold the object inspector. There are no writeValue,
  578. // setValue, etc methods yet...
  579. }
  580. /**
  581. * Specialized writer for MapColumnVector. Will throw cast exception
  582. * if the wrong vector column is used.
  583. */
  584. private static abstract class VectorExpressionWriterMap extends VectorExpressionWriterBase {
  585. // For now, we just use this to hold the object inspector. There are no writeValue,
  586. // setValue, etc methods yet...
  587. }
  588. /**
  589. * Specialized writer for StructColumnVector. Will throw cast exception
  590. * if the wrong vector column is used.
  591. */
  592. private static abstract class VectorExpressionWriterStruct extends VectorExpressionWriterBase {
  593. // For now, we just use this to hold the object inspector. There are no writeValue,
  594. // setValue, etc methods yet...
  595. }
  596. /**
  597. * Specialized writer for UnionColumnVector. Will throw cast exception
  598. * if the wrong vector column is used.
  599. */
  600. private static abstract class VectorExpressionWriterUnion extends VectorExpressionWriterBase {
  601. // For now, we just use this to hold the object inspector. There are no writeValue,
  602. // setValue, etc methods yet...
  603. }
  604. /**
  605. * Compiles the appropriate vector expression writer based on an expression info (ExprNodeDesc)
  606. */
  607. public static VectorExpressionWriter genVectorExpressionWritable(
  608. ObjectInspector fieldObjInspector) throws HiveException {
  609. switch (fieldObjInspector.getCategory()) {
  610. case PRIMITIVE:
  611. switch (((PrimitiveObjectInspector) fieldObjInspector).getPrimitiveCategory()) {
  612. case FLOAT:
  613. return genVectorExpressionWritableFloat(
  614. (SettableFloatObjectInspector) fieldObjInspector);
  615. case DOUBLE:
  616. return genVectorExpressionWritableDouble(
  617. (SettableDoubleObjectInspector) fieldObjInspector);
  618. case BOOLEAN:
  619. return genVectorExpressionWritableBoolean(
  620. (SettableBooleanObjectInspector) fieldObjInspector);
  621. case BYTE:
  622. return genVectorExpressionWritableByte(
  623. (SettableByteObjectInspector) fieldObjInspector);
  624. case SHORT:
  625. return genVectorExpressionWritableShort(
  626. (SettableShortObjectInspector) fieldObjInspector);
  627. case INT:
  628. return genVectorExpressionWritableInt(
  629. (SettableIntObjectInspector) fieldObjInspector);
  630. case LONG:
  631. return genVectorExpressionWritableLong(
  632. (SettableLongObjectInspector) fieldObjInspector);
  633. case VOID:
  634. return genVectorExpressionWritableVoid(
  635. (VoidObjectInspector) fieldObjInspector);
  636. case BINARY:
  637. return genVectorExpressionWritableBinary(
  638. (SettableBinaryObjectInspector) fieldObjInspector);
  639. case STRING:
  640. return genVectorExpressionWritableString(
  641. (SettableStringObjectInspector) fieldObjInspector);
  642. case CHAR:
  643. return genVectorExpressionWritableChar(
  644. (SettableHiveCharObjectInspector) fieldObjInspector);
  645. case VARCHAR:
  646. return genVectorExpressionWritableVarchar(
  647. (SettableHiveVarcharObjectInspector) fieldObjInspector);
  648. case TIMESTAMP:
  649. return genVectorExpressionWritableTimestamp(
  650. (SettableTimestampObjectInspector) fieldObjInspector);
  651. case DATE:
  652. return genVectorExpressionWritableDate(
  653. (SettableDateObjectInspector) fieldObjInspector);
  654. case INTERVAL_YEAR_MONTH:
  655. return genVectorExpressionWritableIntervalYearMonth(
  656. (SettableHiveIntervalYearMonthObjectInspector) fieldObjInspector);
  657. case INTERVAL_DAY_TIME:
  658. return genVectorExpressionWritableIntervalDayTime(
  659. (SettableHiveIntervalDayTimeObjectInspector) fieldObjInspector);
  660. case DECIMAL:
  661. return genVectorExpressionWritableDecimal(
  662. (SettableHiveDecimalObjectInspector) fieldObjInspector);
  663. default:
  664. throw new IllegalArgumentException("Unknown primitive type: " +
  665. ((PrimitiveObjectInspector) fieldObjInspector).getPrimitiveCategory());
  666. }
  667. case LIST:
  668. return genVectorExpressionWritableList(
  669. (SettableListObjectInspector) fieldObjInspector);
  670. case MAP:
  671. return genVectorExpressionWritableMap(
  672. (SettableMapObjectInspector) fieldObjInspector);
  673. case STRUCT:
  674. return genVectorExpressionWritableStruct(
  675. (SettableStructObjectInspector) fieldObjInspector);
  676. case UNION:
  677. return genVectorExpressionWritableUnion(
  678. (SettableUnionObjectInspector) fieldObjInspector);
  679. default:
  680. throw new IllegalArgumentException("Unknown type " +
  681. fieldObjInspector.getCategory());
  682. }
  683. }
  684. /**
  685. * Compiles the appropriate vector expression writers based on a struct object
  686. * inspector.
  687. */
  688. public static VectorExpressionWriter[] genVectorStructExpressionWritables(
  689. StructObjectInspector oi) throws HiveException {
  690. VectorExpressionWriter[] writers = new VectorExpressionWriter[oi.getAllStructFieldRefs().size()];
  691. final List<? extends StructField> fields = oi.getAllStructFieldRefs();
  692. int i = 0;
  693. for(StructField field : fields) {
  694. writers[i++] = genVectorExpressionWritable(field.getFieldObjectInspector());
  695. }
  696. return writers;
  697. }
  698. private static VectorExpressionWriter genVectorExpressionWritableDecimal(
  699. SettableHiveDecimalObjectInspector fieldObjInspector) throws HiveException {
  700. return new VectorExpressionWriterDecimal() {
  701. private Object obj;
  702. public VectorExpressionWriter init(SettableHiveDecimalObjectInspector objInspector) throws HiveException {
  703. super.init(objInspector);
  704. obj = initValue(null);
  705. return this;
  706. }
  707. @Override
  708. public Object writeValue(HiveDecimalWritable value) throws HiveException {
  709. return ((SettableHiveDecimalObjectInspector) this.objectInspector).set(obj, value);
  710. }
  711. @Override
  712. public Object writeValue(HiveDecimal value) throws HiveException {
  713. return ((SettableHiveDecimalObjectInspector) this.objectInspector).set(obj, value);
  714. }
  715. @Override
  716. public Object setValue(Object field, HiveDecimalWritable value) {
  717. if (null == field) {
  718. field = initValue(null);
  719. }
  720. return ((SettableHiveDecimalObjectInspector) this.objectInspector).set(field, value);
  721. }
  722. @Override
  723. public Object setValue(Object field, HiveDecimal value) {
  724. if (null == field) {
  725. field = initValue(null);
  726. }
  727. return ((SettableHiveDecimalObjectInspector) this.objectInspector).set(field, value);
  728. }
  729. @Override
  730. public Object setValue(Object field, TimestampWritableV2 value) {
  731. if (null == field) {
  732. field = initValue(null);
  733. }
  734. return ((SettableTimestampObjectInspector) this.objectInspector).set(field, value);
  735. }
  736. @Override
  737. public Object setValue(Object field, Timestamp value) {
  738. if (null == field) {
  739. field = initValue(null);
  740. }
  741. return ((SettableTimestampObjectInspector) this.objectInspector).set(field, value);
  742. }
  743. @Override
  744. public Object initValue(Object ignored) {
  745. return ((SettableHiveDecimalObjectInspector) this.objectInspector).create(
  746. HiveDecimal.ZERO);
  747. }
  748. }.init(fieldObjInspector);
  749. }
  750. private static VectorExpressionWriter genVectorExpressionWritableDate(
  751. SettableDateObjectInspector fieldObjInspector) throws HiveException {
  752. return new VectorExpressionWriterLong() {
  753. private Date dt;
  754. private Object obj;
  755. public VectorExpressionWriter init(SettableDateObjectInspector objInspector) throws HiveException {
  756. super.init(objInspector);
  757. dt = new Date(0);
  758. obj = initValue(null);
  759. return this;
  760. }
  761. @Override
  762. public Object writeValue(long value) {
  763. dt.setTime(DateWritableV2.daysToMillis((int) value));
  764. ((SettableDateObjectInspector) this.objectInspector).set(obj, dt);
  765. return obj;
  766. }
  767. @Override
  768. public Object setValue(Object field, long value) {
  769. if (null == field) {
  770. field = initValue(null);
  771. }
  772. dt.setTime(DateWritableV2.daysToMillis((int) value));
  773. ((SettableDateObjectInspector) this.objectInspector).set(field, dt);
  774. return field;
  775. }
  776. @Override
  777. public Object initValue(Object ignored) {
  778. return ((SettableDateObjectInspector) this.objectInspector).create(new Date(0));
  779. }
  780. }.init(fieldObjInspector);
  781. }
  782. private static VectorExpressionWriter genVectorExpressionWritableTimestamp(
  783. SettableTimestampObjectInspector fieldObjInspector) throws HiveException {
  784. return new VectorExpressionWriterTimestamp() {
  785. private Object obj;
  786. public VectorExpressionWriter init(SettableTimestampObjectInspector objInspector) throws HiveException {
  787. super.init(objInspector);
  788. obj = initValue(null);
  789. return this;
  790. }
  791. @Override
  792. public Object writeValue(TimestampWritableV2 value) throws HiveException {
  793. return ((SettableTimestampObjectInspector) this.objectInspector).set(obj, value);
  794. }
  795. @Override
  796. public Object writeValue(Timestamp value) throws HiveException {
  797. return ((SettableTimestampObjectInspector) this.objectInspector).set(obj, value);
  798. }
  799. @Override
  800. public Object writeValue(HiveIntervalDayTimeWritable value) throws HiveException {
  801. return ((SettableHiveIntervalDayTimeObjectInspector) this.objectInspector).set(obj, value);
  802. }
  803. @Override
  804. public Object writeValue(HiveIntervalDayTime value) throws HiveException {
  805. return ((SettableHiveIntervalDayTimeObjectInspector) this.objectInspector).set(obj, value);
  806. }
  807. @Override
  808. public Object setValue(Object field, TimestampWritableV2 value) {
  809. if (null == field) {
  810. field = initValue(null);
  811. }
  812. return ((SettableTimestampObjectInspector) this.objectInspector).set(field, value);
  813. }
  814. @Override
  815. public Object setValue(Object field, Timestamp value) {
  816. if (null == field) {
  817. field = initValue(null);
  818. }
  819. return ((SettableTimestampObjectInspector) this.objectInspector).set(field, value);
  820. }
  821. @Override
  822. public Object initValue(Object ignored) {
  823. return ((SettableTimestampObjectInspector) this.objectInspector).create(new Timestamp(0));
  824. }
  825. }.init(fieldObjInspector);
  826. }
  827. private static VectorExpressionWriter genVectorExpressionWritableIntervalYearMonth(
  828. SettableHiveIntervalYearMonthObjectInspector fieldObjInspector) throws HiveException {
  829. return new VectorExpressionWriterLong() {
  830. private Object obj;
  831. private HiveIntervalYearMonth interval;
  832. public VectorExpressionWriter init(SettableHiveIntervalYearMonthObjectInspector objInspector)
  833. throws HiveException {
  834. super.init(objInspector);
  835. interval = new HiveIntervalYearMonth();
  836. obj = initValue(null);
  837. return this;
  838. }
  839. @Override
  840. public Object writeValue(long value) {
  841. interval.set((int) value);
  842. ((SettableHiveIntervalYearMonthObjectInspector) this.objectInspector).set(obj, interval);
  843. return obj;
  844. }
  845. @Override
  846. public Object setValue(Object field, long value) {
  847. if (null == field) {
  848. field = initValue(null);
  849. }
  850. interval.set((int) value);
  851. ((SettableHiveIntervalYearMonthObjectInspector) this.objectInspector).set(field, interval);
  852. return field;
  853. }
  854. @Override
  855. public Object initValue(Object ignored) {
  856. return ((SettableHiveIntervalYearMonthObjectInspector) this.objectInspector)
  857. .create(new HiveIntervalYearMonth());
  858. }
  859. }.init(fieldObjInspector);
  860. }
  861. private static VectorExpressionWriter genVectorExpressionWritableIntervalDayTime(
  862. SettableHiveIntervalDayTimeObjectInspector fieldObjInspector) throws HiveException {
  863. return new VectorExpressionWriterIntervalDayTime() {
  864. private Object obj;
  865. private HiveIntervalDayTime interval;
  866. public VectorExpressionWriter init(SettableHiveIntervalDayTimeObjectInspector objInspector)
  867. throws HiveException {
  868. super.init(objInspector);
  869. interval = new HiveIntervalDayTime();
  870. obj = initValue(null);
  871. return this;
  872. }
  873. @Override
  874. public Object writeValue(HiveIntervalDayTimeWritable value) throws HiveException {
  875. interval.set(value.getHiveIntervalDayTime());
  876. return ((SettableHiveIntervalDayTimeObjectInspector) this.objectInspector).set(obj, interval);
  877. }
  878. @Override
  879. public Object writeValue(HiveIntervalDayTime value) throws HiveException {
  880. interval.set(value);
  881. return ((SettableHiveIntervalDayTimeObjectInspector) this.objectInspector).set(obj, interval);
  882. }
  883. @Override
  884. public Object setValue(Object field, HiveIntervalDayTimeWritable value) {
  885. if (null == field) {
  886. field = initValue(null);
  887. }
  888. interval.set(value.getHiveIntervalDayTime());
  889. return ((SettableHiveIntervalDayTimeObjectInspector) this.objectInspector).set(field, interval);
  890. }
  891. @Override
  892. public Object setValue(Object field, HiveIntervalDayTime value) {
  893. if (null == field) {
  894. field = initValue(null);
  895. }
  896. interval.set(value);
  897. return ((SettableHiveIntervalDayTimeObjectInspector) this.objectInspector).set(field, interval);
  898. }
  899. @Override
  900. public Object initValue(Object ignored) {
  901. return ((SettableHiveIntervalDayTimeObjectInspector) this.objectInspector)
  902. .create(new HiveIntervalDayTime());
  903. }
  904. }.init(fieldObjInspector);
  905. }
  906. private static VectorExpressionWriter genVectorExpressionWritableChar(
  907. SettableHiveCharObjectInspector fieldObjInspector) throws HiveException {
  908. return new VectorExpressionWriterBytes() {
  909. private Object obj;
  910. private Text text;
  911. public VectorExpressionWriter init(SettableHiveCharObjectInspector objInspector)
  912. throws HiveException {
  913. super.init(objInspector);
  914. this.text = new Text();
  915. this.obj = initValue(null);
  916. return this;
  917. }
  918. @Override
  919. public Object writeValue(byte[] value, int start, int length) throws HiveException {
  920. text.set(value, start, length);
  921. ((SettableHiveCharObjectInspector) this.objectInspector).set(this.obj, text.toString());
  922. return this.obj;
  923. }
  924. @Override
  925. public Object setValue(Object field, byte[] value, int start, int length)
  926. throws HiveException {
  927. if (null == field) {
  928. field = initValue(null);
  929. }
  930. text.set(value, start, length);
  931. ((SettableHiveCharObjectInspector) this.objectInspector).set(field, text.toString());
  932. return field;
  933. }
  934. @Override
  935. public Object initValue(Object ignored) {
  936. return ((SettableHiveCharObjectInspector) this.objectInspector)
  937. .create(new HiveChar(StringUtils.EMPTY, -1));
  938. }
  939. }.init(fieldObjInspector);
  940. }
  941. private static VectorExpressionWriter genVectorExpressionWritableVarchar(
  942. SettableHiveVarcharObjectInspector fieldObjInspector) throws HiveException {
  943. return new VectorExpressionWriterBytes() {
  944. private Object obj;
  945. private Text text;
  946. public VectorExpressionWriter init(SettableHiveVarcharObjectInspector objInspector)
  947. throws HiveException {
  948. super.init(objInspector);
  949. this.text = new Text();
  950. this.obj = initValue(null);
  951. return this;
  952. }
  953. @Override
  954. public Object writeValue(byte[] value, int start, int length) throws HiveException {
  955. text.set(value, start, length);
  956. ((SettableHiveVarcharObjectInspector) this.objectInspector).set(this.obj, text.toString());
  957. return this.obj;
  958. }
  959. @Override
  960. public Object setValue(Object field, byte[] value, int start, int length)
  961. throws HiveException {
  962. if (null == field) {
  963. field = initValue(null);
  964. }
  965. text.set(value, start, length);
  966. ((SettableHiveVarcharObjectInspector) this.objectInspector).set(field, text.toString());
  967. return field;
  968. }
  969. @Override
  970. public Object initValue(Object ignored) {
  971. return ((SettableHiveVarcharObjectInspector) this.objectInspector)
  972. .create(new HiveVarchar(StringUtils.EMPTY, -1));
  973. }
  974. }.init(fieldObjInspector);
  975. }
  976. private static VectorExpressionWriter genVectorExpressionWritableString(
  977. SettableStringObjectInspector fieldObjInspector) throws HiveException {
  978. return new VectorExpressionWriterBytes() {
  979. private Object obj;
  980. private Text text;
  981. public VectorExpressionWriter init(SettableStringObjectInspector objInspector)
  982. throws HiveException {
  983. super.init(objInspector);
  984. this.text = new Text();
  985. this.obj = initValue(null);
  986. return this;
  987. }
  988. @Override
  989. public Object writeValue(byte[] value, int start, int length) throws HiveException {
  990. this.text.set(value, start, length);
  991. ((SettableStringObjectInspector) this.objectInspector).set(this.obj, this.text);
  992. return this.obj;
  993. }
  994. @Override
  995. public Object setValue(Object field, byte[] value, int start, int length)
  996. throws HiveException {
  997. if (null == field) {
  998. field = initValue(null);
  999. }
  1000. this.text.set(value, start, length);
  1001. ((SettableStringObjectInspector) this.objectInspector).set(field, this.text);
  1002. return field;
  1003. }
  1004. @Override
  1005. public Object initValue(Object ignored) {
  1006. return ((SettableStringObjectInspector) this.objectInspector).create(StringUtils.EMPTY);
  1007. }
  1008. }.init(fieldObjInspector);
  1009. }
  1010. private static VectorExpressionWriter genVectorExpressionWritableBinary(
  1011. SettableBinaryObjectInspector fieldObjInspector) throws HiveException {
  1012. return new VectorExpressionWriterBytes() {
  1013. private Object obj;
  1014. private byte[] bytes;
  1015. public VectorExpressionWriter init(SettableBinaryObjectInspector objInspector)
  1016. throws HiveException {
  1017. super.init(objInspector);
  1018. this.bytes = ArrayUtils.EMPTY_BYTE_ARRAY;
  1019. this.obj = initValue(null);
  1020. return this;
  1021. }
  1022. @Override
  1023. public Object writeValue(byte[] value, int start, int length) throws HiveException {
  1024. bytes = Arrays.copyOfRange(value, start, start + length);
  1025. ((SettableBinaryObjectInspector) this.objectInspector).set(this.obj, bytes);
  1026. return this.obj;
  1027. }
  1028. @Override
  1029. public Object setValue(Object field, byte[] value, int start, int length) throws HiveException {
  1030. if (null == field) {
  1031. field = initValue(null);
  1032. }
  1033. bytes = Arrays.copyOfRange(value, start, start + length);
  1034. ((SettableBinaryObjectInspector) this.objectInspector).set(field, bytes);
  1035. return field;
  1036. }
  1037. @Override
  1038. public Object initValue(Object ignored) {
  1039. return ((SettableBinaryObjectInspector) this.objectInspector)
  1040. .create(ArrayUtils.EMPTY_BYTE_ARRAY);
  1041. }
  1042. }.init(fieldObjInspector);
  1043. }
  1044. private static VectorExpressionWriter genVectorExpressionWritableLong(
  1045. SettableLongObjectInspector fieldObjInspector) throws HiveException {
  1046. return new VectorExpressionWriterLong() {
  1047. private Object obj;
  1048. public VectorExpressionWriter init(SettableLongObjectInspector objInspector)
  1049. throws HiveException {
  1050. super.init(objInspector);
  1051. this.obj = initValue(null);
  1052. return this;
  1053. }
  1054. @Override
  1055. public Object writeValue(long value) throws HiveException {
  1056. ((SettableLongObjectInspector) this.objectInspector).set(this.obj, value);
  1057. return this.obj;
  1058. }
  1059. @Override
  1060. public Object setValue(Object field, long value) throws HiveException {
  1061. if (null == field) {
  1062. field = initValue(null);
  1063. }
  1064. ((SettableLongObjectInspector) this.objectInspector).set(field, value);
  1065. return field;
  1066. }
  1067. @Override
  1068. public Object initValue(Object ignored) {
  1069. return ((SettableLongObjectInspector) this.objectInspector)
  1070. .create(0L);
  1071. }
  1072. }.init(fieldObjInspector);
  1073. }
  1074. private static VectorExpressionWriter genVectorExpressionWritableVoid(
  1075. VoidObjectInspector fieldObjInspector) throws HiveException {
  1076. return new VectorExpressionWriterLong() {
  1077. private Object obj;
  1078. public VectorExpressionWriter init(VoidObjectInspector objInspector) throws HiveException {
  1079. super.init(objInspector);
  1080. this.obj = initValue(null);
  1081. return this;
  1082. }
  1083. @Override
  1084. public Object writeValue(long value) throws HiveException {
  1085. return this.obj;
  1086. }
  1087. @Override
  1088. public Object setValue(Object field, long value) throws HiveException {
  1089. if (null == field) {
  1090. field = initValue(null);
  1091. }
  1092. return field;
  1093. }
  1094. @Override
  1095. public Object initValue(Object ignored) {
  1096. return ((VoidObjectInspector) this.objectInspector).copyObject(null);
  1097. }
  1098. }.init(fieldObjInspector);
  1099. }
  1100. private static VectorExpressionWriter genVectorExpressionWritableInt(
  1101. SettableIntObjectInspector fieldObjInspector) throws HiveException {
  1102. return new VectorExpressionWriterLong() {
  1103. private Object obj;
  1104. public VectorExpressionWriter init(SettableIntObjectInspector objInspector)
  1105. throws HiveException {
  1106. super.init(objInspector);
  1107. this.obj = initValue(null);
  1108. return this;
  1109. }
  1110. @Override
  1111. public Object writeValue(long value) throws HiveException {
  1112. ((SettableIntObjectInspector) this.objectInspector).set(this.obj, (int) value);
  1113. return this.obj;
  1114. }
  1115. @Override
  1116. public Object setValue(Object field, long value) throws HiveException {
  1117. if (null == field) {
  1118. field = initValue(null);
  1119. }
  1120. ((SettableIntObjectInspector) this.objectInspector).set(field, (int) value);
  1121. return field;
  1122. }
  1123. @Override
  1124. public Object initValue(Object ignored) {
  1125. return ((SettableIntObjectInspector) this.objectInspector)
  1126. .create(0);
  1127. }
  1128. }.init(fieldObjInspector);
  1129. }
  1130. private static VectorExpressionWriter genVectorExpressionWritableShort(
  1131. SettableShortObjectInspector fieldObjInspector) throws HiveException {
  1132. return new VectorExpressionWriterLong() {
  1133. private Object obj;
  1134. public VectorExpressionWriter init(SettableShortObjectInspector objInspector)
  1135. throws HiveException {
  1136. super.init(objInspector);
  1137. this.obj = initValue(null);
  1138. return this;
  1139. }
  1140. @Override
  1141. public Object writeValue(long value) throws HiveException {
  1142. ((SettableShortObjectInspector) this.objectInspector).set(this.obj, (short) value);
  1143. return this.obj;
  1144. }
  1145. @Override
  1146. public Object setValue(Object field, long value) throws HiveException {
  1147. if (null == field) {
  1148. field = initValue(null);
  1149. }
  1150. ((SettableShortObjectInspector) this.objectInspector).set(field, (short) value);
  1151. return field;
  1152. }
  1153. @Override
  1154. public Object initValue(Object ignored) {
  1155. return ((SettableShortObjectInspector) this.objectInspector)
  1156. .create((short) 0);
  1157. }
  1158. }.init(fieldObjInspector);
  1159. }
  1160. private static VectorExpressionWriter genVectorExpressionWritableByte(
  1161. SettableByteObjectInspector fieldObjInspector) throws HiveException {
  1162. return new VectorExpressionWriterLong() {
  1163. private Object obj;
  1164. public VectorExpressionWriter init(SettableByteObjectInspector objInspector)
  1165. throws HiveException {
  1166. super.init(objInspector);
  1167. this.obj = initValue(null);
  1168. return this;
  1169. }
  1170. @Override
  1171. public Object writeValue(long value) throws HiveException {
  1172. ((SettableByteObjectInspector) this.objectInspector).set(this.obj, (byte) value);
  1173. return this.obj;
  1174. }
  1175. @Override
  1176. public Object setValue(Object field, long value) throws HiveException {
  1177. if (null == field) {
  1178. field = initValue(null);
  1179. }
  1180. ((SettableByteObjectInspector) this.objectInspector).set(field, (byte) value);
  1181. return field;
  1182. }
  1183. @Override
  1184. public Object initValue(Object ignored) {
  1185. return ((SettableByteObjectInspector) this.objectInspector)
  1186. .create((byte) 0);
  1187. }
  1188. }.init(fieldObjInspector);
  1189. }
  1190. private static VectorExpressionWriter genVectorExpressionWritableBoolean(
  1191. SettableBooleanObjectInspector fieldObjInspector) throws HiveException {
  1192. return new VectorExpressionWriterLong() {
  1193. private Object obj;
  1194. public VectorExpressionWriter init(SettableBooleanObjectInspector objInspector)
  1195. throws HiveException {
  1196. super.init(objInspector);
  1197. this.obj = initValue(null);
  1198. return this;
  1199. }
  1200. @Override
  1201. public Object writeValue(long value) throws HiveException {
  1202. ((SettableBooleanObjectInspector) this.objectInspector).set(this.obj,
  1203. value == 0 ? false : true);
  1204. return this.obj;
  1205. }
  1206. @Override
  1207. public Object setValue(Object field, long value) throws HiveException {
  1208. if (null == field) {
  1209. field = initValue(null);
  1210. }
  1211. ((SettableBooleanObjectInspector) this.objectInspector).set(field,
  1212. value == 0 ? false : true);
  1213. return field;
  1214. }
  1215. @Override
  1216. public Object initValue(Object ignored) {
  1217. return ((SettableBooleanObjectInspector) this.objectInspector)
  1218. .create(false);
  1219. }
  1220. }.init(fieldObjInspector);
  1221. }
  1222. private static VectorExpressionWriter genVectorExpressionWritableDouble(
  1223. SettableDoubleObjectInspector fieldObjInspector) throws HiveException {
  1224. return new VectorExpressionWriterDouble() {
  1225. private Object obj;
  1226. public VectorExpressionWriter init(SettableDoubleObjectInspector objInspector)
  1227. throws HiveException {
  1228. super.init(objInspector);
  1229. this.obj = initValue(null);
  1230. return this;
  1231. }
  1232. @Override
  1233. public Object writeValue(double value) throws HiveException {
  1234. ((SettableDoubleObjectInspector) this.objectInspector).set(this.obj, value);
  1235. return this.obj;
  1236. }
  1237. @Override
  1238. public Object setValue(Object field, double value) throws HiveException {
  1239. if (null == field) {
  1240. field = initValue(null);
  1241. }
  1242. ((SettableDoubleObjectInspector) this.objectInspector).set(field, value);
  1243. return field;
  1244. }
  1245. @Override
  1246. public Object initValue(Object ignored) {
  1247. return ((SettableDoubleObjectInspector) this.objectInspector)
  1248. .create(0f);
  1249. }
  1250. }.init(fieldObjInspector);
  1251. }
  1252. private static VectorExpressionWriter genVectorExpressionWritableFloat(
  1253. SettableFloatObjectInspector fieldObjInspector) throws HiveException {
  1254. return new VectorExpressionWriterDouble() {
  1255. private Object obj;
  1256. public VectorExpressionWriter init(SettableFloatObjectInspector objInspector)
  1257. throws HiveException {
  1258. super.init(objInspector);
  1259. this.obj = initValue(null);
  1260. return this;
  1261. }
  1262. @Override
  1263. public Object writeValue(double value) throws HiveException {
  1264. ((SettableFloatObjectInspector) this.objectInspector).set(this.obj, (float) value);
  1265. return this.obj;
  1266. }
  1267. @Override
  1268. public Object setValue(Object field, double value) throws HiveException {
  1269. if (null == field) {
  1270. field = initValue(null);
  1271. }
  1272. ((SettableFloatObjectInspector) this.objectInspector).set(field, (float) value);
  1273. return field;
  1274. }
  1275. @Override
  1276. public Object initValue(Object ignored) {
  1277. return ((SettableFloatObjectInspector) this.objectInspector)
  1278. .create(0f);
  1279. }
  1280. }.init(fieldObjInspector);
  1281. }
  1282. private static VectorExpressionWriter genVectorExpressionWritableList(
  1283. SettableListObjectInspector fieldObjInspector) throws HiveException {
  1284. return new VectorExpressionWriterList() {
  1285. private Object obj;
  1286. private VectorExtractRow vectorExtractRow;
  1287. private ListTypeInfo listTypeInfo;
  1288. public VectorExpressionWriter init(SettableListObjectInspector objInspector) throws HiveException {
  1289. super.init(objInspector);
  1290. obj = initValue(null);
  1291. vectorExtractRow = new VectorExtractRow();
  1292. listTypeInfo = (ListTypeInfo)
  1293. TypeInfoUtils.getTypeInfoFromTypeString(objInspector.getTypeName());
  1294. return this;
  1295. }
  1296. @Override
  1297. public Object initValue(Object ignored) {
  1298. return ((SettableListObjectInspector) this.objectInspector).create(0);
  1299. }
  1300. @Override
  1301. public Object writeValue(ColumnVector column, int row)
  1302. throws HiveException {
  1303. final ListColumnVector listColVector = (ListColumnVector) column;
  1304. final SettableListObjectInspector listOI =
  1305. (SettableListObjectInspector) this.objectInspector;
  1306. final List value = (List) vectorExtractRow.extractRowColumn(listColVector,
  1307. listTypeInfo, listOI, row);
  1308. if (value == null) {
  1309. return null;
  1310. }
  1311. listOI.resize(obj, value.size());
  1312. for (int i = 0; i < value.size(); i++) {
  1313. listOI.set(obj, i, value.get(i));
  1314. }
  1315. return obj;
  1316. }
  1317. @Override
  1318. public Object setValue(Object list, ColumnVector column, int row)
  1319. throws HiveException {
  1320. if (list == null) {
  1321. list = initValue(null);
  1322. }
  1323. final ListColumnVector listColVector = (ListColumnVector) column;
  1324. final SettableListObjectInspector listOI =
  1325. (SettableListObjectInspector) this.objectInspector;
  1326. final List value = (List) vectorExtractRow.extractRowColumn(listColVector,
  1327. listTypeInfo, listOI, row);
  1328. if (value == null) {
  1329. return null;
  1330. }
  1331. listOI.resize(list, value.size());
  1332. for (int i = 0; i < value.size(); i++) {
  1333. listOI.set(list, i, value.get(i));
  1334. }
  1335. return list;
  1336. }
  1337. }.init(fieldObjInspector);
  1338. }
  1339. private static VectorExpressionWriter genVectorExpressionWritableMap(
  1340. SettableMapObjectInspector fieldObjInspector) throws HiveException {
  1341. return new VectorExpressionWriterMap() {
  1342. private Object obj;
  1343. private VectorExtractRow vectorExtractRow;
  1344. private MapTypeInfo mapTypeInfo;
  1345. public VectorExpressionWriter init(SettableMapObjectInspector objInspector) throws HiveException {
  1346. super.init(objInspector);
  1347. obj = initValue(null);
  1348. vectorExtractRow = new VectorExtractRow();
  1349. mapTypeInfo = (MapTypeInfo)
  1350. TypeInfoUtils.getTypeInfoFromTypeString(objInspector.getTypeName());
  1351. return this;
  1352. }
  1353. @Override
  1354. public Object initValue(Object ignored) {
  1355. return ((SettableMapObjectInspector) this.objectInspector).create();
  1356. }
  1357. @Override
  1358. public Object writeValue(ColumnVector column, int row)
  1359. throws HiveException {
  1360. final MapColumnVector mapColVector = (MapColumnVector) column;
  1361. final SettableMapObjectInspector mapOI =
  1362. (SettableMapObjectInspector) this.objectInspector;
  1363. final Map<Object, Object> value =
  1364. (Map<Object, Object>) vectorExtractRow.extractRowColumn(
  1365. mapColVector, mapTypeInfo, mapOI, row);
  1366. if (value == null) {
  1367. return null;
  1368. }
  1369. mapOI.clear(obj);
  1370. for (Map.Entry<Object, Object> entry : value.entrySet()) {
  1371. mapOI.put(obj, entry.getKey(), entry.getValue());
  1372. }
  1373. return obj;
  1374. }
  1375. @Override
  1376. public Object setValue(Object map, ColumnVector column, int row)
  1377. throws HiveException {
  1378. if (map == null) {
  1379. map = initValue(null);
  1380. }
  1381. final MapColumnVector mapColVector = (MapColumnVector) column;
  1382. final SettableMapObjectInspector mapOI =
  1383. (SettableMapObjectInspector) this.objectInspector;
  1384. final Map<Object, Object> value =
  1385. (Map<Object, Object>) vectorExtractRow.extractRowColumn(
  1386. mapColVector, mapTypeInfo, mapOI, row);
  1387. if (value == null) {
  1388. return null;
  1389. }
  1390. mapOI.clear(map);
  1391. for (Map.Entry<Object, Object> entry : value.entrySet()) {
  1392. mapOI.put(map, entry.getKey(), entry.getValue());
  1393. }
  1394. return map;
  1395. }
  1396. }.init(fieldObjInspector);
  1397. }
  1398. private static VectorExpressionWriter genVectorExpressionWritableStruct(
  1399. SettableStructObjectInspector fieldObjInspector) throws HiveException {
  1400. return new VectorExpressionWriterStruct() {
  1401. private Object obj;
  1402. private VectorExtractRow vectorExtractRow;
  1403. private StructTypeInfo structTypeInfo;
  1404. public VectorExpressionWriter init(SettableStructObjectInspector objInspector)
  1405. throws HiveException {
  1406. super.init(objInspector);
  1407. obj = initValue(null);
  1408. vectorExtractRow = new VectorExtractRow();
  1409. structTypeInfo = (StructTypeInfo)
  1410. TypeInfoUtils.getTypeInfoFromTypeString(objInspector.getTypeName());
  1411. return this;
  1412. }
  1413. @Override
  1414. public Object initValue(Object ignored) {
  1415. return ((SettableStructObjectInspector) this.objectInspector).create();
  1416. }
  1417. @Override
  1418. public Object writeValue(ColumnVector column, int row) throws HiveException {
  1419. return setValueInternal(obj, column, row);
  1420. }
  1421. @Override
  1422. public Object setValue(Object struct, ColumnVector column, int row) throws HiveException {
  1423. if (struct == null) {
  1424. struct = initValue(null);
  1425. }
  1426. return setValueInternal(struct, column, row);
  1427. }
  1428. private Object setValueInternal(final Object struct, ColumnVector colVector, int batchIndex) {
  1429. if (colVector == null) {
  1430. // The planner will not include unneeded columns for reading but other parts of execution
  1431. // may ask for them..
  1432. return null;
  1433. }
  1434. final int adjustedIndex = (colVector.isRepeating ? 0 : batchIndex);
  1435. if (!colVector.noNulls && colVector.isNull[adjustedIndex]) {
  1436. return null;
  1437. }
  1438. final StructColumnVector structColumnVector = (StructColumnVector) colVector;
  1439. final StandardStructObjectInspector structInspector =
  1440. (StandardStructObjectInspector) objectInspector;
  1441. final List<TypeInfo> fieldTypeInfos = structTypeInfo.getAllStructFieldTypeInfos();
  1442. final int size = fieldTypeInfos.size();
  1443. final List<? extends StructField> structFields =
  1444. structInspector.getAllStructFieldRefs();
  1445. for (int i = 0; i < size; i++) {
  1446. final StructField structField = structFields.get(i);
  1447. final TypeInfo fieldTypeInfo = fieldTypeInfos.get(i);
  1448. final Object value = vectorExtractRow.extractRowColumn(
  1449. structColumnVector.fields[i],
  1450. fieldTypeInfo,
  1451. structField.getFieldObjectInspector(),
  1452. adjustedIndex);
  1453. structInspector.setStructFieldData(struct, structField, value);
  1454. }
  1455. return struct;
  1456. }
  1457. }.init(fieldObjInspector);
  1458. }
  1459. private static VectorExpressionWriter genVectorExpressionWritableUnion(
  1460. SettableUnionObjectInspector fieldObjInspector) throws HiveException {
  1461. return new VectorExpressionWriterMap() {
  1462. private Object obj;
  1463. private VectorExtractRow vectorExtractRow;
  1464. private UnionTypeInfo unionTypeInfo;
  1465. public VectorExpressionWriter init(SettableUnionObjectInspector objInspector) throws HiveException {
  1466. super.init(objInspector);
  1467. obj = initValue(null);
  1468. vectorExtractRow = new VectorExtractRow();
  1469. unionTypeInfo = (UnionTypeInfo)
  1470. TypeInfoUtils.getTypeInfoFromTypeString(objInspector.getTypeName());
  1471. return this;
  1472. }
  1473. @Override
  1474. public Object initValue(Object ignored) {
  1475. return ((SettableUnionObjectInspector) this.objectInspector).create();
  1476. }
  1477. @Override
  1478. public Object writeValue(ColumnVector column, int row)
  1479. throws HiveException {
  1480. final UnionColumnVector unionColumnVector = (UnionColumnVector) column;
  1481. final int tag = unionColumnVector.tags[row];
  1482. final SettableUnionObjectInspector unionOI =
  1483. (SettableUnionObjectInspector) this.objectInspector;
  1484. ObjectInspector fieldOI = unionOI.getObjectInspectors().get(tag);
  1485. ColumnVector fieldColVector = unionColumnVector.fields[tag];
  1486. final Object value =
  1487. vectorExtractRow.extractRowColumn(
  1488. fieldColVector, unionTypeInfo.getAllUnionObjectTypeInfos().get(tag), fieldOI, row);
  1489. if (value == null) {
  1490. return null;
  1491. }
  1492. unionOI.setFieldAndTag(obj, value, (byte) tag);
  1493. return obj;
  1494. }
  1495. @Override
  1496. public Object setValue(Object union, ColumnVector column, int row)
  1497. throws HiveException {
  1498. if (union == null) {
  1499. union = initValue(null);
  1500. }
  1501. final UnionColumnVector unionColumnVector = (UnionColumnVector) column;
  1502. final int tag = unionColumnVector.tags[row];
  1503. final SettableUnionObjectInspector unionOI =
  1504. (SettableUnionObjectInspector) this.objectInspector;
  1505. ObjectInspector fieldOI = unionOI.getObjectInspectors().get(tag);
  1506. ColumnVector fieldColVector = unionColumnVector.fields[tag];
  1507. final Object value =
  1508. vectorExtractRow.extractRowColumn(
  1509. fieldColVector, unionTypeInfo.getAllUnionObjectTypeInfos().get(tag), fieldOI, row);
  1510. if (value == null) {
  1511. return null;
  1512. }
  1513. unionOI.setFieldAndTag(union, value, (byte) tag);
  1514. return union;
  1515. }
  1516. }.init(fieldObjInspector);
  1517. }
  1518. // For complex types like STRUCT, MAP, etc we do not support, we need a writer that
  1519. // does nothing. We assume the Vectorizer class has not validated the query to actually
  1520. // try and use the complex types. They do show up in inputObjInspector[0] and need to be
  1521. // ignored.
  1522. private static VectorExpressionWriter genVectorExpressionWritableEmpty() {
  1523. return new VectorExpressionWriterBase() {
  1524. @Override
  1525. public Object writeValue(ColumnVector column, int row)
  1526. throws HiveException {
  1527. return null;
  1528. }
  1529. @Override
  1530. public Object setValue(Object row, ColumnVector column, int columnRow)
  1531. throws HiveException {
  1532. return null;
  1533. }
  1534. @Override
  1535. public Object initValue(Object ost) throws HiveException {
  1536. return null;
  1537. }
  1538. };
  1539. }
  1540. /**
  1541. * Helper function to create an array of writers from a list of expression descriptors.
  1542. */
  1543. public static VectorExpressionWriter[] getExpressionWriters(List<ExprNodeDesc> nodesDesc)
  1544. throws HiveException {
  1545. VectorExpressionWriter[] writers = new VectorExpressionWriter[nodesDesc.size()];
  1546. for(int i=0; i<writers.length; ++i) {
  1547. ExprNodeDesc nodeDesc = nodesDesc.get(i);
  1548. writers[i] = genVectorExpressionWritable(nodeDesc);
  1549. }
  1550. return writers;
  1551. }
  1552. /**
  1553. * Helper function to create an array of writers from a list of expression descriptors.
  1554. */
  1555. public static VectorExpressionWriter[] getExpressionWriters(VectorExpression[] vecExprs)
  1556. throws HiveException {
  1557. VectorExpressionWriter[] writers = new VectorExpressionWriter[vecExprs.length];
  1558. for(int i=0; i<writers.length; ++i) {
  1559. VectorExpression vecExpr = vecExprs[i];
  1560. writers[i] = genVectorExpressionWritable(vecExpr);
  1561. }
  1562. return writers;
  1563. }
  1564. /**
  1565. * A poor man Java closure. Works around the problem of having to return multiple objects
  1566. * from one function call.
  1567. */
  1568. public static interface SingleOIDClosure {
  1569. void assign(VectorExpressionWriter[] writers, ObjectInspector objectInspector);
  1570. }
  1571. public static interface ListOIDClosure {
  1572. void assign(VectorExpressionWriter[] writers, List<ObjectInspector> oids);
  1573. }
  1574. /**
  1575. * Creates the value writers for a column vector expression list.
  1576. * Creates an appropriate output object inspector.
  1577. */
  1578. public static void processVectorExpressions(
  1579. List<ExprNodeDesc> nodesDesc,
  1580. List<String> columnNames,
  1581. SingleOIDClosure closure)
  1582. throws HiveException {
  1583. VectorExpressionWriter[] writers = getExpressionWriters(nodesDesc);
  1584. List<ObjectInspector> oids = new ArrayList<ObjectInspector>(writers.length);
  1585. for(int i=0; i<writers.length; ++i) {
  1586. oids.add(writers[i].getObjectInspector());
  1587. }
  1588. ObjectInspector objectInspector = ObjectInspectorFactory.
  1589. getStandardStructObjectInspector(columnNames,oids);
  1590. closure.assign(writers, objectInspector);
  1591. }
  1592. /**
  1593. * Creates the value writers for a column vector expression list.
  1594. * Creates an appropriate output object inspector.
  1595. */
  1596. public static void processVectorExpressions(
  1597. List<ExprNodeDesc> nodesDesc,
  1598. ListOIDClosure closure)
  1599. throws HiveException {
  1600. VectorExpressionWriter[] writers = getExpressionWriters(nodesDesc);
  1601. List<ObjectInspector> oids = new ArrayList<ObjectInspector>(writers.length);
  1602. for(int i=0; i<writers.length; ++i) {
  1603. oids.add(writers[i].getObjectInspector());
  1604. }
  1605. closure.assign(writers, oids);
  1606. }
  1607. /**
  1608. * Creates the value writers for an struct object inspector.
  1609. * Creates an appropriate output object inspector.
  1610. */
  1611. public static void processVectorInspector(
  1612. StructObjectInspector structObjInspector,
  1613. SingleOIDClosure closure)
  1614. throws HiveException {
  1615. List<? extends StructField> fields = structObjInspector.getAllStructFieldRefs();
  1616. VectorExpressionWriter[] writers = new VectorExpressionWriter[fields.size()];
  1617. List<ObjectInspector> oids = new ArrayList<ObjectInspector>(writers.length);
  1618. ArrayList<String> columnNames = new ArrayList<String>();
  1619. int i = 0;
  1620. for(StructField field : fields) {
  1621. ObjectInspector fieldObjInsp = TypeInfoUtils.getStandardWritableObjectInspectorFromTypeInfo(
  1622. TypeInfoUtils.getTypeInfoFromObjectInspector(field.getFieldObjectInspector()));
  1623. writers[i] = VectorExpressionWriterFactory.
  1624. genVectorExpressionWritable(fieldObjInsp);
  1625. columnNames.add(field.getFieldName());
  1626. oids.add(writers[i].getObjectInspector());
  1627. i++;
  1628. }
  1629. ObjectInspector objectInspector = ObjectInspectorFactory.
  1630. getStandardStructObjectInspector(columnNames,oids);
  1631. closure.assign(writers, objectInspector);
  1632. }
  1633. /**
  1634. * Returns {@link VectorExpressionWriter} objects for the fields in the given
  1635. * object inspector.
  1636. *
  1637. * @param objInspector
  1638. * @return
  1639. * @throws HiveException
  1640. */
  1641. public static VectorExpressionWriter[] getExpressionWriters(StructObjectInspector objInspector)
  1642. throws HiveException {
  1643. if (objInspector.isSettable()) {
  1644. return getSettableExpressionWriters((SettableStructObjectInspector) objInspector);
  1645. }
  1646. List<? extends StructField> allFieldRefs = objInspector.getAllStructFieldRefs();
  1647. VectorExpressionWriter[] expressionWriters = new VectorExpressionWriter[allFieldRefs.size()];
  1648. for(int i=0; i<expressionWriters.length; ++i) {
  1649. expressionWriters[i] = genVectorExpressionWritable(allFieldRefs.get(i).getFieldObjectInspector());
  1650. }
  1651. return expressionWriters;
  1652. }
  1653. public static VectorExpressionWriter[] getSettableExpressionWriters(
  1654. SettableStructObjectInspector objInspector) throws HiveException {
  1655. List<? extends StructField> fieldsRef = objInspector.getAllStructFieldRefs();
  1656. VectorExpressionWriter[] writers = new VectorExpressionWriter[fieldsRef.size()];
  1657. for(int i=0; i<writers.length; ++i) {
  1658. StructField fieldRef = fieldsRef.get(i);
  1659. VectorExpressionWriter baseWriter = genVectorExpressionWritable(
  1660. fieldRef.getFieldObjectInspector());
  1661. writers[i] = genVectorExpressionWritable(objInspector, fieldRef, baseWriter);
  1662. }
  1663. return writers;
  1664. }
  1665. /**
  1666. * VectorExpressionWriterSetter helper for vector expression writers that use
  1667. * settable ObjectInspector fields to assign the values.
  1668. * This is used by the OrcStruct serialization (eg. CREATE TABLE ... AS ...)
  1669. */
  1670. private static class VectorExpressionWriterSetter extends VectorExpressionWriterBase {
  1671. private SettableStructObjectInspector settableObjInspector;
  1672. private StructField fieldRef;
  1673. private VectorExpressionWriter baseWriter;
  1674. public VectorExpressionWriterSetter init(
  1675. SettableStructObjectInspector objInspector,
  1676. StructField fieldRef,
  1677. VectorExpressionWriter baseWriter) {
  1678. this.fieldRef = fieldRef;
  1679. this.settableObjInspector = objInspector;
  1680. this.objectInspector = fieldRef.getFieldObjectInspector();
  1681. this.baseWriter = baseWriter;
  1682. return this;
  1683. }
  1684. @Override
  1685. public Object writeValue(ColumnVector column, int row)
  1686. throws HiveException {
  1687. return baseWriter.writeValue(column, row);
  1688. }
  1689. @Override
  1690. public Object setValue(Object row, ColumnVector column, int columnRow)
  1691. throws HiveException {
  1692. // NULLs are handled by each individual base writer setter
  1693. // We could handle NULLs centrally here but that would result in spurious allocs
  1694. Object fieldValue = this.settableObjInspector.getStructFieldData(row, fieldRef);
  1695. fieldValue = baseWriter.setValue(fieldValue, column, columnRow);
  1696. return this.settableObjInspector.setStructFieldData(row, fieldRef, fieldValue);
  1697. }
  1698. @Override
  1699. public Object initValue(Object struct) throws HiveException {
  1700. Object initValue = this.baseWriter.initValue(null);
  1701. this.settableObjInspector.setStructFieldData(struct, fieldRef, initValue);
  1702. return struct;
  1703. }
  1704. }
  1705. private static VectorExpressionWriter genVectorExpressionWritable(
  1706. SettableStructObjectInspector objInspector,
  1707. StructField fieldRef,
  1708. VectorExpressionWriter baseWriter) throws HiveException {
  1709. return new VectorExpressionWriterSetter().init(objInspector, fieldRef, baseWriter);
  1710. }
  1711. }