Skip to content

Commit

Permalink
RHBA-365 - Pagination displays incorrect amount of tasks when custom …
Browse files Browse the repository at this point in the history
…advanced query returns duplicate records
  • Loading branch information
mswiderski committed Jan 9, 2018
1 parent 46f6888 commit ec00677
Show file tree
Hide file tree
Showing 6 changed files with 167 additions and 13 deletions.
Expand Up @@ -164,21 +164,21 @@ public void replaceQuery(QueryDefinition queryDefinition) {
DataSetDef sqlDef = builder.buildDef();
try {
dataSetDefRegistry.registerDataSetDef(sqlDef);

DataSetMetadata metadata = dataSetManager.getDataSetMetadata(sqlDef.getUUID());
if (queryDefinition.getTarget().equals(Target.BA_TASK)) {
dataSetDefRegistry.registerPreprocessor(sqlDef.getUUID(), new BusinessAdminTasksPreprocessor(identityProvider));
dataSetDefRegistry.registerPreprocessor(sqlDef.getUUID(), new BusinessAdminTasksPreprocessor(identityProvider, metadata));
} else if (queryDefinition.getTarget().equals(Target.PO_TASK)) {
dataSetDefRegistry.registerPreprocessor(sqlDef.getUUID(), new PotOwnerTasksPreprocessor(identityProvider));
dataSetDefRegistry.registerPreprocessor(sqlDef.getUUID(), new PotOwnerTasksPreprocessor(identityProvider, metadata));
} else if (queryDefinition.getTarget().equals(Target.FILTERED_PROCESS)) {
dataSetDefRegistry.registerPreprocessor(sqlDef.getUUID(), new DeploymentIdsPreprocessor(deploymentRolesManager, identityProvider, COLUMN_EXTERNALID));
} else if (queryDefinition.getTarget().equals(Target.FILTERED_BA_TASK)) {
dataSetDefRegistry.registerPreprocessor(sqlDef.getUUID(), new BusinessAdminPreprocessor(identityProvider));
dataSetDefRegistry.registerPreprocessor(sqlDef.getUUID(), new BusinessAdminPreprocessor(identityProvider, metadata));
dataSetDefRegistry.registerPreprocessor(sqlDef.getUUID(), new DeploymentIdsPreprocessor(deploymentRolesManager, identityProvider, COLUMN_DEPLOYMENTID));
} else if (queryDefinition.getTarget().equals(Target.FILTERED_PO_TASK)) {
dataSetDefRegistry.registerPreprocessor(sqlDef.getUUID(), new PotOwnerTasksPreprocessor(identityProvider));
dataSetDefRegistry.registerPreprocessor(sqlDef.getUUID(), new PotOwnerTasksPreprocessor(identityProvider, metadata));
dataSetDefRegistry.registerPreprocessor(sqlDef.getUUID(), new DeploymentIdsPreprocessor(deploymentRolesManager, identityProvider, COLUMN_DEPLOYMENTID));
}
DataSetMetadata metadata = dataSetManager.getDataSetMetadata(sqlDef.getUUID());

for (String columnId : metadata.getColumnIds()) {
sqlDef.addColumn(columnId, metadata.getColumnType(columnId));
}
Expand Down
Expand Up @@ -17,9 +17,14 @@
package org.jbpm.kie.services.impl.query.preprocessor;

import org.dashbuilder.dataset.DataSetLookup;
import org.dashbuilder.dataset.DataSetMetadata;
import org.dashbuilder.dataset.def.DataSetPreprocessor;
import org.dashbuilder.dataset.filter.ColumnFilter;
import org.dashbuilder.dataset.filter.DataSetFilter;
import org.dashbuilder.dataset.group.AggregateFunctionType;
import org.dashbuilder.dataset.group.ColumnGroup;
import org.dashbuilder.dataset.group.DataSetGroup;
import org.dashbuilder.dataset.group.GroupFunction;
import org.kie.internal.identity.IdentityProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -33,11 +38,14 @@ public class BusinessAdminPreprocessor implements DataSetPreprocessor {
"Administrator");
public static final String ADMIN_GROUP = System.getProperty("org.jbpm.ht.admin.group",
"Administrators");

private static final Logger LOGGER = LoggerFactory.getLogger(BusinessAdminPreprocessor.class);
private IdentityProvider identityProvider;
private DataSetMetadata metadata;

public BusinessAdminPreprocessor(IdentityProvider identityProvider) {
public BusinessAdminPreprocessor(IdentityProvider identityProvider, DataSetMetadata metadata) {
this.identityProvider = identityProvider;
this.metadata = metadata;
}

@SuppressWarnings("rawtypes")
Expand Down Expand Up @@ -65,5 +73,17 @@ public void preprocess(DataSetLookup lookup) {
filter.addFilterColumn(columnFilter);
lookup.addOperation(filter);
}
if (lookup.getLastGroupOp() == null) {
DataSetGroup gOp = new DataSetGroup();
gOp.setColumnGroup(new ColumnGroup(COLUMN_TASKID, COLUMN_TASKID));
for (String columnId : metadata.getColumnIds()) {
AggregateFunctionType functionType = null;
if (columnId.equals(COLUMN_TASKID)) {
functionType = AggregateFunctionType.DISTINCT;
}
gOp.addGroupFunction(new GroupFunction(columnId, columnId, functionType));
}
lookup.addOperation(gOp);
}
}
}
Expand Up @@ -18,14 +18,20 @@

import static org.dashbuilder.dataset.filter.FilterFactory.equalsTo;
import static org.jbpm.services.api.query.QueryResultMapper.COLUMN_ORGANIZATIONAL_ENTITY;
import static org.jbpm.services.api.query.QueryResultMapper.COLUMN_TASKID;

import java.util.ArrayList;
import java.util.List;

import org.dashbuilder.dataset.DataSetLookup;
import org.dashbuilder.dataset.DataSetMetadata;
import org.dashbuilder.dataset.def.DataSetPreprocessor;
import org.dashbuilder.dataset.filter.ColumnFilter;
import org.dashbuilder.dataset.filter.DataSetFilter;
import org.dashbuilder.dataset.group.AggregateFunctionType;
import org.dashbuilder.dataset.group.ColumnGroup;
import org.dashbuilder.dataset.group.DataSetGroup;
import org.dashbuilder.dataset.group.GroupFunction;
import org.kie.internal.identity.IdentityProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -35,9 +41,11 @@ public class BusinessAdminTasksPreprocessor implements DataSetPreprocessor {
private static final Logger LOGGER = LoggerFactory.getLogger(BusinessAdminTasksPreprocessor.class);

private IdentityProvider identityProvider;
private DataSetMetadata metadata;

public BusinessAdminTasksPreprocessor(IdentityProvider identityProvider) {
public BusinessAdminTasksPreprocessor(IdentityProvider identityProvider, DataSetMetadata metadata) {
this.identityProvider = identityProvider;
this.metadata = metadata;
}


Expand All @@ -60,7 +68,18 @@ public void preprocess(DataSetLookup lookup) {
filter.addFilterColumn(columnFilter);
lookup.addOperation(filter);
}

if (lookup.getLastGroupOp() == null) {
DataSetGroup gOp = new DataSetGroup();
gOp.setColumnGroup(new ColumnGroup(COLUMN_TASKID, COLUMN_TASKID));
for (String columnId : metadata.getColumnIds()) {
AggregateFunctionType functionType = null;
if (columnId.equals(COLUMN_TASKID)) {
functionType = AggregateFunctionType.DISTINCT;
}
gOp.addGroupFunction(new GroupFunction(columnId, columnId, functionType));
}
lookup.addOperation(gOp);
}
}

}
Expand Up @@ -20,26 +20,34 @@
import static org.jbpm.services.api.query.QueryResultMapper.COLUMN_ACTUALOWNER;
import static org.jbpm.services.api.query.QueryResultMapper.COLUMN_ORGANIZATIONAL_ENTITY;
import static org.jbpm.services.api.query.QueryResultMapper.COLUMN_EXCLUDED_OWNER;
import static org.jbpm.services.api.query.QueryResultMapper.COLUMN_TASKID;

import java.util.ArrayList;
import java.util.List;

import org.dashbuilder.dataset.DataSetLookup;
import org.dashbuilder.dataset.DataSetMetadata;
import org.dashbuilder.dataset.def.DataSetPreprocessor;
import org.dashbuilder.dataset.filter.ColumnFilter;
import org.dashbuilder.dataset.filter.DataSetFilter;
import org.dashbuilder.dataset.group.AggregateFunctionType;
import org.dashbuilder.dataset.group.ColumnGroup;
import org.dashbuilder.dataset.group.DataSetGroup;
import org.dashbuilder.dataset.group.GroupFunction;
import org.kie.internal.identity.IdentityProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class PotOwnerTasksPreprocessor implements DataSetPreprocessor {

private static final Logger LOGGER = LoggerFactory.getLogger(PotOwnerTasksPreprocessor.class);

private IdentityProvider identityProvider;
private DataSetMetadata metadata;

public PotOwnerTasksPreprocessor(IdentityProvider identityProvider) {
public PotOwnerTasksPreprocessor(IdentityProvider identityProvider, DataSetMetadata metadata) {
this.identityProvider = identityProvider;
this.metadata = metadata;
}

@SuppressWarnings("rawtypes")
Expand Down Expand Up @@ -69,7 +77,19 @@ public void preprocess(DataSetLookup lookup) {
filter.addFilterColumn(columnFilter);
lookup.addOperation(filter);
}


if (lookup.getLastGroupOp() == null) {
DataSetGroup gOp = new DataSetGroup();
gOp.setColumnGroup(new ColumnGroup(COLUMN_TASKID, COLUMN_TASKID));
for (String columnId : metadata.getColumnIds()) {
AggregateFunctionType functionType = null;
if (columnId.equals(COLUMN_TASKID)) {
functionType = AggregateFunctionType.DISTINCT;
}
gOp.addGroupFunction(new GroupFunction(columnId, columnId, functionType));
}
lookup.addOperation(gOp);
}
}

}
Expand Up @@ -16,6 +16,10 @@

package org.jbpm.kie.services.impl.admin;

import static org.jbpm.services.api.query.QueryResultMapper.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.kie.scanner.KieMavenRepository.getKieMavenRepository;

import java.io.File;
Expand All @@ -31,6 +35,10 @@
import org.assertj.core.api.Assertions;
import org.drools.compiler.kie.builder.impl.InternalKieModule;
import org.jbpm.kie.services.impl.KModuleDeploymentUnit;
import org.jbpm.kie.services.impl.query.SqlQueryDefinition;
import org.jbpm.kie.services.impl.query.mapper.RawListQueryMapper;
import org.jbpm.kie.services.impl.query.mapper.TaskSummaryQueryMapper;
import org.jbpm.kie.services.impl.query.mapper.UserTaskInstanceQueryMapper;
import org.jbpm.kie.services.test.KModuleDeploymentServiceTest;
import org.jbpm.kie.test.util.AbstractKieServicesBaseTest;
import org.jbpm.kie.test.util.CountDownListenerFactory;
Expand All @@ -39,13 +47,18 @@
import org.jbpm.services.api.admin.TaskReassignment;
import org.jbpm.services.api.admin.UserTaskAdminService;
import org.jbpm.services.api.model.DeploymentUnit;
import org.jbpm.services.api.model.UserTaskInstanceDesc;
import org.jbpm.services.api.query.model.QueryDefinition;
import org.jbpm.services.api.query.model.QueryParam;
import org.jbpm.services.api.query.model.QueryDefinition.Target;
import org.jbpm.shared.services.impl.TransactionalCommandService;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.builder.ReleaseId;
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.api.runtime.query.QueryContext;
import org.kie.api.task.model.OrganizationalEntity;
import org.kie.api.task.model.Status;
import org.kie.api.task.model.TaskSummary;
Expand Down Expand Up @@ -712,6 +725,84 @@ public void testReassignNotStartedAndCancel() throws Exception {
Assertions.assertThat(reassignments).hasSize(0);
}

@Test
public void testGetTaskInstancesAsPotOwners() {

String PO_TASK_QUERY = "select ti.taskId, ti.activationTime, ti.actualOwner, ti.createdBy, ti.createdOn, ti.deploymentId, " + "ti.description, ti.dueDate, ti.name, ti.parentId, ti.priority, ti.processId, ti.processInstanceId, " + "ti.processSessionId, ti.status, ti.workItemId, oe.id, eo.entity_id " + "from AuditTaskImpl ti " + "left join PeopleAssignments_PotOwners po on ti.taskId = po.task_id " + "left join OrganizationalEntity oe on po.entity_id = oe.id " + " left join PeopleAssignments_ExclOwners eo on ti.taskId = eo.task_id ";
SqlQueryDefinition query = new SqlQueryDefinition("getMyTaskInstances", "jdbc/testDS1", Target.PO_TASK);
query.setExpression(PO_TASK_QUERY);

queryService.registerQuery(query);

List<QueryDefinition> queries = queryService.getQueries(new QueryContext());
assertNotNull(queries);
assertEquals(1, queries.size());

QueryDefinition registeredQuery = queries.get(0);
assertNotNull(registeredQuery);
assertEquals(query.getName(), registeredQuery.getName());
assertEquals(query.getSource(), registeredQuery.getSource());
assertEquals(query.getExpression(), registeredQuery.getExpression());
assertEquals(query.getTarget(), registeredQuery.getTarget());

registeredQuery = queryService.getQuery(query.getName());

assertNotNull(registeredQuery);
assertEquals(query.getName(), registeredQuery.getName());
assertEquals(query.getSource(), registeredQuery.getSource());
assertEquals(query.getExpression(), registeredQuery.getExpression());
assertEquals(query.getTarget(), registeredQuery.getTarget());

Map<String, Object> params = new HashMap<String, Object>();
params.put("approval_document", "initial content");

processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), "org.jbpm.writedocument", params);
assertNotNull(processInstanceId);
identityProvider.setName("notvalid");

