use of org.jbpm.services.api.query.QueryNotFoundException in project jbpm by kiegroup.
the class QueryServiceImpl method query.
@Override
public <T> T query(String queryName, QueryResultMapper<T> mapper, QueryContext queryContext, QueryParamBuilder<?> paramBuilder) throws QueryNotFoundException {
if (dataSetDefRegistry.getDataSetDef(queryName) == null) {
throw new QueryNotFoundException("Query " + queryName + " not found");
}
logger.debug("About to query using {} definition with number of rows {} and starting at {} offset", queryName, queryContext.getCount(), queryContext.getOffset());
DataSetLookupBuilder<?> builder = DataSetLookupFactory.newDataSetLookupBuilder().dataset(queryName).rowNumber(queryContext.getCount()).rowOffset(queryContext.getOffset());
Object filter = paramBuilder.build();
while (filter != null) {
if (filter instanceof ColumnFilter) {
// add filter
builder.filter((ColumnFilter) filter);
} else if (filter instanceof AggregateColumnFilter) {
// add aggregate function
builder.column(((AggregateColumnFilter) filter).getColumnId(), ((AggregateColumnFilter) filter).getType(), ((AggregateColumnFilter) filter).getColumnId());
} else if (filter instanceof GroupColumnFilter) {
GroupColumnFilter groupFilter = ((GroupColumnFilter) filter);
// add group function
builder.group(((GroupColumnFilter) filter).getColumnId(), ((GroupColumnFilter) filter).getNewColumnId());
if (groupFilter.getIntervalSize() != null) {
((AbstractDataSetLookupBuilder<?>) builder).dynamic(groupFilter.getMaxIntervals(), DateIntervalType.valueOf(groupFilter.getIntervalSize()), true);
}
} else if (filter instanceof ExtraColumnFilter) {
// add extra column
builder.column(((ExtraColumnFilter) filter).getColumnId(), ((ExtraColumnFilter) filter).getNewColumnId());
} else {
logger.warn("Unsupported filter '{}' generated by '{}'", filter, paramBuilder);
}
// call builder again in case more parameters are available
filter = paramBuilder.build();
}
// if advanced ordering is used process the ORDER BY clause into order by and sort order pairs
if (queryContext instanceof AdvancedQueryContext && ((AdvancedQueryContext) queryContext).getOrderByClause() != null && !((AdvancedQueryContext) queryContext).getOrderByClause().isEmpty()) {
String[] orderBySortOrderItems = ((AdvancedQueryContext) queryContext).getOrderByClause().split(",");
for (String orderBySortOrderItem : orderBySortOrderItems) {
String[] orderBySortOrder = orderBySortOrderItem.trim().split(" ");
// check that sort order is given. default to 'asc'.
String sortOrder = orderBySortOrder.length == 1 ? "asc" : orderBySortOrder[1].trim();
logger.debug("Applying order by clause '{}' with {}ending sort order", orderBySortOrder[0].trim(), sortOrder);
builder.sort(orderBySortOrder[0].trim(), sortOrder);
}
} else {
// use default simple ordering
if (queryContext.getOrderBy() != null) {
String[] oderByItems = queryContext.getOrderBy().split(",");
for (String orderBy : oderByItems) {
logger.debug("Applying order by {} and ascending {}", orderBy, queryContext.isAscending());
builder.sort(orderBy.trim(), queryContext.isAscending() ? "asc" : "desc");
}
}
}
DataSet result = dataSetManager.lookupDataSet(builder.buildLookup());
logger.debug("Query result is {}", result);
T mappedResult = mapper.map(result);
logger.debug("Mapped result is {}", mappedResult);
return mappedResult;
}
Aggregations