You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pig.apache.org by da...@apache.org on 2011/08/18 19:21:57 UTC

svn commit: r1159319 [1/2] - in /pig/trunk: ./ contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/storage/ contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/storage/hiverc/ contrib/zebra/src/java/org/apache/hadoop/zebra/schema/ s...

Author: daijy
Date: Thu Aug 18 17:21:55 2011
New Revision: 1159319

URL: http://svn.apache.org/viewvc?rev=1159319&view=rev
Log:
PIG-1429: Add Boolean Data Type to Pig (zjshen via daijy)

Added:
    pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/PigBooleanRawComparator.java
Modified:
    pig/trunk/CHANGES.txt
    pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/storage/SequenceFileLoader.java
    pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/storage/hiverc/HiveRCSchemaUtil.java
    pig/trunk/contrib/zebra/src/java/org/apache/hadoop/zebra/schema/SchemaParser.jjt
    pig/trunk/src/org/apache/pig/LoadCaster.java
    pig/trunk/src/org/apache/pig/PigWarning.java
    pig/trunk/src/org/apache/pig/StoreCaster.java
    pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/JobControlCompiler.java
    pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/partitioners/WeightedRangePartitioner.java
    pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/EqualToExpr.java
    pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/NotEqualToExpr.java
    pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/POCast.java
    pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/relationalOperators/POSort.java
    pig/trunk/src/org/apache/pig/backend/hadoop/hbase/HBaseBinaryConverter.java
    pig/trunk/src/org/apache/pig/backend/hadoop/hbase/HBaseStorage.java
    pig/trunk/src/org/apache/pig/builtin/BinStorage.java
    pig/trunk/src/org/apache/pig/builtin/TextLoader.java
    pig/trunk/src/org/apache/pig/builtin/Utf8StorageConverter.java
    pig/trunk/src/org/apache/pig/data/DataType.java
    pig/trunk/src/org/apache/pig/impl/logicalLayer/schema/Schema.java
    pig/trunk/src/org/apache/pig/impl/util/CastUtils.java
    pig/trunk/src/org/apache/pig/newplan/logical/relational/LogicalSchema.java
    pig/trunk/src/org/apache/pig/newplan/logical/visitor/TypeCheckingExpVisitor.java
    pig/trunk/src/org/apache/pig/parser/AliasMasker.g
    pig/trunk/src/org/apache/pig/parser/AstPrinter.g
    pig/trunk/src/org/apache/pig/parser/AstValidator.g
    pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g
    pig/trunk/src/org/apache/pig/parser/QueryLexer.g
    pig/trunk/src/org/apache/pig/parser/QueryParser.g
    pig/trunk/src/org/apache/pig/pen/AugmentBaseDataVisitor.java
    pig/trunk/test/e2e/pig/udfs/java/org/apache/pig/test/udf/evalfunc/TOBAG.java
    pig/trunk/test/e2e/pig/udfs/java/org/apache/pig/test/udf/evalfunc/VARBAG.java
    pig/trunk/test/e2e/pig/udfs/java/org/apache/pig/test/udf/storefunc/PigPerformanceLoader.java
    pig/trunk/test/findbugsExcludeFile.xml
    pig/trunk/test/org/apache/pig/test/TestConversions.java
    pig/trunk/test/org/apache/pig/test/TestEqualTo.java
    pig/trunk/test/org/apache/pig/test/TestNotEqualTo.java
    pig/trunk/test/org/apache/pig/test/TestOrderBy.java
    pig/trunk/test/org/apache/pig/test/TestPOBinCond.java
    pig/trunk/test/org/apache/pig/test/TestPOCast.java
    pig/trunk/test/org/apache/pig/test/TestProject.java
    pig/trunk/test/org/apache/pig/test/TestResourceSchema.java
    pig/trunk/test/org/apache/pig/test/TestStore.java
    pig/trunk/test/org/apache/pig/test/TestTextDataParser.java
    pig/trunk/test/org/apache/pig/test/TestTypeCheckingValidatorNewLP.java
    pig/trunk/test/org/apache/pig/test/utils/GenRandomData.java

Modified: pig/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/pig/trunk/CHANGES.txt?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/CHANGES.txt (original)
+++ pig/trunk/CHANGES.txt Thu Aug 18 17:21:55 2011
@@ -24,6 +24,8 @@ INCOMPATIBLE CHANGES
 
 IMPROVEMENTS
 
+PIG-1429: Add Boolean Data Type to Pig (zjshen via daijy)
+
 PIG-2218: Pig end-to-end tests should be accessible from top level build.xml (gates)
 
 PIG-2176: add logical plan assumption checker  (thejas)

