@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 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 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 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 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 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 testBinaryOperatorsIntegralDouble() throws Exception { for (Integer left : intLefts) { 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); Object expectedNullIf = nullIf(left, right); for (String expression : generateExpression("nullif(%s, CAST(%s as DOUBLE))", left, right)) { functionAssertions.assertFunction(expression, INTEGER, expectedNullIf); } 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 + 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 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 testBinaryOperatorsIntegralIntegral() throws Exception { for (Integer left : smallInts) { for (Integer right : intRights) { assertExecute(generateExpression("%s = %s", left, right), BOOLEAN, left == null || right == null ? null : (long) left == right); assertExecute(generateExpression("%s <> %s", left, right), BOOLEAN, left == null || right == null ? null : (long) left != right); assertExecute(generateExpression("%s > %s", left, right), BOOLEAN, left == null || right == null ? null : (long) left > right); assertExecute(generateExpression("%s < %s", left, right), BOOLEAN, left == null || right == null ? null : (long) left < right); assertExecute(generateExpression("%s >= %s", left, right), BOOLEAN, left == null || right == null ? null : (long) left >= right); assertExecute(generateExpression("%s <= %s", left, right), BOOLEAN, left == null || right == null ? null : (long) left <= right); assertExecute(generateExpression("nullif(%s, %s)", left, right), INTEGER, nullIf(left, right)); assertExecute(generateExpression("%s is distinct from %s", left, right), BOOLEAN, !Objects.equals(left, right)); assertExecute(generateExpression("%s + %s", left, right), INTEGER, left == null || right == null ? null : left + right); assertExecute(generateExpression("%s - %s", left, right), INTEGER, left == null || right == null ? null : left - right); assertExecute(generateExpression("%s * %s", left, right), INTEGER, left == null || right == null ? null : left * right); assertExecute(generateExpression("%s / %s", left, right), INTEGER, left == null || right == null ? null : left / right); assertExecute(generateExpression("%s %% %s", left, right), INTEGER, left == null || right == null ? null : left % right); Long longLeft = left == null ? null : left * 1000000000L; assertExecute(generateExpression("%s + %s", longLeft, right), BIGINT, longLeft == null || right == null ? null : longLeft + right); assertExecute(generateExpression("%s - %s", longLeft, right), BIGINT, longLeft == null || right == null ? null : longLeft - right); assertExecute(generateExpression("%s * %s", longLeft, right), BIGINT, longLeft == null || right == null ? null : longLeft * right); assertExecute(generateExpression("%s / %s", longLeft, right), BIGINT, longLeft == null || right == null ? null : longLeft / right); assertExecute(generateExpression("%s %% %s", longLeft, right), BIGINT, longLeft == null || right == null ? null : longLeft % right); } } 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 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 testBinaryOperatorsDoubleLong() throws Exception { for (Double left : doubleLefts) { for (Long right : longRights) { assertExecute(generateExpression("%s = %s", left, right), BOOLEAN, left == null || right == null ? null : left == (double) right); assertExecute(generateExpression("%s <> %s", left, right), BOOLEAN, left == null || right == null ? null : left != (double) right); assertExecute(generateExpression("%s > %s", left, right), BOOLEAN, left == null || right == null ? null : left > (double) right); assertExecute(generateExpression("%s < %s", left, right), BOOLEAN, left == null || right == null ? null : left < (double) right); assertExecute(generateExpression("%s >= %s", left, right), BOOLEAN, left == null || right == null ? null : left >= (double) right); assertExecute(generateExpression("%s <= %s", left, right), BOOLEAN, left == null || right == null ? null : left <= (double) 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 == null ? null : right.doubleValue())); 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 testBinaryOperatorsLongDouble() throws Exception { for (Long left : longLefts) { 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); Object expectedNullIf = nullIf(left, right); for (String expression : generateExpression("nullif(%s, %s)", left, right)) { functionAssertions.assertFunction(expression, BIGINT, expectedNullIf); } 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 + 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 testBinaryOperatorsLongLong() throws Exception { for (Long left : longLefts) { for (Long right : longRights) { assertExecute(generateExpression("%s = %s", left, right), BOOLEAN, left == null || right == null ? null : (long) left == right); assertExecute(generateExpression("%s <> %s", left, right), BOOLEAN, left == null || right == null ? null : (long) left != right); assertExecute(generateExpression("%s > %s", left, right), BOOLEAN, left == null || right == null ? null : (long) left > right); assertExecute(generateExpression("%s < %s", left, right), BOOLEAN, left == null || right == null ? null : (long) left < right); assertExecute(generateExpression("%s >= %s", left, right), BOOLEAN, left == null || right == null ? null : (long) left >= right); assertExecute(generateExpression("%s <= %s", left, right), BOOLEAN, left == null || right == null ? null : (long) left <= right); assertExecute(generateExpression("nullif(%s, %s)", left, right), BIGINT, nullIf(left, right)); assertExecute(generateExpression("%s is distinct from %s", left, right), BOOLEAN, !Objects.equals(left, right)); assertExecute(generateExpression("%s + %s", left, right), BIGINT, left == null || right == null ? null : left + right); assertExecute(generateExpression("%s - %s", left, right), BIGINT, left == null || right == null ? null : left - right); assertExecute(generateExpression("%s * %s", left, right), BIGINT, left == null || right == null ? null : left * right); assertExecute(generateExpression("%s / %s", left, right), BIGINT, left == null || right == null ? null : left / right); assertExecute(generateExpression("%s %% %s", left, right), BIGINT, 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(); }