Document the between operator in SpEL

Closes gh-32140
This commit is contained in:
Sam Brannen
2024-01-29 18:34:12 +01:00
parent e97fc7be38
commit 84cce6018c
3 changed files with 148 additions and 57 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2022 the original author or authors.
* Copyright 2002-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,12 +26,18 @@ import org.springframework.expression.spel.SpelMessage;
import org.springframework.expression.spel.support.BooleanTypedValue;
/**
* Represents the between operator. The left operand to between must be a single value and
* the right operand must be a list - this operator returns true if the left operand is
* between (using the registered comparator) the two elements in the list. The definition
* of between being inclusive follows the SQL BETWEEN definition.
* Represents the {@code between} operator.
*
* <p>The left operand must be a single value, and the right operand must be a
* 2-element list which defines the range.
*
* <p>This operator returns {@code true} if the left operand is between the two
* elements in the range, inclusive (using the registered {@link TypeComparator}
* for comparison). In addition, the first element in the range must be less than
* or equal to the second element in the range.
*
* @author Andy Clement
* @author Sam Brannen
* @since 3.0
*/
public class OperatorBetween extends Operator {

View File

@@ -221,6 +221,7 @@ class SpelDocumentationTests extends AbstractExpressionTests {
void relationalOperators() {
boolean result = parser.parseExpression("2 == 2").getValue(Boolean.class);
assertThat(result).isTrue();
// evaluates to false
result = parser.parseExpression("2 < -5.0").getValue(Boolean.class);
assertThat(result).isFalse();
@@ -232,17 +233,47 @@ class SpelDocumentationTests extends AbstractExpressionTests {
@Test
void otherOperators() {
// evaluates to false
boolean falseValue = parser.parseExpression("'xyz' instanceof T(int)").getValue(Boolean.class);
assertThat(falseValue).isFalse();
boolean result;
// evaluates to true
boolean trueValue = parser.parseExpression("'5.00' matches '^-?\\d+(\\.\\d{2})?$'").getValue(Boolean.class);
assertThat(trueValue).isTrue();
result = parser.parseExpression(
"1 between {1, 5}").getValue(Boolean.class);
assertThat(result).isTrue();
//evaluates to false
falseValue = parser.parseExpression("'5.0067' matches '^-?\\d+(\\.\\d{2})?$'").getValue(Boolean.class);
assertThat(falseValue).isFalse();
// evaluates to false
result = parser.parseExpression(
"1 between {10, 15}").getValue(Boolean.class);
assertThat(result).isFalse();
// evaluates to true
result = parser.parseExpression(
"'elephant' between {'aardvark', 'zebra'}").getValue(Boolean.class);
assertThat(result).isTrue();
// evaluates to false
result = parser.parseExpression(
"'elephant' between {'aardvark', 'cobra'}").getValue(Boolean.class);
assertThat(result).isFalse();
// evaluates to true
result = parser.parseExpression(
"123 instanceof T(Integer)").getValue(Boolean.class);
assertThat(result).isTrue();
// evaluates to false
result = parser.parseExpression(
"'xyz' instanceof T(Integer)").getValue(Boolean.class);
assertThat(result).isFalse();
// evaluates to true
result = parser.parseExpression(
"'5.00' matches '^-?\\d+(\\.\\d{2})?$'").getValue(Boolean.class);
assertThat(result).isTrue();
// evaluates to false
result = parser.parseExpression(
"'5.0067' matches '^-?\\d+(\\.\\d{2})?$'").getValue(Boolean.class);
assertThat(result).isFalse();
}
@Test