Bladeren bron

改进算法,当OR节点已被其它条件节点计算通过时就不再计算余下的条件节点,减少不必要计算

jacky6024 8 jaren geleden
bovenliggende
commit
9a6a62c502

+ 1 - 0
urule-core/src/main/java/com/bstek/urule/runtime/rete/AbstractActivity.java

@@ -62,5 +62,6 @@ public abstract class AbstractActivity implements Activity {
 		}
 		return trackers;
 	}
+	public abstract boolean orNodeIsPassed();
 	public abstract void reset();
 }

+ 5 - 0
urule-core/src/main/java/com/bstek/urule/runtime/rete/AndActivity.java

@@ -118,6 +118,11 @@ public class AndActivity extends JoinActivity {
 		return resultList;
 	}
 	
+	@Override
+	public boolean orNodeIsPassed() {
+		return false;
+	}
+	
 	@Override
 	public void reset() {
 		toActivityMap.clear();

+ 17 - 0
urule-core/src/main/java/com/bstek/urule/runtime/rete/CriteriaActivity.java

@@ -35,6 +35,9 @@ public class CriteriaActivity  extends AbstractActivity {
 		if(pass){
 			return null;
 		}
+		if(orNodeIsPassed()){
+			return null;
+		}
 		List<Object> allMatchedObjects=new ArrayList<Object>();
 		boolean result=criteria.evaluate(context, obj,allMatchedObjects);
 		if(result){
@@ -49,6 +52,20 @@ public class CriteriaActivity  extends AbstractActivity {
 		return null;
 	}
 	@Override
+	public boolean orNodeIsPassed() {
+		List<Path> paths=getPaths();
+		if(paths!=null){
+			if(paths.size()>1){
+				return false;
+			}else if(paths.size()==1){
+				Path path=paths.get(0);
+				AbstractActivity activity=(AbstractActivity)path.getTo();
+				return activity.orNodeIsPassed();
+			}
+		}
+		return false;
+	}
+	@Override
 	public void reset() {
 		pass=false;
 	}

+ 4 - 0
urule-core/src/main/java/com/bstek/urule/runtime/rete/NamedCriteriaActivity.java

@@ -57,6 +57,10 @@ public class NamedCriteriaActivity  extends AbstractActivity{
 		return null;
 	}
 	@Override
+	public boolean orNodeIsPassed() {
+		return false;
+	}
+	@Override
 	public void reset() {
 		pass=false;
 	}

+ 4 - 0
urule-core/src/main/java/com/bstek/urule/runtime/rete/ObjectTypeActivity.java

@@ -58,6 +58,10 @@ public class ObjectTypeActivity extends AbstractActivity {
 		return false;
 	}
 	@Override
+	public boolean orNodeIsPassed() {
+		return false;
+	}
+	@Override
 	public void reset() {
 	}
 }

+ 4 - 0
urule-core/src/main/java/com/bstek/urule/runtime/rete/OrActivity.java

@@ -33,6 +33,10 @@ public class OrActivity extends JoinActivity {
 		return visitPahs(context,obj,tracker,variableMap);
 	}
 	@Override
+	public boolean orNodeIsPassed() {
+		return pass;
+	}
+	@Override
 	public void reset(){
 		pass=false;
 	}

+ 4 - 0
urule-core/src/main/java/com/bstek/urule/runtime/rete/TerminalActivity.java

@@ -44,6 +44,10 @@ public class TerminalActivity extends AbstractActivity {
 		return result;
 	}
 	@Override
+	public boolean orNodeIsPassed() {
+		return false;
+	}
+	@Override
 	public void reset() {
 	}
 }