/* * 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 org.apache.pig.PigException; import org.apache.pig.SortInfo; import org.apache.pig.impl.logicalLayer.FrontendException; import org.apache.pig.impl.plan.VisitorException; import org.apache.pig.newplan.DependencyOrderWalker; import org.apache.pig.newplan.Operator; import org.apache.pig.newplan.OperatorPlan; import org.apache.pig.newplan.logical.expression.ConstantExpression; import org.apache.pig.newplan.logical.expression.LogicalExpressionPlan; import org.apache.pig.newplan.logical.relational.LOLimit; import org.apache.pig.newplan.logical.relational.LOSort; import org.apache.pig.newplan.logical.relational.LOSplit; import org.apache.pig.newplan.logical.relational.LOSplitOutput; import org.apache.pig.newplan.logical.relational.LOStore; import org.apache.pig.newplan.logical.relational.LogicalRelationalNodesVisitor; public class SortInfoSetter extends LogicalRelationalNodesVisitor { public SortInfoSetter(OperatorPlan plan) throws FrontendException { super(plan, new DependencyOrderWalker(plan)); } @Override public void visit(LOStore store) throws FrontendException { Operator storePred = store.getPlan().getPredecessors(store).get(0); if(storePred == null){ int errCode = 2051; String msg = "Did not find a predecessor for Store." ; throw new VisitorException(store, msg, errCode, PigException.BUG); } SortInfo sortInfo = null; if(storePred instanceof LOLimit) { storePred = store.getPlan().getPredecessors(storePred).get(0); } else if (storePred instanceof LOSplitOutput) { LOSplitOutput splitOutput = (LOSplitOutput)storePred; // We assume this is the LOSplitOutput we injected for this case: // b = order a by $0; store b into '1'; store b into '2'; // In this case, we should mark both '1' and '2' as sorted LogicalExpressionPlan conditionPlan = splitOutput.getFilterPlan(); if (conditionPlan.getSinks().size()==1) { Operator root = conditionPlan.getSinks().get(0); if (root instanceof ConstantExpression) { Object value = ((ConstantExpression)root).getValue(); if (value instanceof Boolean && (Boolean)value==true) { Operator split = splitOutput.getPlan().getPredecessors(splitOutput).get(0); if (split instanceof LOSplit) storePred = store.getPlan().getPredecessors(split).get(0); } } } } // if this predecessor is a sort, get // the sort info. if( storePred instanceof LOSort ) { sortInfo = ((LOSort)storePred).getSortInfo(); } store.setSortInfo(sortInfo); } }