diff --git a/src/main/java/apoc/trigger/Trigger.java b/src/main/java/apoc/trigger/Trigger.java index d139e1fb..fc6e95a7 100644 --- a/src/main/java/apoc/trigger/Trigger.java +++ b/src/main/java/apoc/trigger/Trigger.java @@ -10,6 +10,7 @@ import org.neo4j.graphdb.event.TransactionData; import org.neo4j.graphdb.event.TransactionEventHandler; import org.neo4j.helpers.collection.Iterators; +import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.impl.core.GraphProperties; import org.neo4j.kernel.impl.core.NodeManager; import org.neo4j.kernel.internal.GraphDatabaseAPI; @@ -17,6 +18,7 @@ import org.neo4j.logging.Log; import org.neo4j.procedure.*; +import java.lang.reflect.Field; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Stream; @@ -225,6 +227,19 @@ private void executeTriggers(TransactionData txData, String phase) { if (phase.equals( "after" )) { params.putAll( txDataCollector( txData, phase, (Map) data.get( "config" ) ) ); + + try + { + Field f = txData.getClass().getDeclaredField( "transaction" ); + f.setAccessible( true ); + KernelTransaction kernelTransaction = (KernelTransaction) f.get( txData ); + params.put( "lastTxId", kernelTransaction.lastTransactionIdWhenStarted() ); + f.setAccessible( false ); + } + catch ( NoSuchFieldException | IllegalAccessException e ) + { + log.error( "Failed to get last transaction id: " + e.getMessage() ); + } } if( ( (Map) data.get( "config" )).get( "params" ) != null) { diff --git a/src/test/java/apoc/trigger/TriggerDataTest.java b/src/test/java/apoc/trigger/TriggerDataTest.java index 58036343..a23a0141 100644 --- a/src/test/java/apoc/trigger/TriggerDataTest.java +++ b/src/test/java/apoc/trigger/TriggerDataTest.java @@ -57,6 +57,16 @@ public void testTriggerData_TransactionId() throws Exception { }); } + @Test + public void testTriggerData_lastTxId() { + db.execute("CALL apoc.trigger.add('test','WITH {createdNodes} AS createdNodes, {lastTxId} AS lastTxId UNWIND {createdNodes} AS n SET n.testProp = lastTxId',{phase: 'after'}, { uidKeys: ['uid'], params: {}})").close(); + db.execute("CREATE (f:Foo {name:'Michael'})").close(); + TestUtil.testCall(db, "MATCH (f:Foo) RETURN f", (row) -> { + assertEquals(true, ((Node)row.get("f")).hasProperty("testProp")); + assertNotEquals( "``:``:`0`", ((Node)row.get("f")).getProperty( "testProp") ); + }); + } + @Test public void testTriggerData_CommitTime() throws Exception { db.execute("CALL apoc.trigger.add('test','WITH {createdNodes} AS createdNodes, {txData} AS txData UNWIND {createdNodes} AS n SET n.testProp = txData." + COMMIT_TIME + "',{phase: 'after'}, { uidKeys: ['uid'], params: {}})").close();