Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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 @@ -130,6 +130,8 @@ private static Filter transform(AttributeFilter filter) {
return transformToEqFilterWithValueListRhs(filter);
} else if (ATTRIBUTES_LABELS_FIELD_NAME.equals(filter.getName()) && filter.getOperator() == Operator.IN) {
return transformToOrFilterChainForStrArray(filter);
} else if (ATTRIBUTES_LABELS_FIELD_NAME.equals(filter.getName()) && filter.getOperator() == Operator.NOT_IN) {
Comment thread
skjindal93 marked this conversation as resolved.
return transformToAndFilterChainForStrArray(filter);
} else {
return transformNonListRhsFilterTypes(filter);
}
Expand Down Expand Up @@ -183,6 +185,23 @@ private static Filter transformToOrFilterChainForStrArray(AttributeFilter attrib
return f;
}

private static Filter transformToAndFilterChainForStrArray(AttributeFilter attributeFilter) {
Comment thread
skjindal93 marked this conversation as resolved.
String fieldName = attributeFilter.getName() + VALUE_LIST_VALUES_CONST;

Filter f = new Filter();
f.setFieldName("");
f.setOp(Op.AND);

f.setChildFilters(
attributeFilter.getAttributeValue().getValueList().getValuesList().stream()
.map(rhsAttributeValue -> createNeqFilterForAttributeValue(fieldName, rhsAttributeValue))
.collect(Collectors.toList())
.toArray(new Filter[]{})
);

return f;
}

private static Filter transformToEqFilterWithValueListRhs(AttributeFilter attributeFilter) {
String fieldName = attributeFilter.getName() + VALUE_LIST_VALUES_CONST;
return createEqFilterForAttributeValue(fieldName, attributeFilter.getAttributeValue());
Expand All @@ -192,24 +211,36 @@ private static Filter createEqFilterForAttributeValue(String fieldName, Attribut
Filter f = new Filter();
f.setFieldName(fieldName);
f.setOp(Op.EQ);
f.setValue(prepareRhsValueForSpecialValueListCase(attributeValue));
// Set child filters to empty array
f.setChildFilters(new Filter[]{});
return f;
}

private static Filter createNeqFilterForAttributeValue(String fieldName, AttributeValue attributeValue) {
Filter f = new Filter();
f.setFieldName(fieldName);
f.setOp(Op.NEQ);
Comment thread
skjindal93 marked this conversation as resolved.
f.setValue(prepareRhsValueForSpecialValueListCase(attributeValue));
// Set child filters to empty array
f.setChildFilters(new Filter[]{});
return f;
}

private static Object prepareRhsValueForSpecialValueListCase(AttributeValue attributeValue) {
org.hypertrace.entity.data.service.v1.AttributeValue.TypeCase typeCase = attributeValue.getTypeCase();
if (typeCase == TypeCase.VALUE) {
try {
JsonNode mapNode = OBJECT_MAPPER.readTree(JSONFORMAT_PRINTER.print(attributeValue));
Map map = OBJECT_MAPPER.convertValue(mapNode, Map.class);
f.setValue(map);
return map;
} catch (JsonProcessingException | InvalidProtocolBufferException e) {
throw new RuntimeException(e);
}
} else { // For now, just expecting VALUE type on the RHS
throw new UnsupportedOperationException(
String.format("The RHS of filter for string array types can only be VALUE: %s", attributeValue));
}

// Set child filters to empty array
f.setChildFilters(new Filter[]{});
return f;
}

private static void transform(AttributeValue attributeValue, Filter filter,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -554,6 +554,81 @@ public void testStringArrayValueTypeColumnOrChain() throws JsonProcessingExcepti
transformedFilter.getChildFilters()[2].getChildFilters()[1].getChildFilters()[2].getValue());
}

