Author: dvryaboy
Date: Thu May 20 17:33:06 2010
New Revision: 946722

URL: http://svn.apache.org/viewvc?rev=946722&view=rev
Log:
PIG-1420: Make CONCAT act on all fields of a tuple, instead of just the first 
two fields of a tuple (rjurney via dvryaboy)

Modified:
    hadoop/pig/trunk/CHANGES.txt
    hadoop/pig/trunk/src/org/apache/pig/builtin/CONCAT.java
    hadoop/pig/trunk/src/org/apache/pig/builtin/StringConcat.java
    hadoop/pig/trunk/src/org/apache/pig/data/DataByteArray.java
    hadoop/pig/trunk/test/org/apache/pig/test/TestBuiltin.java
    hadoop/pig/trunk/test/org/apache/pig/test/TestDataModel.java

Modified: hadoop/pig/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hadoop/pig/trunk/CHANGES.txt?rev=946722&r1=946721&r2=946722&view=diff
==============================================================================
--- hadoop/pig/trunk/CHANGES.txt (original)
+++ hadoop/pig/trunk/CHANGES.txt Thu May 20 17:33:06 2010
@@ -24,6 +24,8 @@ INCOMPATIBLE CHANGES
 
 IMPROVEMENTS
 
+PIG-1420: Make CONCAT act on all fields of a tuple, instead of just the first 
two fields of a tuple (rjurney via dvryaboy)
+
 PIG-1408: Annotate explain plans with aliases (rding)
 
 PIG-1410: Make PigServer can handle files with parameters (zjffdu)

Modified: hadoop/pig/trunk/src/org/apache/pig/builtin/CONCAT.java
URL: 
http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/builtin/CONCAT.java?rev=946722&r1=946721&r2=946722&view=diff
==============================================================================
--- hadoop/pig/trunk/src/org/apache/pig/builtin/CONCAT.java (original)
+++ hadoop/pig/trunk/src/org/apache/pig/builtin/CONCAT.java Thu May 20 17:33:06 
2010
@@ -40,30 +40,32 @@ public class CONCAT extends EvalFunc<Dat
     @Override
     public DataByteArray exec(Tuple input) throws IOException {
         try {
-            DataByteArray dba1 = (DataByteArray)input.get(0);
-            DataByteArray dba2 = (DataByteArray)input.get(1);
-            if(dba1 != null && dba2 != null) {
-                return new DataByteArray(dba1, dba2);
-            } else {
+            if (input == null || input.size() == 0)
                 return null;
+
+            DataByteArray db = new DataByteArray();
+            for (int i = 0; i < input.size(); i++) {
+                db.append((DataByteArray)(input.get(i)));
             }
+            return db;
         } catch (ExecException exp) {
             throw exp;
         } catch (Exception e) {
             int errCode = 2106;
             String msg = "Error while computing concat in " + 
this.getClass().getSimpleName();
-            throw new ExecException(msg, errCode, PigException.BUG, e);        
  
+            throw new ExecException(msg, errCode, PigException.BUG, e);
         }
     }
 
     @Override
     public Schema outputSchema(Schema input) {
-        return new Schema(new Schema.FieldSchema(null, DataType.BYTEARRAY)); 
+        return new Schema(new Schema.FieldSchema(null, DataType.BYTEARRAY));
     }
 
     /* (non-Javadoc)
      * @see org.apache.pig.EvalFunc#getArgToFuncMapping()
      */
+
     @Override
     public List<FuncSpec> getArgToFuncMapping() throws FrontendException {
         List<FuncSpec> funcList = new ArrayList<FuncSpec>();
@@ -76,5 +78,5 @@ public class CONCAT extends EvalFunc<Dat
         s.add(new Schema.FieldSchema(null, DataType.CHARARRAY));
         funcList.add(new FuncSpec(StringConcat.class.getName(), s));
         return funcList;
-    }    
+    }
 }

