blob: c5d5151558482c475bee0e3edf5c6454c1074cfe [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.visitor;
import java.util.List;
import org.apache.pig.impl.logicalLayer.FrontendException;
import org.apache.pig.impl.util.Pair;
import org.apache.pig.newplan.Operator;
import org.apache.pig.newplan.logical.expression.LogicalExpressionPlan;
import org.apache.pig.newplan.logical.expression.ProjectExpression;
import org.apache.pig.newplan.logical.relational.LogicalRelationalOperator;
import org.apache.pig.newplan.logical.relational.LogicalSchema;
/**
* Util function(s) for project-(star/range) expansion
*/
public class ProjectStarExpanderUtil{
/**
* If the argument project is a project-star or project-range that
* can be expanded, find the position of first and last columns
* it should project
* @param expPlan
* @param proj
* @return pair that has the first and last columns that need to be projected
* @throws FrontendException
*/
static Pair<Integer, Integer> getProjectStartEndCols(
LogicalExpressionPlan expPlan, ProjectExpression proj)
throws FrontendException {
// get the input schema first
LogicalRelationalOperator relOp = proj.getAttachedRelationalOp();
// list of inputs of attached relation
List<Operator> inputRels = relOp.getPlan().getPredecessors(relOp);
//the relation that is input to this project
LogicalRelationalOperator inputRel =
(LogicalRelationalOperator) inputRels.get(proj.getInputNum());
LogicalSchema inputSchema = inputRel.getSchema();
if(inputSchema == null &&
(proj.isProjectStar() || (proj.isRangeProject() && proj.getEndCol() == -1))
){
// can't expand if input schema is null and it is a project-star
// or project-range-until-end
return null;
}
//find first and last column in input schema to be projected
int firstProjCol;
int lastProjCol;
//the range values are set in the project in LOInnerLoad
if(proj.isRangeProject()){
proj.setColumnNumberFromAlias();
firstProjCol = proj.getStartCol();
if(proj.getEndCol() >= 0)
lastProjCol = proj.getEndCol();
else
lastProjCol = inputSchema.size() - 1;
}else{
//project-star
firstProjCol = 0;
lastProjCol = inputSchema.size() - 1;
}
return new Pair<Integer, Integer>(firstProjCol, lastProjCol);
}
}