blob: ad7c4141d89347f68e0ada1d5fa36716ff343c80 [file] [log] [blame]
/*
* 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.pig.newplan.logical.relational;
import java.util.Map;
import org.apache.pig.data.DataType;
import org.apache.pig.impl.logicalLayer.FrontendException;
import org.apache.pig.newplan.Operator;
import org.apache.pig.newplan.OperatorPlan;
import org.apache.pig.newplan.PlanVisitor;
import org.apache.pig.newplan.logical.expression.LogicalExpressionPlan;
import org.apache.pig.newplan.logical.expression.ProjectExpression;
import org.apache.pig.newplan.logical.relational.LogicalSchema.LogicalFieldSchema;
import org.apache.pig.parser.SourceLocation;
/**
* Operator to map the data into the inner plan of LOForEach
* It can only be used in the inner plan of LOForEach
*
*/
public class LOInnerLoad extends LogicalRelationalOperator {
private ProjectExpression prj;
private LOForEach foreach;
private boolean sourceIsBag = false;
public LOInnerLoad(OperatorPlan plan, LOForEach foreach, int colNum) {
super("LOInnerLoad", plan);
// store column number as a ProjectExpression in a plan
// to be able to dynamically adjust column number during optimization
LogicalExpressionPlan exp = new LogicalExpressionPlan();
// we don't care about type, so set to -1
prj = new ProjectExpression(exp, 0, colNum, foreach);
this.foreach = foreach;
}
public LOInnerLoad(OperatorPlan plan, LOForEach foreach, String colAlias)
throws FrontendException {
super("LOInnerLoad", plan);
// store column number as a ProjectExpression in a plan
// to be able to dynamically adjust column number during optimization
LogicalExpressionPlan exp = new LogicalExpressionPlan();
this.prj = new ProjectExpression( exp, 0, colAlias, foreach );
this.foreach = foreach;
}
public LOInnerLoad(LogicalPlan plan, LOForEach foreach,
ProjectExpression projectExpression) {
super("LOInnerLoad", plan);
this.prj = projectExpression;
this.prj.setInputNum(0);
this.prj.setAttachedRelationalOp(foreach);
this.foreach = foreach;
}
@Override
public LogicalSchema getSchema() throws FrontendException {
if (schema!=null)
return schema;
if (prj.findReferent().getSchema()!=null && prj.getFieldSchema()!=null) {
if (prj.getFieldSchema().type==DataType.BAG) {
sourceIsBag = true;
alias = prj.getFieldSchema().alias;
if (prj.getFieldSchema().schema!=null) {
LogicalFieldSchema tupleSchema = prj.getFieldSchema().schema.getField(0);
if (tupleSchema!=null && tupleSchema.schema!=null) {
schema = new LogicalSchema();
for (int i=0;i<tupleSchema.schema.size();i++)
schema.addField(tupleSchema.schema.getField(i));
}
}
}
else {
schema = new LogicalSchema();
schema.addField(prj.getFieldSchema());
}
} else if (!prj.isRangeOrStarProject()) {
schema = new LogicalSchema();
schema.addField(new LogicalFieldSchema(null, null, DataType.BYTEARRAY));
}
return schema;
}
@Override
public void resetSchema(){
super.resetSchema();
prj.resetFieldSchema();
}
public ProjectExpression getProjection() {
return prj;
}
@Override
public boolean isEqual(Operator other) throws FrontendException {
if (!(other instanceof LOInnerLoad)) {
return false;
}
return (getColNum() == ((LOInnerLoad)other).getColNum());
}
@Override
public void accept(PlanVisitor v) throws FrontendException {
if (!(v instanceof LogicalRelationalNodesVisitor)) {
throw new FrontendException("Expected LogicalPlanVisitor", 2223);
}
((LogicalRelationalNodesVisitor)v).visit(this);
}
public int getColNum() {
return prj.getColNum();
}
/**
* Get the LOForEach operator that contains this operator as part of inner plan
* @return the LOForEach operator
*/
public LOForEach getLOForEach() {
return foreach;
}
public boolean sourceIsBag() {
return sourceIsBag;
}
public String toString() {
StringBuilder msg = new StringBuilder();
if (alias!=null) {
msg.append(alias + ": ");
}
msg.append("(Name: " + name);
msg.append("[");
if( getProjection().getColAlias() != null )
msg.append( getProjection().getColAlias() );
else if (getProjection().isProjectStar())
msg.append("*");
else if (getProjection().isRangeProject())
msg.append(getProjection().getStartCol())
.append(" .. ")
.append(getProjection().getEndCol());
else
msg.append(getProjection().getColNum());
msg.append("]");
msg.append(" Schema: ");
if (schema!=null)
msg.append(schema);
else
msg.append("null");
msg.append(")");
if (annotations!=null) {
for (Map.Entry<String, Object> entry : annotations.entrySet()) {
msg.append(entry);
}
}
return msg.toString();
}
@Override
public void setLocation(SourceLocation loc) {
super.setLocation( loc );
prj.setLocation( loc );
}
}