/* * 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.HashSet; import java.util.Set; import org.apache.pig.PigException; import org.apache.pig.impl.logicalLayer.FrontendException; import org.apache.pig.impl.plan.PlanValidationException; import org.apache.pig.newplan.DependencyOrderWalker; import org.apache.pig.newplan.OperatorPlan; import org.apache.pig.newplan.logical.relational.LOCogroup; import org.apache.pig.newplan.logical.relational.LOCross; import org.apache.pig.newplan.logical.relational.LODistinct; import org.apache.pig.newplan.logical.relational.LOFilter; import org.apache.pig.newplan.logical.relational.LOForEach; import org.apache.pig.newplan.logical.relational.LOGenerate; import org.apache.pig.newplan.logical.relational.LOInnerLoad; import org.apache.pig.newplan.logical.relational.LOJoin; import org.apache.pig.newplan.logical.relational.LOLimit; import org.apache.pig.newplan.logical.relational.LONative; import org.apache.pig.newplan.logical.relational.LORank; 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.LOStream; import org.apache.pig.newplan.logical.relational.LOUnion; import org.apache.pig.newplan.logical.relational.LogicalRelationalNodesVisitor; import org.apache.pig.newplan.logical.relational.LogicalRelationalOperator; import org.apache.pig.newplan.logical.relational.LogicalSchema; public class SchemaAliasVisitor extends LogicalRelationalNodesVisitor { public SchemaAliasVisitor(OperatorPlan plan) throws FrontendException { super(plan, new DependencyOrderWalker(plan)); } /*** * The logic here is to check if we have duplicate alias in each schema * @throws FrontendException */ protected void validate(LogicalRelationalOperator op) throws FrontendException { LogicalSchema schema = op.getSchema(); Set<String> seenAliases = new HashSet<String>(); if( schema != null){ for( int i = 0; i < schema.size(); i++){ if( schema.getField(i) != null && schema.getField(i).alias != null ){ String alias = schema.getField(i).alias; if(seenAliases.contains(alias)){ int errCode = 1108; String msg = "Duplicate schema alias: " + schema.getField( i ).alias; if( op.getAlias() != null ) msg = msg + " in \"" + op.getAlias() + "\""; throw new PlanValidationException( op, msg, errCode, PigException.INPUT ); } seenAliases.add(alias); } } } } @Override public void visit(LOStore store) throws FrontendException { validate( store ); } @Override public void visit(LOFilter filter) throws FrontendException { validate( filter ); } @Override public void visit(LOJoin join) throws FrontendException { validate( join ); } @Override public void visit(LOForEach foreach) throws FrontendException { new SchemaAliasVisitor( foreach.getInnerPlan() ).visit(); } @Override public void visit(LOGenerate gen) throws FrontendException { validate( gen ); } @Override public void visit(LOInnerLoad load) throws FrontendException { validate( load ); } @Override public void visit(LOCogroup group) throws FrontendException { validate( group ); } @Override public void visit(LOSplit split) throws FrontendException { validate( split ); } @Override public void visit(LOSplitOutput splitOutput) throws FrontendException { validate( splitOutput ); } @Override public void visit(LOUnion union) throws FrontendException { validate( union ); } @Override public void visit(LOSort sort) throws FrontendException { validate( sort ); } @Override public void visit(LORank rank) throws FrontendException { validate( rank ); } @Override public void visit(LODistinct distinct) throws FrontendException { validate( distinct ); } @Override public void visit(LOLimit limit) throws FrontendException { validate( limit ); } @Override public void visit(LOCross cross) throws FrontendException { validate( cross ); } @Override public void visit(LOStream stream) throws FrontendException { validate( stream ); } @Override public void visit(LONative nativeMR) throws FrontendException { validate( nativeMR ); } }