package org.apache.pig.backend.stratosphere.executionengine.contractsLayer.stubs;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.pig.backend.stratosphere.executionengine.util.DataTypeUtils;
import eu.stratosphere.pact.common.stubs.Collector;
import eu.stratosphere.pact.common.type.PactRecord;
import eu.stratosphere.pact.common.type.base.PactInteger;
import eu.stratosphere.pact.common.type.base.PactString;
public class PigStubs {
public static class PigMapStub extends PigGenericMapStub
{
@Override
public void map(PactRecord record, Collector<PactRecord> collector)
{
if(pactOp != null){
try {
//convert record to a Pig Tuple
pactOp.attachInput(DataTypeUtils.recordToTuple(record));
runPipeline();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(outputRecord.getNumFields() > 0)
collector.collect(outputRecord);
}
}
public static class PigReduceStub extends PigGenericReduceStub
{
/*
* TODO: needs to package the list of PactRecords into a Pig Bag
* and call runPipeline() on some kind of package operator
*
* this one is a simple grouping
*
*/
@Override
public void reduce(Iterator<PactRecord> iter, Collector<PactRecord> collector)
throws Exception {
int numFields;
int keyPos;
PactRecord rec;
List<String> str = new ArrayList<String>();
if(pactOp != null){
keyPos = pactOp.getFirstKeyPosition();
PactRecord first = iter.next();
int firstNumFields = first.getNumFields();
outputRecord.setField(0, new PactString(first.getField(keyPos, PactString.class)));
for(int i=0; i < firstNumFields; i++){
if(i != keyPos) {
str.add(first.getField(i, PactString.class).toString());
}
}
while(iter.hasNext()){
rec = iter.next();
numFields = rec.getNumFields();
for(int i=0; i < numFields; i++) {
if(i != keyPos)
str.add(rec.getField(i, PactString.class).toString());
}
}
outputRecord.setNumFields(str.size());
for(int i=1; i<str.size()+1; i++) {
outputRecord.setField(i, new PactString(str.get(i-1)));
}
if(outputRecord.getNumFields() > 0)
collector.collect(outputRecord);
}
}
}
public static class PigMatchStub extends PigGenericMatchStub
{
@Override
public void match(PactRecord rec1, PactRecord rec2, Collector<PactRecord> collector)
throws Exception {
for (int i=0; i<rec1.getNumFields(); i++) {
outputRecord.setField(i, rec1.getField(i, PactString.class));
}
for (int j=rec1.getNumFields(); j<rec1.getNumFields()+rec2.getNumFields(); j++) {
outputRecord.setField(j, rec2.getField(j-rec1.getNumFields(), PactString.class));
}
collector.collect(outputRecord);
}
}
public static class PigCrossStub extends PigGenericCrossStub
{
@Override
public void cross(PactRecord rec1, PactRecord rec2, Collector<PactRecord> collector) {
for (int i=0; i<rec1.getNumFields(); i++) {
outputRecord.setField(i, rec1.getField(i, PactString.class));
}
for (int j=rec1.getNumFields(); j<rec1.getNumFields()+rec2.getNumFields(); j++) {
outputRecord.setField(j, rec2.getField(j-rec1.getNumFields(), PactString.class));
}
collector.collect(outputRecord);
}
}
public static class PigCoGroupStub extends PigGenericCoGroupStub
{
@Override
public void coGroup(Iterator<PactRecord> it1, Iterator<PactRecord> it2,
Collector<PactRecord> collector) {
}
}
}