blob: e411bb4490d3707a73aea378eca30192bc058ae8 [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.backend.hadoop.executionengine.mapReduceLayer;
import java.util.ArrayList;
import java.util.List;
import org.apache.pig.backend.hadoop.executionengine.physicalLayer.expressionOperators.POProject;
// Representing one sort key. Sort key may be compound if we sort on multiple columns,
// if that is the case, then this sort key contains multiple ColumnChainInfo
public class ColumnChainInfo implements Cloneable {
private List<ColumnInfo> columnInfos = new ArrayList<ColumnInfo>();
public boolean equals(Object o2)
{
if (!(o2 instanceof ColumnChainInfo))
return false;
ColumnChainInfo c2 = (ColumnChainInfo)o2;
if (columnInfos.size()!=c2.columnInfos.size())
return false;
for (int i=0;i<columnInfos.size();i++)
{
if (!columnInfos.get(i).equals(c2.columnInfos.get(i)))
return false;
}
return true;
}
public void insert(List<Integer> columns, byte type)
{
ColumnInfo newColumnInfo = new ColumnInfo(columns, type);
columnInfos.add(newColumnInfo);
}
/**
* Insert new ColumnInfo for a project-star or project-range-to-end
* @param startCol
* @param type
*/
public void insert(int startCol, byte type)
{
ColumnInfo newColumnInfo = new ColumnInfo(startCol, type);
columnInfos.add(newColumnInfo);
}
// In reduce, the input#1 represent the first input, put 0 instead of 1, so
// that we can match the sort information collected from POLocalRearrange
public void insertInReduce(POProject project)
{
if (size()==0)
{
int col;
if(project.isProjectToEnd() || project.getColumns().size() != 1){
// expecting first project to be projecting one of the bags
// so getting here is unexpected.
// setting -1 as the column so that it secondary sort optimization
// will not get used
col = -1;
return;
}else{
col = project.getColumns().get(0) - 1;
}
List<Integer> newColumns = new ArrayList<Integer>();
newColumns.add(col);
ColumnInfo newColumnInfo = new ColumnInfo(newColumns, project.getResultType());
columnInfos.add(newColumnInfo);
}
else if (project.isProjectToEnd()){
insert(project.getStartCol(), project.getResultType());
}
else {
insert(project.getColumns(), project.getResultType());
}
}
public void insertColumnChainInfo(ColumnChainInfo columnChainInfo)
{
columnInfos.addAll(columnChainInfo.columnInfos);
}
public List<ColumnInfo> getColumnInfos()
{
return columnInfos;
}
public String toString() {
return columnInfos.toString();
}
@Override
public Object clone() throws CloneNotSupportedException {
super.clone();
ColumnChainInfo result = new ColumnChainInfo();
for (ColumnInfo columnInfo:columnInfos)
{
ColumnInfo newColumnInfo = (ColumnInfo) columnInfo.clone();
result.columnInfos.add(newColumnInfo);
}
return result;
}
public int size() {
return columnInfos.size();
}
public ColumnInfo getColumnInfo(int i) {
return columnInfos.get(i);
}
@Override
public int hashCode() {
int result = 0;
for (ColumnInfo columnInfo : columnInfos)
result+=columnInfo.hashCode();
return result;
}
}