@Test public void testTernaryOperatorsDecimalDouble() throws Exception { for (BigDecimal first : decimalLefts) { for (Double second : doubleMiddle) { for (BigDecimal third : decimalRights) { assertExecute(generateExpression("%s between %s and %s", first, second, third), BOOLEAN, first == null || second == null || third == null ? null : second <= first.doubleValue() && first.compareTo(third) <= 0); } } } Futures.allAsList(futures).get(); }
@Test public void testTernaryOperatorsLongDouble() throws Exception { for (Integer first : intLefts) { for (Double second : doubleLefts) { for (Integer third : intRights) { assertExecute(generateExpression("%s between %s and %s", first, second, third), BOOLEAN, first == null || second == null || third == null ? null : second <= first && first <= third); } } } Futures.allAsList(futures).get(); }
@Test public void testTernaryOperatorsDoubleDouble() throws Exception { for (Double first : doubleLefts) { for (Double second : doubleLefts) { for (Integer third : intRights) { assertExecute(generateExpression("%s between %s and %s", first, second, third), BOOLEAN, first == null || second == null || third == null ? null : second <= first && first <= third); } } } Futures.allAsList(futures).get(); }
@Test public void testTernaryOperatorsLongLong() throws Exception { for (Integer first : intLefts) { for (Integer second : intLefts) { for (Integer third : intRights) { assertExecute(generateExpression("%s between %s and %s", first, second, third), BOOLEAN, first == null || second == null || third == null ? null : second <= first && first <= third); } } } Futures.allAsList(futures).get(); }
@Test public void testTernaryOperatorsString() throws Exception { for (String first : stringLefts) { for (String second : stringLefts) { for (String third : stringRights) { assertExecute(generateExpression("%s between %s and %s", first, second, third), BOOLEAN, first == null || second == null || third == null ? null : second.compareTo(first) <= 0 && first.compareTo(third) <= 0); } } } Futures.allAsList(futures).get(); }
@Test public void testTernaryOperatorsLongDecimal() throws Exception { for (Long first : longLefts) { for (BigDecimal second : decimalMiddle) { for (Long third : longRights) { assertExecute(generateExpression("%s between %s and %s", first, second, third), BOOLEAN, first == null || second == null || third == null ? null : second.compareTo(new BigDecimal(first)) <= 0 && first <= third); } } } Futures.allAsList(futures).get(); }
@Test public void testBinaryOperatorsBigintDecimal() throws Exception { for (Long left : longLefts) { for (BigDecimal right : decimalRights) { assertExecute(generateExpression("%s = %s", left, right), BOOLEAN, left == null || right == null ? null : new BigDecimal(left).equals(right)); assertExecute(generateExpression("%s <> %s", left, right), BOOLEAN, left == null || right == null ? null : !new BigDecimal(left).equals(right)); assertExecute(generateExpression("%s > %s", left, right), BOOLEAN, left == null || right == null ? null : new BigDecimal(left).compareTo(right) > 0); assertExecute(generateExpression("%s < %s", left, right), BOOLEAN, left == null || right == null ? null : new BigDecimal(left).compareTo(right) < 0); assertExecute(generateExpression("%s >= %s", left, right), BOOLEAN, left == null || right == null ? null : new BigDecimal(left).compareTo(right) >= 0); assertExecute(generateExpression("%s <= %s", left, right), BOOLEAN, left == null || right == null ? null : new BigDecimal(left).compareTo(right) <= 0); assertExecute(generateExpression("nullif(%s, %s)", left, right), BIGINT, left); assertExecute(generateExpression("%s is distinct from %s", left, right), BOOLEAN, !Objects.equals(left == null ? null : new BigDecimal(left), right)); // arithmetic operators are already tested in TestDecimalOperators } } Futures.allAsList(futures).get(); }
@Test public void testBinaryOperatorsIntegerDecimal() throws Exception { for (Integer left : intLefts) { for (BigDecimal right : decimalRights) { assertExecute(generateExpression("%s = %s", left, right), BOOLEAN, left == null || right == null ? null : new BigDecimal(left).equals(right)); assertExecute(generateExpression("%s <> %s", left, right), BOOLEAN, left == null || right == null ? null : !new BigDecimal(left).equals(right)); assertExecute(generateExpression("%s > %s", left, right), BOOLEAN, left == null || right == null ? null : new BigDecimal(left).compareTo(right) > 0); assertExecute(generateExpression("%s < %s", left, right), BOOLEAN, left == null || right == null ? null : new BigDecimal(left).compareTo(right) < 0); assertExecute(generateExpression("%s >= %s", left, right), BOOLEAN, left == null || right == null ? null : new BigDecimal(left).compareTo(right) >= 0); assertExecute(generateExpression("%s <= %s", left, right), BOOLEAN, left == null || right == null ? null : new BigDecimal(left).compareTo(right) <= 0); assertExecute(generateExpression("nullif(%s, %s)", left, right), INTEGER, left); assertExecute(generateExpression("%s is distinct from %s", left, right), BOOLEAN, !Objects.equals(left == null ? null : new BigDecimal(left), right)); // arithmetic operators are already tested in TestDecimalOperators } } Futures.allAsList(futures).get(); }
@Test public void testBinaryOperatorsDecimalBigint() throws Exception { for (BigDecimal left : decimalLefts) { for (Long right : longRights) { assertExecute(generateExpression("%s = %s", left, right), BOOLEAN, left == null || right == null ? null : left.equals(new BigDecimal(right))); assertExecute(generateExpression("%s <> %s", left, right), BOOLEAN, left == null || right == null ? null : !left.equals(new BigDecimal(right))); assertExecute(generateExpression("%s > %s", left, right), BOOLEAN, left == null || right == null ? null : left.compareTo(new BigDecimal(right)) > 0); assertExecute(generateExpression("%s < %s", left, right), BOOLEAN, left == null || right == null ? null : left.compareTo(new BigDecimal(right)) < 0); assertExecute(generateExpression("%s >= %s", left, right), BOOLEAN, left == null || right == null ? null : left.compareTo(new BigDecimal(right)) >= 0); assertExecute(generateExpression("%s <= %s", left, right), BOOLEAN, left == null || right == null ? null : left.compareTo(new BigDecimal(right)) <= 0); assertExecute(generateExpression("nullif(%s, %s)", left, right), BigDecimal.class.cast(nullIf(left, right))); assertExecute(generateExpression("%s is distinct from %s", left, right), BOOLEAN, !Objects.equals(left, right == null ? null : new BigDecimal(right))); // arithmetic operators are already tested in TestDecimalOperators } } Futures.allAsList(futures).get(); }
@Test public void testBinaryOperatorsString() throws Exception { for (String left : stringLefts) { for (String right : stringRights) { assertExecute(generateExpression("%s = %s", left, right), BOOLEAN, left == null || right == null ? null : left.equals(right)); assertExecute(generateExpression("%s <> %s", left, right), BOOLEAN, left == null || right == null ? null : !left.equals(right)); assertExecute(generateExpression("%s > %s", left, right), BOOLEAN, left == null || right == null ? null : left.compareTo(right) > 0); assertExecute(generateExpression("%s < %s", left, right), BOOLEAN, left == null || right == null ? null : left.compareTo(right) < 0); assertExecute(generateExpression("%s >= %s", left, right), BOOLEAN, left == null || right == null ? null : left.compareTo(right) >= 0); assertExecute(generateExpression("%s <= %s", left, right), BOOLEAN, left == null || right == null ? null : left.compareTo(right) <= 0); assertExecute(generateExpression("%s || %s", left, right), VARCHAR, left == null || right == null ? null : left + right); assertExecute(generateExpression("%s is distinct from %s", left, right), BOOLEAN, !Objects.equals(left, right)); assertExecute(generateExpression("nullif(%s, %s)", left, right), varcharType(left), nullIf(left, right)); } } Futures.allAsList(futures).get(); }
@Test public void testBinaryOperatorsDecimalInteger() throws Exception { for (BigDecimal left : decimalLefts) { for (Integer right : intRights) { assertExecute(generateExpression("%s = %s", left, right), BOOLEAN, left == null || right == null ? null : left.equals(new BigDecimal(right))); assertExecute(generateExpression("%s <> %s", left, right), BOOLEAN, left == null || right == null ? null : !left.equals(new BigDecimal(right))); assertExecute(generateExpression("%s > %s", left, right), BOOLEAN, left == null || right == null ? null : left.compareTo(new BigDecimal(right)) > 0); assertExecute(generateExpression("%s < %s", left, right), BOOLEAN, left == null || right == null ? null : left.compareTo(new BigDecimal(right)) < 0); assertExecute(generateExpression("%s >= %s", left, right), BOOLEAN, left == null || right == null ? null : left.compareTo(new BigDecimal(right)) >= 0); assertExecute(generateExpression("%s <= %s", left, right), BOOLEAN, left == null || right == null ? null : left.compareTo(new BigDecimal(right)) <= 0); assertExecute(generateExpression("nullif(%s, %s)", left, right), BigDecimal.class.cast(nullIf(left, right))); assertExecute(generateExpression("%s is distinct from %s", left, right), BOOLEAN, !Objects.equals(left, right == null ? null : new BigDecimal(right))); // arithmetic operators are already tested in TestDecimalOperators } } Futures.allAsList(futures).get(); }
@Test public void testBinaryOperatorsBoolean() throws Exception { assertExecute("nullif(cast(null as boolean), true)", BOOLEAN, null); for (Boolean left : booleanValues) { for (Boolean right : booleanValues) { assertExecute(generateExpression("%s = %s", left, right), BOOLEAN, left == null || right == null ? null : left == right); assertExecute(generateExpression("%s <> %s", left, right), BOOLEAN, left == null || right == null ? null : left != right); assertExecute(generateExpression("nullif(%s, %s)", left, right), BOOLEAN, nullIf(left, right)); assertExecute(generateExpression("%s is distinct from %s", left, right), BOOLEAN, !Objects.equals(left, right)); } } Futures.allAsList(futures).get(); }
@Test public void testBinaryOperatorsDoubleDecimal() throws Exception { for (Double left : doubleLefts) { for (BigDecimal right : decimalRights) { assertExecute(generateExpression("%s = %s", left, right), BOOLEAN, left == null || right == null ? null : left == right.doubleValue()); assertExecute(generateExpression("%s <> %s", left, right), BOOLEAN, left == null || right == null ? null : left != right.doubleValue()); assertExecute(generateExpression("%s > %s", left, right), BOOLEAN, left == null || right == null ? null : left > right.doubleValue()); assertExecute(generateExpression("%s < %s", left, right), BOOLEAN, left == null || right == null ? null : left < right.doubleValue()); assertExecute(generateExpression("%s >= %s", left, right), BOOLEAN, left == null || right == null ? null : left >= right.doubleValue()); assertExecute(generateExpression("%s <= %s", left, right), BOOLEAN, left == null || right == null ? null : left <= right.doubleValue()); assertExecute(generateExpression("nullif(%s, %s)", left, right), DOUBLE, nullIf(left, right)); assertExecute(generateExpression("%s is distinct from %s", left, right), BOOLEAN, !Objects.equals(left, right == null ? null : right.doubleValue())); assertExecute(generateExpression("%s + %s", left, right), DOUBLE, left == null || right == null ? null : left + right.doubleValue()); assertExecute(generateExpression("%s - %s", left, right), DOUBLE, left == null || right == null ? null : left - right.doubleValue()); assertExecute(generateExpression("%s * %s", left, right), DOUBLE, left == null || right == null ? null : left * right.doubleValue()); assertExecute(generateExpression("%s / %s", left, right), DOUBLE, left == null || right == null ? null : left / right.doubleValue()); assertExecute(generateExpression("%s %% %s", left, right), DOUBLE, left == null || right == null ? null : left % right.doubleValue()); } } Futures.allAsList(futures).get(); }
@Test public void testBinaryOperatorsDoubleIntegral() throws Exception { for (Double left : doubleLefts) { for (Integer right : intRights) { assertExecute(generateExpression("CAST(%s as DOUBLE) = %s", left, right), BOOLEAN, left == null || right == null ? null : left == (double) right); assertExecute(generateExpression("CAST(%s as DOUBLE) <> %s", left, right), BOOLEAN, left == null || right == null ? null : left != (double) right); assertExecute(generateExpression("CAST(%s as DOUBLE) > %s", left, right), BOOLEAN, left == null || right == null ? null : left > (double) right); assertExecute(generateExpression("CAST(%s as DOUBLE) < %s", left, right), BOOLEAN, left == null || right == null ? null : left < (double) right); assertExecute(generateExpression("CAST(%s as DOUBLE) >= %s", left, right), BOOLEAN, left == null || right == null ? null : left >= (double) right); assertExecute(generateExpression("CAST(%s as DOUBLE) <= %s", left, right), BOOLEAN, left == null || right == null ? null : left <= (double) right); assertExecute(generateExpression("nullif(CAST(%s as DOUBLE), %s)", left, right), DOUBLE, nullIf(left, right)); assertExecute(generateExpression("CAST(%s as DOUBLE) is distinct from %s", left, right), BOOLEAN, !Objects.equals(left, right == null ? null : right.doubleValue())); assertExecute(generateExpression("CAST(%s as DOUBLE) + %s", left, right), DOUBLE, left == null || right == null ? null : left + right); assertExecute(generateExpression("CAST(%s as DOUBLE) - %s", left, right), DOUBLE, left == null || right == null ? null : left - right); assertExecute(generateExpression("CAST(%s as DOUBLE) * %s", left, right), DOUBLE, left == null || right == null ? null : left * right); assertExecute(generateExpression("CAST(%s as DOUBLE) / %s", left, right), DOUBLE, left == null || right == null ? null : left / right); assertExecute(generateExpression("CAST(%s as DOUBLE) %% %s", left, right), DOUBLE, left == null || right == null ? null : left % right); } } Futures.allAsList(futures).get(); }
@Test public void testBinaryOperatorsDoubleDouble() throws Exception { for (Double left : doubleLefts) { for (Double right : doubleRights) { assertExecute(generateExpression("%s = %s", left, right), BOOLEAN, left == null || right == null ? null : (double) left == right); assertExecute(generateExpression("%s <> %s", left, right), BOOLEAN, left == null || right == null ? null : (double) left != right); assertExecute(generateExpression("%s > %s", left, right), BOOLEAN, left == null || right == null ? null : (double) left > right); assertExecute(generateExpression("%s < %s", left, right), BOOLEAN, left == null || right == null ? null : (double) left < right); assertExecute(generateExpression("%s >= %s", left, right), BOOLEAN, left == null || right == null ? null : (double) left >= right); assertExecute(generateExpression("%s <= %s", left, right), BOOLEAN, left == null || right == null ? null : (double) left <= right); assertExecute(generateExpression("nullif(%s, %s)", left, right), DOUBLE, nullIf(left, right)); assertExecute(generateExpression("%s is distinct from %s", left, right), BOOLEAN, !Objects.equals(left, right)); assertExecute(generateExpression("%s + %s", left, right), DOUBLE, left == null || right == null ? null : left + right); assertExecute(generateExpression("%s - %s", left, right), DOUBLE, left == null || right == null ? null : left - right); assertExecute(generateExpression("%s * %s", left, right), DOUBLE, left == null || right == null ? null : left * right); assertExecute(generateExpression("%s / %s", left, right), DOUBLE, left == null || right == null ? null : left / right); assertExecute(generateExpression("%s %% %s", left, right), DOUBLE, left == null || right == null ? null : left % right); } } Futures.allAsList(futures).get(); }
@Test public void testBinaryOperatorsDecimalDouble() throws Exception { for (BigDecimal left : decimalLefts) { for (Double right : doubleRights) { assertExecute(generateExpression("%s = %s", left, right), BOOLEAN, left == null || right == null ? null : left.doubleValue() == right); assertExecute(generateExpression("%s <> %s", left, right), BOOLEAN, left == null || right == null ? null : left.doubleValue() != right); assertExecute(generateExpression("%s > %s", left, right), BOOLEAN, left == null || right == null ? null : left.doubleValue() > right); assertExecute(generateExpression("%s < %s", left, right), BOOLEAN, left == null || right == null ? null : left.doubleValue() < right); assertExecute(generateExpression("%s >= %s", left, right), BOOLEAN, left == null || right == null ? null : left.doubleValue() >= right); assertExecute(generateExpression("%s <= %s", left, right), BOOLEAN, left == null || right == null ? null : left.doubleValue() <= right); assertExecute(generateExpression("nullif(%s, %s)", left, right), BigDecimal.class.cast(nullIf(left, right))); assertExecute(generateExpression("%s is distinct from %s", left, right), BOOLEAN, !Objects.equals(left == null ? null : left.doubleValue(), right)); assertExecute(generateExpression("%s + %s", left, right), DOUBLE, left == null || right == null ? null : left.doubleValue() + right); assertExecute(generateExpression("%s - %s", left, right), DOUBLE, left == null || right == null ? null : left.doubleValue() - right); assertExecute(generateExpression("%s * %s", left, right), DOUBLE, left == null || right == null ? null : left.doubleValue() * right); assertExecute(generateExpression("%s / %s", left, right), DOUBLE, left == null || right == null ? null : left.doubleValue() / right); assertExecute(generateExpression("%s %% %s", left, right), DOUBLE, left == null || right == null ? null : left.doubleValue() % right); } } Futures.allAsList(futures).get(); }
@Test public void testIf() throws Exception { assertExecute("if(null and true, BIGINT '1', 0)", BIGINT, 0L); assertExecute("if(null and true, 1, 0)", INTEGER, 0); for (Boolean condition : booleanValues) { for (String trueValue : stringLefts) { for (String falseValue : stringRights) { assertExecute( generateExpression("if(%s, %s, %s)", condition, trueValue, falseValue), varcharType(trueValue, falseValue), condition != null && condition ? trueValue : falseValue); } } } Futures.allAsList(futures).get(); }
@Test public void testExtract() throws Exception { for (DateTime left : dateTimeValues) { for (Field field : Field.values()) { Long expected = null; Long millis = null; if (left != null) { millis = left.getMillis(); expected = callExtractFunction(TEST_SESSION.toConnectorSession(), millis, field); } DateTimeZone zone = getDateTimeZone(TEST_SESSION.getTimeZoneKey()); long zoneOffsetMinutes = millis != null ? MILLISECONDS.toMinutes(zone.getOffset(millis)) : 0; String expressionPattern = format( "extract(%s from from_unixtime(%%s / 1000.0E0, %s, %s))", field, zoneOffsetMinutes / 60, zoneOffsetMinutes % 60); assertExecute(generateExpression(expressionPattern, millis), BIGINT, expected); } } Futures.allAsList(futures).get(); }
@Test public void testLike() throws Exception { for (String value : stringLefts) { for (String pattern : stringLefts) { Boolean expected = null; if (value != null && pattern != null) { Regex regex = LikeFunctions.likePattern(utf8Slice(pattern), utf8Slice("\\")); expected = LikeFunctions.likeVarchar(utf8Slice(value), regex); } assertExecute(generateExpression("%s like %s", value, pattern), BOOLEAN, expected); } } Futures.allAsList(futures).get(); }
@Test public void testFunctionCallRegexp() throws Exception { for (String value : stringLefts) { for (String pattern : stringRights) { assertExecute(generateExpression("regexp_like(%s, %s)", value, pattern), BOOLEAN, value == null || pattern == null ? null : JoniRegexpFunctions.regexpLike(utf8Slice(value), joniRegexp(utf8Slice(pattern)))); assertExecute(generateExpression("regexp_replace(%s, %s)", value, pattern), value == null ? VARCHAR : createVarcharType(value.length()), value == null || pattern == null ? null : JoniRegexpFunctions.regexpReplace(utf8Slice(value), joniRegexp(utf8Slice(pattern)))); assertExecute(generateExpression("regexp_extract(%s, %s)", value, pattern), value == null ? VARCHAR : createVarcharType(value.length()), value == null || pattern == null ? null : JoniRegexpFunctions.regexpExtract(utf8Slice(value), joniRegexp(utf8Slice(pattern)))); } } Futures.allAsList(futures).get(); }