Modified: pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/storage/SequenceFileLoader.java
URL: http://svn.apache.org/viewvc/pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/storage/SequenceFileLoader.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/storage/SequenceFileLoader.java (original)
+++ pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/storage/SequenceFileLoader.java Thu Aug 18 17:21:55 2011
@@ -104,6 +104,7 @@ public class SequenceFileLoader extends 
     switch(dataType) {
       case DataType.CHARARRAY: return ((Text) w).toString();
       case DataType.BYTEARRAY: return((DataByteArray) w).get();
+      case DataType.BOOLEAN: return ((BooleanWritable) w).get();
       case DataType.INTEGER: return ((IntWritable) w).get();
       case DataType.LONG: return ((LongWritable) w).get();
       case DataType.FLOAT: return ((FloatWritable) w).get();

Modified: pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/storage/hiverc/HiveRCSchemaUtil.java
URL: http://svn.apache.org/viewvc/pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/storage/hiverc/HiveRCSchemaUtil.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/storage/hiverc/HiveRCSchemaUtil.java (original)
+++ pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/storage/hiverc/HiveRCSchemaUtil.java Thu Aug 18 17:21:55 2011
@@ -195,7 +195,7 @@ public class HiveRCSchemaUtil {
 	else if (hiveType.equals("double"))
 	    return DataType.DOUBLE;
 	else if (hiveType.equals("boolean"))
-	    return DataType.INTEGER;
+	    return DataType.BOOLEAN;
 	else if (hiveType.equals("byte"))
 	    return DataType.INTEGER;
 	else if (hiveType.contains("array"))

Modified: pig/trunk/contrib/zebra/src/java/org/apache/hadoop/zebra/schema/SchemaParser.jjt
URL: http://svn.apache.org/viewvc/pig/trunk/contrib/zebra/src/java/org/apache/hadoop/zebra/schema/SchemaParser.jjt?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/contrib/zebra/src/java/org/apache/hadoop/zebra/schema/SchemaParser.jjt (original)
+++ pig/trunk/contrib/zebra/src/java/org/apache/hadoop/zebra/schema/SchemaParser.jjt Thu Aug 18 17:21:55 2011
@@ -53,7 +53,7 @@ SKIP : {
 }
 
 TOKEN : { <INT : "int"> }
-TOKEN : { <BOOL : "bool"> }
+TOKEN : { <BOOL : "boolean"> }
 TOKEN : { <LONG : "long"> }
 TOKEN : { <FLOAT : "float"> }
 TOKEN : { <DOUBLE : "double"> }

Modified: pig/trunk/src/org/apache/pig/LoadCaster.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/LoadCaster.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/LoadCaster.java (original)
+++ pig/trunk/src/org/apache/pig/LoadCaster.java Thu Aug 18 17:21:55 2011
@@ -38,6 +38,14 @@ import org.apache.pig.data.Tuple;
 public interface LoadCaster {
 
     /**
+     * Cast data from bytearray to boolean value.  
+     * @param b bytearray to be cast.
+     * @return Boolean value.
+     * @throws IOException if the value cannot be cast.
+     */
+    public Boolean bytesToBoolean(byte[] b) throws IOException;
+
+    /**
      * Cast data from bytearray to long value.  
      * @param b bytearray to be cast.
      * @return Long value.

Modified: pig/trunk/src/org/apache/pig/PigWarning.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/PigWarning.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/PigWarning.java (original)
+++ pig/trunk/src/org/apache/pig/PigWarning.java Thu Aug 18 17:21:55 2011
@@ -33,6 +33,7 @@ public enum PigWarning {
     IMPLICIT_CAST_TO_FLOAT,
     IMPLICIT_CAST_TO_INT,
     IMPLICIT_CAST_TO_LONG,
+    IMPLICIT_CAST_TO_BOOLEAN,
     IMPLICIT_CAST_TO_MAP,
     IMPLICIT_CAST_TO_TUPLE,
     TOO_LARGE_FOR_INT,

Modified: pig/trunk/src/org/apache/pig/StoreCaster.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/StoreCaster.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/StoreCaster.java (original)
+++ pig/trunk/src/org/apache/pig/StoreCaster.java Thu Aug 18 17:21:55 2011
@@ -43,6 +43,8 @@ public interface StoreCaster extends Loa
     public byte[] toBytes(Float f) throws IOException;
 
     public byte[] toBytes(Integer i) throws IOException;
+    
+    public byte[] toBytes(Boolean b) throws IOException;
 
     public byte[] toBytes(Long l) throws IOException;
 

Modified: pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/JobControlCompiler.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/JobControlCompiler.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/JobControlCompiler.java (original)
+++ pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/JobControlCompiler.java Thu Aug 18 17:21:55 2011
@@ -72,6 +72,7 @@ import org.apache.pig.data.TupleFactory;
 import org.apache.pig.impl.PigContext;
 import org.apache.pig.impl.io.FileLocalizer;
 import org.apache.pig.impl.io.FileSpec;
+import org.apache.pig.impl.io.NullableBooleanWritable;
 import org.apache.pig.impl.io.NullableBytesWritable;
 import org.apache.pig.impl.io.NullableDoubleWritable;
 import org.apache.pig.impl.io.NullableFloatWritable;
@@ -863,6 +864,12 @@ public class JobControlCompiler{
         }
     }
 
+    public static class PigBooleanWritableComparator extends PigWritableComparator {
+        public PigBooleanWritableComparator() {
+            super(NullableBooleanWritable.class);
+        }
+    }
+
     public static class PigIntWritableComparator extends PigWritableComparator {
         public PigIntWritableComparator() {
             super(NullableIntWritable.class);
@@ -913,6 +920,12 @@ public class JobControlCompiler{
     
     // XXX hadoop 20 new API integration: we need to explicitly set the Grouping 
     // Comparator
+    public static class PigGroupingBooleanWritableComparator extends WritableComparator {
+        public PigGroupingBooleanWritableComparator() {
+            super(NullableBooleanWritable.class, true);
+        }
+    }
+
     public static class PigGroupingIntWritableComparator extends WritableComparator {
         public PigGroupingIntWritableComparator() {
             super(NullableIntWritable.class, true);
@@ -992,6 +1005,10 @@ public class JobControlCompiler{
         }
         if (hasOrderBy) {
             switch (keyType) {
+            case DataType.BOOLEAN:
+                job.setSortComparatorClass(PigBooleanRawComparator.class);
+                break;
+
             case DataType.INTEGER:            	
                 job.setSortComparatorClass(PigIntRawComparator.class);               
                 break;
@@ -1037,6 +1054,11 @@ public class JobControlCompiler{
         }
 
         switch (keyType) {
+        case DataType.BOOLEAN:
+            job.setSortComparatorClass(PigBooleanWritableComparator.class);
+            job.setGroupingComparatorClass(PigGroupingBooleanWritableComparator.class);
+            break;
+
         case DataType.INTEGER:
             job.setSortComparatorClass(PigIntWritableComparator.class);
             job.setGroupingComparatorClass(PigGroupingIntWritableComparator.class);

Added: pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/PigBooleanRawComparator.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/PigBooleanRawComparator.java?rev=1159319&view=auto
==============================================================================
--- pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/PigBooleanRawComparator.java (added)
+++ pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/PigBooleanRawComparator.java Thu Aug 18 17:21:55 2011
@@ -0,0 +1,108 @@
+/*
+ * 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.mapReduceLayer;
+
+import java.io.IOException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configurable;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.io.BooleanWritable;
+import org.apache.hadoop.io.WritableComparator;
+import org.apache.hadoop.mapred.JobConf;
+import org.apache.pig.impl.io.NullableBooleanWritable;
+import org.apache.pig.impl.util.ObjectSerializer;
+
+public class PigBooleanRawComparator extends WritableComparator implements Configurable {
+
+    private final Log mLog = LogFactory.getLog(getClass());
+    private boolean[] mAsc;
+    private BooleanWritable.Comparator mWrappedComp;
+
+    public PigBooleanRawComparator() {
+        super(NullableBooleanWritable.class);
+        mWrappedComp = new BooleanWritable.Comparator();
+    }
+    public void setConf(Configuration conf) {
+        if (!(conf instanceof JobConf)) {
+            mLog.warn("Expected jobconf in setConf, got " +
+                conf.getClass().getName());
+            return;
+        }
+        JobConf jconf = (JobConf)conf;
+        try {
+            mAsc = (boolean[])ObjectSerializer.deserialize(jconf.get(
+                "pig.sortOrder"));
+        } catch (IOException ioe) {
+            mLog.error("Unable to deserialize pig.sortOrder " +
+                ioe.getMessage());
+            throw new RuntimeException(ioe);
+        }
+        if (mAsc == null) {
+            mAsc = new boolean[1];
+            mAsc[0] = true;
+        }
+    }
+
+    public Configuration getConf() {
+        return null;
+    }
+
+    /**
+     * Compare two NullableIntWritables as raw bytes.  If neither are null,
+     * then BooleanWritable.compare() is used.  If both are null then the indices
+     * are compared.  Otherwise the null one is defined to be less.
+     */
+    public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
+        int rc = 0;
+
+        // If either are null, handle differently.
+        if (b1[s1] == 0 && b2[s2] == 0) {
+            byte byte1 = b1[s1 + 1];
+            byte byte2 = b2[s2 + 1];
+            rc = (byte1 < byte2) ? -1 : ((byte1 > byte2) ? 1 : 0); 
+        } else {
+            // For sorting purposes two nulls are equal.
+            if (b1[s1] != 0 && b2[s2] != 0) rc = 0;
+            else if (b1[s1] != 0) rc = -1;
+            else rc = 1;
+        }
+        if (!mAsc[0]) rc *= -1;
+        return rc;
+    }
+
+    public int compare(Object o1, Object o2) {
+        NullableBooleanWritable nbw1 = (NullableBooleanWritable)o1;
+        NullableBooleanWritable nbw2 = (NullableBooleanWritable)o2;
+        int rc = 0;
+
+        // If either are null, handle differently.
+        if (!nbw1.isNull() && !nbw2.isNull()) {
+            rc = ((Boolean)nbw1.getValueAsPigType()).compareTo((Boolean)nbw2.getValueAsPigType());
+        } else {
+            // For sorting purposes two nulls are equal.
+            if (nbw1.isNull() && nbw2.isNull()) rc = 0;
+            else if (nbw1.isNull()) rc = -1;
+            else rc = 1;
+        }
+        if (!mAsc[0]) rc *= -1;
+        return rc;
+    }
+
+}

Modified: pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/partitioners/WeightedRangePartitioner.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/partitioners/WeightedRangePartitioner.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/partitioners/WeightedRangePartitioner.java (original)
+++ pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/mapReduceLayer/partitioners/WeightedRangePartitioner.java Thu Aug 18 17:21:55 2011
@@ -41,6 +41,7 @@ import org.apache.pig.data.InternalMap;
 import org.apache.pig.data.Tuple;
 import org.apache.pig.impl.PigContext;
 import org.apache.pig.impl.builtin.FindQuantiles;
+import org.apache.pig.impl.io.NullableBooleanWritable;
 import org.apache.pig.impl.io.NullableBytesWritable;
 import org.apache.pig.impl.io.NullableDoubleWritable;
 import org.apache.pig.impl.io.NullableFloatWritable;
@@ -204,6 +205,8 @@ public class WeightedRangePartitioner ex
             quantiles = quantilesList.toArray(new NullableDoubleWritable[0]);
         } else if (quantilesList.get(0).getClass().equals(NullableFloatWritable.class)) {
             quantiles = quantilesList.toArray(new NullableFloatWritable[0]);
+        } else if (quantilesList.get(0).getClass().equals(NullableBooleanWritable.class)) {
+            quantiles = quantilesList.toArray(new NullableBooleanWritable[0]);
         } else if (quantilesList.get(0).getClass().equals(NullableIntWritable.class)) {
             quantiles = quantilesList.toArray(new NullableIntWritable[0]);
         } else if (quantilesList.get(0).getClass().equals(NullableLongWritable.class)) {

Modified: pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/EqualToExpr.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/EqualToExpr.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/EqualToExpr.java (original)
+++ pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/EqualToExpr.java Thu Aug 18 17:21:55 2011
@@ -67,6 +67,7 @@ public class EqualToExpr extends BinaryC
         case DataType.BYTEARRAY:
         case DataType.DOUBLE:
         case DataType.FLOAT:
+        case DataType.BOOLEAN:
         case DataType.INTEGER:
         case DataType.LONG:
         case DataType.CHARARRAY:

Modified: pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/NotEqualToExpr.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/NotEqualToExpr.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/NotEqualToExpr.java (original)
+++ pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/NotEqualToExpr.java Thu Aug 18 17:21:55 2011
@@ -67,6 +67,7 @@ public class NotEqualToExpr extends Bina
         case DataType.BYTEARRAY:
         case DataType.DOUBLE:
         case DataType.FLOAT:
+        case DataType.BOOLEAN:
         case DataType.INTEGER:
         case DataType.LONG:
         case DataType.CHARARRAY:

Modified: pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/POCast.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/POCast.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/POCast.java (original)
+++ pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/expressionOperators/POCast.java Thu Aug 18 17:21:55 2011
@@ -119,6 +119,122 @@ public class POCast extends ExpressionOp
     }
 
     @Override