Modified: hadoop/pig/trunk/src/org/apache/pig/builtin/StringConcat.java
URL: 
http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/builtin/StringConcat.java?rev=946722&r1=946721&r2=946722&view=diff
==============================================================================
--- hadoop/pig/trunk/src/org/apache/pig/builtin/StringConcat.java (original)
+++ hadoop/pig/trunk/src/org/apache/pig/builtin/StringConcat.java Thu May 20 
17:33:06 2010
@@ -27,30 +27,27 @@ import org.apache.pig.impl.logicalLayer.
 
 
 /**
- * Generates the concatenation of the first two fields of a tuple.
+ * Generates the concatenation of all fields of a tuple.
  */
 public class StringConcat extends EvalFunc<String> {
 
     @Override
     public String exec(Tuple input) throws IOException {
-        try {
-            String s1 = (String)(input.get(0));
-            String s2 = (String)(input.get(1));
-            if(s1 != null && s2 != null)
-            {
-                StringBuilder sb = new StringBuilder();
-                sb.append(s1);
-                sb.append(s2);
-                return sb.toString();
-            } else {
-                return null;
-            } 
+        try{
+        if (input == null || input.size() == 0)
+          return null;
+
+          StringBuilder sb = new StringBuilder();
+          for (int i = 0; i < input.size(); i++){
+            sb.append(String.valueOf(input.get(i)));
+          }
+          return sb.toString();
         } catch (ExecException exp) {
             throw exp;
         } catch (Exception e) {
             int errCode = 2106;
             String msg = "Error while computing concat in " + 
this.getClass().getSimpleName();
-            throw new ExecException(msg, errCode, PigException.BUG, e);        
  
+            throw new ExecException(msg, errCode, PigException.BUG, e);
         }
     }
     

Modified: hadoop/pig/trunk/src/org/apache/pig/data/DataByteArray.java
URL: 
http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/data/DataByteArray.java?rev=946722&r1=946721&r2=946722&view=diff
==============================================================================
--- hadoop/pig/trunk/src/org/apache/pig/data/DataByteArray.java (original)
+++ hadoop/pig/trunk/src/org/apache/pig/data/DataByteArray.java Thu May 20 
17:33:06 2010
@@ -23,6 +23,7 @@ import java.io.UnsupportedEncodingExcept
 import java.lang.StringBuilder;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.nio.MappedByteBuffer;
 
 import org.apache.pig.classification.InterfaceAudience;
 import org.apache.pig.classification.InterfaceStability;
@@ -149,6 +150,33 @@ public class DataByteArray implements Co
     }
 
     /**
+     * Append given byte array to the internal byte array.
+     * @param b byte array who's contents to append.  The contents of the byte 
array are
+     * copied.
+     */
+    public void append(DataByteArray b) {
+
+        byte[] ba = (b == null) ?  null : b.get();
+        int mDataLength = (mData == null) ? 0 : mData.length;
+        int baLength = (ba == null) ? 0 : ba.length;
+        
+        int totalSize = mDataLength + baLength;
+        if(totalSize == 0) {
+            return;
+        }
+        byte[] oldData = mData == null ? new byte[0] : mData.clone();
+        mData = new byte[totalSize];
+        int i = 0;
+        for ( ;i < mDataLength; i++) {
+            mData[i] = oldData[i];
+        }
+
+        for (int j = 0; j < baLength; j++, i++) {
+            mData[i] = ba[j];
+        }
+    }
+
+    /**
      * Convert the byte array to a string.  UTF8 encoding will be assumed.
      */
     @Override

Modified: hadoop/pig/trunk/test/org/apache/pig/test/TestBuiltin.java
URL: 
http://svn.apache.org/viewvc/hadoop/pig/trunk/test/org/apache/pig/test/TestBuiltin.java?rev=946722&r1=946721&r2=946722&view=diff
==============================================================================
--- hadoop/pig/trunk/test/org/apache/pig/test/TestBuiltin.java (original)
+++ hadoop/pig/trunk/test/org/apache/pig/test/TestBuiltin.java Thu May 20 
17:33:06 2010
@@ -1202,6 +1202,57 @@ public class TestBuiltin {
     }
 
     @Test
+    public void testMultiCONCAT() throws Exception {
+
+        // DataByteArray concat
+        byte[] a = {1,2,3};
+        byte[] b = {4,5,6};
+        byte[] c = {7,8,9};
+        byte[] d = {10,11,12};
+        byte[] e = {13,14,15};
+        byte[] expected = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
+        DataByteArray dbaExpected = new DataByteArray(expected);
+
+        DataByteArray dbaA = new DataByteArray(a);
+        DataByteArray dbaB = new DataByteArray(b);
+        DataByteArray dbaC = new DataByteArray(c);
+        DataByteArray dbaD = new DataByteArray(d);
+        DataByteArray dbaE = new DataByteArray(e);
+
+        EvalFunc<DataByteArray> concat = new CONCAT();
+
+        Tuple t = TupleFactory.getInstance().newTuple(5);
+        t.set(0, dbaA);
+        t.set(1, dbaB);
+        t.set(2, dbaC);
+        t.set(3, dbaD);
+        t.set(4, dbaE);
+
+        DataByteArray result = concat.exec(t);
+        String msg = "[Testing CONCAT on >2 tuples for input type: bytearray]";
+        assertTrue(msg, result.equals(dbaExpected));
+
+        // String concat
+        String s1 = "high ";
+        String s2 = "fives ";
+        String s3 = "kick ";
+        String s4 = "ass ";
+        String s5 = "yo";
+        String exp = "high fives kick ass yo";
+        EvalFunc<String> sConcat = new StringConcat();
+        Tuple ts = TupleFactory.getInstance().newTuple(5);
+        ts.set(0, s1);
+        ts.set(1, s2);
+        ts.set(2, s3);
+        ts.set(3, s4);
+        ts.set(4, s5);
+        String res = sConcat.exec(ts);
+        msg = "[Testing StringConcat on >2 tuples input type: String]";
+        assertTrue(msg, res.equals(exp));
+
+    }
+
+    @Test
     public void testSIZE() throws Exception {
         
         // DataByteArray size

Modified: hadoop/pig/trunk/test/org/apache/pig/test/TestDataModel.java
URL: 
http://svn.apache.org/viewvc/hadoop/pig/trunk/test/org/apache/pig/test/TestDataModel.java?rev=946722&r1=946721&r2=946722&view=diff
==============================================================================
--- hadoop/pig/trunk/test/org/apache/pig/test/TestDataModel.java (original)
+++ hadoop/pig/trunk/test/org/apache/pig/test/TestDataModel.java Thu May 20 
17:33:06 2010
@@ -514,6 +514,15 @@ public class TestDataModel extends junit
     }
 
     @Test
+    public void testByteArrayAppend() throws Exception {
+       DataByteArray expected = new DataByteArray("hello world");
+        DataByteArray db1 = new DataByteArray("hello ");
+        DataByteArray db2 = new DataByteArray("world");
+        db1.append(db2);
+        assertTrue("appends as expected", db1.equals(expected));
+    }
+
+    @Test
     public void testMapConversionErr() throws Exception {
        List list = new ArrayList();
        try {


Reply via email to