Search in sources :

Example 1 with Empty

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);
    }
}
Also used : Entity(org.hypertrace.entity.data.service.v1.Entity) AttributeValueList(org.hypertrace.entity.data.service.v1.AttributeValueList) Iterator(java.util.Iterator) ProtocolStringList(com.google.protobuf.ProtocolStringList) List(java.util.List) ArrayList(java.util.ArrayList) AttributeValueList(org.hypertrace.entity.data.service.v1.AttributeValueList) EntityQueryRequest(org.hypertrace.entity.query.service.v1.EntityQueryRequest) Test(org.junit.jupiter.api.Test) Disabled(org.junit.jupiter.api.Disabled)

Example 2 with Empty

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());
}
Also used : Entity(org.hypertrace.entity.data.service.v1.Entity) Test(org.junit.jupiter.api.Test)

Example 3 with Empty

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());
}
Also used : Query(org.hypertrace.entity.data.service.v1.Query) AttributeFilter(org.hypertrace.entity.data.service.v1.AttributeFilter) Filter(org.hypertrace.core.documentstore.Filter) Test(org.junit.jupiter.api.Test)

Example 4 with Empty

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;
}
Also used : Filter(org.hypertrace.core.documentstore.Filter) AttributeFilter(org.hypertrace.entity.data.service.v1.AttributeFilter)

Example 5 with Empty

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;
}
Also used : Filter(org.hypertrace.core.documentstore.Filter) AttributeFilter(org.hypertrace.entity.data.service.v1.AttributeFilter)

Aggregations

Filter (org.hypertrace.core.documentstore.Filter)7 Entity (org.hypertrace.entity.data.service.v1.Entity)6 AttributeFilter (org.hypertrace.entity.data.service.v1.AttributeFilter)5 ServiceException (com.google.protobuf.ServiceException)4 IOException (java.io.IOException)4 Key (org.hypertrace.core.documentstore.Key)4 ArrayList (java.util.ArrayList)3 HashMap (java.util.HashMap)3 Iterator (java.util.Iterator)3 List (java.util.List)3 Document (org.hypertrace.core.documentstore.Document)3 JSONDocument (org.hypertrace.core.documentstore.JSONDocument)3 EnrichedEntity (org.hypertrace.entity.data.service.v1.EnrichedEntity)3 EntityRelationship (org.hypertrace.entity.data.service.v1.EntityRelationship)3 Query (org.hypertrace.entity.data.service.v1.Query)3 Test (org.junit.jupiter.api.Test)3 Streams (com.google.common.collect.Streams)2 Descriptors (com.google.protobuf.Descriptors)2 GeneratedMessageV3 (com.google.protobuf.GeneratedMessageV3)2 Message (com.google.protobuf.Message)2