/* (c) 2014 LinkedIn Corp. All rights reserved.
*
* Licensed 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.
*/
package com.linkedin.cubert.operator;
import com.linkedin.cubert.block.Block;
import com.linkedin.cubert.block.BlockProperties;
import com.linkedin.cubert.block.BlockSchema;
import com.linkedin.cubert.block.PivotedBlock;
import com.linkedin.cubert.utils.TupleUtils;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import org.apache.pig.data.Tuple;
import org.apache.pig.data.TupleFactory;
import org.codehaus.jackson.JsonNode;
public class DistinctOperator implements TupleOperator
{
private PivotedBlock pivotedBlock;
private Tuple outputTuple;
private boolean hasMore = true;
// private TupleCopier tupleCopier;
@Override
public void setInput(Map<String, Block> input, JsonNode json, BlockProperties props)
throws IOException, InterruptedException
{
Block inputBlock = input.values().iterator().next();
BlockSchema schema = inputBlock.getProperties().getSchema();
pivotedBlock = new PivotedBlock(inputBlock, schema.getColumnNames());
// tupleCopier = new TupleCopier(schema);
// outputTuple = tupleCopier.newTuple();
outputTuple = TupleFactory.getInstance().newTuple(schema.getNumColumns());
}
@Override
public Tuple next()
throws IOException, InterruptedException
{
if (!hasMore)
{
return null;
}
Tuple tuple = pivotedBlock.next();
if (tuple == null)
{
return null;
}
// TODO: use copiers. For now using deep copy API. Will degenerate to copy if columns are shallow copiable.
// tupleCopier.copy(tuple, outputTuple);
TupleUtils.deepCopy(tuple, outputTuple);
while (pivotedBlock.next() != null)
{
// skip these tuples
}
hasMore = pivotedBlock.advancePivot();
return outputTuple;
}
@Override
public PostCondition getPostCondition(Map<String, PostCondition> preConditions, JsonNode json)
throws PreconditionException
{
PostCondition condition = preConditions.values().iterator().next();
String[] columns = condition.getSchema().getColumnNames();
if (condition.getSortKeys() == null || condition.getSortKeys().length != columns.length)
{
throw new PreconditionException(PreconditionExceptionType.INVALID_SORT_KEYS, String
.format("Columns=%s Sorted=%s", Arrays.toString(columns), Arrays.toString(condition.getSortKeys())));
}
return preConditions.values().iterator().next();
}
}