private void buildSelectListEvaluators() throws SemanticException, HiveException { resultExprInfo = new ResultExprInfo(); resultExprInfo.resultExprEvals = new ArrayList<ExprNodeEvaluator>(); resultExprInfo.resultExprNames = new ArrayList<String>(); resultExprInfo.resultExprNodes = new ArrayList<ExprNodeDesc>(); // result ArrayList<ObjectInspector> selectListExprOIs = new ArrayList<ObjectInspector>(); int i = 0; for (WindowExpressionSpec expr : selectSpec) { String selectColName = expr.getAlias(); ASTNode selectColumnNode = expr.getExpression(); ExprNodeDesc selectColumnExprNode = ResultExpressionParser.buildExprNode(selectColumnNode, selectListInputTypeCheckCtx); ExprNodeEvaluator selectColumnExprEval = ExprNodeEvaluatorFactory.get(selectColumnExprNode); ObjectInspector selectColumnOI = null; selectColumnOI = selectColumnExprEval.initialize(selectListInputOI); selectColName = getColumnName(selectColName, selectColumnExprNode, i); resultExprInfo.resultExprEvals.add(selectColumnExprEval); selectListExprOIs.add(selectColumnOI); resultExprInfo.resultExprNodes.add(selectColumnExprNode); resultExprInfo.resultExprNames.add(selectColName); i++; } resultExprInfo.resultOI = ObjectInspectorFactory.getStandardStructObjectInspector( resultExprInfo.resultExprNames, selectListExprOIs); }
/** * * * <ul> * <li>check structure of Arguments: * <ol> * <li>First arg should be a String * <li>then there should be an even number of Arguments: String, expression; expression * should be Convertible to Boolean. * <li>finally there should be a String. * </ol> * <li>convert pattern into a NNode chain. * <li>convert symbol args into a Symbol Map. * <li>parse selectList into SelectList struct. The inputOI used to translate these * expressions should be based on the columns in the Input, the 'path.attr' * </ul> */ @Override public void setupOutputOI() throws SemanticException { MatchPath evaluator = (MatchPath) getEvaluator(); PartitionedTableFunctionDef tDef = evaluator.getTableDef(); List<PTFExpressionDef> args = tDef.getArgs(); int argsNum = args == null ? 0 : args.size(); if (argsNum < 4) { throwErrorWithSignature("at least 4 arguments required"); } validateAndSetupPatternStr(evaluator, args); validateAndSetupSymbolInfo(evaluator, args, argsNum); validateAndSetupResultExprStr(evaluator, args, argsNum); setupSymbolFunctionChain(evaluator); /* * setup OI for input to resultExpr select list */ RowResolver selectListInputRR = MatchPath.createSelectListRR(evaluator, tDef.getInput()); /* * parse ResultExpr Str and setup OI. */ ResultExpressionParser resultExprParser = new ResultExpressionParser(evaluator.resultExprStr, selectListInputRR); try { resultExprParser.translate(); } catch (HiveException he) { throw new SemanticException(he); } evaluator.resultExprInfo = resultExprParser.getResultExprInfo(); StructObjectInspector OI = evaluator.resultExprInfo.resultOI; setOutputOI(OI); }