Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,23 @@ static Object qualify(Object target, ImmutableList<SelectField> fields, int from
return current;
}

/**
* Presence tests every field in {@code fields} in turn, returning the terminal value or empty if
* any field is absent.
*/
public static Optional<Object> find(Object target, ImmutableList<SelectField> fields) {
Optional<Object> current = Optional.empty();
Object next = target;
for (int i = 0; i < fields.size(); i++) {
current = navigateField(next, fields.get(i));
if (!current.isPresent()) {
return Optional.empty();
}
next = current.get();
}
return current;
}

/**
* Presence tests the terminal field of {@code fields}, navigating through all preceding fields.
*/
Expand All @@ -77,9 +94,6 @@ public static boolean hasField(Object target, ImmutableList<SelectField> fields)
// StructValue is only ever instantiated with String keys in the select path.
@SuppressWarnings("unchecked")
private static Object qualifyField(Object target, SelectField field) {
if (target instanceof ErrorValue) {
return target;
}
if (target instanceof OptimizedSelectable) {
return ((OptimizedSelectable) target).selectByFieldNumber(field);
}
Expand All @@ -99,9 +113,6 @@ private static Object qualifyField(Object target, SelectField field) {
// StructValue is only ever instantiated with String keys in the select path.
@SuppressWarnings("unchecked")
private static Optional<Object> navigateField(Object target, SelectField field) {
if (target instanceof ErrorValue) {
return Optional.of(target);
}
if (target instanceof OptimizedSelectable) {
return ((OptimizedSelectable) target).findByFieldNumber(field);
}
Expand All @@ -114,9 +125,6 @@ private static Optional<Object> navigateField(Object target, SelectField field)
// StructValue is only ever instantiated with String keys in the select path.
@SuppressWarnings("unchecked")
private static boolean hasTerminalField(Object target, SelectField field) {
if (target instanceof ErrorValue) {
return false;
}
if (target instanceof OptimizedSelectable) {
return ((OptimizedSelectable) target).hasFieldByNumber(field);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,25 +271,28 @@ public void hasField_unsupportedTarget_throwsException() {
}

@Test
public void qualify_errorValue_propagatesError() {
ErrorValue error = ErrorValue.create(1L, new RuntimeException("test error"));
ImmutableList<SelectField> fields =
ImmutableList.of(SelectField.create(1L, "field1"), SelectField.create(2L, "field2"));

Object result = OptimizedSelectTraversal.qualify(error, fields);
public void find_emptyFields_returnsEmpty() {
Optional<Object> result = OptimizedSelectTraversal.find(new Object(), ImmutableList.of());

assertThat(result).isSameInstanceAs(error);
assertThat(result).isEmpty();
}

@Test
public void hasField_errorValue_returnsFalse() {
ErrorValue error = ErrorValue.create(1L, new RuntimeException("test error"));
public void find_nestedFields(
@TestParameter TargetType targetType, @TestParameter NestedPresenceTestCase testCase) {
Object target = targetType.createNestedTarget(testCase.innerData);
ImmutableList<SelectField> fields =
ImmutableList.of(SelectField.create(1L, "field1"), SelectField.create(2L, "field2"));
ImmutableList.of(
SelectField.create(1L, testCase.outerField),
SelectField.create(2L, testCase.innerField));

boolean result = OptimizedSelectTraversal.hasField(error, fields);
Optional<Object> result = OptimizedSelectTraversal.find(target, fields);

assertThat(result).isFalse();
if (testCase.expected) {
assertThat(result).hasValue("nested_val");
} else {
assertThat(result).isEmpty();
}
}

@SuppressWarnings("Immutable")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,13 @@ final class DefaultOptimizerConstants {
.build();

static final String CEL_ATTRIBUTE_FUNCTION_NAME = "cel.@attribute";
static final String CEL_OPTIONAL_ATTRIBUTE_FUNCTION_NAME = "cel.@optionalAttribute";
static final String CEL_HAS_FIELD_FUNCTION_NAME = "cel.@hasField";
static final ImmutableSet<String> SELECT_OPTIMIZED_FUNCTION_NAMES =
ImmutableSet.of(
CEL_ATTRIBUTE_FUNCTION_NAME,
CEL_OPTIONAL_ATTRIBUTE_FUNCTION_NAME,
CEL_HAS_FIELD_FUNCTION_NAME);

private DefaultOptimizerConstants() {}
}
Loading
Loading