+    public Result getNext(Boolean b) throws ExecException {
+        PhysicalOperator in = inputs.get(0);
+        Byte resultType = in.getResultType();
+        switch (resultType) {
+        case DataType.BAG: {
+            Result res = new Result();
+            res.returnStatus = POStatus.STATUS_ERR;
+            return res;
+        }
+
+        case DataType.TUPLE: {
+            Result res = new Result();
+            res.returnStatus = POStatus.STATUS_ERR;
+            return res;
+        }
+
+        case DataType.MAP: {
+            Result res = new Result();
+            res.returnStatus = POStatus.STATUS_ERR;
+            return res;
+        }
+        
+        case DataType.BYTEARRAY: {
+            DataByteArray dba = null;
+            Result res = in.getNext(dba);
+            if (res.returnStatus == POStatus.STATUS_OK && res.result != null) {
+                try {
+                    dba = (DataByteArray) res.result;
+                } catch (ClassCastException e) {
+                    // res.result is not of type ByteArray. But it can be one of the types from which cast is still possible.
+                    if (realType == null)
+                        // Find the type and cache it.
+                        realType = DataType.findType(res.result);
+                    try {
+                        res.result = DataType.toBoolean(res.result, realType);
+                    } catch (ClassCastException cce) {
+                        // Type has changed. Need to find type again and try casting it again.
+                        realType = DataType.findType(res.result);
+                        res.result = DataType.toBoolean(res.result, realType);
+                    }
+                    return res;
+                }
+                try {
+                    if (null != caster) {
+                        res.result = caster.bytesToBoolean(dba.get());
+                    } else {
+                        int errCode = 1075;
+                        String msg = "Received a bytearray from the UDF. Cannot determine how to convert the bytearray to boolean.";
+                        throw new ExecException(msg, errCode, PigException.INPUT);
+                    }
+                } catch (ExecException ee) {
+                    throw ee;
+                } catch (IOException e) {
+                    log.error("Error while casting from ByteArray to Boolean");
+                }
+            }
+            return res;
+        }
+
+        case DataType.CHARARRAY: {
+            String str = null;
+            Result res = in.getNext(str);
+            if (res.returnStatus == POStatus.STATUS_OK && res.result != null) {
+                res.result = CastUtils.stringToBoolean((String)res.result);
+            }
+            return res;
+        }
+        
+        case DataType.BOOLEAN: {
+            Result res = in.getNext(b);
+            return res;
+        }
+        
+        case DataType.INTEGER: {
+            Integer i = null;
+            Result res = in.getNext(i);
+            if (res.returnStatus == POStatus.STATUS_OK && res.result != null) {
+                res.result = Boolean.valueOf(((Integer) res.result).intValue() != 0);
+            }
+            return res;
+        }
+
+        case DataType.LONG: {
+            Long l = null;
+            Result res = in.getNext(l);
+            if (res.returnStatus == POStatus.STATUS_OK && res.result != null) {
+                res.result = Boolean.valueOf(((Long) res.result).longValue() != 0L);
+            }
+            return res;
+        }
+
+        case DataType.FLOAT: {
+            Float f = null;
+            Result res = in.getNext(f);
+            if (res.returnStatus == POStatus.STATUS_OK && res.result != null) {
+                res.result = Boolean.valueOf(((Float) res.result).floatValue() != 0.0F);
+            }
+            return res;
+        }
+
+        case DataType.DOUBLE: {
+            Double d = null;
+            Result res = in.getNext(d);
+            if (res.returnStatus == POStatus.STATUS_OK && res.result != null) {
+                res.result = Boolean.valueOf(((Double) res.result).doubleValue() != 0.0);
+            }
+            return res;
+        }
+        }
+        
+        Result res = new Result();
+        res.returnStatus = POStatus.STATUS_ERR;
+        return res;
+    }
+
+    @Override
     public Result getNext(Integer i) throws ExecException {
         PhysicalOperator in = inputs.get(0);
         Byte resultType = in.getResultType();
@@ -671,9 +787,11 @@ public class POCast extends ExpressionOp
             Result res = in.getNext(b);
             if (res.returnStatus == POStatus.STATUS_OK && res.result != null) {
                 if (((Boolean) res.result) == true)
-                    res.result = "1";
+                    //res.result = "1";
+                    res.result = Boolean.TRUE.toString();
                 else
-                    res.result = "0";
+                    //res.result = "0";
+                    res.result = Boolean.FALSE.toString();
             }
             return res;
         }
@@ -925,6 +1043,39 @@ public class POCast extends ExpressionOp
                 throw new ExecException("Cannot cast " + obj + " to map.", 1120, PigException.INPUT);
             }
             break;
+        case DataType.BOOLEAN:
+            switch (DataType.findType(obj)) {
+            case DataType.BYTEARRAY:
+                if (null != caster) {
+                    result = caster.bytesToBoolean(((DataByteArray) obj).get());
+                } else {
+                    int errCode = 1075;
+                    String msg = "Received a bytearray from the UDF. Cannot determine how to convert the bytearray to int.";
+                    throw new ExecException(msg, errCode, PigException.INPUT);
+                }
+                break;
+            case DataType.BOOLEAN:
+                result = obj;
+                break;
+            case DataType.INTEGER:
+                result = Boolean.valueOf(((Integer) obj).intValue() != 0);;
+                break;
+            case DataType.DOUBLE:
+                result = Boolean.valueOf(((Double) obj).doubleValue() != 0.0D);
+                break;
+            case DataType.LONG:
+                result = Boolean.valueOf(((Long) obj).longValue() != 0L);
+                break;
+            case DataType.FLOAT:
+                result = Boolean.valueOf(((Float) obj).floatValue() != 0.0F);
+                break;
+            case DataType.CHARARRAY:
+                result = CastUtils.stringToBoolean((String)obj);
+                break;
+            default:
+                throw new ExecException("Cannot convert "+ obj + " to " + fs, 1120, PigException.INPUT);
+            }
+            break;
         case DataType.INTEGER:
             switch (DataType.findType(obj)) {
             case DataType.BYTEARRAY:
@@ -1082,9 +1233,11 @@ public class POCast extends ExpressionOp
                 break;
             case DataType.BOOLEAN:
                 if (((Boolean) obj) == true)
-                    result = "1";
+                    //result = "1";
+                    result = Boolean.TRUE.toString();
                 else
-                    result = "0";
+                    //result = "0";
+                    result = Boolean.FALSE.toString();
                 break;
             case DataType.INTEGER:
                 result = ((Integer) obj).toString();

Modified: pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/relationalOperators/POSort.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/relationalOperators/POSort.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/relationalOperators/POSort.java (original)
+++ pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/relationalOperators/POSort.java Thu Aug 18 17:21:55 2011
@@ -189,6 +189,7 @@ public class POSort extends PhysicalOper
             case DataType.CHARARRAY:
             case DataType.DOUBLE:
             case DataType.FLOAT:
+            case DataType.BOOLEAN:
             case DataType.INTEGER:
             case DataType.LONG:
             case DataType.TUPLE:

Modified: pig/trunk/src/org/apache/pig/backend/hadoop/hbase/HBaseBinaryConverter.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/backend/hadoop/hbase/HBaseBinaryConverter.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/backend/hadoop/hbase/HBaseBinaryConverter.java (original)
+++ pig/trunk/src/org/apache/pig/backend/hadoop/hbase/HBaseBinaryConverter.java Thu Aug 18 17:21:55 2011
@@ -72,6 +72,15 @@ public class HBaseBinaryConverter implem
     }
 
     @Override
+    public Boolean bytesToBoolean(byte[] b) throws IOException {
+        if (Bytes.SIZEOF_BOOLEAN > b.length) {
+            return Bytes.toBoolean(Bytes.padHead(b, Bytes.SIZEOF_BOOLEAN - b.length));
+        } else {
+            return Bytes.toBoolean(Bytes.head(b, Bytes.SIZEOF_BOOLEAN));
+        }
+    }
+
+    @Override
     public Map<String, Object> bytesToMap(byte[] b) throws IOException {
         return bytesToMap(b, null);
     }
@@ -132,6 +141,11 @@ public class HBaseBinaryConverter implem
         return Bytes.toBytes(l);
     }
 
+    @Override
+    public byte[] toBytes(Boolean b) throws IOException {
+        return Bytes.toBytes(b);
+    }
+
     /**
      * NOT IMPLEMENTED
      */

