use of org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.PartitionedTableFunctionSpec in project hive by apache.
the class PTFTranslator method translatePTFChain.
private void translatePTFChain() throws SemanticException {
Deque<PTFInputSpec> ptfChain = new ArrayDeque<PTFInvocationSpec.PTFInputSpec>();
PTFInputSpec currentSpec = ptfInvocation.getFunction();
while (currentSpec != null) {
ptfChain.push(currentSpec);
currentSpec = currentSpec.getInput();
}
int inputNum = 0;
PTFInputDef currentDef = null;
while (!ptfChain.isEmpty()) {
currentSpec = ptfChain.pop();
if (currentSpec instanceof PTFQueryInputSpec) {
currentDef = translate((PTFQueryInputSpec) currentSpec, inputNum);
} else {
currentDef = translate((PartitionedTableFunctionSpec) currentSpec, currentDef, inputNum);
}
inputNum++;
}
ptfDesc.setFuncDef((PartitionedTableFunctionDef) currentDef);
}
use of org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.PartitionedTableFunctionSpec in project hive by apache.
the class PTFTranslator method componentize.
public static ArrayList<PTFInvocationSpec> componentize(PTFInvocationSpec ptfInvocation) throws SemanticException {
ArrayList<PTFInvocationSpec> componentInvocations = new ArrayList<PTFInvocationSpec>();
Stack<PTFInputSpec> ptfChain = new Stack<PTFInvocationSpec.PTFInputSpec>();
PTFInputSpec spec = ptfInvocation.getFunction();
while (spec instanceof PartitionedTableFunctionSpec) {
ptfChain.push(spec);
spec = spec.getInput();
}
PartitionedTableFunctionSpec prevFn = (PartitionedTableFunctionSpec) ptfChain.pop();
applyConstantPartition(prevFn);
PartitionSpec partSpec = prevFn.getPartition();
OrderSpec orderSpec = prevFn.getOrder();
if (partSpec == null) {
// oops this should have been caught before trying to componentize
throw new SemanticException("No Partitioning specification specified at start of a PTFChain");
}
if (orderSpec == null) {
orderSpec = new OrderSpec(partSpec);
prevFn.setOrder(orderSpec);
}
while (!ptfChain.isEmpty()) {
PartitionedTableFunctionSpec currentFn = (PartitionedTableFunctionSpec) ptfChain.pop();
String fnName = currentFn.getName();
if (!FunctionRegistry.isTableFunction(fnName)) {
throw new SemanticException(ErrorMsg.INVALID_FUNCTION.getMsg(fnName));
}
boolean transformsRawInput = FunctionRegistry.getTableFunctionResolver(fnName).transformsRawInput();
/*
* if the current table function has no partition info specified: inherit it from the PTF up
* the chain.
*/
if (currentFn.getPartition() == null) {
currentFn.setPartition(prevFn.getPartition());
if (currentFn.getOrder() == null) {
currentFn.setOrder(prevFn.getOrder());
}
}
/*
* If the current table function has no order info specified;
*/
if (currentFn.getOrder() == null) {
currentFn.setOrder(new OrderSpec(currentFn.getPartition()));
}
if (!currentFn.getPartition().equals(partSpec) || !currentFn.getOrder().equals(orderSpec) || transformsRawInput) {
PTFInvocationSpec component = new PTFInvocationSpec();
component.setFunction(prevFn);
componentInvocations.add(component);
PTFQueryInputSpec cQInSpec = new PTFQueryInputSpec();
cQInSpec.setType(PTFQueryInputType.PTFCOMPONENT);
currentFn.setInput(cQInSpec);
}
prevFn = currentFn;
partSpec = prevFn.getPartition();
orderSpec = prevFn.getOrder();
}
componentInvocations.add(ptfInvocation);
return componentInvocations;
}
use of org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.PartitionedTableFunctionSpec in project hive by apache.
the class SemanticAnalyzer method processPTFChain.
/*
* - tree form is
* ^(TOK_PTBLFUNCTION name alias? partitionTableFunctionSource partitioningSpec? arguments*)
* - a partitionTableFunctionSource can be a tableReference, a SubQuery or another
* PTF invocation.
*/
private PartitionedTableFunctionSpec processPTFChain(QB qb, ASTNode ptf) throws SemanticException {
int child_count = ptf.getChildCount();
if (child_count < 2) {
throw new SemanticException(generateErrorMessage(ptf, "Not enough Children " + child_count));
}
PartitionedTableFunctionSpec ptfSpec = new PartitionedTableFunctionSpec();
ptfSpec.setAstNode(ptf);
/*
* name
*/
ASTNode nameNode = (ASTNode) ptf.getChild(0);
ptfSpec.setName(nameNode.getText());
int inputIdx = 1;
/*
* alias
*/
ASTNode secondChild = (ASTNode) ptf.getChild(1);
if (secondChild.getType() == HiveParser.Identifier) {
ptfSpec.setAlias(secondChild.getText());
inputIdx++;
}
/*
* input
*/
ASTNode inputNode = (ASTNode) ptf.getChild(inputIdx);
ptfSpec.setInput(processPTFSource(qb, inputNode));
int argStartIdx = inputIdx + 1;
/*
* partitioning Spec
*/
int pSpecIdx = inputIdx + 1;
ASTNode pSpecNode = ptf.getChildCount() > inputIdx ? (ASTNode) ptf.getChild(pSpecIdx) : null;
if (pSpecNode != null && pSpecNode.getType() == HiveParser.TOK_PARTITIONINGSPEC) {
PartitioningSpec partitioning = processPTFPartitionSpec(pSpecNode);
ptfSpec.setPartitioning(partitioning);
argStartIdx++;
}
/*
* arguments
*/
for (int i = argStartIdx; i < ptf.getChildCount(); i++) {
ptfSpec.addArg((ASTNode) ptf.getChild(i));
}
return ptfSpec;
}
use of org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.PartitionedTableFunctionSpec in project hive by apache.
the class SemanticAnalyzer method processPTF.
/*
* - invoked during FROM AST tree processing, on encountering a PTF invocation.
* - tree form is
* ^(TOK_PTBLFUNCTION name partitionTableFunctionSource partitioningSpec? arguments*)
* - setup a PTFInvocationSpec for this top level PTF invocation.
*/
private void processPTF(QB qb, ASTNode ptf) throws SemanticException {
PartitionedTableFunctionSpec ptfSpec = processPTFChain(qb, ptf);
if (ptfSpec.getAlias() != null) {
qb.addAlias(ptfSpec.getAlias());
}
PTFInvocationSpec spec = new PTFInvocationSpec();
spec.setFunction(ptfSpec);
qb.addPTFNodeToSpec(ptf, spec);
}
Aggregations