List<UserTaskInstanceDesc> taskInstanceLogs = queryService.query(query.getName(), UserTaskInstanceQueryMapper.get(), new QueryContext());
assertNotNull(taskInstanceLogs);
assertEquals(0, taskInstanceLogs.size());

identityProvider.setName("salaboy");

taskInstanceLogs = queryService.query(query.getName(), UserTaskInstanceQueryMapper.get(), new QueryContext());
assertNotNull(taskInstanceLogs);
assertEquals(1, taskInstanceLogs.size());

List<TaskSummary> taskSummaries = queryService.query(query.getName(), TaskSummaryQueryMapper.get(), new QueryContext());
assertNotNull(taskSummaries);
assertEquals(1, taskSummaries.size());

identityProvider.setName("Administrator");
userTaskAdminService.addPotentialOwners(taskSummaries.get(0).getId(), false, factory.newUser("john"));
identityProvider.setName("salaboy");

taskInstanceLogs = queryService.query(query.getName(), UserTaskInstanceQueryMapper.get(), new QueryContext());
assertNotNull(taskInstanceLogs);
assertEquals(1, taskInstanceLogs.size());

taskSummaries = queryService.query(query.getName(), TaskSummaryQueryMapper.get(), new QueryContext());
assertNotNull(taskSummaries);
assertEquals(1, taskSummaries.size());