Modified: pig/trunk/src/org/apache/pig/backend/hadoop/hbase/HBaseStorage.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/backend/hadoop/hbase/HBaseStorage.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/backend/hadoop/hbase/HBaseStorage.java (original)
+++ pig/trunk/src/org/apache/pig/backend/hadoop/hbase/HBaseStorage.java Thu Aug 18 17:21:55 2011
@@ -717,6 +717,7 @@ public class HBaseStorage extends LoadFu
         case DataType.FLOAT: return caster.toBytes((Float) o);
         case DataType.INTEGER: return caster.toBytes((Integer) o);
         case DataType.LONG: return caster.toBytes((Long) o);
+        case DataType.BOOLEAN: return caster.toBytes((Boolean) o);
         
         // The type conversion here is unchecked. 
         // Relying on DataType.findType to do the right thing.

Modified: pig/trunk/src/org/apache/pig/builtin/BinStorage.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/builtin/BinStorage.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/builtin/BinStorage.java (original)
+++ pig/trunk/src/org/apache/pig/builtin/BinStorage.java Thu Aug 18 17:21:55 2011
@@ -110,6 +110,11 @@ implements StoreFuncInterface, LoadMetad
         }
 
         @Override
+        public Boolean bytesToBoolean(byte[] b) throws IOException {
+            throw new ExecException(unImplementedErrorMessage, 1118);
+        }
+
+        @Override
         public Map<String, Object> bytesToMap(byte[] b) throws IOException {
             return bytesToMap(b, null);
         }
@@ -243,6 +248,19 @@ implements StoreFuncInterface, LoadMetad
         }
         return baos.toByteArray();
     }
+    
+    public byte[] toBytes(Boolean b) throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        DataOutputStream dos = new DataOutputStream(baos);
+        try {
+            DataReaderWriter.writeDatum(dos, b);
+        } catch (Exception ee) {
+            int errCode = 2105;
+            String msg = "Error while converting boolean to bytes.";
+            throw new ExecException(msg, errCode, PigException.BUG, ee);
+        }
+        return baos.toByteArray();
+    }
 
     public byte[] toBytes(Map<String, Object> m) throws IOException {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();

Modified: pig/trunk/src/org/apache/pig/builtin/TextLoader.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/builtin/TextLoader.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/builtin/TextLoader.java (original)
+++ pig/trunk/src/org/apache/pig/builtin/TextLoader.java Thu Aug 18 17:21:55 2011
@@ -65,7 +65,18 @@ public class TextLoader extends LoadFunc
             throw new IOException("Error getting input");
         }
     }
-    
+
+    /**
+     * TextLoader does not support conversion to Boolean
+     * @throws IOException if the value cannot be cast.
+     */
+    @Override
+    public Boolean bytesToBoolean(byte[] b) throws IOException {
+        int errCode = 2109;
+        String msg = "TextLoader does not support conversion to Boolean.";
+        throw new ExecException(msg, errCode, PigException.BUG);
+    }
+
     /**
      * TextLoader does not support conversion to Integer
      * @throws IOException if the value cannot be cast.
@@ -180,6 +191,12 @@ public class TextLoader extends LoadFunc
         throw new ExecException(msg, errCode, PigException.BUG);
     }
 
+    public byte[] toBytes(Boolean b) throws IOException {
+        int errCode = 2109;
+        String msg = "TextLoader does not support conversion from Boolean.";
+        throw new ExecException(msg, errCode, PigException.BUG);
+    }
+
     public byte[] toBytes(Integer i) throws IOException {
         int errCode = 2109;
         String msg = "TextLoader does not support conversion from Integer.";

Modified: pig/trunk/src/org/apache/pig/builtin/Utf8StorageConverter.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/builtin/Utf8StorageConverter.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/builtin/Utf8StorageConverter.java (original)
+++ pig/trunk/src/org/apache/pig/builtin/Utf8StorageConverter.java Thu Aug 18 17:21:55 2011
@@ -378,17 +378,19 @@ public class Utf8StorageConverter implem
         }
     }
     
-    /**
-     * Note: NOT part of the LoadCaster interface.
-     * @param b
-     * @return boolean value represented by the byte array
-     * @throws IOException
-     */
+
+    @Override
     public Boolean bytesToBoolean(byte[] b) throws IOException {
         if(b == null)
             return null;
         String s = new String(b);
-        return Boolean.valueOf(s);
+        if (s.equalsIgnoreCase("true")) {
+            return Boolean.TRUE;
+        } else if (s.equalsIgnoreCase("false")) {
+            return Boolean.FALSE;
+        } else {
+            return null;
+        }
     }
 
     @Override
@@ -540,6 +542,11 @@ public class Utf8StorageConverter implem
     }
 
     @Override
+    public byte[] toBytes(Boolean b) throws IOException {
+        return b.toString().getBytes();
+    }
+
+    @Override
     public byte[] toBytes(Map<String, Object> m) throws IOException {
         return DataType.mapToString(m).getBytes();
     }

