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());
}
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());
}
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;
}
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();
}
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();
}
Aggregations