| /* |
| * 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.test; |
| |
| import static org.junit.Assert.assertTrue; |
| |
| import java.util.Map; |
| import java.util.Random; |
| |
| import org.apache.pig.backend.executionengine.ExecException; |
| import org.apache.pig.backend.hadoop.executionengine.physicalLayer.Result; |
| import org.apache.pig.backend.hadoop.executionengine.physicalLayer.expressionOperators.ConstantExpression; |
| import org.apache.pig.backend.hadoop.executionengine.physicalLayer.expressionOperators.POIsNull; |
| import org.apache.pig.data.DataBag; |
| import org.apache.pig.data.DataByteArray; |
| import org.apache.pig.data.DataType; |
| import org.apache.pig.data.Tuple; |
| import org.apache.pig.data.TupleFactory; |
| import org.apache.pig.test.utils.GenPhyOp; |
| import org.apache.pig.test.utils.GenRandomData; |
| import org.joda.time.DateTime; |
| import org.junit.Test; |
| |
| public class TestNull { |
| public static boolean test(byte type) throws ExecException { |
| Random r = new Random(); |
| ConstantExpression lt = (ConstantExpression)GenPhyOp.exprConst(); |
| lt.setResultType(type); |
| Tuple dummyTuple = TupleFactory.getInstance().newTuple(1); |
| lt.attachInput(dummyTuple); |
| POIsNull isNullExpr = (POIsNull)GenPhyOp.compIsNullExpr(); |
| isNullExpr.setExpr(lt); |
| isNullExpr.setOperandType(type); |
| |
| Object inp1; |
| Result res; |
| Boolean ret; |
| switch (type) { |
| case DataType.BAG: |
| inp1 = GenRandomData.genRandSmallTupDataBag(r, 10, 100); |
| res = isNullExpr.getNextBoolean(); |
| if ((Boolean)res.result != true) |
| return false; |
| lt.setValue(inp1); |
| res = isNullExpr.getNextBoolean(); |
| ret = (DataType.compare(inp1, null) == 0); |
| if (!res.result.equals(ret)) |
| return false; |
| // set the input to null and test |
| lt.setValue((DataBag)null); |
| res = isNullExpr.getNextBoolean(); |
| if (!res.result.equals(true)) |
| return false; |
| return true; |
| case DataType.BOOLEAN: |
| inp1 = r.nextBoolean(); |
| res = isNullExpr.getNextBoolean(); |
| if ((Boolean)res.result != true) |
| return false; |
| lt.setValue(inp1); |
| res = isNullExpr.getNextBoolean(); |
| ret = (DataType.compare(inp1, null) == 0); |
| if (!(res.result.equals(ret))) |
| return false; |
| // set the input to null and test |
| lt.setValue((Boolean)null); |
| res = isNullExpr.getNextBoolean(); |
| ret = (DataType.compare(inp1, null) == 0); |
| if (!(res.result.equals(true))) |
| return false; |
| return true; |
| case DataType.BYTEARRAY: |
| inp1 = GenRandomData.genRandDBA(r); |
| res = isNullExpr.getNextBoolean(); |
| if ((Boolean)res.result != true) |
| return false; |
| lt.setValue(inp1); |
| res = isNullExpr.getNextBoolean(); |
| ret = (DataType.compare(inp1, null) == 0); |
| if (!(res.result.equals(ret))) |
| return false; |
| // set the input to null and test |
| lt.setValue((DataByteArray)null); |
| res = isNullExpr.getNextBoolean(); |
| ret = (DataType.compare(inp1, null) == 0); |
| if (!(res.result.equals(true))) |
| return false; |
| return true; |
| case DataType.CHARARRAY: |
| inp1 = GenRandomData.genRandString(r); |
| res = isNullExpr.getNextBoolean(); |
| if ((Boolean)res.result != true) |
| return false; |
| lt.setValue(inp1); |
| res = isNullExpr.getNextBoolean(); |
| ret = (DataType.compare(inp1, null) == 0); |
| if (!(res.result.equals(ret))) |
| return false; |
| // set the input to null and test |
| lt.setValue((String)null); |
| res = isNullExpr.getNextBoolean(); |
| ret = (DataType.compare(inp1, null) == 0); |
| if (!(res.result.equals(true))) |
| return false; |
| return true; |
| case DataType.DOUBLE: |
| inp1 = r.nextDouble(); |
| res = isNullExpr.getNextBoolean(); |
| if ((Boolean)res.result != true) |
| return false; |
| lt.setValue(inp1); |
| res = isNullExpr.getNextBoolean(); |
| ret = (DataType.compare(inp1, null) == 0); |
| if (!(res.result.equals(ret))) |
| return false; |
| // set the input to null and test |
| lt.setValue((Double)null); |
| res = isNullExpr.getNextBoolean(); |
| ret = (DataType.compare(inp1, null) == 0); |
| if (!(res.result.equals(true))) |
| return false; |
| return true; |
| case DataType.FLOAT: |
| inp1 = r.nextFloat(); |
| res = isNullExpr.getNextBoolean(); |
| if ((Boolean)res.result != true) |
| return false; |
| lt.setValue(inp1); |
| res = isNullExpr.getNextBoolean(); |
| ret = (DataType.compare(inp1, null) == 0); |
| if (!(res.result.equals(ret))) |
| return false; |
| // set the input to null and test |
| lt.setValue((Float)null); |
| res = isNullExpr.getNextBoolean(); |
| if (!res.result.equals(true)) |
| return false; |
| return true; |
| case DataType.INTEGER: |
| inp1 = r.nextInt(); |
| res = isNullExpr.getNextBoolean(); |
| if ((Boolean)res.result != true) |
| return false; |
| lt.setValue(inp1); |
| res = isNullExpr.getNextBoolean(); |
| ret = (DataType.compare(inp1, null) == 0); |
| if (!(res.result.equals(ret))) |
| return false; |
| // set the input to null and test |
| lt.setValue((Integer)null); |
| res = isNullExpr.getNextBoolean(); |
| if (!res.result.equals(true)) |
| return false; |
| return true; |
| case DataType.LONG: |
| inp1 = r.nextLong(); |
| res = isNullExpr.getNextBoolean(); |
| if ((Boolean)res.result != true) |
| return false; |
| lt.setValue(inp1); |
| res = isNullExpr.getNextBoolean(); |
| ret = (DataType.compare(inp1, null) == 0); |
| if (!(res.result.equals(ret))) |
| return false; |
| // set the input to null and test |
| lt.setValue((Long)null); |
| res = isNullExpr.getNextBoolean(); |
| if (!res.result.equals(true)) |
| return false; |
| return true; |
| case DataType.DATETIME: |
| inp1 = new DateTime(r.nextLong()); |
| res = isNullExpr.getNextBoolean(); |
| if ((Boolean)res.result != true) |
| return false; |
| lt.setValue(inp1); |
| res = isNullExpr.getNextBoolean(); |
| ret = (DataType.compare(inp1, null) == 0); |
| if (!(res.result.equals(ret))) |
| return false; |
| // set the input to null and test |
| lt.setValue((DateTime)null); |
| res = isNullExpr.getNextBoolean(); |
| if (!res.result.equals(true)) |
| return false; |
| return true; |
| case DataType.MAP: |
| inp1 = GenRandomData.genRandMap(r, 10); |
| res = isNullExpr.getNextBoolean(); |
| if ((Boolean)res.result != true) |
| return false; |
| lt.setValue(inp1); |
| res = isNullExpr.getNextBoolean(); |
| ret = (DataType.compare(inp1, null) == 0); |
| if (!(res.result.equals(ret))) |
| return false; |
| // set the input to null and test |
| lt.setValue((Map)null); |
| res = isNullExpr.getNextBoolean(); |
| if (!res.result.equals(true)) |
| return false; |
| return true; |
| case DataType.TUPLE: |
| inp1 = GenRandomData.genRandSmallBagTuple(r, 10, 100); |
| res = isNullExpr.getNextBoolean(); |
| if ((Boolean)res.result != true) |
| return false; |
| lt.setValue(inp1); |
| res = isNullExpr.getNextBoolean(); |
| ret = (DataType.compare(inp1, null) == 0); |
| if (!(res.result.equals(ret))) |
| return false; |
| // set the input to null and test |
| lt.setValue((Tuple)null); |
| res = isNullExpr.getNextBoolean(); |
| if (!res.result.equals(true)) |
| return false; |
| return true; |
| } |
| return true; |
| } |
| |
| @Test |
| public void testCompare() { |
| Object o1 = new Object(); |
| Object o2 = null; |
| assertTrue(DataType.compare(o1, o2, DataType.NULL, DataType.NULL) > 0); |
| |
| o1 = null; |
| o2 = new Object(); |
| assertTrue(DataType.compare(o1, o2, DataType.NULL, DataType.NULL) < 0); |
| |
| o1 = null; |
| o2 = null; |
| assertTrue(DataType.compare(o1, o2, DataType.NULL, DataType.NULL) == 0); |
| } |
| |
| @Test |
| public void testOperator() throws ExecException { |
| int TRIALS = 10; |
| byte[] types = DataType.genAllTypes(); |
| Map<Byte, String> map = DataType.genTypeToNameMap(); |
| // System.out.println("Testing Not Equal To Expression:"); |
| |
| long t1 = System.currentTimeMillis(); |
| |
| for (byte b : types) { |
| // System.out.print("\t With " + map.get(b) + ": "); |
| for (int i = 0; i < TRIALS; i++) { |
| assertTrue(test(b)); |
| } |
| /* |
| * if (succ) System.out.println("Success!!"); else |
| * System.out.println("Failure"); |
| */ |
| } |
| } |
| } |