Skip to content

Commit

Permalink
removed updated output - some code refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
vga91 committed Nov 28, 2022
1 parent 1dbba23 commit 4904b28
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 51 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public class TriggerHandlerNewProcedures {
private static Map<String, Object> toTriggerInfo(Node node) {
return node.getAllProperties()
.entrySet().stream()
.filter(e -> !List.of(SystemPropertyKeys.name.name(), SystemPropertyKeys.database.name()).contains(e.getKey()))
.filter(e -> !SystemPropertyKeys.database.name().equals(e.getKey()))
.collect(HashMap::new, // workaround for https://bugs.openjdk.java.net/browse/JDK-8148463
(mapAccumulator, e) -> {
Object value = List.of(SystemPropertyKeys.selector.name(), SystemPropertyKeys.params.name()).contains(e.getKey())
Expand Down
63 changes: 20 additions & 43 deletions core/src/main/java/apoc/trigger/TriggerNewProcedures.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package apoc.trigger;

import apoc.ApocConfig;
import apoc.SystemPropertyKeys;
import apoc.util.Util;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.kernel.api.procedure.SystemProcedure;
Expand All @@ -15,25 +16,12 @@
import java.util.Map;
import java.util.stream.Stream;

import static apoc.ApocConfig.apocConfig;
import static org.neo4j.configuration.GraphDatabaseSettings.SYSTEM_DATABASE_NAME;


public class TriggerNewProcedures {
// public for testing purpose
public static final String TRIGGER_NOT_ROUTED_ERROR = "The procedure should be routed and executed against a LEADER system database";

public static class TriggerShowInfo extends TriggerInfo {
public boolean updated;

public TriggerShowInfo(String name, String query,
Map<String, Object> selector, Map<String, Object> params,
boolean installed, boolean paused,
boolean updated ) {
super(name, query, selector, params, installed, paused);
this.updated = updated;
}
}

public static class TriggerInfo {
public String name;
Expand All @@ -55,6 +43,15 @@ public TriggerInfo( String name, String query, Map<String,Object> selector, Map<
this(name, query, selector, installed, paused);
this.params = params;
}

public static TriggerInfo from(Map<String, Object> mapInfo, boolean installed) {
return new TriggerInfo((String) mapInfo.get(SystemPropertyKeys.name.name()),
(String) mapInfo.get(SystemPropertyKeys.statement.name()),
(Map<String, Object>) mapInfo.get(SystemPropertyKeys.selector.name()),
(Map<String, Object>) mapInfo.get(SystemPropertyKeys.params.name()),
installed,
(boolean) mapInfo.getOrDefault(SystemPropertyKeys.paused.name(), true));
}
}

@Context public GraphDatabaseService db;
Expand All @@ -74,7 +71,7 @@ public TriggerInfo toTriggerInfo(Map.Entry<String, Object> e) {
if (e.getValue() instanceof Map) {
try {
Map<String, Object> value = (Map<String, Object>) e.getValue();
return new TriggerInfo(name, (String) value.get("statement"), (Map<String, Object>) value.get("selector"), (Map<String, Object>) value.get("params"), false, false);
return TriggerInfo.from(value, false);
} catch(Exception ex) {
return new TriggerInfo(name, ex.getMessage(), null, false, false);
}
Expand All @@ -94,9 +91,9 @@ public Stream<TriggerInfo> install(@Name("databaseName") String databaseName, @N

Map<String,Object> params = (Map)config.getOrDefault("params", Collections.emptyMap());
Map<String, Object> removed = TriggerHandlerNewProcedures.install(databaseName, name, statement, selector, params);
if (!removed.isEmpty()) {
if (removed.containsKey(SystemPropertyKeys.statement.name())) {
return Stream.of(
new TriggerInfo( name, (String)removed.get( "statement"), (Map<String, Object>) removed.get( "selector"), (Map<String, Object>) removed.get( "params"), false, false),
TriggerInfo.from(removed, false),
new TriggerInfo( name, statement, selector, params, true, false));
}
return Stream.of(new TriggerInfo( name, statement, selector, params, true, false));
Expand All @@ -110,10 +107,10 @@ public Stream<TriggerInfo> install(@Name("databaseName") String databaseName, @N
public Stream<TriggerInfo> drop(@Name("databaseName") String databaseName, @Name("name")String name) {
checkInSystemLeader();
Map<String, Object> removed = TriggerHandlerNewProcedures.drop(databaseName, name);
if (removed.isEmpty()) {
if (!removed.containsKey(SystemPropertyKeys.statement.name())) {
return Stream.of(new TriggerInfo(name, null, null, false, false));
}
return Stream.of(new TriggerInfo(name,(String)removed.get("statement"), (Map<String, Object>) removed.get("selector"), (Map<String, Object>) removed.get("params"),false, false));
return Stream.of(TriggerInfo.from(removed, false));
}


Expand All @@ -135,10 +132,7 @@ public Stream<TriggerInfo> stop(@Name("databaseName") String databaseName, @Name
checkInSystemLeader();
Map<String, Object> paused = TriggerHandlerNewProcedures.updatePaused(databaseName, name, true);

return Stream.of(new TriggerInfo(name,
(String)paused.get("statement"),
(Map<String,Object>) paused.get("selector"),
(Map<String,Object>) paused.get("params"),true, true));
return Stream.of(TriggerInfo.from(paused,true));
}

// TODO - change with @SystemOnlyProcedure
Expand All @@ -149,37 +143,20 @@ public Stream<TriggerInfo> start(@Name("databaseName") String databaseName, @Nam
checkInSystemLeader();
Map<String, Object> resume = TriggerHandlerNewProcedures.updatePaused(databaseName, name, false);

return Stream.of(new TriggerInfo(name,
(String)resume.get("statement"),
(Map<String,Object>) resume.get("selector"),
(Map<String,Object>) resume.get("params"),true, false));
return Stream.of(TriggerInfo.from(resume, true));
}

// TODO - perhaps change with @SystemOnlyProcedure
@SystemProcedure
@Procedure(mode = Mode.READ)
@Description("CALL apoc.trigger.show(databaseName) | it lists all installed triggers")
public Stream<TriggerShowInfo> show(@Name("databaseName") String databaseName) {
public Stream<TriggerInfo> show(@Name("databaseName") String databaseName) {
// TODO - perhaps not needed
checkInSystemLeader();

final long interval = apocConfig().getInt("apoc.trigger.refresh", 60000);
final long currTime = System.currentTimeMillis();

return TriggerHandlerNewProcedures.getTriggerNodes(databaseName)
.stream()
.map(trigger -> {
final long lastUpdated = currTime - (long) trigger.get("lastUpdated");
return new TriggerShowInfo((String) trigger.get("name"),
(String) trigger.get("statement"),
(Map<String, Object>) trigger.get("selector"),
(Map<String, Object>) trigger.get("params"),
true,
(boolean) trigger.get("paused"),

// if lastUpdated property is less than apoc.trigger.refresh
lastUpdated > interval
);
});
.map(trigger -> TriggerInfo.from( trigger, true)
);
}
}
26 changes: 19 additions & 7 deletions core/src/test/java/apoc/trigger/TriggerNewProceduresTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import static apoc.util.TestUtil.testCallCount;
import static apoc.util.TestUtil.testCallCountEventually;
import static apoc.util.TestUtil.testCallEventually;
import static apoc.util.TestUtil.testResult;
import static apoc.util.TestUtil.waitDbsAvailable;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
Expand Down Expand Up @@ -507,20 +508,31 @@ public void testDeleteRelationships() {

@Test
public void testTriggerShow() throws Exception {
String name = "test-show";
String name = "test-show1";
String name2 = "test-show2";
String query = "MATCH (c:TestShow) SET c.count = 1";

testCall(sysDb, "CALL apoc.trigger.install('neo4j', $name, $query,{}) YIELD name",
map("query", query, "name", name),
r -> assertEquals(name, r.get("name")));

testCall(sysDb, "CALL apoc.trigger.install('neo4j', $name, $query,{}) YIELD name",
map("query", query, "name", name2),
r -> assertEquals(name2, r.get("name")));

// not updated
testCall(sysDb, "CALL apoc.trigger.show('neo4j') YIELD updated RETURN updated LIMIT 1",
map("query", query, "name", name),
r -> assertEquals(false, r.get("updated")));
// update
testCallEventually(sysDb, "CALL apoc.trigger.show('neo4j') YIELD updated",
testResult(sysDb, "CALL apoc.trigger.show('neo4j') " +
"YIELD name, query RETURN * ORDER BY name",
map("query", query, "name", name),
r -> assertEquals(true, r.get("updated")), 5L);
res -> {
Map<String, Object> row = res.next();
assertEquals(name, row.get("name"));
assertEquals(query, row.get("query"));
row = res.next();
assertEquals(name2, row.get("name"));
assertEquals(query, row.get("query"));
assertFalse(res.hasNext());
});
}

@Test
Expand Down

0 comments on commit 4904b28

Please sign in to comment.