Modified: pig/trunk/src/org/apache/pig/data/DataType.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/data/DataType.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/data/DataType.java (original)
+++ pig/trunk/src/org/apache/pig/data/DataType.java Thu Aug 18 17:21:55 2011
@@ -41,7 +41,7 @@ import org.apache.pig.impl.logicalLayer.
 
 /**
  * A class of static final values used to encode data type and a number of
- * static helper funcitons for manipulating data objects.  The data type
+ * static helper functions for manipulating data objects.  The data type
  * values could be
  * done as an enumeration, but it is done as byte codes instead to save
  * creating objects.
@@ -57,7 +57,7 @@ public class DataType {
     // values or creating order issues.
     public static final byte UNKNOWN   =   0;
     public static final byte NULL      =   1;
-    public static final byte BOOLEAN   =   5; // internal use only
+    public static final byte BOOLEAN   =   5;
     public static final byte BYTE      =   6; // internal use only
     public static final byte INTEGER   =  10;
     public static final byte LONG      =  15;
@@ -493,7 +493,8 @@ public class DataType {
     public static byte[] toBytes(Object o, byte type) throws ExecException {
         switch (type) {
         case BOOLEAN:
-            return ((Boolean) o).booleanValue() ? new byte[] {1} : new byte[] {0};
+            //return ((Boolean) o).booleanValue() ? new byte[] {1} : new byte[] {0};
+            return ((Boolean) o).toString().getBytes();
         case BYTE:
             return new byte[] {((Byte) o)};
 
@@ -525,6 +526,84 @@ public class DataType {
     }
 
     /**
+     * Force a data object to a Boolean, if possible. Any numeric type can be
+     * forced to a Boolean, as well as CharArray, ByteArray. Complex types
+     * cannot be forced to a Boolean. This isn't particularly efficient, so if
+     * you already <b>know</b> that the object you have is a Boolean you should
+     * just cast it.
+     * 
+     * @param o
+     *            object to cast
+     * @param type
+     *            of the object you are casting
+     * @return The object as a Boolean.
+     * @throws ExecException
+     *             if the type can't be forced to a Boolean.
+     */
+    public static Boolean toBoolean(Object o, byte type) throws ExecException {
+        try {
+            switch (type) {
+            case NULL:
+                return null;
+            case BOOLEAN:
+                return (Boolean) o;
+            case BYTE:
+                return Boolean.valueOf(((Byte) o).byteValue() != 0);
+            case INTEGER:
+                return Boolean.valueOf(((Integer) o).intValue() != 0);
+            case LONG:
+                return Boolean.valueOf(((Long) o).longValue() != 0L);
+            case FLOAT:
+                return Boolean.valueOf(((Float) o).floatValue() != 0.0F);
+            case DOUBLE:
+                return Boolean.valueOf(((Double) o).doubleValue() != 0.0D);
+            case BYTEARRAY:
+                String str = ((DataByteArray) o).toString();
+                if (str.equalsIgnoreCase("true")) {
+                    return Boolean.TRUE;
+                } else if (str.equalsIgnoreCase("false")) {
+                    return Boolean.FALSE;
+                } else {
+                    return null;
+                }
+            case CHARARRAY:
+                if (((String) o).equalsIgnoreCase("true")) {
+                    return Boolean.TRUE;
+                } else if (((String) o).equalsIgnoreCase("false")) {
+                    return Boolean.FALSE;
+                } else {
+                    return null;
+                }
+            case MAP:
+            case INTERNALMAP:
+            case TUPLE:
+            case BAG:
+            case UNKNOWN:
+            default:
+                int errCode = 1071;
+                String msg = "Cannot convert a " + findTypeName(o) + " to a Boolean";
+                throw new ExecException(msg, errCode, PigException.INPUT);
+            }
+        } catch (ClassCastException cce) {
+            throw cce;
+        } catch (ExecException ee) {
+            throw ee;
+        } catch (NumberFormatException nfe) {
+            int errCode = 1074;
+            String msg = "Problem with formatting. Could not convert " + o + " to Float.";
+            throw new ExecException(msg, errCode, PigException.INPUT, nfe);
+        } catch (Exception e) {
+            int errCode = 2054;
+            String msg = "Internal error. Could not convert " + o + " to Float.";
+            throw new ExecException(msg, errCode, PigException.BUG);
+        }
+    }
+    
+    public static Boolean toBoolean(Object o) throws ExecException {
+        return toBoolean(o, findType(o));
+    }
+
+    /**
      * Force a data object to an Integer, if possible.  Any numeric type
      * can be forced to an Integer (though precision may be lost), as well
      * as CharArray, ByteArray, or Boolean.  Complex types cannot be
@@ -718,6 +797,9 @@ public class DataType {
     public static Float toFloat(Object o,byte type) throws ExecException {
         try {
 			switch (type) {
+			case BOOLEAN:
+			    return (Boolean) o ? Float.valueOf(1.0F) : Float.valueOf(0.0F);
+
 			case INTEGER:
 			    return new Float(((Integer)o).floatValue());
 
@@ -739,7 +821,6 @@ public class DataType {
 			case NULL:
 			    return null;
 
-			case BOOLEAN:
 			case BYTE:
 			case MAP:
 			case INTERNALMAP:
@@ -799,6 +880,9 @@ public class DataType {
     public static Double toDouble(Object o,byte type) throws ExecException {
         try {
 			switch (type) {
+			case BOOLEAN:
+			    return (Boolean) o ? Double.valueOf(1.0D) : Double.valueOf(0.0D);
+
 			case INTEGER:
 			    return new Double(((Integer)o).doubleValue());
 
@@ -820,7 +904,6 @@ public class DataType {
 			case NULL:
 			    return null;
 
-			case BOOLEAN:
 			case BYTE:
 			case MAP:
 			case INTERNALMAP:

Modified: pig/trunk/src/org/apache/pig/impl/logicalLayer/schema/Schema.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/impl/logicalLayer/schema/Schema.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/impl/logicalLayer/schema/Schema.java (original)
+++ pig/trunk/src/org/apache/pig/impl/logicalLayer/schema/Schema.java Thu Aug 18 17:21:55 2011
@@ -233,7 +233,7 @@ public class Schema implements Serializa
     
             if (DataType.isSchemaType(castFs.type)) {
                 if(inputType == DataType.BYTEARRAY) {
-                    //good
+                    // good
                 } else if (inputType == castType) {
                     // Don't do the comparison if both embedded schemas are
                     // null.  That will cause Schema.equals to return false,
@@ -249,25 +249,25 @@ public class Schema implements Serializa
                 }
             } else {
                 if (inputType == castType) {
-                    //good
+                    // good
                 }
-                else if (DataType.isNumberType(inputType) &&
-                    DataType.isNumberType(castType) ) {
-                    //good
+                else if (inputType == DataType.BOOLEAN && (castType == DataType.CHARARRAY
+                        || castType == DataType.BYTEARRAY || DataType.isNumberType(castType))) {
+                    // good
+                }
+                else if (DataType.isNumberType(inputType) && (castType == DataType.CHARARRAY
+                        || castType == DataType.BYTEARRAY || DataType.isNumberType(castType)
+                        || castType == DataType.BOOLEAN)) {
+                    // good
                 }
+                else if (inputType == DataType.CHARARRAY && (castType == DataType.BYTEARRAY
+                        || DataType.isNumberType(castType) || castType == DataType.BOOLEAN)) {
+                    // good
+                } 
                 else if (inputType == DataType.BYTEARRAY) {
-                    //good
+                    // good
                 }
-                else if (  ( DataType.isNumberType(inputType) || 
-                             inputType == DataType.CHARARRAY 
-                           )  &&
-                           (  (castType == DataType.CHARARRAY) ||
-                              (castType == DataType.BYTEARRAY) ||
-                              (DataType.isNumberType(castType))
-                           ) 
-                        ) {
-                    //good
-                } else {
+                else {
                     return false;
                 }
             }

Modified: pig/trunk/src/org/apache/pig/impl/util/CastUtils.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/impl/util/CastUtils.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/impl/util/CastUtils.java (original)
+++ pig/trunk/src/org/apache/pig/impl/util/CastUtils.java Thu Aug 18 17:21:55 2011
@@ -55,6 +55,7 @@ public class CastUtils {
 	    case (DataType.FLOAT): return caster.bytesToFloat(bytes);
 	    case (DataType.INTEGER): return caster.bytesToInteger(bytes);
 	    case (DataType.LONG): return caster.bytesToLong(bytes);
+	    case (DataType.BOOLEAN): return caster.bytesToBoolean(bytes);
 	    case (DataType.MAP): return caster.bytesToMap(bytes);
 	    case (DataType.TUPLE): return caster.bytesToTuple(bytes, fieldSchema);
 	    default: throw new IOException("Unknown type " + dataType);
@@ -184,5 +185,19 @@ public class CastUtils {
 			}
 		}
 	}
+	
+	public static Boolean stringToBoolean(String str) {
+        if (str == null) {
+            return null;
+        } else {
+            if (str.equalsIgnoreCase("true")) {
+                return Boolean.TRUE;
+            } else if (str.equalsIgnoreCase("false")) {
+                return Boolean.FALSE;
+            } else {
+                return null;
+            }
+        }
+    }
 
 }

Modified: pig/trunk/src/org/apache/pig/newplan/logical/relational/LogicalSchema.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/newplan/logical/relational/LogicalSchema.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/newplan/logical/relational/LogicalSchema.java (original)
+++ pig/trunk/src/org/apache/pig/newplan/logical/relational/LogicalSchema.java Thu Aug 18 17:21:55 2011
@@ -287,7 +287,7 @@ public class LogicalSchema {
     
             if (DataType.isSchemaType(outFs.type)) {
                 if(inType == DataType.BYTEARRAY) {
-                    //good
+                    // good
                 } else if (inType == outType) {
                     // Don't do the comparison if either input inner schema 
                     // is null/empty or  both inner schemas are
@@ -305,25 +305,25 @@ public class LogicalSchema {
                 }
             } else {
                 if (inType == outType) {
-                    //good
+                    // good
+                }
+                else if (inType == DataType.BOOLEAN && (outType == DataType.CHARARRAY
+                        || outType == DataType.BYTEARRAY || DataType.isNumberType(outType))) {
+                    // good
+                }
+                else if (DataType.isNumberType(inType) && (outType == DataType.CHARARRAY
+                        || outType == DataType.BYTEARRAY || DataType.isNumberType(outType))
+                        || outType == DataType.BOOLEAN) {
+                    // good
                 }
-                else if (DataType.isNumberType(inType) &&
-                    DataType.isNumberType(outType) ) {
-                    //good
+                else if (inType == DataType.CHARARRAY && (outType == DataType.BYTEARRAY
+                        || DataType.isNumberType(outType)) || outType == DataType.BOOLEAN) {
+                    // good
                 }
                 else if (inType == DataType.BYTEARRAY) {
-                    //good
+                    // good
                 }
-                else if (  ( DataType.isNumberType(inType) || 
-                             inType == DataType.CHARARRAY 
-                           )  &&
-                           (  (outType == DataType.CHARARRAY) ||
-                              (outType == DataType.BYTEARRAY) ||
-                              (DataType.isNumberType(outType))
-                           ) 
-                        ) {
-                    //good
-                } else {
+                else {
                     return false;
                 }
             }

Modified: pig/trunk/src/org/apache/pig/newplan/logical/visitor/TypeCheckingExpVisitor.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/newplan/logical/visitor/TypeCheckingExpVisitor.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/newplan/logical/visitor/TypeCheckingExpVisitor.java (original)
+++ pig/trunk/src/org/apache/pig/newplan/logical/visitor/TypeCheckingExpVisitor.java Thu Aug 18 17:21:55 2011
@@ -374,8 +374,12 @@ public class TypeCheckingExpVisitor exte
             insertCast(binOp, lhsType, binOp.getRhs());
         }else if (isEquality){
             
-            //in case of equality condition, allow tuples and maps as args
-            if((lhsType == DataType.TUPLE) &&
+            //in case of equality condition, allow boolean, tuples and maps as args
+            if((lhsType == DataType.BOOLEAN) &&
+                    (rhsType == DataType.BOOLEAN) ) {
+                // good
+            }
+            else if((lhsType == DataType.TUPLE) &&
                     (rhsType == DataType.TUPLE) ) {
                 // good
             }
@@ -1193,6 +1197,15 @@ public class TypeCheckingExpVisitor exte
         //over conversion to a bigger type where ordering of types is:
         //INTEGER, LONG, FLOAT, DOUBLE, CHARARRAY, TUPLE, BAG, MAP
         //from small to big
+        
+        List<Byte> boolToTypes = Arrays.asList(
+                DataType.INTEGER,
+                DataType.LONG,
+                DataType.FLOAT,
+                DataType.DOUBLE
+                // maybe more bigger types
+        );
+        castLookup.put(DataType.BOOLEAN, boolToTypes);
 
         List<Byte> intToTypes = Arrays.asList(
                 DataType.LONG, 
@@ -1213,6 +1226,7 @@ public class TypeCheckingExpVisitor exte
         castLookup.put(DataType.FLOAT, floatToTypes);
 
         List<Byte> byteArrayToTypes = Arrays.asList(
+                DataType.BOOLEAN,
                 DataType.INTEGER,
                 DataType.LONG,
                 DataType.FLOAT,
@@ -1334,6 +1348,9 @@ public class TypeCheckingExpVisitor exte
         case DataType.LONG:
             kind = PigWarning.IMPLICIT_CAST_TO_LONG;
             break;
+        case DataType.BOOLEAN:
+            kind = PigWarning.IMPLICIT_CAST_TO_BOOLEAN;
+            break;
         case DataType.MAP:
             kind = PigWarning.IMPLICIT_CAST_TO_MAP;
             break;

Modified: pig/trunk/src/org/apache/pig/parser/AliasMasker.g
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/AliasMasker.g?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/AliasMasker.g (original)
+++ pig/trunk/src/org/apache/pig/parser/AliasMasker.g Thu Aug 18 17:21:55 2011
@@ -201,7 +201,7 @@ type : simple_type | tuple_type | bag_ty
 ;
 
 simple_type 
-    : INT | LONG | FLOAT | DOUBLE | CHARARRAY | BYTEARRAY 
+    : BOOLEAN | INT | LONG | FLOAT | DOUBLE | CHARARRAY | BYTEARRAY 
 ;
 
 tuple_type 
@@ -530,7 +530,9 @@ scalar 
     | FLOATNUMBER
     | DOUBLENUMBER
     | QUOTEDSTRING
-    | NULL    
+    | NULL
+    | TRUE
+    | FALSE
 ;
 
 map 
@@ -587,6 +589,7 @@ eid : rel_str_op
     | EVAL
     | ASC
     | DESC
+    | BOOLEAN
     | INT
     | LONG
     | FLOAT
@@ -598,6 +601,8 @@ eid : rel_str_op
     | MAP
     | IS
     | NULL
+    | TRUE
+    | FALSE
     | STREAM
     | THROUGH
     | STORE

Modified: pig/trunk/src/org/apache/pig/parser/AstPrinter.g
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/AstPrinter.g?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/AstPrinter.g (original)
+++ pig/trunk/src/org/apache/pig/parser/AstPrinter.g Thu Aug 18 17:21:55 2011
@@ -162,7 +162,8 @@ type : simple_type | tuple_type | bag_ty
 ;
 
 simple_type 
-    : INT { sb.append($INT.text); }
+    : BOOLEAN { sb.append($BOOLEAN.text); }
+    | INT { sb.append($INT.text); }
     | LONG { sb.append($LONG.text); }
     | FLOAT { sb.append($FLOAT.text); }
     | DOUBLE { sb.append($DOUBLE.text); }
@@ -500,7 +501,9 @@ literal : scalar | map | bag | tuple
 
 scalar : num_scalar
        | QUOTEDSTRING { sb.append($QUOTEDSTRING.text); }
-       | NULL { sb.append($NULL.text); }    
+       | NULL { sb.append($NULL.text); } 
+       | TRUE { sb.append($TRUE.text); }
+       | FALSE { sb.append($FALSE.text); }   
 ;
 
 num_scalar : ( MINUS { sb.append( "-" ); } )?
@@ -568,6 +571,7 @@ eid : rel_str_op
     | EVAL      { sb.append($EVAL.text); }
     | ASC       { sb.append($ASC.text); }
     | DESC      { sb.append($DESC.text); }
+    | BOOLEAN   { sb.append($BOOLEAN.text); }
     | INT       { sb.append($INT.text); }
     | LONG      { sb.append($LONG.text); }
     | FLOAT     { sb.append($FLOAT.text); }
@@ -579,6 +583,8 @@ eid : rel_str_op
     | MAP       { sb.append($MAP.text); }
     | IS        { sb.append($IS.text); }
     | NULL      { sb.append($NULL.text); }
+    | TRUE      { sb.append($TRUE.text); }
+    | FALSE     { sb.append($FALSE.text); }
     | STREAM    { sb.append($STREAM.text); }
     | THROUGH   { sb.append($THROUGH.text); }
     | STORE     { sb.append($STORE.text); }

Modified: pig/trunk/src/org/apache/pig/parser/AstValidator.g
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/AstValidator.g?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/AstValidator.g (original)
+++ pig/trunk/src/org/apache/pig/parser/AstValidator.g Thu Aug 18 17:21:55 2011
@@ -203,7 +203,7 @@ scope{
 type : simple_type | tuple_type | bag_type | map_type
 ;
 
-simple_type : INT | LONG | FLOAT | DOUBLE | CHARARRAY | BYTEARRAY
+simple_type : BOOLEAN | INT | LONG | FLOAT | DOUBLE | CHARARRAY | BYTEARRAY
 ;
 
 tuple_type : ^( TUPLE_TYPE field_def_list? )
@@ -508,7 +508,7 @@ const_expr : literal
 literal : scalar | map | bag | tuple
 ;
 
-scalar : num_scalar | QUOTEDSTRING | NULL
+scalar : num_scalar | QUOTEDSTRING | NULL | TRUE | FALSE
 ;
 
 num_scalar : MINUS? ( INTEGER | LONGINTEGER | FLOATNUMBER | DOUBLENUMBER )
@@ -564,6 +564,7 @@ eid : rel_str_op
     | EVAL
     | ASC
     | DESC
+    | BOOLEAN
     | INT
     | LONG
     | FLOAT
@@ -575,6 +576,8 @@ eid : rel_str_op
     | MAP
     | IS
     | NULL
+    | TRUE
+    | FALSE
     | STREAM
     | THROUGH
     | STORE

Modified: pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g (original)
+++ pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g Thu Aug 18 17:21:55 2011
@@ -353,7 +353,8 @@ type returns[Byte datatype, LogicalSchem
 ;
 
 simple_type returns[byte datatype]
- : INT { $datatype = DataType.INTEGER; }
+ : BOOLEAN { $datatype = DataType.BOOLEAN; }
+ | INT { $datatype = DataType.INTEGER; }
  | LONG { $datatype = DataType.LONG; }
  | FLOAT { $datatype = DataType.FLOAT; }
  | DOUBLE { $datatype = DataType.DOUBLE; }
@@ -1480,6 +1481,16 @@ scalar returns[Object value, byte type]
    { 
        $type = DataType.NULL;
    }
+ | TRUE
+   {
+       $type = DataType.BOOLEAN;
+       $value = Boolean.TRUE;
+   }
+ | FALSE
+   {
+       $type = DataType.BOOLEAN;
+       $value = Boolean.FALSE;
+   }
 ;
 
 num_scalar returns[Object value, byte type]
@@ -1581,6 +1592,7 @@ eid returns[String id] : rel_str_op { $i
     | EVAL { $id = $EVAL.text; }
     | ASC { $id = $ASC.text; }
     | DESC { $id = $DESC.text; }
+    | BOOLEAN { $id = $BOOLEAN.text; }
     | INT { $id = $INT.text; }
     | LONG { $id = $LONG.text; }
     | FLOAT { $id = $FLOAT.text; }
@@ -1592,6 +1604,8 @@ eid returns[String id] : rel_str_op { $i
     | MAP { $id = $MAP.text; }
     | IS { $id = $IS.text; }
     | NULL { $id = $NULL.text; }
+    | TRUE { $id = $TRUE.text; }
+    | FALSE { $id = $FALSE.text; }
     | STREAM { $id = $STREAM.text; }
     | THROUGH { $id = $THROUGH.text; }
     | STORE { $id = $STORE.text; }

Modified: pig/trunk/src/org/apache/pig/parser/QueryLexer.g
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/QueryLexer.g?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/QueryLexer.g (original)
+++ pig/trunk/src/org/apache/pig/parser/QueryLexer.g Thu Aug 18 17:21:55 2011
@@ -159,6 +159,9 @@ ASC : 'ASC'
 DESC : 'DESC'
 ;
 
+BOOLEAN : 'BOOLEAN'
+;
+
 INT : 'INT'
 ;
 
@@ -257,6 +260,12 @@ STR_OP_NE : 'NEQ'
 
 STR_OP_MATCHES : 'MATCHES'
 ;
+
+TRUE : 'TRUE'
+;
+
+FALSE : 'FALSE'
+;
     
 NUM_OP_EQ : '=='
 ;

Modified: pig/trunk/src/org/apache/pig/parser/QueryParser.g
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/QueryParser.g?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/QueryParser.g (original)
+++ pig/trunk/src/org/apache/pig/parser/QueryParser.g Thu Aug 18 17:21:55 2011
@@ -66,6 +66,8 @@ tokens {
     MACRO_BODY;
     MACRO_INLINE;
     NULL;
+    TRUE;
+    FALSE;
     IDENTIFIER;
     ANY;
 }
@@ -297,7 +299,7 @@ field_def_list : field_def ( COMMA field
 type : simple_type | tuple_type | bag_type | map_type
 ;
 
-simple_type : INT | LONG | FLOAT | DOUBLE | CHARARRAY | BYTEARRAY
+simple_type : BOOLEAN | INT | LONG | FLOAT | DOUBLE | CHARARRAY | BYTEARRAY
 ;
 
 tuple_type : TUPLE? LEFT_PAREN field_def_list? RIGHT_PAREN
@@ -640,7 +642,7 @@ literal : scalar | map | bag | tuple
 ;
 
 
-scalar : num_scalar | QUOTEDSTRING | null_keyword
+scalar : num_scalar | QUOTEDSTRING | null_keyword | TRUE | FALSE
 ;
 
 num_scalar : MINUS? ( INTEGER | LONGINTEGER | FLOATNUMBER | DOUBLENUMBER )
@@ -704,6 +706,7 @@ eid : rel_str_op
     | FLATTEN
     | ASC
     | DESC
+    | BOOL
     | INT
     | LONG
     | FLOAT
@@ -732,6 +735,8 @@ eid : rel_str_op
     | FULL
     | identifier
     | null_keyword
+    | TRUE
+    | FALSE
 ;
 
 // relational operator

Modified: pig/trunk/src/org/apache/pig/pen/AugmentBaseDataVisitor.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/pen/AugmentBaseDataVisitor.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/pen/AugmentBaseDataVisitor.java (original)
+++ pig/trunk/src/org/apache/pig/pen/AugmentBaseDataVisitor.java Thu Aug 18 17:21:55 2011
@@ -1231,7 +1231,13 @@ public class AugmentBaseDataVisitor exte
     Object generateData(byte type, String data) {
         switch (type) {
         case DataType.BOOLEAN:
-            return Boolean.valueOf(data);
+            if (data.equalsIgnoreCase("true")) {
+                return Boolean.TRUE;
+            } else if (data.equalsIgnoreCase("false")) {
+                return Boolean.FALSE;
+            } else {
+                return null;
+            }
         case DataType.BYTEARRAY:
             return new DataByteArray(data.getBytes());
         case DataType.DOUBLE:

Modified: pig/trunk/test/e2e/pig/udfs/java/org/apache/pig/test/udf/evalfunc/TOBAG.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/e2e/pig/udfs/java/org/apache/pig/test/udf/evalfunc/TOBAG.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/test/e2e/pig/udfs/java/org/apache/pig/test/udf/evalfunc/TOBAG.java (original)
+++ pig/trunk/test/e2e/pig/udfs/java/org/apache/pig/test/udf/evalfunc/TOBAG.java Thu Aug 18 17:21:55 2011
@@ -61,6 +61,9 @@ public class TOBAG extends EvalFunc<Data
         } else if ( fieldType.equalsIgnoreCase( "FLOAT" )){ 
             this.fieldType = DataType.FLOAT; 
 
+        } else if ( fieldType.equalsIgnoreCase( "BOOLEAN" )){ 
+            this.fieldType = DataType.BOOLEAN; 
+
         } else if ( fieldType.equalsIgnoreCase( "INTEGER" )){ 
             this.fieldType = DataType.INTEGER;
 

Modified: pig/trunk/test/e2e/pig/udfs/java/org/apache/pig/test/udf/evalfunc/VARBAG.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/e2e/pig/udfs/java/org/apache/pig/test/udf/evalfunc/VARBAG.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/test/e2e/pig/udfs/java/org/apache/pig/test/udf/evalfunc/VARBAG.java (original)
+++ pig/trunk/test/e2e/pig/udfs/java/org/apache/pig/test/udf/evalfunc/VARBAG.java Thu Aug 18 17:21:55 2011
@@ -60,6 +60,9 @@ public class VARBAG extends EvalFunc<Dat
         } else if ( fieldType.equalsIgnoreCase( "FLOAT" )){ 
             this.fieldType = DataType.FLOAT; 
 
+        } else if ( fieldType.equalsIgnoreCase( "BOOLEAN" )) {
+            this.fieldType = DataType.BOOLEAN;
+            
         } else if ( fieldType.equalsIgnoreCase( "INTEGER" )){ 
             this.fieldType = DataType.INTEGER;
 

Modified: pig/trunk/test/e2e/pig/udfs/java/org/apache/pig/test/udf/storefunc/PigPerformanceLoader.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/e2e/pig/udfs/java/org/apache/pig/test/udf/storefunc/PigPerformanceLoader.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/test/e2e/pig/udfs/java/org/apache/pig/test/udf/storefunc/PigPerformanceLoader.java (original)
+++ pig/trunk/test/e2e/pig/udfs/java/org/apache/pig/test/udf/storefunc/PigPerformanceLoader.java Thu Aug 18 17:21:55 2011
@@ -154,6 +154,11 @@ public class PigPerformanceLoader extend
         public Long bytesToLong(byte[] arg0) throws IOException {
             return helper.bytesToLong(arg0);
         }
+        
+        @Override
+        public Boolean bytesToBoolean(byte[] arg0) throws IOException {
+            return helper.bytesToBoolean(arg0);
+        }
 
         @Override
         public Tuple bytesToTuple(byte[] arg0, ResourceFieldSchema fs) throws IOException {

Modified: pig/trunk/test/findbugsExcludeFile.xml
URL: http://svn.apache.org/viewvc/pig/trunk/test/findbugsExcludeFile.xml?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/test/findbugsExcludeFile.xml (original)
+++ pig/trunk/test/findbugsExcludeFile.xml Thu Aug 18 17:21:55 2011
@@ -429,4 +429,12 @@
         <Class name = "org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigGenericMapReduce" />
         <Bug pattern = "MS_CANNOT_BE_FINAL" />
     </Match>
+    <Match>
+        <Class name = "org.apache.pig.data.DataType" />
+        <Bug pattern = "NP_BOOLEAN_RETURN_NULL" />
+    </Match>
+    <Match>
+        <Class name = "org.apache.pig.impl.util.CastUtils" />
+        <Bug pattern = "NP_BOOLEAN_RETURN_NULL" />
+    </Match>
 </FindBugsFilter>

Modified: pig/trunk/test/org/apache/pig/test/TestConversions.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestConversions.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/test/TestConversions.java (original)
+++ pig/trunk/test/org/apache/pig/test/TestConversions.java Thu Aug 18 17:21:55 2011
@@ -52,6 +52,27 @@ public class TestConversions extends Tes
 	Random r = new Random();
 	final int MAX = 10;
 
+    @Test
+    public void testBytesToBoolean() throws IOException {
+        // valid booleans
+        String[] a = { "true", "True", "TRUE", "false", "False", "FALSE" };
+        Boolean[] b = { Boolean.TRUE, Boolean.TRUE, Boolean.TRUE,
+                Boolean.FALSE, Boolean.FALSE, Boolean.FALSE };
+
+        for (int i = 0; i < b.length; ++i) {
+            byte[] bytes = a[i].getBytes();
+            assertEquals(b[i], ps.getLoadCaster().bytesToBoolean(bytes));
+        }
+
+        // invalid booleans
+        // the string that is neither "true" nor "false" cannot be converted to a boolean value
+        a = new String[] { "neither true nor false" };
+        for (String s : a) {
+            byte[] bytes = s.getBytes();
+            Boolean bool = ps.getLoadCaster().bytesToBoolean(bytes);
+            assertEquals(null, bool);
+        }
+    }
     
     @Test
     public  void testBytesToInteger() throws IOException
@@ -194,6 +215,12 @@ public class TestConversions extends Tes
         }
         
     }
+    
+    @Test
+    public void testBooleanToBytes() throws IOException {
+        assertTrue(DataType.equalByteArrays(Boolean.TRUE.toString().getBytes(), ((Utf8StorageConverter)ps.getLoadCaster()).toBytes(Boolean.TRUE)));
+        assertTrue(DataType.equalByteArrays(Boolean.FALSE.toString().getBytes(), ((Utf8StorageConverter)ps.getLoadCaster()).toBytes(Boolean.FALSE)));
+    }
 
     @Test
     public void testIntegerToBytes() throws IOException {

Modified: pig/trunk/test/org/apache/pig/test/TestEqualTo.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestEqualTo.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/test/TestEqualTo.java (original)
+++ pig/trunk/test/org/apache/pig/test/TestEqualTo.java Thu Aug 18 17:21:55 2011
@@ -48,6 +48,43 @@ public class TestEqualTo extends junit.f
     @After
     public void tearDown() throws Exception {
     }
+    
+    @Test
+    public void testBooleanNe() throws Exception {
+        ConstantExpression lt = GenPhyOp.exprConst();
+        lt.setValue(Boolean.TRUE);
+        ConstantExpression rt = GenPhyOp.exprConst();
+        rt.setValue(Boolean.FALSE);
+        EqualToExpr g = GenPhyOp.compEqualToExpr();
+        g.setLhs(lt);
+        g.setRhs(rt);
+        g.setOperandType(DataType.BOOLEAN);
+        Result r = g.getNext(new Boolean(true));
+        assertEquals(POStatus.STATUS_OK, r.returnStatus);
+        assertFalse((Boolean)r.result);
+    }
+    
+    @Test
+    public void testBooleanEq() throws Exception {
+        ConstantExpression lt = GenPhyOp.exprConst();
+        lt.setValue(Boolean.TRUE);
+        ConstantExpression rt = GenPhyOp.exprConst();
+        rt.setValue(Boolean.TRUE);
+        EqualToExpr g = GenPhyOp.compEqualToExpr();
+        g.setLhs(lt);
+        g.setRhs(rt);
+        g.setOperandType(DataType.BOOLEAN);
+        Result r = g.getNext(new Boolean(true));
+        assertEquals(POStatus.STATUS_OK, r.returnStatus);
+        assertTrue((Boolean)r.result);
+    }
+    
+    @Test
+    public void testBooleanAndNullValues() throws Exception {
+
+        checkNullValues(DataType.BOOLEAN, Boolean.TRUE);
+
+    }
 
     @Test
     public void testIntegerNe() throws Exception {

Modified: pig/trunk/test/org/apache/pig/test/TestNotEqualTo.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestNotEqualTo.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/test/TestNotEqualTo.java (original)
+++ pig/trunk/test/org/apache/pig/test/TestNotEqualTo.java Thu Aug 18 17:21:55 2011
@@ -49,6 +49,42 @@ public class TestNotEqualTo extends juni
     @After
     public void tearDown() throws Exception {
     }
+    
+    @Test
+    public void testBooleanNe() throws Exception {
+        ConstantExpression lt = GenPhyOp.exprConst();
+        lt.setValue(Boolean.TRUE);
+        ConstantExpression rt = GenPhyOp.exprConst();
+        rt.setValue(Boolean.FALSE);
+        NotEqualToExpr g = GenPhyOp.compNotEqualToExpr();
+        g.setLhs(lt);
+        g.setRhs(rt);
+        g.setOperandType(DataType.BOOLEAN);
+        Result r = g.getNext(new Boolean(true));
+        assertEquals(POStatus.STATUS_OK, r.returnStatus);
+        assertTrue((Boolean) r.result);
+    }
+    
+    @Test
+    public void testBooleanEq() throws Exception {
+        ConstantExpression lt = GenPhyOp.exprConst();
+        lt.setValue(Boolean.TRUE);
+        ConstantExpression rt = GenPhyOp.exprConst();
+        rt.setValue(Boolean.TRUE);
+        NotEqualToExpr g = GenPhyOp.compNotEqualToExpr();
+        g.setLhs(lt);
+        g.setRhs(rt);
+        g.setOperandType(DataType.BOOLEAN);
+        Result r = g.getNext(new Boolean(true));
+        assertEquals(POStatus.STATUS_OK, r.returnStatus);
+        assertFalse((Boolean)r.result);
+    }
+
+    @Test
+    public void testBooleanAndNullValues() throws Exception {
+
+        checkNullValues(DataType.BOOLEAN, Boolean.TRUE);
+    }
 
     @Test
     public void testIntegerNe() throws Exception {

Modified: pig/trunk/test/org/apache/pig/test/TestOrderBy.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestOrderBy.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/test/TestOrderBy.java (original)
+++ pig/trunk/test/org/apache/pig/test/TestOrderBy.java Thu Aug 18 17:21:55 2011
@@ -19,12 +19,19 @@ package org.apache.pig.test;
 
 import java.io.File;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.io.PrintStream;
 import java.text.DecimalFormat;
+import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 
 import junit.framework.TestCase;
 
+import org.apache.pig.ExecType;
+import org.apache.pig.PigServer;
+import org.apache.pig.data.DataType;
+import org.apache.pig.data.Tuple;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -32,11 +39,6 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import org.apache.pig.ExecType;
-import org.apache.pig.PigServer;
-import org.apache.pig.data.DataType;
-import org.apache.pig.data.Tuple;
-
 @RunWith(JUnit4.class)
 public class TestOrderBy extends TestCase {
     private static final int DATALEN = 1024;
@@ -251,5 +253,54 @@ public class TestOrderBy extends TestCas
     	}
     	assertEquals(count, 100);
     }
+    
+    @Test
+    public void testOrderByBooleanColumn() throws Exception {
+        File tmpFile = genDataSetFileForOrderByBooleanColumn();
+        List<Tuple> expectedResults = new ArrayList<Tuple>();
+        expectedResults.add(Util.buildTuple("value3", null));
+        expectedResults.add(Util.buildTuple("value4", null));
+        expectedResults.add(Util.buildTuple("value10", null));
+        expectedResults.add(Util.buildTuple("value2", Boolean.FALSE));
+        expectedResults.add(Util.buildTuple("value6", Boolean.FALSE));
+        expectedResults.add(Util.buildTuple("value7", Boolean.FALSE));
+        expectedResults.add(Util.buildTuple("value1", Boolean.TRUE));
+        expectedResults.add(Util.buildTuple("value5", Boolean.TRUE));
+        expectedResults.add(Util.buildTuple("value8", Boolean.TRUE));
+        expectedResults.add(Util.buildTuple("value9", Boolean.TRUE));
+        
+        pig.registerQuery("blah = load '"
+                + Util.generateURI(tmpFile.toString(), pig.getPigContext())
+                + "' as (data:chararray, test:boolean);");
+        pig.registerQuery("ordered = order blah by test;");
+        Iterator<Tuple> expectedItr = expectedResults.iterator();
+        Iterator<Tuple> actualItr = pig.openIterator("ordered");
+        while (expectedItr.hasNext() && actualItr.hasNext()) {
+            Tuple expectedTuple = expectedItr.next();
+            Tuple actualTuple = actualItr.next();
+            assertEquals(expectedTuple, actualTuple);
+        }
+        assertEquals(expectedItr.hasNext(), actualItr.hasNext());
+    }
+    
+    private File genDataSetFileForOrderByBooleanColumn() throws IOException {
+
+        File fp1 = File.createTempFile("order_by_boolean", "txt");
+        PrintStream ps = new PrintStream(new FileOutputStream(fp1));
+        ps.println("value1\ttrue");
+        ps.println("value2\tfalse");
+        ps.println("value3\t");
+        ps.println("value4\t");
+        ps.println("value5\ttrue");
+        ps.println("value6\tfalse");
+        ps.println("value7\tfalse");
+        ps.println("value8\ttrue");
+        ps.println("value9\ttrue");
+        ps.println("value10\t");
+
+        ps.close();
+
+        return fp1;
+    }
 
 }

Modified: pig/trunk/test/org/apache/pig/test/TestPOBinCond.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestPOBinCond.java?rev=1159319&r1=1159318&r2=1159319&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/test/TestPOBinCond.java (original)
+++ pig/trunk/test/org/apache/pig/test/TestPOBinCond.java Thu Aug 18 17:21:55 2011
@@ -190,6 +190,22 @@ public class TestPOBinCond extends TestC
     }
   */
     
