package com.mongodb.hadoop.pig.udf; import com.mongodb.hadoop.pig.udf.types.PigBoxedDBRef; import org.apache.pig.data.Tuple; import org.bson.types.ObjectId; import java.io.IOException; import java.util.Map; /** * Pig UDF that transforms the incoming value into a MongoDB DBRef. */ public class ToDBRef extends ByteArrayTypeEvalFunc<PigBoxedDBRef> { @Override public PigBoxedDBRef exec(final Tuple input) throws IOException { if (null == input || input.size() == 0) { return null; } Object o = input.get(0); if (o instanceof Map) { Object collectionName = ((Map) o).get("$ref"); Object id = ((Map) o).get("$id"); if (null == collectionName || null == id) { throw new IOException( "Map must contain both $ref and $id fields: " + o); } byte[] collectionNameBytes = ((String) collectionName).getBytes(); byte[] dbrefBytes = new byte[12 + 1 + collectionNameBytes.length]; byte[] oidBytes = new ObjectId((String) id).toByteArray(); System.arraycopy( collectionNameBytes, 0, dbrefBytes, 0, collectionNameBytes.length); dbrefBytes[collectionNameBytes.length] = 0; System.arraycopy( oidBytes, 0, dbrefBytes, collectionNameBytes.length + 1, 12); return new PigBoxedDBRef(dbrefBytes); } throw new IOException("Need a Map to build a DBRef, not " + o); } }