Hello,
I have some trouble writing custom query for filtering process instances by multiple process instance variables at the same time.
I want to query with paging and multiple optional filters. Here is m setup:
I have created a process with following variables:

Now I want to filter by processName variable AND by year variable.
My approach is to use QueryServicesClient, <T> List<T> query(String queryName, String mapper, QueryFilterSpec filterSpec, Integer page, Integer pageSize, Class<T> resultType) method.
I register query with this content:
private static final String PROCESS_INSTANCE_QUERY = "select pil.*, " +
"v_year.variableId as v_year_variableId, v_year.value as v_year_value, " +
"v_processName.variableId as v_processName_variableId, v_processName.value as v_processName_value " +
"from ProcessInstanceLog pil " +
"inner join (select vil.processInstanceId, vil.variableId, max(vil.ID) maxvilid from VariableInstanceLog vil where vil.variableId='year' group by vil.processInstanceId, vil.variableId) x_year " +
"on (x_year.processInstanceId = pil.processInstanceId) " +
"inner join VariableInstanceLog v_year " +
"on (v_year.variableId = x_year.variableId and
v_year.id = x_year.maxvilid and v_year.processInstanceId = pil.processInstanceId) " +
"inner join (select vil.processInstanceId, vil.variableId, max(vil.ID) maxvilid from VariableInstanceLog vil where vil.variableId='processName' group by vil.processInstanceId, vil.variableId) x_processName " +
"on (x_processName.processInstanceId = pil.processInstanceId) " +
"inner join VariableInstanceLog v_processName " +
"on (v_processName.variableId = x_processName.variableId and v_processName.id = x_processName.maxvilid and v_processName.processInstanceId = pil.processInstanceId) ";
I am setting up the filter like this:
private QueryFilterSpec filterSpec(ActiveProcessesFilterAndPaging filterAndPaging) {
QueryFilterSpecBuilder builder = new QueryFilterSpecBuilder();
builder.oderBy(filterAndPaging.getOrderBy(), true);
setProcessParameters(filterAndPaging, builder);
return builder.get();
}
private void setProcessParameters(ActiveProcessesFilterAndPaging filterAndPaging, QueryFilterSpecBuilder builder) {
maybeAddTitle(filterAndPaging, builder);
maybeAddYear(filterAndPaging, builder);
builder
.addColumnMapping("v_year_variableId", "string")
.addColumnMapping("v_year_value", "integer")
.addColumnMapping("v_processName_variableId", "string")
.addColumnMapping("v_processName_value", "string")
;
}
private void maybeAddTitle(ActiveProcessesFilterAndPaging filterAndPaging, QueryFilterSpecBuilder queryFilterSpecBuilder) {
String title = filterAndPaging.getTitle();
if (nonNull(title)) {
queryFilterSpecBuilder
.equalsTo("v_processName_variableId", "processName")
.likeTo("v_processName_value", false, "%" + title + "%");
}
}
private void maybeAddYear(ActiveProcessesFilterAndPaging filterAndPaging, QueryFilterSpecBuilder queryFilterSpecBuilder) {
Integer year = filterAndPaging.getYear();
if (nonNull(year)) {
queryFilterSpecBuilder
.equalsTo("v_year_variableId", "year")
.equalsTo("v_year_value", year);
}
}
Then I query the kie server:
List<ProcessInstance> processes = queryClient.query(
ACTIVE_PROCESSES_QUERY_NAME,
QueryServicesClient.QUERY_MAP_PI_WITH_VARS,
filterSpec(activeProcessesFilterAndPaging),
activeProcessesFilterAndPaging.getPageNumber(),
activeProcessesFilterAndPaging.getPageSize(),
ProcessInstance.class
);
And, instead of the result, I get exception on server side:
What am I lacking for this to work?
Kind regards,
Marcin Świderski