QueryParam[] parameters = QueryParam.getBuilder().append(QueryParam.groupBy(COLUMN_NAME)).append(QueryParam.count(COLUMN_TASKID)).get();

Collection<List<Object>> instances = queryService.query(query.getName(), RawListQueryMapper.get(), new QueryContext(), parameters);
assertNotNull(instances);
assertEquals(1, instances.size());

List<Object> result = instances.iterator().next();
assertNotNull(result);
assertEquals(2, result.size());
// here we have count set to 2 because group by is on name and thus it returns duplicates
assertTrue(result.get(1) instanceof Number);
assertEquals(2, ((Number) result.get(1)).intValue());

processService.abortProcessInstance(processInstanceId);
processInstanceId = null;
}

/*
* Helper methods
*/
Expand Down
Expand Up @@ -19,6 +19,7 @@
import java.util.Collections;

import org.dashbuilder.dataset.DataSetLookup;
import org.dashbuilder.dataset.DataSetMetadata;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
Expand All @@ -34,6 +35,9 @@ public class BusinessAdminPreprocessorTest {

@Mock
IdentityProvider identityProvider;

@Mock
DataSetMetadata metaData;

DataSetLookup dataSetLookup;

Expand All @@ -45,7 +49,7 @@ public void init() {
"admins");
System.setProperty("org.jbpm.ht.admin.user",
"admin");
businessAdminPreprocessor = new BusinessAdminPreprocessor(identityProvider);
businessAdminPreprocessor = new BusinessAdminPreprocessor(identityProvider, metaData);
}

@Test
Expand Down

0 comments on commit ec00677

Please sign in to comment.