[jboss-svn-commits] JBL Code SVN: r17797 - labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Jan 13 17:37:32 EST 2008
Author: mark.proctor at jboss.com
Date: 2008-01-13 17:37:32 -0500 (Sun, 13 Jan 2008)
New Revision: 17797
Added:
labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/AlphaNetworkCompiler.java
Log:
JBRULES-1418 Compiled AlphaNode Network
Added: labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/AlphaNetworkCompiler.java
===================================================================
--- labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/AlphaNetworkCompiler.java (rev 0)
+++ labs/jbossrules/branches/righttuple/drools-core/src/main/java/org/drools/reteoo/AlphaNetworkCompiler.java 2008-01-13 22:37:32 UTC (rev 17797)
@@ -0,0 +1,168 @@
+package org.drools.reteoo;
+
+import java.util.Arrays;
+import java.util.Comparator;
+
+import org.drools.util.Iterator;
+import org.drools.util.LinkedList;
+import org.drools.util.ObjectHashMap;
+import org.drools.util.ObjectHashMap.ObjectEntry;
+import org.drools.reteoo.CompositeRightTupleSinkAdapter.HashKey;
+
+public class AlphaNetworkCompiler {
+ private StringBuilder builder;
+
+ public void compile(ObjectTypeNode objectTypeNode) {
+ builder = new StringBuilder();
+ builder.append( "public class Compiled" + objectTypeNode.getObjectType() + "AlphaNetwork implements RightTupleSink { \n" );
+
+ createVars( objectTypeNode.getSinkPropagator().getSinks(), 4 );
+
+ builder.append( " public void assertObject(....) { \n");
+
+ compileAlphaNodes( objectTypeNode.getSinkPropagator(),
+ 8 );
+
+ builder.append( " } \n" );
+ builder.append( "} \n" );
+
+ System.out.println( builder.toString() );
+ }
+
+ public void createVars(RightTupleSink[] sinks,
+ int indent) {
+ for ( RightTupleSink sink : sinks ) {
+ if ( sink instanceof AlphaNode ) {
+ AlphaNode alphaNode = (AlphaNode) sink;
+ builder.append( getIndent( indent ) + "AlphaNodeFieldConstraint alphaNodeConstraint" + alphaNode.getId() + ";\n" );
+ createVars( alphaNode.getSinkPropagator().getSinks(), indent );
+ } else if ( sink instanceof BetaNode ) {
+ BetaNode betaNode = (BetaNode) sink;
+ builder.append( getIndent( indent ) + "RightTupleSink sink" + betaNode.getId() + ";\n" );
+ } else if ( sink instanceof LeftInputAdapterNode ) {
+ LeftInputAdapterNode liaNode = (LeftInputAdapterNode) sink;
+ builder.append( getIndent( indent ) + "RightTupleSink sink" + liaNode.getId() + ";\n" );
+ }
+ }
+ }
+
+ public void compileAlphaNodes(RightTupleSinkPropagator adapter,
+ int indent) {
+ if ( adapter instanceof SingleRightTupleSinkAdapter ) {
+ compileAlphaNodeSingleConstraint( (SingleRightTupleSinkAdapter) adapter,
+ indent );
+ } else if ( adapter instanceof CompositeRightTupleSinkAdapter ) {
+ compileAlphaNodeCompositeConstraint( (CompositeRightTupleSinkAdapter) adapter,
+ indent );
+ }
+ }
+
+ private void compileAlphaNodeCompositeConstraint(CompositeRightTupleSinkAdapter adapter,
+ int indent) {
+ RightTupleSinkNodeList sinks = adapter.getHashableSinks();
+ if ( sinks != null ) {
+ for ( RightTupleSinkNode sink = sinks.getFirst(); sink != null; sink = sink.getNextRightTupleSinkNode() ) {
+ compileAlphaNodeSingleConstraint( sink,
+ indent );
+ }
+ }
+
+ sinks = adapter.getOthers();
+ if ( sinks != null ) {
+ for ( RightTupleSinkNode sink = sinks.getFirst(); sink != null; sink = sink.getNextRightTupleSinkNode() ) {
+ compileAlphaNodeSingleConstraint( sink,
+ indent );
+ }
+ }
+
+ ObjectHashMap map = adapter.getHashedSinkMap();
+ if ( map != null ) {
+ ObjectEntry[] entries = new ObjectEntry[map.size()];
+ Iterator it = map.iterator();
+ int i = 0;
+ for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
+ entries[i++] = entry;
+ }
+
+ // we sort as switch works faster with ordered cases
+ Arrays.sort( entries,
+ new Comparator() {
+ public int compare(Object o1,
+ Object o2) {
+ ObjectEntry entry1 = (ObjectEntry) o1;
+ ObjectEntry entry2 = (ObjectEntry) o2;
+ return ((RightTupleSink) entry1.getValue()).getId() - ((RightTupleSink) entry2.getValue()).getId();
+ }
+
+ } );
+
+ //final Iterator it = map.newIterator();
+ builder.append( getIndent( indent ) + "HashKey key = new HashKey(handle);\n" );
+ builder.append( getIndent( indent ) + "swtich ((RightTupleSink)this.hashedSinkedMap(key)).getId() {\n" );
+ for ( ObjectEntry entry : entries ) {
+ RightTupleSink sink = (RightTupleSink) entry.getValue();
+ builder.append( getIndent( indent + 4 ) + "case " + sink.getId() + ": {\n" );
+ //builder.append( getIndent( indent + 8 ) + "sink" + sink.getId() + ".assertRight(handle, wm, context);\n" );
+
+ if (sink instanceof AlphaNode ) {
+ compileAlphaNodes( ((AlphaNode)sink).getSinkPropagator(),
+ indent + 8 );
+ }
+
+ builder.append( getIndent( indent + 4 )+ "};\n" );
+ }
+ builder.append( getIndent( indent ) + "};\n" );
+ }
+
+ }
+
+ public void compileAlphaNodeSingleConstraint(SingleRightTupleSinkAdapter adapter,
+ int indent) {
+ compileAlphaNodeSingleConstraint( adapter.getSinks()[0],
+ indent );
+ }
+
+ public void compileAlphaNodeSingleConstraint(RightTupleSink sink,
+ int indent) {
+ if ( sink instanceof AlphaNode ) {
+ AlphaNode alphaNode = (AlphaNode) sink;
+ builder.append( getIndent( indent ) + "if ( alphaNodeConstraint" + alphaNode.getId() + ".isAllowed(handle, wm) ) {\n" );
+ compileAlphaNodes( alphaNode.getSinkPropagator(),
+ indent + 4 );
+ builder.append( getIndent( indent ) + "}\n" );
+ } else if ( sink instanceof BetaNode ) {
+ BetaNode betaNode = (BetaNode) sink;
+ builder.append( getIndent( indent ) + "sink" + betaNode.getId() + ".assertRight(handle, wm, context);\n" );
+ } else if ( sink instanceof LeftInputAdapterNode ) {
+ LeftInputAdapterNode liaNode = (LeftInputAdapterNode) sink;
+ builder.append( getIndent( indent ) + "sink" + liaNode.getId() + ".assertRight(handle, wm, context);\n" );
+ }
+ }
+
+ public void compileAlphaNodeCompositeConstraint(RightTupleSink sink,
+ int indent) {
+ if ( sink instanceof AlphaNode ) {
+ AlphaNode alphaNode = (AlphaNode) sink;
+ builder.append( getIndent( indent ) + "if ( alphaNodeConstraint" + alphaNode.getId() + ".isAllowed(handle, wm) ) {\n" );
+ compileAlphaNodes( alphaNode.getSinkPropagator(),
+ indent + 4 );
+ builder.append( getIndent( indent ) + "}\n" );
+ } else if ( sink instanceof BetaNode ) {
+ BetaNode betaNode = (BetaNode) sink;
+ builder.append( getIndent( indent ) + "sink" + betaNode.getId() + ".assertRight(handle, wm, context);\n" );
+ } else if ( sink instanceof LeftInputAdapterNode ) {
+ LeftInputAdapterNode liaNode = (LeftInputAdapterNode) sink;
+ builder.append( getIndent( indent ) + "sink" + liaNode.getId() + ".assertRight(handle, wm, context);\n" );
+ }
+ }
+
+ private String getIndent(int indent) {
+ char[] spaces = new char[indent];
+ for ( int i = 0; i < spaces.length; i++ ) {
+ spaces[i] = ' ';
+ }
+
+ return new String( spaces );
+ }
+
+}
More information about the jboss-svn-commits
mailing list