提交 47e1b0c9 编写于 作者: T Tijs Rademakers

Merge pull request #79 from henryyan/master

native query for HistoricVariableInstance and HistoricDetail
......@@ -28,8 +28,10 @@ import org.activiti.engine.history.HistoricTaskInstanceQuery;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.history.HistoricVariableInstanceQuery;
import org.activiti.engine.history.NativeHistoricActivityInstanceQuery;
import org.activiti.engine.history.NativeHistoricDetailQuery;
import org.activiti.engine.history.NativeHistoricProcessInstanceQuery;
import org.activiti.engine.history.NativeHistoricTaskInstanceQuery;
import org.activiti.engine.history.NativeHistoricVariableInstanceQuery;
import org.activiti.engine.task.IdentityLink;
/**
......@@ -56,10 +58,20 @@ public interface HistoryService {
/** Creates a new programmatic query to search for {@link HistoricDetail}s. */
HistoricDetailQuery createHistoricDetailQuery();
/**
* Returns a new {@link org.activiti.engine.query.NativeQuery} for process definitions.
*/
NativeHistoricDetailQuery createNativeHistoricDetailQuery();
/** Creates a new programmatic query to search for {@link HistoricVariableInstance}s. */
HistoricVariableInstanceQuery createHistoricVariableInstanceQuery();
/**
* Returns a new {@link org.activiti.engine.query.NativeQuery} for process definitions.
*/
NativeHistoricVariableInstanceQuery createNativeHistoricVariableInstanceQuery();
/** Deletes historic task instance. This might be useful for tasks that are
* {@link TaskService#newTask() dynamically created} and then {@link TaskService#complete(String) completed}.
* If the historic task instance doesn't exist, no exception is thrown and the
......
package org.activiti.engine.history;
import org.activiti.engine.query.NativeQuery;
/**
* Allows querying of {@link org.activiti.engine.history.HistoricDetail}s via native (SQL) queries
* @author Henry Yan(http://www.kafeitu.me)
*/
public interface NativeHistoricDetailQuery extends NativeQuery<NativeHistoricDetailQuery, HistoricDetail> {
}
\ No newline at end of file
package org.activiti.engine.history;
import org.activiti.engine.query.NativeQuery;
/**
* Allows querying of {@link org.activiti.engine.history.HistoricVariableInstance}s via native (SQL) queries
* @author Henry Yan(http://www.kafeitu.me)
*/
public interface NativeHistoricVariableInstanceQuery
extends NativeQuery<NativeHistoricVariableInstanceQuery, HistoricVariableInstance> {
}
\ No newline at end of file
......@@ -24,8 +24,10 @@ import org.activiti.engine.history.HistoricProcessInstanceQuery;
import org.activiti.engine.history.HistoricTaskInstanceQuery;
import org.activiti.engine.history.HistoricVariableInstanceQuery;
import org.activiti.engine.history.NativeHistoricActivityInstanceQuery;
import org.activiti.engine.history.NativeHistoricDetailQuery;
import org.activiti.engine.history.NativeHistoricProcessInstanceQuery;
import org.activiti.engine.history.NativeHistoricTaskInstanceQuery;
import org.activiti.engine.history.NativeHistoricVariableInstanceQuery;
import org.activiti.engine.impl.cmd.DeleteHistoricProcessInstanceCmd;
import org.activiti.engine.impl.cmd.DeleteHistoricTaskInstanceCmd;
import org.activiti.engine.impl.cmd.GetHistoricIdentityLinksForTaskCmd;
......@@ -53,10 +55,20 @@ public class HistoryServiceImpl extends ServiceImpl implements HistoryService {
return new HistoricDetailQueryImpl(commandExecutor);
}
@Override
public NativeHistoricDetailQuery createNativeHistoricDetailQuery() {
return new NativeHistoricDetailQueryImpl(commandExecutor);
}
public HistoricVariableInstanceQuery createHistoricVariableInstanceQuery() {
return new HistoricVariableInstanceQueryImpl(commandExecutor);
}
@Override
public NativeHistoricVariableInstanceQuery createNativeHistoricVariableInstanceQuery() {
return new NativeHistoricVariableInstanceQueryImpl(commandExecutor);
}
public void deleteHistoricTaskInstance(String taskId) {
commandExecutor.execute(new DeleteHistoricTaskInstanceCmd(taskId));
}
......
package org.activiti.engine.impl;
import java.util.List;
import java.util.Map;
import org.activiti.engine.history.HistoricDetail;
import org.activiti.engine.history.NativeHistoricDetailQuery;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.interceptor.CommandExecutor;
public class NativeHistoricDetailQueryImpl extends AbstractNativeQuery<NativeHistoricDetailQuery, HistoricDetail> implements NativeHistoricDetailQuery {
private static final long serialVersionUID = 1L;
public NativeHistoricDetailQueryImpl(CommandContext commandContext) {
super(commandContext);
}
public NativeHistoricDetailQueryImpl(CommandExecutor commandExecutor) {
super(commandExecutor);
}
//results ////////////////////////////////////////////////////////////////
public List<HistoricDetail> executeList(CommandContext commandContext, Map<String, Object> parameterMap, int firstResult, int maxResults) {
return commandContext
.getHistoricDetailEntityManager()
.findHistoricDetailsByNativeQuery(parameterMap, firstResult, maxResults);
}
public long executeCount(CommandContext commandContext, Map<String, Object> parameterMap) {
return commandContext
.getHistoricDetailEntityManager()
.findHistoricDetailCountByNativeQuery(parameterMap);
}
}
\ No newline at end of file
package org.activiti.engine.impl;
import java.util.List;
import java.util.Map;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.history.NativeHistoricVariableInstanceQuery;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.interceptor.CommandExecutor;
public class NativeHistoricVariableInstanceQueryImpl extends AbstractNativeQuery<NativeHistoricVariableInstanceQuery, HistoricVariableInstance> implements NativeHistoricVariableInstanceQuery {
private static final long serialVersionUID = 1L;
public NativeHistoricVariableInstanceQueryImpl(CommandContext commandContext) {
super(commandContext);
}
public NativeHistoricVariableInstanceQueryImpl(CommandExecutor commandExecutor) {
super(commandExecutor);
}
//results ////////////////////////////////////////////////////////////////
public List<HistoricVariableInstance> executeList(CommandContext commandContext, Map<String, Object> parameterMap, int firstResult, int maxResults) {
return commandContext
.getHistoricVariableInstanceEntityManager()
.findHistoricVariableInstancesByNativeQuery(parameterMap, firstResult, maxResults);
}
public long executeCount(CommandContext commandContext, Map<String, Object> parameterMap) {
return commandContext
.getHistoricVariableInstanceEntityManager()
.findHistoricVariableInstanceCountByNativeQuery(parameterMap);
}
}
\ No newline at end of file
......@@ -99,6 +99,13 @@ public class DbSqlSessionFactory implements SessionFactory {
addDatabaseSpecificStatement("db2", "selectHistoricProcessInstanceByNativeQuery", "selectHistoricProcessInstanceByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("db2", "selectHistoricTaskInstanceByNativeQuery", "selectHistoricTaskInstanceByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("db2", "selectTaskByNativeQuery", "selectTaskByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("db2", "selectProcessDefinitionByNativeQuery", "selectProcessDefinitionByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("db2", "selectDeploymentByNativeQuery", "selectDeploymentByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("db2", "selectGroupByNativeQuery", "selectGroupByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("db2", "selectUserByNativeQuery", "selectUserByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("db2", "selectModelByNativeQuery", "selectModelByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("db2", "selectHistoricDetailByNativeQuery", "selectHistoricDetailByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("db2", "selectHistoricVariableInstanceByNativeQuery", "selectHistoricVariableInstanceByNativeQuery_mssql_or_db2");
// mssql
databaseSpecificLimitBeforeStatements.put("mssql", "SELECT SUB.* FROM (");
......@@ -112,6 +119,13 @@ public class DbSqlSessionFactory implements SessionFactory {
addDatabaseSpecificStatement("mssql", "selectHistoricProcessInstanceByNativeQuery", "selectHistoricProcessInstanceByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("mssql", "selectHistoricTaskInstanceByNativeQuery", "selectHistoricTaskInstanceByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("mssql", "selectTaskByNativeQuery", "selectTaskByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("mssql", "selectProcessDefinitionByNativeQuery", "selectProcessDefinitionByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("mssql", "selectDeploymentByNativeQuery", "selectDeploymentByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("mssql", "selectGroupByNativeQuery", "selectGroupByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("mssql", "selectUserByNativeQuery", "selectUserByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("mssql", "selectModelByNativeQuery", "selectModelByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("mssql", "selectHistoricDetailByNativeQuery", "selectHistoricDetailByNativeQuery_mssql_or_db2");
addDatabaseSpecificStatement("mssql", "selectHistoricVariableInstanceByNativeQuery", "selectHistoricVariableInstanceByNativeQuery_mssql_or_db2");
}
......
......@@ -14,6 +14,7 @@
package org.activiti.engine.impl.persistence.entity;
import java.util.List;
import java.util.Map;
import org.activiti.engine.history.HistoricDetail;
import org.activiti.engine.impl.HistoricDetailQueryImpl;
......@@ -60,4 +61,13 @@ public class HistoricDetailEntityManager extends AbstractManager {
}
}
}
@SuppressWarnings("unchecked")
public List<HistoricDetail> findHistoricDetailsByNativeQuery(Map<String, Object> parameterMap, int firstResult, int maxResults) {
return getDbSqlSession().selectListWithRawParameter("selectHistoricDetailByNativeQuery", parameterMap, firstResult, maxResults);
}
public long findHistoricDetailCountByNativeQuery(Map<String, Object> parameterMap) {
return (Long) getDbSqlSession().selectOne("selectHistoricDetailCountByNativeQuery", parameterMap);
}
}
......@@ -14,6 +14,7 @@
package org.activiti.engine.impl.persistence.entity;
import java.util.List;
import java.util.Map;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.impl.HistoricVariableInstanceQueryImpl;
......@@ -74,4 +75,13 @@ public class HistoricVariableInstanceEntityManager extends AbstractManager {
}
}
}
@SuppressWarnings("unchecked")
public List<HistoricVariableInstance> findHistoricVariableInstancesByNativeQuery(Map<String, Object> parameterMap, int firstResult, int maxResults) {
return getDbSqlSession().selectListWithRawParameter("selectHistoricVariableInstanceByNativeQuery", parameterMap, firstResult, maxResults);
}
public long findHistoricVariableInstanceCountByNativeQuery(Map<String, Object> parameterMap) {
return (Long) getDbSqlSession().selectOne("selectHistoricVariableInstanceCountByNativeQuery", parameterMap);
}
}
......@@ -154,5 +154,29 @@
</if>
</where>
</sql>
<select id="selectHistoricDetailByNativeQuery" parameterType="java.util.Map" resultMap="historicDetailResultMap">
<if test="resultType == 'LIST_PAGE'">
${limitBefore}
</if>
${sql}
<if test="resultType == 'LIST_PAGE'">
${limitAfter}
</if>
</select>
<select id="selectHistoricDetailByNativeQuery_mssql_or_db2" parameterType="java.util.Map" resultMap="historicDetailResultMap">
<if test="resultType == 'LIST_PAGE'">
${limitBeforeNativeQuery}
</if>
${sql}
<if test="resultType == 'LIST_PAGE'">
${limitAfter}
</if>
</select>
<select id="selectHistoricDetailCountByNativeQuery" parameterType="java.util.Map" resultType="long">
${sql}
</select>
</mapper>
......@@ -169,5 +169,29 @@
<select id="selectHistoricVariableInstanceByVariableInstanceId" resultMap="historicProcessVariableResultMap">
select * from ${prefix}ACT_HI_VARINST where ID_ = #{variableInstanceId}
</select>
<select id="selectHistoricVariableInstanceByNativeQuery" parameterType="java.util.Map" resultMap="historicProcessVariableResultMap">
<if test="resultType == 'LIST_PAGE'">
${limitBefore}
</if>
${sql}
<if test="resultType == 'LIST_PAGE'">
${limitAfter}
</if>
</select>
<select id="selectHistoricVariableInstanceByNativeQuery_mssql_or_db2" parameterType="java.util.Map" resultMap="historicProcessVariableResultMap">
<if test="resultType == 'LIST_PAGE'">
${limitBeforeNativeQuery}
</if>
${sql}
<if test="resultType == 'LIST_PAGE'">
${limitAfter}
</if>
</select>
<select id="selectHistoricVariableInstanceCountByNativeQuery" parameterType="java.util.Map" resultType="long">
${sql}
</select>
</mapper>
......@@ -13,16 +13,11 @@
package org.activiti.engine.test.history;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricDetail;
import org.activiti.engine.history.HistoricVariableInstance;
......@@ -313,5 +308,80 @@ public class HistoricVariableInstanceTest extends AbstractActivitiTestCase {
assertEquals(2, count);
}
@Deployment(resources = "org/activiti/engine/test/history/HistoricVariableInstanceTest.testSimple.bpmn20.xml")
public void testNativeHistoricVariableInstanceQuery() {
assertEquals("ACT_HI_VARINST", managementService.getTableName(HistoricVariableInstance.class));
assertEquals("ACT_HI_VARINST", managementService.getTableName(HistoricVariableInstanceEntity.class));
String tableName = managementService.getTableName(HistoricVariableInstance.class);
String baseQuerySql = "SELECT * FROM " + tableName;
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("var1", "value1");
variables.put("var2", "value2");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProc", variables);
assertNotNull(processInstance);
assertEquals(3, historyService.createNativeHistoricVariableInstanceQuery().sql(baseQuerySql).list().size());
String sqlWithConditions = baseQuerySql + " where NAME_ = #{name}";
assertEquals("test123", historyService.createNativeHistoricVariableInstanceQuery().sql(sqlWithConditions)
.parameter("name", "myVar").singleResult().getValue());
sqlWithConditions = baseQuerySql + " where NAME_ like #{name}";
assertEquals(2, historyService.createNativeHistoricVariableInstanceQuery().sql(sqlWithConditions)
.parameter("name", "var%").list().size());
// paging
assertEquals(3, historyService.createNativeHistoricVariableInstanceQuery().sql(baseQuerySql).listPage(0, 3).size());
assertEquals(2, historyService.createNativeHistoricVariableInstanceQuery().sql(baseQuerySql).listPage(1, 3).size());
assertEquals(2, historyService.createNativeHistoricVariableInstanceQuery().sql(sqlWithConditions)
.parameter("name", "var%").listPage(0, 2).size());
}
@Deployment(resources = "org/activiti/engine/test/history/HistoricVariableInstanceTest.testSimple.bpmn20.xml")
public void testNativeHistoricDetailQuery() {
assertEquals("ACT_HI_DETAIL", managementService.getTableName(HistoricDetail.class));
assertEquals("ACT_HI_DETAIL", managementService.getTableName(HistoricVariableUpdate.class));
String tableName = managementService.getTableName(HistoricDetail.class);
String baseQuerySql = "SELECT * FROM " + tableName;
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("var1", "value1");
variables.put("var2", "value2");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProc", variables);
assertNotNull(processInstance);
assertEquals(3, historyService.createNativeHistoricDetailQuery().sql(baseQuerySql).list().size());
String sqlWithConditions = baseQuerySql + " where NAME_ = #{name} and TYPE_ = #{type}";
assertNotNull(historyService.createNativeHistoricDetailQuery().sql(sqlWithConditions)
.parameter("name", "myVar").parameter("type", "VariableUpdate").singleResult());
sqlWithConditions = baseQuerySql + " where NAME_ like #{name}";
assertEquals(2, historyService.createNativeHistoricDetailQuery().sql(sqlWithConditions)
.parameter("name", "var%").list().size());
Task task = taskService.createTaskQuery().singleResult();
Map<String, String> formDatas = new HashMap<String, String>();
formDatas.put("field1", "field value 1");
formDatas.put("field2", "field value 2");
formService.submitTaskFormData(task.getId(), formDatas);
String countSql = "select count(*) from " + tableName + " where TYPE_ = #{type} and PROC_INST_ID_ = #{pid}";
assertEquals(2, historyService.createNativeHistoricDetailQuery().sql(countSql)
.parameter("type", "FormProperty").parameter("pid", processInstance.getId()).count());
// paging
assertEquals(3, historyService.createNativeHistoricDetailQuery().sql(baseQuerySql).listPage(0, 3).size());
assertEquals(3, historyService.createNativeHistoricDetailQuery().sql(baseQuerySql).listPage(1, 3).size());
sqlWithConditions = baseQuerySql + " where TYPE_ = #{type} and PROC_INST_ID_ = #{pid}";
assertEquals(2, historyService.createNativeHistoricDetailQuery().sql(sqlWithConditions)
.parameter("type", "FormProperty").parameter("pid", processInstance.getId()).listPage(0, 2).size());
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册