+    public void testPOBinCondWithBoolean() throws ExecException, PlanException {
+        bag = getBag(DataType.BOOLEAN);
+        TestPoBinCondHelper testHelper = new TestPoBinCondHelper(
+                DataType.BOOLEAN, Boolean.TRUE);
+
+        for (Iterator<Tuple> it = bag.iterator(); it.hasNext();) {
+            Tuple t = it.next();
+            testHelper.getPlan().attachInput(t);
+            Boolean value = (Boolean) t.get(0);
+            int expected = (value.booleanValue() == true) ? 1 : 0;
+            Integer dummy = new Integer(0);
+            Integer result = (Integer) testHelper.getOperator().getNext(dummy).result;
+            int actual = result.intValue();
+            assertEquals(expected, actual);
+        }
+    }
 
     public void testPOBinCondWithInteger() throws  ExecException, PlanException {
     	
@@ -421,6 +437,9 @@ public class TestPOBinCond extends TestC
         for(int i = 0; i < 10; i ++) {
             Tuple t = TupleFactory.getInstance().newTuple();
             switch(type) {
+                case DataType.BOOLEAN:
+                    t.append(r.nextBoolean());
+                    break;
                 case DataType.INTEGER:
                     t.append(r.nextInt(2));
                     break;
@@ -449,6 +468,9 @@ public class TestPOBinCond extends TestC
                 t.append(null);                
             }else{
                 switch(type) {
+                    case DataType.BOOLEAN:
+                        t.append(r.nextBoolean());
+                        break;
                     case DataType.INTEGER:
                         t.append(r.nextInt(2));
                         break;