| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.hadoop.hive.ql.parse; |
| |
| import java.util.List; |
| |
| import org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator; |
| import org.apache.hadoop.hive.ql.exec.ExprNodeEvaluatorFactory; |
| import org.apache.hadoop.hive.ql.metadata.HiveException; |
| import org.apache.hadoop.hive.ql.plan.ExprNodeDesc; |
| import org.apache.hadoop.hive.ql.plan.ExprNodeGenericFuncDesc; |
| import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; |
| import org.apache.hadoop.hive.ql.udf.generic.GenericUDFLag; |
| import org.apache.hadoop.hive.ql.udf.generic.GenericUDFLead; |
| |
| /* |
| * When constructing the Evaluator Tree from an ExprNode Tree |
| * - look for any descendant LeadLag Function Expressions |
| * - if they are found: |
| * - add them to the LLInfo.leadLagExprs and |
| * - add a mapping from the Expr Tree root to the LLFunc Expr in LLInfo.mapTopExprToLLFunExprs |
| */ |
| public class WindowingExprNodeEvaluatorFactory { |
| |
| public static ExprNodeEvaluator get(LeadLagInfo llInfo, ExprNodeDesc desc) throws HiveException |
| { |
| FindLeadLagFuncExprs visitor = new FindLeadLagFuncExprs(llInfo, desc); |
| new ExprNodeWalker(visitor).walk(desc); |
| return ExprNodeEvaluatorFactory.get(desc); |
| } |
| |
| public static class FindLeadLagFuncExprs |
| { |
| ExprNodeDesc topExpr; |
| LeadLagInfo llInfo; |
| |
| FindLeadLagFuncExprs(LeadLagInfo llInfo, ExprNodeDesc topExpr) |
| { |
| this.llInfo = llInfo; |
| this.topExpr = topExpr; |
| } |
| |
| public void visit(ExprNodeGenericFuncDesc fnExpr) throws HiveException |
| { |
| GenericUDF fn = fnExpr.getGenericUDF(); |
| if (fn instanceof GenericUDFLead || fn instanceof GenericUDFLag ) |
| { |
| llInfo.addLLFuncExprForTopExpr(topExpr, fnExpr); |
| } |
| } |
| } |
| |
| static class ExprNodeWalker |
| { |
| FindLeadLagFuncExprs visitor; |
| |
| public ExprNodeWalker(FindLeadLagFuncExprs visitor) |
| { |
| super(); |
| this.visitor = visitor; |
| } |
| |
| public void walk(ExprNodeDesc e) throws HiveException |
| { |
| if ( e == null ) { |
| return; |
| } |
| List<ExprNodeDesc> children = e.getChildren(); |
| if ( children != null ) |
| { |
| for(ExprNodeDesc child : children) |
| { |
| walk(child); |
| } |
| } |
| |
| if ( e instanceof ExprNodeGenericFuncDesc) |
| { |
| visitor.visit((ExprNodeGenericFuncDesc)e); |
| } |
| } |
| } |
| } |