/* * 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.physicalLayer.relationalOperators; import java.util.List; import org.apache.pig.backend.executionengine.ExecException; import org.apache.pig.backend.hadoop.executionengine.physicalLayer.POStatus; import org.apache.pig.backend.hadoop.executionengine.physicalLayer.PhysicalOperator; import org.apache.pig.backend.hadoop.executionengine.physicalLayer.Result; import org.apache.pig.data.DataType; import org.apache.pig.data.Tuple; import org.apache.pig.impl.plan.OperatorKey; /** * This operator is a variation of PODistinct, the input to this operator * must be sorted already. * */ public class POSortedDistinct extends PODistinct { /** * */ private static final long serialVersionUID = 1L; private transient Tuple lastTuple; public POSortedDistinct(OperatorKey k, int rp, List<PhysicalOperator> inp) { super(k, rp, inp); } public POSortedDistinct(OperatorKey k, int rp) { super(k, rp); } public POSortedDistinct(OperatorKey k, List<PhysicalOperator> inp) { super(k, inp); } public POSortedDistinct(OperatorKey k) { super(k); } public Result getNextTuple() throws ExecException { while(true) { Result in = processInput(); if (in.returnStatus == POStatus.STATUS_NULL) { continue; } if (in.returnStatus == POStatus.STATUS_OK) { if (lastTuple == null || !lastTuple.equals(in.result)) { lastTuple = (Tuple)in.result; return in; } else { continue; } } if (in.returnStatus == POStatus.STATUS_EOP) { if (!isAccumulative() || !isAccumStarted()) { lastTuple = null; } return in; } // if there is an error, just return return in; } } @Override public String name() { return getAliasString() + "POSortedDistinct" + "[" + DataType.findTypeName(resultType) + "]" + " - " + mKey.toString(); } }