/* * 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.test.utils.dotGraph; import org.apache.pig.impl.plan.OperatorKey; import org.apache.pig.impl.plan.OperatorPlan; import org.apache.pig.impl.plan.Operator; import java.util.Map; import java.util.Iterator; import java.util.HashMap; /*** * This matcher only does exact key matching */ public class ExactKeyMatcher implements NodeMatcher<Operator, OperatorPlan<Operator>> { public Map<OperatorKey, OperatorKey> match(OperatorPlan<Operator> plan1, OperatorPlan<Operator> plan2, StringBuilder messages) { // Find plan1.OperatorSet - plan2.OperatorSet int diff1 = diffKeys(plan1, plan2, messages, "plan2") ; // Find plan2.OperatorSet - plan1.OperatorSet int diff2 = diffKeys(plan2, plan1, messages, "plan1") ; // If there is a problem, just finish here if ( (diff1 != 0) || (diff2 != 0) ) { return null ; } // if no problem, we just return exact matching Iterator<Operator> iter = plan1.getKeys().values().iterator() ; Map<OperatorKey, OperatorKey> outputMap = new HashMap<OperatorKey, OperatorKey>() ; while(iter.hasNext()) { Operator op = iter.next() ; outputMap.put(op.getOperatorKey(), op.getOperatorKey()) ; } return outputMap; } /*** * Report plan1.OperatorSet - plan2.OperatorSet * * @param plan1 * @param plan2 * @param messages where the report messages go. null if no messages needed * @param plan2Name the name that is used to refer to plan2 in messages * @return */ private int diffKeys(OperatorPlan<Operator> plan1, OperatorPlan<Operator> plan2, StringBuilder messages, String plan2Name) { int count = 0 ; // prepare Map<OperatorKey, Operator> keyList = plan1.getKeys() ; Iterator<OperatorKey> iter = keyList.keySet().iterator() ; // go through the list of vertices of the first plan while(iter.hasNext()) { OperatorKey key = iter.next() ; // if the same key doesn't exist in the second plan // we've got a problem if (plan2.getOperator(key) == null) { Operator op1 = plan1.getOperator(key) ; if (messages != null) { messages.append(op1.getClass().getSimpleName()) ; appendOpKey(op1.getOperatorKey(), messages) ; messages.append(" doesn't exist") ; if (plan2Name != null) { messages.append(" in ") ; messages.append(plan2Name) ; messages.append("\n") ; } } // increment diff counter count++ ; } } return count ; } ////////////// String Formatting Helpers ////////////// protected void appendOpKey(OperatorKey operatorKey, StringBuilder sb) { sb.append("(") ; sb.append(operatorKey.toString()) ; sb.append(")") ; } }