org.apache.hadoop.hive.ql.parse.WindowingExprNodeEvaluatorFactory Maven / Gradle / Ivy
The newest version!
/**
* 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 children = e.getChildren();
if ( children != null )
{
for(ExprNodeDesc child : children)
{
walk(child);
}
}
if ( e instanceof ExprNodeGenericFuncDesc)
{
visitor.visit((ExprNodeGenericFuncDesc)e);
}
}
}
}