Search in sources :

Example 11 with Query

use of org.molgenis.emx2.Query in project entity-service by hypertrace.

the class DocStoreConverterTest method testSelectionsWithOrderBy.

@Test
public void testSelectionsWithOrderBy() {
    Query query = Query.newBuilder().addEntityId("some id").addOrderBy(OrderByExpression.newBuilder().setName("col1").setOrder(SortOrder.DESC).build()).addOrderBy(OrderByExpression.newBuilder().setName("col2").build()).build();
    org.hypertrace.core.documentstore.Query transformedQuery = DocStoreConverter.transform(TENANT_ID, query, List.of("selection1", "selection2"));
    List<String> selections = transformedQuery.getSelections();
    Assertions.assertEquals(2, selections.size());
    Assertions.assertEquals("selection1", selections.get(0));
    Assertions.assertEquals("selection2", selections.get(1));
    List<OrderBy> transformedOrderBys = transformedQuery.getOrderBys();
    Assertions.assertEquals(2, transformedOrderBys.size());
    Assertions.assertEquals("col1", transformedOrderBys.get(0).getField());
    Assertions.assertFalse(transformedOrderBys.get(0).isAsc());
    Assertions.assertEquals("col2", transformedOrderBys.get(1).getField());
    Assertions.assertTrue(transformedOrderBys.get(1).isAsc());
}
Also used : OrderBy(org.hypertrace.core.documentstore.OrderBy) Query(org.hypertrace.entity.data.service.v1.Query) Test(org.junit.jupiter.api.Test)

Example 12 with Query

use of org.molgenis.emx2.Query in project entity-service by hypertrace.

the class DocStoreConverterTest method testOrderByConversion.

@Test
public void testOrderByConversion() {
    Query query = Query.newBuilder().addEntityId("some id").addOrderBy(OrderByExpression.newBuilder().setName("col1").setOrder(SortOrder.DESC).build()).addOrderBy(OrderByExpression.newBuilder().setName("col2").build()).build();
    org.hypertrace.core.documentstore.Query transformedQuery = DocStoreConverter.transform(TENANT_ID, query, Collections.emptyList());
    Assertions.assertEquals(0, transformedQuery.getSelections().size());
    List<OrderBy> transformedOrderBys = transformedQuery.getOrderBys();
    Assertions.assertEquals(2, transformedOrderBys.size());
    Assertions.assertEquals("col1", transformedOrderBys.get(0).getField());
    Assertions.assertFalse(transformedOrderBys.get(0).isAsc());
    Assertions.assertEquals("col2", transformedOrderBys.get(1).getField());
    Assertions.assertTrue(transformedOrderBys.get(1).isAsc());
}
Also used : OrderBy(org.hypertrace.core.documentstore.OrderBy) Query(org.hypertrace.entity.data.service.v1.Query) Test(org.junit.jupiter.api.Test)

Example 13 with Query

use of org.molgenis.emx2.Query in project entity-service by hypertrace.

the class DocStoreConverter method transform.

