/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jbpm.process.audit.query; import static org.jbpm.persistence.util.PersistenceUtil.JBPM_PERSISTENCE_UNIT_NAME; import static org.jbpm.persistence.util.PersistenceUtil.cleanUp; import static org.jbpm.persistence.util.PersistenceUtil.setupWithPoolingDataSource; import static org.jbpm.process.audit.query.AuditQueryDataUtil.BOTH; import static org.jbpm.process.audit.query.AuditQueryDataUtil.MAX; import static org.jbpm.process.audit.query.AuditQueryDataUtil.MIN; import static org.jbpm.process.audit.query.AuditQueryDataUtil.createTestNodeInstanceLogData; import static org.jbpm.process.audit.query.AuditQueryDataUtil.createTestProcessInstanceLogData; import static org.jbpm.process.audit.query.AuditQueryDataUtil.createTestVariableInstanceLogData; import static org.jbpm.process.audit.query.AuditQueryDataUtil.randomLong; import static org.jbpm.process.audit.query.AuditQueryDataUtil.verifyMaxMinDuration; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.kie.api.runtime.EnvironmentName.ENTITY_MANAGER_FACTORY; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import org.jbpm.process.audit.AuditLogServiceTest; import org.jbpm.process.audit.JPAAuditLogService; import org.jbpm.process.audit.NodeInstanceLog; import org.jbpm.process.audit.ProcessInstanceLog; import org.jbpm.process.audit.VariableInstanceLog; import org.jbpm.process.audit.strategy.StandaloneJtaStrategy; import org.jbpm.process.instance.impl.util.LoggingPrintStream; import org.jbpm.test.util.AbstractBaseTest; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.kie.internal.KieInternalServices; import org.kie.internal.process.CorrelationKey; import org.kie.internal.query.ParametrizedQuery; import org.kie.internal.runtime.manager.audit.query.AuditLogQueryBuilder.OrderBy; import org.kie.internal.runtime.manager.audit.query.NodeInstanceLogQueryBuilder; import org.kie.internal.runtime.manager.audit.query.ProcessInstanceLogQueryBuilder; import org.kie.internal.runtime.manager.audit.query.VariableInstanceLogQueryBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class AuditQueryTest extends JPAAuditLogService { private static HashMap<String, Object> context; private static EntityManagerFactory emf; private static final Logger logger = LoggerFactory.getLogger(AuditLogServiceTest.class); private ProcessInstanceLog [] pilTestData; private VariableInstanceLog [] vilTestData; private NodeInstanceLog [] nilTestData; @AfterClass public static void resetLogging() { AbstractBaseTest.reset(); } @BeforeClass public static void configure() { AbstractBaseTest.hackTheDatabaseMetadataLoggerBecauseTheresALogbackXmlInTheClasspath(); LoggingPrintStream.interceptSysOutSysErr(); context = setupWithPoolingDataSource(JBPM_PERSISTENCE_UNIT_NAME); emf = (EntityManagerFactory) context.get(ENTITY_MANAGER_FACTORY); } @AfterClass public static void reset() { LoggingPrintStream.resetInterceptSysOutSysErr(); cleanUp(context); } @Before public void setUp() throws Exception { if( pilTestData == null ) { pilTestData = createTestProcessInstanceLogData(emf); vilTestData = createTestVariableInstanceLogData(emf); nilTestData = createTestNodeInstanceLogData(emf); } this.persistenceStrategy = new StandaloneJtaStrategy(emf); } @Test public void simpleProcessInstanceLogQueryBuilderTest() { int p = 0; long duration = pilTestData[p++].getDuration(); ProcessInstanceLogQueryBuilder builder = this.processInstanceLogQuery().duration(duration); List<org.kie.api.runtime.manager.audit.ProcessInstanceLog> resultList = builder.build().getResultList(); assertEquals( "duration query result", 2, resultList.size()); { Date end = pilTestData[p++].getEnd(); builder = this.processInstanceLogQuery().endDate(end); resultList = builder.build().getResultList(); assertEquals( "end date query result", 2, resultList.size()); } { String identity = pilTestData[p++].getIdentity(); builder = this.processInstanceLogQuery().identity(identity); resultList = builder.build().getResultList(); assertEquals( "identity query result", 2, resultList.size()); } { String processId = pilTestData[p++].getProcessId(); builder = this.processInstanceLogQuery().processId(processId); resultList = builder.build().getResultList(); assertEquals( "process id query result", 2, resultList.size()); } { long processInstanceId = pilTestData[p++].getProcessInstanceId(); builder = this.processInstanceLogQuery().processInstanceId(processInstanceId); resultList = builder.build().getResultList(); assertEquals( "process instance id query result", 2, resultList.size()); } { String processName = pilTestData[p++].getProcessName(); builder = this.processInstanceLogQuery().processName(processName); resultList = builder.build().getResultList(); assertEquals( "process name query result", 2, resultList.size()); } { String version = pilTestData[p++].getProcessVersion(); builder = this.processInstanceLogQuery().processVersion(version); resultList = builder.build().getResultList(); assertEquals( "process version query result", 2, resultList.size()); } { Date start = pilTestData[p++].getStart(); builder = this.processInstanceLogQuery().startDate(start); resultList = builder.build().getResultList(); assertEquals( "start date query result", 2, resultList.size()); } { int status = pilTestData[p++].getStatus(); builder = this.processInstanceLogQuery().status(status); resultList = builder.build().getResultList(); assertEquals( "status query result", 2, resultList.size()); } { String outcome = pilTestData[p++].getOutcome(); builder = this.processInstanceLogQuery().outcome(outcome); resultList = builder.build().getResultList(); assertEquals( "outcome query result", 2, resultList.size()); } { String correlationKey = pilTestData[p++].getCorrelationKey(); CorrelationKey ck = KieInternalServices.Factory.get().newCorrelationKeyFactory().newCorrelationKey(correlationKey); builder = this.processInstanceLogQuery().correlationKey(ck); resultList = builder.build().getResultList(); assertEquals( "identity query result", 1, resultList.size()); } } @Test public void simpleVariableInstanceLogQueryBuilderTest() { int p = 0; Date date = vilTestData[p++].getDate(); VariableInstanceLogQueryBuilder builder = this.variableInstanceLogQuery().date(date); List<org.kie.api.runtime.manager.audit.VariableInstanceLog> resultList = builder.build().getResultList(); assertEquals( "date query result", 2, resultList.size()); { String oldValue = vilTestData[p++].getOldValue(); builder = this.variableInstanceLogQuery().oldValue(oldValue); resultList = builder.build().getResultList(); assertEquals( "old value query result", 2, resultList.size()); } { String processId = vilTestData[p++].getProcessId(); builder = this.variableInstanceLogQuery().processId(processId); resultList = builder.build().getResultList(); assertEquals( "process id query result", 2, resultList.size()); } { long processInstanceId = vilTestData[p++].getProcessInstanceId(); builder = this.variableInstanceLogQuery().processInstanceId(processInstanceId); resultList = builder.build().getResultList(); assertEquals( "process instance id query result", 2, resultList.size()); } { String value = vilTestData[p++].getValue(); builder = this.variableInstanceLogQuery().value(value); resultList = builder.build().getResultList(); assertEquals( "value query result", 2, resultList.size()); } { String variableId = vilTestData[p++].getVariableId(); builder = this.variableInstanceLogQuery().variableId(variableId); resultList = builder.build().getResultList(); assertEquals( "variable id query result", 2, resultList.size()); } { String varInstId = vilTestData[p++].getVariableInstanceId(); builder = this.variableInstanceLogQuery().variableInstanceId(varInstId); resultList = builder.build().getResultList(); assertEquals( "variable instance id query result", 2, resultList.size()); } } @Test public void simpleNodeInstanceLogQueryBuilderTest() { int p = 0; Date date = nilTestData[p++].getDate(); NodeInstanceLogQueryBuilder builder = this.nodeInstanceLogQuery().date(date); List<org.kie.api.runtime.manager.audit.NodeInstanceLog> resultList = builder.build().getResultList(); assertEquals( "date query result", 2, resultList.size()); { String nodeId = nilTestData[p++].getNodeId(); builder = this.nodeInstanceLogQuery().nodeId(nodeId); resultList = builder.build().getResultList(); assertEquals( "node id query result", 2, resultList.size()); } { String nodeInstId = nilTestData[p++].getNodeInstanceId(); builder = this.nodeInstanceLogQuery().nodeInstanceId(nodeInstId); resultList = builder.build().getResultList(); assertEquals( "node instance id query result", 2, resultList.size()); } { String name = nilTestData[p++].getNodeName(); builder = this.nodeInstanceLogQuery().nodeName(name); resultList = builder.build().getResultList(); assertEquals( "node name query result", 2, resultList.size()); } { String nodeType = nilTestData[p++].getNodeType(); builder = this.nodeInstanceLogQuery().nodeType(nodeType); resultList = builder.build().getResultList(); assertEquals( "node type query result", 2, resultList.size()); } { String processId = nilTestData[p++].getProcessId(); builder = this.nodeInstanceLogQuery().processId(processId); resultList = builder.build().getResultList(); assertEquals( "process id query result", 2, resultList.size()); } { long processInstanceId = nilTestData[p++].getProcessInstanceId(); builder = this.nodeInstanceLogQuery().processInstanceId(processInstanceId); resultList = builder.build().getResultList(); assertEquals( "process instance id query result", 2, resultList.size()); } { long workItemId = nilTestData[p++].getWorkItemId(); builder = this.nodeInstanceLogQuery().workItemId(workItemId); resultList = builder.build().getResultList(); assertEquals( "work item id query result", 2, resultList.size()); } // pagination int maxResults = 5; resultList = this.nodeInstanceLogQuery().build().getResultList(); assertTrue( "Not enough to do pagination test", resultList.size() > maxResults ); resultList = this.nodeInstanceLogQuery() .maxResults(maxResults) .ascending(org.kie.internal.runtime.manager.audit.query.NodeInstanceLogQueryBuilder.OrderBy.processInstanceId) .build().getResultList(); assertTrue( "Only expected " + maxResults + " results, not " + resultList.size(), resultList.size() <= 5 ); int offset = 3; List<org.kie.api.runtime.manager.audit.NodeInstanceLog> newResultList = this.nodeInstanceLogQuery() .maxResults(maxResults) .offset(offset) .ascending(org.kie.internal.runtime.manager.audit.query.NodeInstanceLogQueryBuilder.OrderBy.processInstanceId) .build().getResultList(); assertTrue( "Only expected" + maxResults + " results, not " + newResultList.size(), newResultList.size() <= 5 ); assertEquals( "Offset should have been " + offset + ": " + resultList.get(offset).getProcessInstanceId() + " != " + newResultList.get(0).getProcessInstanceId(), resultList.get(offset).getProcessInstanceId(), newResultList.get(0).getProcessInstanceId() ); } @Test public void unionQueryBuilderTest() { ProcessInstanceLogQueryBuilder builder = this.processInstanceLogQuery(); builder.duration(pilTestData[4].getDuration()); List<org.kie.api.runtime.manager.audit.ProcessInstanceLog> resultList = builder.build().getResultList(); assertEquals( "duration result", 1, resultList.size()); builder.endDate(pilTestData[5].getEnd(), pilTestData[6].getEnd()); resultList = builder.build().getResultList(); assertEquals( "union: duration OR end result", 3, resultList.size()); builder.identity(pilTestData[7].getIdentity(), pilTestData[8].getIdentity()); resultList = builder.build().getResultList(); assertEquals( "union: duration OR end OR identity result", 5, resultList.size()); } @Test public void intersectQueryBuilderTest() { ProcessInstanceLogQueryBuilder builder = this.processInstanceLogQuery(); builder.intersect(); builder.duration(pilTestData[4].getDuration()); List<org.kie.api.runtime.manager.audit.ProcessInstanceLog> resultList = builder.build().getResultList(); assertEquals( "duration result", 1, resultList.size()); builder.endDate(pilTestData[5].getEnd()); resultList = builder.build().getResultList(); assertEquals( "intersect: duration AND end result", 0, resultList.size()); builder.identity(pilTestData[6].getIdentity()); resultList = builder.build().getResultList(); assertEquals( "intersect: duration AND end AND identity result", 0, resultList.size()); } @Test public void intersectUnionQueryBuilderTest() { ProcessInstanceLogQueryBuilder builder = this.processInstanceLogQuery(); builder.duration(pilTestData[0].getDuration(), pilTestData[2].getDuration()); List<org.kie.api.runtime.manager.audit.ProcessInstanceLog> resultList = builder.build().getResultList(); assertEquals( "duration result", 3, resultList.size()); builder.intersect().endDate(pilTestData[0].getEnd()); resultList = builder.build().getResultList(); assertEquals( "intersect: duration AND end result", 1, resultList.size()); builder.union().processId(pilTestData[10].getProcessId()); resultList = builder.build().getResultList(); assertEquals( "intersect/union: duration AND end OR processId result", 1 + 1, resultList.size()); } @Test public void likeRegexQueryBuilderTest() { ProcessInstanceLogQueryBuilder builder = this.processInstanceLogQuery(); builder.like(); boolean parameterFailed = false; try { builder.duration(pilTestData[0].getDuration(), pilTestData[2].getDuration()); } catch( Exception e ) { parameterFailed = true; } assertTrue( "adding critera should have failed because of like()", parameterFailed); String regex = pilTestData[0].getIdentity(); builder.identity(regex); List<org.kie.api.runtime.manager.audit.ProcessInstanceLog> resultList = builder.build().getResultList(); assertEquals( "literal regex identity result", 1, resultList.size()); String externalId = resultList.get(0).getExternalId(); builder = this.processInstanceLogQuery(); regex = regex.substring(0, regex.length()-1) + "."; builder.like().identity(regex); resultList = builder.build().getResultList(); assertEquals( "literal regex identity result", 1, resultList.size()); assertEquals( externalId, resultList.get(0).getExternalId() ); builder = this.processInstanceLogQuery(); regex = regex.substring(0, 10) + "*"; builder.like().identity(regex); resultList = builder.build().getResultList(); assertEquals( "literal regex identity result", 1, resultList.size()); assertEquals( externalId, resultList.get(0).getExternalId() ); builder = this.processInstanceLogQuery(); String regex2 = "*" + pilTestData[0].getIdentity().substring(10); builder.like().intersect().identity(regex, regex2); resultList = builder.build().getResultList(); assertEquals( "literal regex identity result", 1, resultList.size()); assertEquals( externalId, resultList.get(0).getExternalId() ); builder = this.processInstanceLogQuery(); regex2 = "*" + pilTestData[5].getIdentity().substring(10); builder.like().intersect().identity(regex, regex2); resultList = builder.build().getResultList(); assertEquals( "literal regex identity result", 0, resultList.size()); builder = this.processInstanceLogQuery(); builder.like().union().identity(regex, regex2); resultList = builder.build().getResultList(); assertEquals( "literal regex identity result", 2, resultList.size()); builder = this.processInstanceLogQuery(); builder.like().union().identity("*"); resultList = builder.build().getResultList(); assertEquals( "literal regex identity result", this.processInstanceLogQuery().build().getResultList().size(), resultList.size()); } @Test public void rangeQueryBuilderTest() { ProcessInstanceLogQueryBuilder builder = this.processInstanceLogQuery(); long duration = pilTestData[5].getDuration(); builder.intersect().durationMin(duration-1).durationMax(duration+1); List<org.kie.api.runtime.manager.audit.ProcessInstanceLog> resultList = builder.build().getResultList(); assertEquals( "duration min + max result", 1, resultList.size()); List<org.kie.api.runtime.manager.audit.ProcessInstanceLog> durationOrderedProcInstLogList = this.processInstanceLogQuery().build().getResultList(); Collections.sort(durationOrderedProcInstLogList, new Comparator<org.kie.api.runtime.manager.audit.ProcessInstanceLog>() { @Override public int compare( org.kie.api.runtime.manager.audit.ProcessInstanceLog o1, org.kie.api.runtime.manager.audit.ProcessInstanceLog o2 ) { return o1.getDuration().compareTo(o2.getDuration()); } } ); int lastElemIndex = durationOrderedProcInstLogList.size()-1; builder = this.processInstanceLogQuery(); long max = durationOrderedProcInstLogList.get(0).getDuration(); builder.durationMax(max); resultList = builder.build().getResultList(); verifyMaxMinDuration( resultList, MAX, max ); builder = this.processInstanceLogQuery(); long min = durationOrderedProcInstLogList.get(lastElemIndex).getDuration(); builder.durationMin(min); resultList = builder.build().getResultList(); duration = resultList.get(0).getDuration(); verifyMaxMinDuration(resultList, MIN, min); // union max and min builder = this.processInstanceLogQuery(); min = durationOrderedProcInstLogList.get(lastElemIndex).getDuration(); builder.durationMin(min); max = durationOrderedProcInstLogList.get(0).getDuration(); builder.durationMax(max); resultList = builder.build().getResultList(); for( org.kie.api.runtime.manager.audit.ProcessInstanceLog log : resultList ) { long dur = log.getDuration(); assertTrue( "Duration " + dur + " is neither larger than min + " + min + " nor smaller than max" + max, dur >= min || dur <= max ); } // empty intersection (larger than large min, smaller than small max ) builder = this.processInstanceLogQuery().intersect(); min = durationOrderedProcInstLogList.get(lastElemIndex).getDuration(); builder.durationMin(min); max = durationOrderedProcInstLogList.get(0).getDuration(); builder.durationMax(max); resultList = builder.build().getResultList(); verifyMaxMinDuration(resultList, BOTH, min, max); builder = this.processInstanceLogQuery().intersect(); min = durationOrderedProcInstLogList.get(2).getDuration(); max = durationOrderedProcInstLogList.get(3).getDuration(); builder.durationMin(min); builder.durationMax(max); resultList = builder.build().getResultList(); // there are 2 ProcessInstanceLog's with the same duration verifyMaxMinDuration(resultList, BOTH, min, max ); } @Test public void orderByQueryBuilderTest() { ProcessInstanceLogQueryBuilder builder = this.processInstanceLogQuery(); builder.ascending(OrderBy.processInstanceId); List<org.kie.api.runtime.manager.audit.ProcessInstanceLog> resultList = builder.build().getResultList(); for (int i = 1; i < resultList.size(); ++i) { ProcessInstanceLog pilB = (ProcessInstanceLog) resultList.get(i); ProcessInstanceLog pilA = (ProcessInstanceLog) resultList.get(i - 1); assertTrue("order by asc process instance id failed: " + pilA.getProcessInstanceId() + " ? " + pilB.getProcessInstanceId(), pilA.getProcessInstanceId() <= pilB.getProcessInstanceId()); } builder.descending(OrderBy.processInstanceId); resultList = builder.build().getResultList(); for (int i = 1; i < resultList.size(); ++i) { ProcessInstanceLog pilB = (ProcessInstanceLog) resultList.get(i); ProcessInstanceLog pilA = (ProcessInstanceLog) resultList.get(i - 1); assertTrue("order by desc process instance id failed: " + pilA.getProcessInstanceId() + " ? " + pilB.getProcessInstanceId(), pilA.getProcessInstanceId() >= pilB.getProcessInstanceId()); } builder.ascending(OrderBy.processId); resultList = builder.build().getResultList(); for (int i = 1; i < resultList.size(); ++i) { ProcessInstanceLog pilA = (ProcessInstanceLog) resultList.get(i - 1); ProcessInstanceLog pilB = (ProcessInstanceLog) resultList.get(i); assertTrue("order by asc process id failed: " + pilA.getProcessId() + " ? " + pilB.getProcessId(), pilA.getProcessId().compareTo(pilB.getProcessId()) <= 0); } builder.descending(OrderBy.processId); resultList = builder.build().getResultList(); for (int i = 1; i < resultList.size(); ++i) { ProcessInstanceLog pilA = (ProcessInstanceLog) resultList.get(i - 1); ProcessInstanceLog pilB = (ProcessInstanceLog) resultList.get(i); assertTrue("order by desc process id failed: " + pilA.getProcessId() + " ? " + pilB.getProcessId(), pilA.getProcessId().compareTo(pilB.getProcessId()) >= 0); } } @Test public void lastVariableTest() throws Exception { StandaloneJtaStrategy jtaHelper = new StandaloneJtaStrategy(emf); EntityManager em = jtaHelper.getEntityManager(); int numLogs = 10; VariableInstanceLog [] testData = new VariableInstanceLog[numLogs]; Calendar cal = GregorianCalendar.getInstance(); for( int i = 0; i < 5; ++i ) { cal.roll(Calendar.SECOND, 1); testData[i] = new VariableInstanceLog(23l, "org.lots.of.vars", "inst", "first-var", "val-a", "oldVal-" + i); testData[i+5] = new VariableInstanceLog(23l, "org.lots.of.vars", "inst", "second-var", "val-b", "oldVal-" + i); testData[i].setDate(cal.getTime()); testData[i+5].setDate(cal.getTime()); } Object tx = jtaHelper.joinTransaction(em); for( int i = 0; i < numLogs; ++i ) { em.persist(testData[i]); } jtaHelper.leaveTransaction(em, tx); VariableInstanceLogQueryBuilder queryBuilder; ParametrizedQuery<org.kie.api.runtime.manager.audit.VariableInstanceLog> query ; List<org.kie.api.runtime.manager.audit.VariableInstanceLog> logs; queryBuilder = this.variableInstanceLogQuery(); query = queryBuilder.last().intersect().processInstanceId(23l).build(); logs = query.getResultList(); assertEquals("2 logs", 2, logs.size()); queryBuilder = this.variableInstanceLogQuery(); query = queryBuilder.value("val-a").intersect().last().build(); logs = query.getResultList(); assertEquals("Only 1 log expected", 1, logs.size()); assertEquals("Incorrect variable val", "val-a", logs.get(0).getValue()); assertEquals("Incorrect variable old val", "oldVal-4", logs.get(0).getOldValue()); } @Test public void variableValueTest() throws Exception { StandaloneJtaStrategy jtaHelper = new StandaloneJtaStrategy(emf); EntityManager em = jtaHelper.getEntityManager(); int numLogs = 9; VariableInstanceLog [] testData = new VariableInstanceLog[numLogs]; Calendar cal = GregorianCalendar.getInstance(); String processId = "org.variable.value"; for( int i = 0; i < testData.length; ++i ) { cal.roll(Calendar.SECOND, 1); testData[i] = new VariableInstanceLog(randomLong(), processId, "varInstId", "var-" +i, "val-"+i, "oldVal-" + i); } Object tx = jtaHelper.joinTransaction(em); for( int i = 0; i < numLogs; ++i ) { em.persist(testData[i]); } jtaHelper.leaveTransaction(em, tx); VariableInstanceLogQueryBuilder queryBuilder; ParametrizedQuery<org.kie.api.runtime.manager.audit.VariableInstanceLog> query ; List<org.kie.api.runtime.manager.audit.VariableInstanceLog> logs; // check queryBuilder = this.variableInstanceLogQuery(); query = queryBuilder.processId(processId).build(); logs = query.getResultList(); assertEquals(numLogs + " logs expected", numLogs, logs.size()); // control: don't find any queryBuilder = this.variableInstanceLogQuery() .intersect() .processId(processId); query = queryBuilder .variableValue("var-1", "val-2") .build(); logs = query.getResultList(); assertEquals("No logs expected", 0, logs.size()); // control: don't find any queryBuilder = this.variableInstanceLogQuery() .intersect() .processId(processId); query = queryBuilder .variableValue("var-1", "val-1") .variableValue("var-2", "val-2") .build(); logs = query.getResultList(); assertEquals("No logs expected", 0, logs.size()); // find 1 queryBuilder = this.variableInstanceLogQuery(); query = queryBuilder .union() .variableValue("var-1", "val-1") .build(); logs = query.getResultList(); assertEquals("1 log expected", 1, logs.size()); assertEquals("Incorrect variable val", "val-1", logs.get(0).getValue()); assertEquals("Incorrect variable id", "var-1", logs.get(0).getVariableId()); // find 2 queryBuilder = this.variableInstanceLogQuery(); query = queryBuilder .union() .variableValue("var-2", "val-2") .variableValue("var-4", "val-4") .build(); logs = query.getResultList(); assertEquals("2 log expected", 2, logs.size()); for( org.kie.api.runtime.manager.audit.VariableInstanceLog varLog : logs ) { String id = varLog.getVariableId().substring("var-".length()); assertEquals( "variable value", "val-" + id, varLog.getValue()); } // regex: find 1 queryBuilder = this.variableInstanceLogQuery(); query = queryBuilder .like() .variableValue("var-2", "val-*") .build(); logs = query.getResultList(); assertEquals("1 log expected", 1, logs.size()); assertEquals("Incorrect variable val", "val-2", logs.get(0).getValue()); assertEquals("Incorrect variable id", "var-2", logs.get(0).getVariableId()); // regex: find 2 queryBuilder = this.variableInstanceLogQuery(); query = queryBuilder .like().union() .variableValue("var-2", "val-*") .variableValue("var-3", "val-*") .build(); logs = query.getResultList(); assertEquals("2 log expected", 2, logs.size()); for( org.kie.api.runtime.manager.audit.VariableInstanceLog varLog : logs ) { String id = varLog.getVariableId().substring("var-".length()); assertEquals( "variable value", "val-" + id, varLog.getValue()); } // regex: find 2 with last queryBuilder = this.variableInstanceLogQuery(); query = queryBuilder .newGroup() .like().union() .variableValue("var-2", "val-*") .variableValue("var-3", "val-*") .endGroup() .equals().intersect() .last() .build(); logs = query.getResultList(); assertEquals("2 log expected", 2, logs.size()); for( org.kie.api.runtime.manager.audit.VariableInstanceLog varLog : logs ) { String id = varLog.getVariableId().substring("var-".length()); assertEquals( "variable value", "val-" + id, varLog.getValue()); } } }