use of org.hypertrace.entity.data.service.v1.Empty in project entity-service by hypertrace.
the class EntityQueryServiceTest method testExecuteWithEqualsArrayFilter.
@Test
@Disabled("Disabled until we enable querying based on the new Query DTO")
void testExecuteWithEqualsArrayFilter() {
String filterValue1 = generateRandomUUID();
String filterValue2 = generateRandomUUID();
String filterValue3 = generateRandomUUID();
AttributeValueList.Builder attributeValueListBuilder = AttributeValueList.newBuilder();
attributeValueListBuilder.clear();
Stream.of(filterValue1, filterValue2).map(this::generateAttrValue).forEach(attributeValueListBuilder::addValues);
Entity entity1 = Entity.newBuilder().setTenantId(TENANT_ID).setEntityType(EntityType.SERVICE.name()).setEntityName("Some Service 1").putAttributes("labels", AttributeValue.newBuilder().setValueList(attributeValueListBuilder).build()).putIdentifyingAttributes(EntityConstants.getValue(CommonAttribute.COMMON_ATTRIBUTE_FQN), generateRandomUUIDAttrValue()).build();
Entity createdEntity1 = entityDataServiceClient.upsert(entity1);
assertNotNull(createdEntity1);
assertFalse(createdEntity1.getEntityId().trim().isEmpty());
attributeValueListBuilder.clear();
Stream.of(filterValue2, filterValue3).map(this::generateAttrValue).forEach(attributeValueListBuilder::addValues);
Entity entity2 = Entity.newBuilder().setTenantId(TENANT_ID).setEntityType(EntityType.SERVICE.name()).setEntityName("Some Service 2").putAttributes("labels", AttributeValue.newBuilder().setValueList(attributeValueListBuilder).build()).putIdentifyingAttributes(EntityConstants.getValue(CommonAttribute.COMMON_ATTRIBUTE_FQN), generateRandomUUIDAttrValue()).build();
Entity createdEntity2 = entityDataServiceClient.upsert(entity2);
assertNotNull(createdEntity2);
assertFalse(createdEntity2.getEntityId().trim().isEmpty());
attributeValueListBuilder.clear();
Stream.of(filterValue3, filterValue1, generateRandomUUID()).map(this::generateAttrValue).forEach(attributeValueListBuilder::addValues);
Entity entity3 = Entity.newBuilder().setTenantId(TENANT_ID).setEntityType(EntityType.SERVICE.name()).setEntityName("Some Service 3").putAttributes("labels", AttributeValue.newBuilder().setValueList(attributeValueListBuilder).build()).putIdentifyingAttributes(EntityConstants.getValue(CommonAttribute.COMMON_ATTRIBUTE_FQN), generateRandomUUIDAttrValue()).build();
Entity createdEntity3 = entityDataServiceClient.upsert(entity3);
assertNotNull(createdEntity3);
assertFalse(createdEntity3.getEntityId().trim().isEmpty());
Entity entity4 = Entity.newBuilder().setTenantId(TENANT_ID).setEntityType(EntityType.SERVICE.name()).setEntityName("Some Service 4").putIdentifyingAttributes(EntityConstants.getValue(CommonAttribute.COMMON_ATTRIBUTE_FQN), generateRandomUUIDAttrValue()).build();
Entity createdEntity4 = entityDataServiceClient.upsert(entity4);
assertNotNull(createdEntity4);
assertFalse(createdEntity4.getEntityId().trim().isEmpty());
attributeValueListBuilder.clear();
Stream.of(generateRandomUUID(), generateRandomUUID()).map(this::generateAttrValue).forEach(attributeValueListBuilder::addValues);
Entity entity5 = Entity.newBuilder().setTenantId(TENANT_ID).setEntityType(EntityType.SERVICE.name()).setEntityName("Some Service 5").putAttributes("labels", AttributeValue.newBuilder().setValueList(attributeValueListBuilder).build()).putIdentifyingAttributes(EntityConstants.getValue(CommonAttribute.COMMON_ATTRIBUTE_FQN), generateRandomUUIDAttrValue()).build();
Entity createdEntity5 = entityDataServiceClient.upsert(entity5);
assertNotNull(createdEntity5);
assertFalse(createdEntity5.getEntityId().trim().isEmpty());
// Filtering for a single value in an array with EQUALS should fetch all rows having the VALUE
// AS ONE OF THE ARRAY ELEMENTS
{
EntityQueryRequest queryRequest = EntityQueryRequest.newBuilder().setEntityType(EntityType.SERVICE.name()).setFilter(Filter.newBuilder().setOperator(Operator.EQ).setLhs(Expression.newBuilder().setColumnIdentifier(ColumnIdentifier.newBuilder().setColumnName(API_LABELS_ATTR))).setRhs(Expression.newBuilder().setLiteral(LiteralConstant.newBuilder().setValue(org.hypertrace.entity.query.service.v1.Value.newBuilder().setValueType(STRING).setString(filterValue1)))).build()).addSelection(Expression.newBuilder().setColumnIdentifier(ColumnIdentifier.newBuilder().setColumnName("API.id").build()).build()).addSelection(Expression.newBuilder().setColumnIdentifier(ColumnIdentifier.newBuilder().setColumnName("API.name").build()).build()).build();
Iterator<ResultSetChunk> resultSetChunkIterator = GrpcClientRequestContextUtil.executeWithHeadersContext(HEADERS, () -> entityQueryServiceClient.execute(queryRequest));
List<ResultSetChunk> list = Lists.newArrayList(resultSetChunkIterator);
assertEquals(1, list.size());
assertEquals(2, list.get(0).getRowCount());
assertEquals(0, list.get(0).getChunkId());
assertTrue(list.get(0).getIsLastChunk());
assertEquals(createdEntity1.getEntityId(), list.get(0).getRow(0).getColumn(0).getString());
assertEquals(createdEntity1.getEntityName(), list.get(0).getRow(0).getColumn(1).getString());
assertEquals(createdEntity3.getEntityId(), list.get(0).getRow(1).getColumn(0).getString());
assertEquals(createdEntity3.getEntityName(), list.get(0).getRow(1).getColumn(1).getString());
assertTrue(list.get(0).getResultSetMetadata().getColumnMetadataCount() > 0);
}
// Filtering for a list of values in an array with EQUALS should fetch only rows EXACTLY
// MATCHING the array
{
EntityQueryRequest queryRequest = EntityQueryRequest.newBuilder().setEntityType(EntityType.SERVICE.name()).setFilter(Filter.newBuilder().setOperator(Operator.EQ).setLhs(Expression.newBuilder().setColumnIdentifier(ColumnIdentifier.newBuilder().setColumnName(API_LABELS_ATTR))).setRhs(Expression.newBuilder().setLiteral(LiteralConstant.newBuilder().setValue(org.hypertrace.entity.query.service.v1.Value.newBuilder().setValueType(STRING_ARRAY).addStringArray(filterValue1).addStringArray(filterValue2)))).build()).addSelection(Expression.newBuilder().setColumnIdentifier(ColumnIdentifier.newBuilder().setColumnName("API.id").build()).build()).addSelection(Expression.newBuilder().setColumnIdentifier(ColumnIdentifier.newBuilder().setColumnName("API.name").build()).build()).build();
Iterator<ResultSetChunk> resultSetChunkIterator = GrpcClientRequestContextUtil.executeWithHeadersContext(HEADERS, () -> entityQueryServiceClient.execute(queryRequest));
List<ResultSetChunk> list = Lists.newArrayList(resultSetChunkIterator);
assertEquals(1, list.size());
assertEquals(1, list.get(0).getRowCount());
assertEquals(0, list.get(0).getChunkId());
assertTrue(list.get(0).getIsLastChunk());
assertEquals(createdEntity1.getEntityId(), list.get(0).getRow(0).getColumn(0).getString());
assertEquals(createdEntity1.getEntityName(), list.get(0).getRow(0).getColumn(1).getString());
assertTrue(list.get(0).getResultSetMetadata().getColumnMetadataCount() > 0);
}
// Filtering for a list of (order-changed) values in an array with EQUALS should fetch EMPTY
// RESULT-SET
{
EntityQueryRequest queryRequest = EntityQueryRequest.newBuilder().setEntityType(EntityType.SERVICE.name()).setFilter(Filter.newBuilder().setOperator(Operator.EQ).setLhs(Expression.newBuilder().setColumnIdentifier(ColumnIdentifier.newBuilder().setColumnName(API_LABELS_ATTR))).setRhs(Expression.newBuilder().setLiteral(LiteralConstant.newBuilder().setValue(org.hypertrace.entity.query.service.v1.Value.newBuilder().setValueType(STRING_ARRAY).addStringArray(filterValue2).addStringArray(filterValue1)))).build()).addSelection(Expression.newBuilder().setColumnIdentifier(ColumnIdentifier.newBuilder().setColumnName("API.id").build()).build()).addSelection(Expression.newBuilder().setColumnIdentifier(ColumnIdentifier.newBuilder().setColumnName("API.name").build()).build()).build();
Iterator<ResultSetChunk> resultSetChunkIterator = GrpcClientRequestContextUtil.executeWithHeadersContext(HEADERS, () -> entityQueryServiceClient.execute(queryRequest));
List<ResultSetChunk> list = Lists.newArrayList(resultSetChunkIterator);
assertEquals(1, list.size());
assertEquals(0, list.get(0).getRowCount());
assertEquals(0, list.get(0).getChunkId());
assertTrue(list.get(0).getIsLastChunk());
assertTrue(list.get(0).getResultSetMetadata().getColumnMetadataCount() > 0);
}
}
use of org.hypertrace.entity.data.service.v1.Empty in project entity-service by hypertrace.
the class EntityNormalizerTest method throwsOnV2EntityMissingId.
@Test
void throwsOnV2EntityMissingId() {
when(this.mockEntityTypeClient.get(V2_ENTITY_TYPE)).thenReturn(Single.just(EntityType.getDefaultInstance()));
Entity inputEntity = Entity.newBuilder().setEntityType(V2_ENTITY_TYPE).build();
Exception exception = assertThrows(IllegalArgumentException.class, () -> this.normalizer.normalize(TENANT_ID, inputEntity));
assertEquals("Entity ID is empty", exception.getMessage());
}
use of org.hypertrace.entity.data.service.v1.Empty in project entity-service by hypertrace.
the class DocStoreConverterTest method testInFilterConversion.
@Test
public void testInFilterConversion() {
Query query = Query.newBuilder().setFilter(AttributeFilter.newBuilder().setName(EntityConstants.ATTRIBUTES_MAP_PATH).setOperator(Operator.IN).setAttributeValue(AttributeValue.newBuilder().setValueList(AttributeValueList.newBuilder().addValues(AttributeValue.newBuilder().setValue(Value.newBuilder().setString("attr-v1"))).addValues(AttributeValue.newBuilder().setValue(Value.newBuilder().setString("attr-v2"))).addValues(AttributeValue.newBuilder().setValue(Value.newBuilder().setString("attr-v3")))).build()).build()).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(2, transformedFilter.getChildFilters().length);
Assertions.assertEquals("attributes.value.string", transformedFilter.getChildFilters()[1].getFieldName());
Assertions.assertEquals(Filter.Op.IN, transformedFilter.getChildFilters()[1].getOp());
Assertions.assertEquals(List.of("attr-v1", "attr-v2", "attr-v3"), transformedFilter.getChildFilters()[1].getValue());
// Empty value list. Default to string attribute value type for the field name
Query query2 = Query.newBuilder().setFilter(AttributeFilter.newBuilder().setName(EntityConstants.ATTRIBUTES_MAP_PATH).setOperator(Operator.IN).setAttributeValue(AttributeValue.newBuilder().setValueList(AttributeValueList.newBuilder()).build()).build()).build();
org.hypertrace.core.documentstore.Query transformedQuery2 = DocStoreConverter.transform(TENANT_ID, query2, Collections.emptyList());
Filter transformedFilter2 = transformedQuery2.getFilter();
Assertions.assertEquals(Filter.Op.AND, transformedFilter2.getOp());
Assertions.assertEquals(2, transformedFilter2.getChildFilters().length);
Assertions.assertEquals("attributes.value.string", transformedFilter2.getChildFilters()[1].getFieldName());
Assertions.assertEquals(Filter.Op.IN, transformedFilter2.getChildFilters()[1].getOp());
Assertions.assertEquals(List.of(), transformedFilter2.getChildFilters()[1].getValue());
// Long list
Query query3 = Query.newBuilder().setFilter(AttributeFilter.newBuilder().setName(EntityConstants.ATTRIBUTES_MAP_PATH).setOperator(Operator.IN).setAttributeValue(AttributeValue.newBuilder().setValueList(AttributeValueList.newBuilder().addValues(AttributeValue.newBuilder().setValue(Value.newBuilder().setLong(21L))).addValues(AttributeValue.newBuilder().setValue(Value.newBuilder().setLong(22L)))).build()).build()).build();
org.hypertrace.core.documentstore.Query transformedQuery3 = DocStoreConverter.transform(TENANT_ID, query3, Collections.emptyList());
Filter transformedFilter3 = transformedQuery3.getFilter();
Assertions.assertEquals(Filter.Op.AND, transformedFilter3.getOp());
Assertions.assertEquals(2, transformedFilter3.getChildFilters().length);
Assertions.assertEquals("attributes.value.long", transformedFilter3.getChildFilters()[1].getFieldName());
Assertions.assertEquals(Filter.Op.IN, transformedFilter3.getChildFilters()[1].getOp());
Assertions.assertEquals(List.of(21L, 22L), transformedFilter3.getChildFilters()[1].getValue());
// CreatedTime field. Will not be part of attributes and so no need to specify the type suffix
Query query4 = Query.newBuilder().setFilter(AttributeFilter.newBuilder().setName(EntityServiceConstants.ENTITY_CREATED_TIME).setOperator(Operator.IN).setAttributeValue(AttributeValue.newBuilder().setValueList(AttributeValueList.newBuilder().addValues(AttributeValue.newBuilder().setValue(Value.newBuilder().setLong(21L))).addValues(AttributeValue.newBuilder().setValue(Value.newBuilder().setLong(22L)))).build()).build()).build();
org.hypertrace.core.documentstore.Query transformedQuery4 = DocStoreConverter.transform(TENANT_ID, query4, Collections.emptyList());
Filter transformedFilter4 = transformedQuery4.getFilter();
Assertions.assertEquals(Filter.Op.AND, transformedFilter4.getOp());
Assertions.assertEquals(2, transformedFilter4.getChildFilters().length);
Assertions.assertEquals("createdTime", transformedFilter4.getChildFilters()[1].getFieldName());
Assertions.assertEquals(Filter.Op.IN, transformedFilter4.getChildFilters()[1].getOp());
Assertions.assertEquals(List.of(21L, 22L), transformedFilter4.getChildFilters()[1].getValue());
}
use of org.hypertrace.entity.data.service.v1.Empty in project entity-service by hypertrace.
the class DocStoreConverter method transformToNeqFilterWithValueListRhs.
private static Filter transformToNeqFilterWithValueListRhs(AttributeFilter attributeFilter) {
String fieldName = attributeFilter.getName() + VALUE_LIST_VALUES_CONST;
Filter f = new Filter();
f.setFieldName(fieldName);
f.setOp(Op.NEQ);
f.setValue(prepareRhsValueForSpecialValueListCase(attributeFilter.getAttributeValue()));
// Set child filters to empty array
f.setChildFilters(new Filter[] {});
return f;
}
use of org.hypertrace.entity.data.service.v1.Empty in project entity-service by hypertrace.
the class DocStoreConverter method createNeqFilterForAttributeValue.
private static Filter createNeqFilterForAttributeValue(String fieldName, AttributeValue attributeValue) {
Filter f = new Filter();
f.setFieldName(fieldName);
f.setOp(Op.NEQ);
f.setValue(prepareRhsValueForSpecialValueListCase(attributeValue));
// Set child filters to empty array
f.setChildFilters(new Filter[] {});
return f;
}
Aggregations