public static org.hypertrace.core.documentstore.Query transform(@Nonnull String tenantId, @Nonnull Query query, List<String> selections) {
    org.hypertrace.core.documentstore.Query docStoreQuery = new org.hypertrace.core.documentstore.Query();
    List<Filter> filters = new ArrayList<>();
    filters.add(getTenantIdEqFilter(tenantId));
    if (!query.getEntityIdList().isEmpty()) {
        filters.add(new Filter(Filter.Op.IN, EntityServiceConstants.ENTITY_ID, query.getEntityIdList()));
    }
    if (StringUtils.isNotEmpty(query.getEntityType())) {
        filters.add(new Filter(Filter.Op.EQ, EntityServiceConstants.ENTITY_TYPE, query.getEntityType()));
    }
    if (StringUtils.isNotEmpty(query.getEntityName())) {
        filters.add(new Filter(Filter.Op.EQ, EntityServiceConstants.ENTITY_NAME, query.getEntityName()));
    }
    if (query.hasFilter()) {
        filters.add(transform(query.getFilter()));
    }
    if (!filters.isEmpty()) {
        if (filters.size() == 1) {
            docStoreQuery.setFilter(filters.get(0));
        } else {
            Filter f = new Filter();
            f.setOp(Filter.Op.AND);
            f.setChildFilters(filters.toArray(new Filter[] {}));
            docStoreQuery.setFilter(f);
        }
    }
    if (!selections.isEmpty()) {
        docStoreQuery.addAllSelections(selections);
    }
    if (query.getOrderByCount() > 0) {
        docStoreQuery.addAllOrderBys(transformOrderBy(query.getOrderByList()));
    }
    if (query.getLimit() > 0) {
        docStoreQuery.setLimit(query.getLimit());
    }
    if (query.getOffset() > 0) {
        docStoreQuery.setOffset(query.getOffset());
    }
    return docStoreQuery;
}
Also used : Query(org.hypertrace.entity.data.service.v1.Query) Filter(org.hypertrace.core.documentstore.Filter) AttributeFilter(org.hypertrace.entity.data.service.v1.AttributeFilter) ArrayList(java.util.ArrayList)

Example 14 with Query

use of org.molgenis.emx2.Query in project entity-service by hypertrace.

the class EntityQueryConverter method convertToEDSQuery.

@Deprecated(forRemoval = true)
public Query convertToEDSQuery(RequestContext requestContext, EntityQueryRequest queryRequest) {
    Query.Builder queryBuilder = Query.newBuilder().setEntityType(queryRequest.getEntityType());
    AttributeFilter attributeFilter = convertToAttributeFilter(requestContext, queryBuilder, queryRequest.getFilter());
    if (attributeFilter != null) {
        queryBuilder.setFilter(attributeFilter);
    }
    queryBuilder.addAllOrderBy(convertOrderBy(requestContext, queryRequest.getOrderByList()));
    queryBuilder.setLimit(queryRequest.getLimit());
    queryBuilder.setOffset(queryRequest.getOffset());
    return queryBuilder.build();
}
Also used : Query(org.hypertrace.entity.data.service.v1.Query) AttributeFilter(org.hypertrace.entity.data.service.v1.AttributeFilter)

Example 15 with Query

use of org.molgenis.emx2.Query in project entity-service by hypertrace.

the class EntityQueryServiceImpl method execute.

