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;