@Test
public void testStringArrayValueTypeColumnAndChain() throws JsonProcessingException {
Query query = Query.newBuilder()
.addEntityId("some id")
.setFilter(
AttributeFilter.newBuilder().setOperator(Operator.AND)
.addChildFilter(
AttributeFilter.newBuilder()
.setName("attributes.some_col")
.setOperator(Operator.EQ)
.setAttributeValue(AttributeValue.newBuilder()
.setValue(Value.newBuilder().setString("some_val"))
)
)
.addChildFilter(
AttributeFilter.newBuilder()
.setName(ATTRIBUTES_LABELS_FIELD_NAME)
.setOperator(Operator.NOT_IN)
.setAttributeValue(AttributeValue.newBuilder()
.setValueList(
AttributeValueList.newBuilder()
.addValues(
AttributeValue.newBuilder().setValue(Value.newBuilder().setString("l1"))
)
.addValues(
AttributeValue.newBuilder().setValue(Value.newBuilder().setString("l2"))
)
.addValues(
AttributeValue.newBuilder().setValue(Value.newBuilder().setString("l3"))
)
)
)
)
)
.build();
org.hypertrace.core.documentstore.Query transformedQuery =
DocStoreConverter.transform(TENANT_ID, query, Collections.emptyList());

Filter transformedFilter = transformedQuery.getFilter();
Assertions.assertEquals(Filter.Op.AND, transformedFilter.getOp());

Assertions.assertEquals(3, transformedFilter.getChildFilters().length);
Assertions.assertEquals(EntityServiceConstants.ENTITY_ID,
transformedFilter.getChildFilters()[1].getFieldName());
Assertions.assertEquals(Collections.singletonList("some id"),
transformedFilter.getChildFilters()[1].getValue());

Assertions.assertEquals(Op.AND, transformedFilter.getChildFilters()[2].getOp());

Assertions.assertEquals("attributes.some_col.value.string",
transformedFilter.getChildFilters()[2].getChildFilters()[0].getFieldName());
Assertions.assertEquals(Op.EQ, transformedFilter.getChildFilters()[2].getChildFilters()[0].getOp());
Assertions.assertEquals("some_val", transformedFilter.getChildFilters()[2].getChildFilters()[0].getValue());

Assertions.assertEquals(Op.AND, transformedFilter.getChildFilters()[2].getChildFilters()[1].getOp());

Assertions.assertEquals(ATTRIBUTES_LABELS_FIELD_NAME + ".valueList.values",
transformedFilter.getChildFilters()[2].getChildFilters()[1].getChildFilters()[0].getFieldName());
Assertions.assertEquals(Op.NEQ, transformedFilter.getChildFilters()[2].getChildFilters()[1].getChildFilters()[0].getOp());
Assertions.assertEquals(OBJECT_MAPPER.convertValue(OBJECT_MAPPER.readTree("{\"value\": {\"string\":\"l1\"}}"), Map.class),
transformedFilter.getChildFilters()[2].getChildFilters()[1].getChildFilters()[0].getValue());

Assertions.assertEquals(ATTRIBUTES_LABELS_FIELD_NAME + ".valueList.values",
transformedFilter.getChildFilters()[2].getChildFilters()[1].getChildFilters()[1].getFieldName());
Assertions.assertEquals(Op.NEQ, transformedFilter.getChildFilters()[2].getChildFilters()[1].getChildFilters()[1].getOp());
Assertions.assertEquals(OBJECT_MAPPER.convertValue(OBJECT_MAPPER.readTree("{\"value\": {\"string\":\"l2\"}}"), Map.class),
transformedFilter.getChildFilters()[2].getChildFilters()[1].getChildFilters()[1].getValue());

Assertions.assertEquals(ATTRIBUTES_LABELS_FIELD_NAME + ".valueList.values",
transformedFilter.getChildFilters()[2].getChildFilters()[1].getChildFilters()[2].getFieldName());
Assertions.assertEquals(Op.NEQ, transformedFilter.getChildFilters()[2].getChildFilters()[1].getChildFilters()[2].getOp());
Assertions.assertEquals(OBJECT_MAPPER.convertValue(OBJECT_MAPPER.readTree("{\"value\": {\"string\":\"l3\"}}"), Map.class),
transformedFilter.getChildFilters()[2].getChildFilters()[1].getChildFilters()[2].getValue());
}

@Test
public void testNeqFilterConversionForValueListThrowsException() {
Assertions.assertThrows(UnsupportedOperationException.class, () -> {
Expand Down