diff --git a/computer-algorithm/pom.xml b/computer-algorithm/pom.xml
index 9d65f3e95..0b2f9b9f8 100644
--- a/computer-algorithm/pom.xml
+++ b/computer-algorithm/pom.xml
@@ -23,9 +23,9 @@
${project.version}
- com.googlecode.aviator
- aviator
- 3.0.1
+ org.mvel
+ mvel2
+ 2.4.13.Final
diff --git a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/SpreadFilter.java b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/SpreadFilter.java
index 924b2abcf..3b9a28f40 100644
--- a/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/SpreadFilter.java
+++ b/computer-algorithm/src/main/java/com/baidu/hugegraph/computer/algorithm/path/rings/filter/SpreadFilter.java
@@ -19,53 +19,64 @@
package com.baidu.hugegraph.computer.algorithm.path.rings.filter;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.stream.Collectors;
+import java.util.function.Predicate;
+
+import org.mvel2.MVEL;
import com.baidu.hugegraph.computer.core.graph.edge.Edge;
import com.baidu.hugegraph.computer.core.graph.value.Value;
import com.baidu.hugegraph.computer.core.graph.vertex.Vertex;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import com.googlecode.aviator.AviatorEvaluator;
-import com.googlecode.aviator.Expression;
public class SpreadFilter {
private static final String ALL = "*";
private static final String MESSAGE = "$message";
private static final String ELEMENT = "$element";
- private static final List PASS = ImmutableList.of();
+ private static final List PASS = ImmutableList.of();
- private final Map vertexFilter;
- private final Map edgeFilter;
+ private final Map vertexFilter;
+ private final Map edgeSpreadFilter;
+ private final Map edgeFilter;
public SpreadFilter(String describe) {
- FilterDescribe filter = FilterDescribe.of(describe);
+ FilterDescribe des = FilterDescribe.of(describe);
this.vertexFilter = new HashMap<>();
+ this.edgeSpreadFilter = new HashMap<>();
this.edgeFilter = new HashMap<>();
- this.init(this.vertexFilter, filter.vertexFilter());
- this.init(this.edgeFilter, filter.edgeFilter());
+ this.init(this.vertexFilter, des.vertexFilter(), expression -> true);
+ this.init(this.edgeSpreadFilter, des.edgeFilter(), expression -> true);
+ // TODO: Use a better scheme to parse expressions with only $element
+ this.init(this.edgeFilter, des.edgeFilter(), expression -> {
+ return !expression.contains(MESSAGE);
+ });
}
- private void init(Map filter,
- List describes) {
+ private void init(Map filter,
+ List describes,
+ Predicate super String> predicate) {
for (FilterDescribe.DescribeItem describe : describes) {
String labelName = describe.label();
- Expression expression = AviatorEvaluator.compile(
- describe.propertyFilter());
- filter.put(labelName, expression);
+ String propertyFilter = describe.propertyFilter();
+ if (predicate.test(propertyFilter) || ALL.equals(labelName)) {
+ Serializable expression = MVEL.compileExpression(
+ describe.propertyFilter());
+ filter.put(labelName, expression);
+ }
}
}
public boolean filter(Vertex vertex) {
String label = vertex.label();
- List expressions = expressions(this.vertexFilter, label);
+ List expressions = expressions(this.vertexFilter, label);
if (expressions == PASS) {
return true;
@@ -78,19 +89,12 @@ public boolean filter(Vertex vertex) {
public boolean filter(Edge edge) {
String label = edge.label();
- List expressions = expressions(this.edgeFilter, label);
+ List expressions = expressions(this.edgeFilter, label);
if (expressions == PASS) {
return true;
}
- expressions = expressions.stream()
- .filter(expression -> {
- return !expression.getVariableNames()
- .contains(MESSAGE);
- })
- .collect(Collectors.toList());
-
Map>> params =
ImmutableMap.of(ELEMENT, edge.properties().get());
return filter(params, expressions);
@@ -98,7 +102,8 @@ public boolean filter(Edge edge) {
public boolean filter(Edge edge, RingsDetectionValue message) {
String label = edge.label();
- List expressions = expressions(this.edgeFilter, label);
+ List expressions = expressions(this.edgeSpreadFilter,
+ label);
if (expressions == PASS) {
return true;
@@ -111,20 +116,22 @@ public boolean filter(Edge edge, RingsDetectionValue message) {
}
private static boolean filter(Map>> params,
- List expressions) {
+ List expressions) {
Map map = convertParamsValueToObject(params);
return expressions.stream()
.allMatch(expression -> {
- return (Boolean) expression.execute(map);
+ return (Boolean) MVEL.executeExpression(
+ expression, map);
});
}
- private static List expressions(Map filter,
- String label) {
+ private static List expressions(
+ Map filter,
+ String label) {
if (filter.size() == 0) {
return PASS;
}
- List expressions = new ArrayList<>();
+ List expressions = new ArrayList<>();
if (filter.containsKey(ALL)) {
expressions.add(filter.get(ALL));
}