Skip to content

Commit bc6b0f3

Browse files
feat: add concat or null operator (#93)
1 parent aceb6fd commit bc6b0f3

File tree

4 files changed

+51
-4
lines changed

4 files changed

+51
-4
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.hypertrace.core.attribute.service.projection.functions;
2+
3+
import static java.util.Objects.isNull;
4+
5+
import javax.annotation.Nullable;
6+
7+
public class ConcatenateOrNull {
8+
9+
@Nullable
10+
public static String concatenate(@Nullable String first, @Nullable String second) {
11+
if (isNull(first) || isNull(second)) {
12+
return null;
13+
}
14+
return first + second;
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.hypertrace.core.attribute.service.projection.functions;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNull;
5+
6+
import org.junit.jupiter.api.Test;
7+
8+
class ConcatenateOrNullTest {
9+
10+
@Test
11+
void concatenatesNormalStrings() {
12+
assertEquals("foobar", ConcatenateOrNull.concatenate("foo", "bar"));
13+
assertEquals("foo", ConcatenateOrNull.concatenate("foo", ""));
14+
assertEquals("bar", ConcatenateOrNull.concatenate("", "bar"));
15+
}
16+
17+
@Test
18+
void returnsNullIfAnyNullArgs() {
19+
assertNull(ConcatenateOrNull.concatenate("foo", null));
20+
assertNull(ConcatenateOrNull.concatenate(null, "bar"));
21+
assertNull(ConcatenateOrNull.concatenate(null, null));
22+
}
23+
}

attribute-projection-registry/src/main/java/org/hypertrace/core/attribute/service/projection/AttributeProjectionRegistry.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,21 @@
22

33
import static org.hypertrace.core.attribute.service.projection.AttributeKindWithNullability.nonNullableKind;
44
import static org.hypertrace.core.attribute.service.projection.AttributeKindWithNullability.nullableKind;
5-
import static org.hypertrace.core.attribute.service.v1.AttributeKind.*;
5+
import static org.hypertrace.core.attribute.service.v1.AttributeKind.TYPE_BOOL;
6+
import static org.hypertrace.core.attribute.service.v1.AttributeKind.TYPE_STRING;
67
import static org.hypertrace.core.attribute.service.v1.ProjectionOperator.PROJECTION_OPERATOR_CONCAT;
8+
import static org.hypertrace.core.attribute.service.v1.ProjectionOperator.PROJECTION_OPERATOR_CONCAT_OR_NULL;
79
import static org.hypertrace.core.attribute.service.v1.ProjectionOperator.PROJECTION_OPERATOR_CONDITIONAL;
810
import static org.hypertrace.core.attribute.service.v1.ProjectionOperator.PROJECTION_OPERATOR_HASH;
911
import static org.hypertrace.core.attribute.service.v1.ProjectionOperator.PROJECTION_OPERATOR_STRING_EQUALS;
1012

1113
import java.util.Map;
1214
import java.util.Optional;
1315
import org.hypertrace.core.attribute.service.projection.functions.Concatenate;
16+
import org.hypertrace.core.attribute.service.projection.functions.ConcatenateOrNull;
1417
import org.hypertrace.core.attribute.service.projection.functions.Conditional;
1518
import org.hypertrace.core.attribute.service.projection.functions.Equals;
1619
import org.hypertrace.core.attribute.service.projection.functions.Hash;
17-
import org.hypertrace.core.attribute.service.v1.AttributeKind;
1820
import org.hypertrace.core.attribute.service.v1.ProjectionOperator;
1921

2022
public class AttributeProjectionRegistry {
@@ -42,8 +44,13 @@ public class AttributeProjectionRegistry {
4244
nullableKind(TYPE_BOOL),
4345
nullableKind(TYPE_STRING),
4446
nullableKind(TYPE_STRING),
45-
Conditional::getValue
46-
));
47+
Conditional::getValue),
48+
PROJECTION_OPERATOR_CONCAT_OR_NULL,
49+
new BinaryAttributeProjection<>(
50+
nullableKind(TYPE_STRING),
51+
nullableKind(TYPE_STRING),
52+
nullableKind(TYPE_STRING),
53+
ConcatenateOrNull::concatenate));
4754

4855
public Optional<AttributeProjection> getProjection(ProjectionOperator projectionOperator) {
4956
return Optional.ofNullable(PROJECTION_MAP.get(projectionOperator));

attribute-service-api/src/main/proto/org/hypertrace/core/attribute/service/v1/attribute_metadata.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,4 +187,5 @@ enum ProjectionOperator {
187187
PROJECTION_OPERATOR_HASH = 2;
188188
PROJECTION_OPERATOR_STRING_EQUALS = 3;
189189
PROJECTION_OPERATOR_CONDITIONAL = 4;
190+
PROJECTION_OPERATOR_CONCAT_OR_NULL = 5;
190191
}

0 commit comments

Comments
 (0)