@Override
public void execute(EntityQueryRequest request, StreamObserver<ResultSetChunk> responseObserver) {
    RequestContext requestContext = RequestContext.CURRENT.get();
    Optional<String> tenantId = requestContext.getTenantId();
    if (tenantId.isEmpty()) {
        responseObserver.onError(new ServiceException("Tenant id is missing in the request."));
        return;
    }
    final Iterator<Document> documentIterator;
    if (queryAggregationEnabled) {
        final Converter<EntityQueryRequest, org.hypertrace.core.documentstore.query.Query> queryConverter = getQueryConverter();
        final org.hypertrace.core.documentstore.query.Query query;
        try {
            query = queryConverter.convert(request, requestContext);
            documentIterator = entitiesCollection.aggregate(query);
        } catch (final Exception e) {
            responseObserver.onError(new ServiceException(e));
            return;
        }
    } else {
        // TODO: Optimize this later. For now converting to EDS Query and then again to DocStore
        // Query.
        Query query = entityQueryConverter.convertToEDSQuery(requestContext, request);
        /**
         * {@link EntityQueryRequest} selections need to treated differently, since they don't
         * transform one to one to {@link org.hypertrace.entity.data.service.v1.EntityDataRequest}
         * selections
         */
        List<String> docStoreSelections = entityQueryConverter.convertSelectionsToDocStoreSelections(requestContext, request.getSelectionList());
        documentIterator = entitiesCollection.search(DocStoreConverter.transform(tenantId.get(), query, docStoreSelections));
    }
    final DocumentConverter rowConverter = injector.getInstance(DocumentConverter.class);
    ResultSetMetadata resultSetMetadata;
    try {
        resultSetMetadata = this.buildMetadataForSelections(request.getSelectionList());
    } catch (final ConversionException e) {
        responseObserver.onError(new ServiceException(e));
        return;
    }
    if (!documentIterator.hasNext()) {
        ResultSetChunk.Builder resultBuilder = ResultSetChunk.newBuilder();
        resultBuilder.setResultSetMetadata(resultSetMetadata);
        resultBuilder.setIsLastChunk(true);
        resultBuilder.setChunkId(0);
        responseObserver.onNext(resultBuilder.build());
        responseObserver.onCompleted();
        return;
    }
    boolean isNewChunk = true;
    int chunkId = 0, rowCount = 0;
    ResultSetChunk.Builder resultBuilder = ResultSetChunk.newBuilder();
    while (documentIterator.hasNext()) {
        // Set metadata for new chunk
        if (isNewChunk) {
            resultBuilder.setResultSetMetadata(resultSetMetadata);
            isNewChunk = false;
        }
        try {
            final Row row;
            if (queryAggregationEnabled) {
                row = rowConverter.convertToRow(documentIterator.next(), resultSetMetadata);
                resultBuilder.addRow(row);
                rowCount++;
            } else {
                Optional<Entity> entity = DOCUMENT_PARSER.parseOrLog(documentIterator.next(), Entity.newBuilder());
                if (entity.isPresent()) {
                    row = convertToEntityQueryResult(requestContext, entity.get(), request.getSelectionList());
                    resultBuilder.addRow(row);
                    rowCount++;
                }
            }
        } catch (final Exception e) {
            responseObserver.onError(new ServiceException(e));
            return;
        }
        // current chunk is complete
        if (rowCount >= CHUNK_SIZE || !documentIterator.hasNext()) {
            resultBuilder.setChunkId(chunkId++);
            resultBuilder.setIsLastChunk(!documentIterator.hasNext());
            responseObserver.onNext(resultBuilder.build());
            resultBuilder = ResultSetChunk.newBuilder();
            isNewChunk = true;
            rowCount = 0;
        }
    }
    responseObserver.onCompleted();
}
Also used : Entity(org.hypertrace.entity.data.service.v1.Entity) Query(org.hypertrace.entity.data.service.v1.Query) Document(org.hypertrace.core.documentstore.Document) JSONDocument(org.hypertrace.core.documentstore.JSONDocument) RequestContext(org.hypertrace.core.grpcutils.context.RequestContext) ConversionException(org.hypertrace.entity.query.service.converter.ConversionException) ResultSetMetadata(org.hypertrace.entity.query.service.v1.ResultSetMetadata) ServiceException(com.google.protobuf.ServiceException) ConversionException(org.hypertrace.entity.query.service.converter.ConversionException) ServiceException(com.google.protobuf.ServiceException) Row(org.hypertrace.entity.query.service.v1.Row) EntityQueryRequest(org.hypertrace.entity.query.service.v1.EntityQueryRequest) DocumentConverter(org.hypertrace.entity.query.service.converter.response.DocumentConverter) ResultSetChunk(org.hypertrace.entity.query.service.v1.ResultSetChunk)

Aggregations

Query (org.jpl7.Query)88 Term (org.jpl7.Term)52 Variable (org.jpl7.Variable)32 Query (org.hypertrace.entity.data.service.v1.Query)31 Map (java.util.Map)28 Test (org.junit.jupiter.api.Test)23 Atom (org.jpl7.Atom)21 Compound (org.jpl7.Compound)18 Test (org.junit.Test)18 Filter (org.hypertrace.core.documentstore.Filter)16 Query (com.google.datastore.v1.Query)14 AttributeFilter (org.hypertrace.entity.data.service.v1.AttributeFilter)14 GqlQuery (com.google.datastore.v1.GqlQuery)7 ArrayList (java.util.ArrayList)7 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)6 Entity (org.hypertrace.entity.data.service.v1.Entity)6 Integer (org.jpl7.Integer)6 Query (org.molgenis.emx2.Query)6 IOException (java.io.IOException)5 Collections (java.util.Collections)5