Skip to content

Commit 9dcb6ac

Browse files
authored
Adds Modulus, LOWER, and UPPER functions (#97)
1 parent cbf0d4e commit 9dcb6ac

File tree

5 files changed

+64
-3
lines changed

5 files changed

+64
-3
lines changed

src/main/java/com/yahoo/bullet/query/expressions/Operation.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public enum Operation {
2121
SUB("-"),
2222
MUL("*"),
2323
DIV("/"),
24+
MOD("%"),
2425
EQUALS("="),
2526
EQUALS_ANY("= ANY"),
2627
EQUALS_ALL("= ALL"),
@@ -62,17 +63,19 @@ public enum Operation {
6263
BETWEEN("BETWEEN"),
6364
NOT_BETWEEN("NOT BETWEEN"),
6465
SUBSTRING("SUBSTRING"),
65-
UNIX_TIMESTAMP("UNIXTIMESTAMP");
66+
UNIX_TIMESTAMP("UNIXTIMESTAMP"),
67+
LOWER("LOWER"),
68+
UPPER("UPPER");
6669

6770
public static final Set<Operation> BINARY_OPERATIONS =
68-
new HashSet<>(asList(ADD, SUB, MUL, DIV,
71+
new HashSet<>(asList(ADD, SUB, MUL, DIV, MOD,
6972
EQUALS, EQUALS_ANY, EQUALS_ALL, NOT_EQUALS, NOT_EQUALS_ANY, NOT_EQUALS_ALL,
7073
GREATER_THAN, GREATER_THAN_ANY, GREATER_THAN_ALL, LESS_THAN, LESS_THAN_ANY, LESS_THAN_ALL,
7174
GREATER_THAN_OR_EQUALS, GREATER_THAN_OR_EQUALS_ANY, GREATER_THAN_OR_EQUALS_ALL,
7275
LESS_THAN_OR_EQUALS, LESS_THAN_OR_EQUALS_ANY, LESS_THAN_OR_EQUALS_ALL, REGEX_LIKE, REGEX_LIKE_ANY,
7376
NOT_REGEX_LIKE, NOT_REGEX_LIKE_ANY, SIZE_IS, CONTAINS_KEY, CONTAINS_VALUE, IN, NOT_IN,
7477
AND, OR, XOR, FILTER));
75-
public static final Set<Operation> UNARY_OPERATIONS = new HashSet<>(asList(NOT, SIZE_OF, IS_NULL, IS_NOT_NULL, TRIM, ABS));
78+
public static final Set<Operation> UNARY_OPERATIONS = new HashSet<>(asList(NOT, SIZE_OF, IS_NULL, IS_NOT_NULL, TRIM, ABS, LOWER, UPPER));
7679
public static final Set<Operation> N_ARY_OPERATIONS = new HashSet<>(asList(AND, OR, IF, BETWEEN, NOT_BETWEEN, SUBSTRING, UNIX_TIMESTAMP));
7780

7881
private String name;

src/main/java/com/yahoo/bullet/querying/evaluators/BinaryOperations.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public interface BinaryOperator extends Serializable {
3737
BINARY_OPERATORS.put(Operation.SUB, BinaryOperations::sub);
3838
BINARY_OPERATORS.put(Operation.MUL, BinaryOperations::mul);
3939
BINARY_OPERATORS.put(Operation.DIV, BinaryOperations::div);
40+
BINARY_OPERATORS.put(Operation.MOD, BinaryOperations::mod);
4041
BINARY_OPERATORS.put(Operation.EQUALS, BinaryOperations::equals);
4142
BINARY_OPERATORS.put(Operation.EQUALS_ANY, BinaryOperations::equalsAny);
4243
BINARY_OPERATORS.put(Operation.EQUALS_ALL, BinaryOperations::equalsAll);
@@ -134,6 +135,22 @@ static TypedObject div(Evaluator left, Evaluator right, BulletRecord record) {
134135
});
135136
}
136137

138+
static TypedObject mod(Evaluator left, Evaluator right, BulletRecord record) {
139+
return checkNull(left, right, record, (leftValue, rightValue) -> {
140+
Type type = getArithmeticResultType(leftValue.getType(), rightValue.getType());
141+
switch (type) {
142+
case DOUBLE:
143+
return new TypedObject(Type.DOUBLE, getDouble(leftValue) % getDouble(rightValue));
144+
case FLOAT:
145+
return new TypedObject(Type.FLOAT, getFloat(leftValue) % getFloat(rightValue));
146+
case LONG:
147+
return new TypedObject(Type.LONG, getLong(leftValue) % getLong(rightValue));
148+
default:
149+
return new TypedObject(Type.INTEGER, getInteger(leftValue) % getInteger(rightValue));
150+
}
151+
});
152+
}
153+
137154
static TypedObject equals(Evaluator left, Evaluator right, BulletRecord record) {
138155
return checkNull(left, right, record, (leftValue, rightValue) -> TypedObject.valueOf(leftValue.equalTo(rightValue)));
139156
}

src/main/java/com/yahoo/bullet/querying/evaluators/UnaryOperations.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ public interface UnaryOperator extends Serializable {
3333
UNARY_OPERATORS.put(Operation.IS_NOT_NULL, UnaryOperations::isNotNull);
3434
UNARY_OPERATORS.put(Operation.TRIM, UnaryOperations::trim);
3535
UNARY_OPERATORS.put(Operation.ABS, UnaryOperations::abs);
36+
UNARY_OPERATORS.put(Operation.LOWER, UnaryOperations::lower);
37+
UNARY_OPERATORS.put(Operation.UPPER, UnaryOperations::upper);
3638
}
3739

3840
static TypedObject not(Evaluator evaluator, BulletRecord record) {
@@ -58,6 +60,20 @@ static TypedObject trim(Evaluator evaluator, BulletRecord record) {
5860
});
5961
}
6062

63+
static TypedObject lower(Evaluator evaluator, BulletRecord record) {
64+
return checkNull(evaluator, record, value -> {
65+
String str = (String) value.getValue();
66+
return TypedObject.valueOf(str.toLowerCase());
67+
});
68+
}
69+
70+
static TypedObject upper(Evaluator evaluator, BulletRecord record) {
71+
return checkNull(evaluator, record, value -> {
72+
String str = (String) value.getValue();
73+
return TypedObject.valueOf(str.toUpperCase());
74+
});
75+
}
76+
6177
static TypedObject abs(Evaluator evaluator, BulletRecord record) {
6278
return checkNull(evaluator, record, value -> {
6379
Number number = (Number) value.getValue();

src/test/java/com/yahoo/bullet/querying/evaluators/BinaryOperationsTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,17 @@ public void testDiv() {
7171
Assert.assertEquals(BinaryOperations.div(valueEvaluator(null), valueEvaluator(null), null), TypedObject.NULL);
7272
}
7373

74+
@Test
75+
public void testMod() {
76+
Assert.assertEquals(BinaryOperations.mod(valueEvaluator(7.0), valueEvaluator(4.0f), null), new TypedObject(Type.DOUBLE, 3.0));
77+
Assert.assertEquals(BinaryOperations.mod(valueEvaluator(5.0f), valueEvaluator(4L), null), new TypedObject(Type.FLOAT, 1.0f));
78+
Assert.assertEquals(BinaryOperations.mod(valueEvaluator(6L), valueEvaluator(4), null), new TypedObject(Type.LONG, 2L));
79+
Assert.assertEquals(BinaryOperations.mod(valueEvaluator(4), valueEvaluator(4), null), new TypedObject(Type.INTEGER, 0));
80+
Assert.assertEquals(BinaryOperations.mod(valueEvaluator(null), valueEvaluator(4), null), TypedObject.NULL);
81+
Assert.assertEquals(BinaryOperations.mod(valueEvaluator(2), valueEvaluator(null), null), TypedObject.NULL);
82+
Assert.assertEquals(BinaryOperations.mod(valueEvaluator(null), valueEvaluator(null), null), TypedObject.NULL);
83+
}
84+
7485
@Test
7586
public void testEquals() {
7687
Assert.assertEquals(BinaryOperations.equals(valueEvaluator(2), valueEvaluator(4), null), TypedObject.FALSE);

src/test/java/com/yahoo/bullet/querying/evaluators/UnaryOperationsTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,18 @@ public void testAbs() {
6969
Assert.assertEquals(UnaryOperations.abs(valueEvaluator(-2), null), TypedObject.valueOf(2));
7070
Assert.assertEquals(UnaryOperations.abs(valueEvaluator(null), null), TypedObject.NULL);
7171
}
72+
73+
@Test
74+
public void testLower() {
75+
Assert.assertEquals(UnaryOperations.lower(valueEvaluator("HELLO"), null), TypedObject.valueOf("hello"));
76+
Assert.assertEquals(UnaryOperations.lower(valueEvaluator("hello"), null), TypedObject.valueOf("hello"));
77+
Assert.assertEquals(UnaryOperations.lower(valueEvaluator(null), null), TypedObject.NULL);
78+
}
79+
80+
@Test
81+
public void testUpper() {
82+
Assert.assertEquals(UnaryOperations.upper(valueEvaluator("HELLO"), null), TypedObject.valueOf("HELLO"));
83+
Assert.assertEquals(UnaryOperations.upper(valueEvaluator("hello"), null), TypedObject.valueOf("HELLO"));
84+
Assert.assertEquals(UnaryOperations.upper(valueEvaluator(null), null), TypedObject.NULL);
85+
}
7286
}

0 commit comments

Comments
 (0)