private void resolveElements( RuleResult ruleResult ) { if( !registry.enabledResolveElements() ) return; FlowElementGraph elementGraph = ruleResult.getAssemblyGraph(); elementGraph = (FlowElementGraph) elementGraph.copyElementGraph(); ScopeResolver.resolveFields( elementGraph ); ruleResult.setLevelResults( ProcessLevel.Assembly, ruleResult.initialAssembly, elementGraph ); }
public FlowElementGraph getAssemblyGraph() { Map<ElementGraph, List<? extends ElementGraph>> results = getLevelResults( ProcessLevel.Assembly ); return (FlowElementGraph) Util.getFirst( results.get( getInitialAssembly() ) ); }
@Override public int compare( RuleResult lhs, RuleResult rhs ) { int c = lhs.getNumSteps() - rhs.getNumSteps(); if( c != 0 ) return c; return lhs.getNumNodes() - rhs.getNumNodes(); }
private void writePhaseResultPlan( PlanPhase phase, RuleResult ruleResult ) { switch( phase.getLevel() ) { case Assembly: traceWriter.writeTransformPlan( registry.getName(), ruleResult.getAssemblyGraph(), format( "%02d-%s-result.dot", phase.ordinal(), phase ) ); break; case Step: traceWriter.writeTransformPlan( registry.getName(), ruleResult.getAssemblyToStepGraphMap().get( ruleResult.getAssemblyGraph() ), phase, "result" ); break; case Node: traceWriter.writeTransformPlan( registry.getName(), ruleResult.getStepToNodeGraphMap(), phase, "result" ); break; case Pipeline: traceWriter.writeTransformPlan( registry.getName(), ruleResult.getStepToNodeGraphMap(), ruleResult.getNodeToPipelineGraphMap(), phase, "result" ); break; } }
@Test public void testSubGraphIterator() { RuleRegistry ruleRegistry = new RuleRegistry(); ruleRegistry.addElementFactory( NonTapFactory.TEMP_TAP, new NonTapFactory() ); PlannerContext plannerContext = new PlannerContext( ruleRegistry, null, null, null, true ); ruleRegistry.addRule( new RuleInsertionTransformer( PlanPhase.PreResolveAssembly, new TestCheckpointExpression(), IntermediateTapElementFactory.TEMP_TAP ) ); // ruleRegistry.addRule( new RuleContractedTransform( PlanPhase.PreResolve, new NoOpPipeExpression() ) ); RuleResult ruleResult = new RuleExec( new TraceWriter(), ruleRegistry ).executeRulePhase( PlanPhase.PreResolveAssembly, plannerContext, new RuleResult( new StandardElementGraph() ) ); FlowElementGraph flowElementGraph = ruleResult.getAssemblyGraph(); SubGraphIterator iterator = new ExpressionSubGraphIterator( new PlannerContext(), new NoGroupTapExpressionGraph(), new TapGroupTapExpressionGraph(), flowElementGraph ); while( iterator.hasNext() ) assertNotNull( iterator.next() ); }
protected RuleResult execPlannerFor( RuleRegistry ruleRegistry ) { flowPlanner.configRuleRegistryDefaults( ruleRegistry ); String registryName = ruleRegistry.getName(); RuleExec ruleExec = new RuleExec( traceWriter, ruleRegistry ); PlannerContext plannerContext = new PlannerContext( ruleRegistry, flowPlanner, flowDef, flow, traceWriter.isTransformTraceEnabled() ); RuleResult ruleResult = ruleExec.exec( plannerContext, flowElementGraph ); getFlowLogger().logInfo( "executed rule registry: {}, completed as: {}, in: {}", registryName, ruleResult.getResultStatus(), formatDurationFromMillis( ruleResult.getDuration() ) ); traceWriter.writeTracePlan( registryName, "completed-flow-element-graph", ruleResult.getAssemblyGraph() ); traceWriter.writeStats( plannerContext, ruleResult ); Exception plannerException; if( ruleResult.isSuccess() ) plannerException = flowPlanner.verifyResult( ruleResult ); else plannerException = ruleResult.getPlannerException(); // will be re-thrown below if( plannerException != null && plannerException instanceof PlannerException && ( (PlannerException) plannerException ).getElementGraph() != null ) traceWriter.writeTracePlan( registryName, "failed-source-element-graph", ( (PlannerException) plannerException ).getElementGraph() ); if( ruleResult.isSuccess() && plannerException != null ) rethrow( plannerException ); return ruleResult; }
private void handleCurrentPartitioning( PlannerContext plannerContext, RuleResult ruleResult, PlanPhase phase, RulePartitioner partitioner ) Map<ElementGraph, List<? extends ElementGraph>> priorResults = ruleResult.getLevelResults( phase.getLevel() ); List<ElementGraph> results = makeBoundedOn( ruleResult.getAssemblyGraph(), partitions.getAnnotatedSubGraphs() ); ruleResult.setLevelResults( phase.getLevel(), subGraphs );
public RuleResult exec( PlannerContext plannerContext, FlowElementGraph flowElementGraph ) { RuleResult ruleResult = new RuleResult( registry, flowElementGraph ); ProcessLogger logger = plannerContext.getLogger(); int size = flowElementGraph.vertexSet().size(); boolean logAsInfo = size >= ELEMENT_THRESHOLD; if( logAsInfo ) logger.logInfo( "elements in graph: {}, info logging threshold: {}, logging planner execution status", size, ELEMENT_THRESHOLD ); long beginExec = System.currentTimeMillis(); try { planPhases( plannerContext, logAsInfo, ruleResult ); } catch( Exception exception ) { ruleResult.setPlannerException( exception ); } finally { long endExec = System.currentTimeMillis(); ruleResult.setDuration( beginExec, endExec ); RuleResult.ResultStatus status = ruleResult.getResultStatus(); String duration = formatDurationFromMillis( endExec - beginExec ); logPhase( logger, logAsInfo, "rule registry completed: {}, with status: {}, and duration: {}", registry.getName(), status, duration ); } return ruleResult; }
private RuleResult selectSuccess() { if( success.isEmpty() ) throw new IllegalStateException( "no planner results from registry set" ); for( RuleResult ruleResult : success ) getFlowLogger().logInfo( "rule registry: {}, supports assembly with steps: {}, nodes: {}", ruleResult.getRegistry().getName(), ruleResult.getNumSteps(), ruleResult.getNumNodes() ); if( success.size() != 1 ) { // sort is stable Collections.sort( success, getOrderComparator() ); Collections.sort( success, getPlanComparator() ); } RuleResult ruleResult = success.get( 0 ); if( registrySet.getSelect() == RuleRegistrySet.Select.FIRST ) getFlowLogger().logInfo( "rule registry: {}, result was selected as first successful", ruleResult.getRegistry().getName() ); else if( registrySet.getSelect() == RuleRegistrySet.Select.COMPARED ) getFlowLogger().logInfo( "rule registry: {}, result was selected using: \'{}\'", ruleResult.getRegistry().getName(), getPlanComparator().toString() ); return ruleResult; }
private void writePhaseInitPlan( PlanPhase phase, RuleResult ruleResult ) { switch( phase.getLevel() ) { case Assembly: traceWriter.writeTransformPlan( registry.getName(), ruleResult.getAssemblyGraph(), format( "%02d-%s-init.dot", phase.ordinal(), phase ) ); break; case Step: break; case Node: break; case Pipeline: break; } }
Map<ElementGraph, List<? extends ElementGraph>> levelResults = ruleResult.getLevelResults( phase.getLevel() ); ruleResult.setLevelResults( phase.getLevel(), parent, results );
@Test public void testRuleEngine() { RuleRegistry ruleRegistry = new RuleRegistry(); ruleRegistry.addElementFactory( NonTapFactory.TEMP_TAP, new NonTapFactory() ); PlannerContext plannerContext = new PlannerContext( ruleRegistry, null, null, null, true ); ruleRegistry.addRule( new RuleAssert( PlanPhase.PreResolveAssembly, new LoneGroupExpression(), "lone group assertion" ) ); ruleRegistry.addRule( new RuleInsertionTransformer( PlanPhase.PreResolveAssembly, new TestGroupGroupExpression(), IntermediateTapElementFactory.TEMP_TAP ) ); try { new RuleExec( new TraceWriter(), ruleRegistry ).executeRulePhase( PlanPhase.PreResolveAssembly, plannerContext, new RuleResult( new LoneGroupAssertionGraph() ) ); fail(); } catch( PlannerException exception ) { // do nothing } new RuleExec( new TraceWriter(), ruleRegistry ).executeRulePhase( PlanPhase.PreResolveAssembly, plannerContext, new RuleResult( new HashJoinSameSourceGraph() ) ); }
public Map<ElementGraph, List<? extends ElementGraph>> getAssemblyToStepGraphMap() { return getLevelResults( ProcessLevel.Step ); }
private void writeTransformTrace( RuleResult ruleResult, PlanPhase phase, Rule rule, ElementGraph parent, ElementGraph child, GraphResult result ) { if( traceWriter.isTransformTraceDisabled() ) return; int[] path = child != null ? ruleResult.getPathFor( parent, child ) : ruleResult.getPathFor( parent ); traceWriter.writeTransformPlan( registry.getName(), phase, rule, path, result ); } }
String registryName = ruleResult.getRegistry().getName(); FlowElementGraph finalFlowElementGraph = ruleResult.getAssemblyGraph(); Map<ElementGraph, List<? extends ElementGraph>> assemblyToSteps = ruleResult.getAssemblyToStepGraphMap(); Map<ElementGraph, List<? extends ElementGraph>> stepToNodes = ruleResult.getStepToNodeGraphMap(); Map<ElementGraph, List<? extends ElementGraph>> nodeToPipeline = ruleResult.getNodeToPipelineGraphMap();
private void runSubGraphIteratorRotate( FlowElementGraph elementGraph, int numSubGraphs ) { RuleRegistry ruleRegistry = new RuleRegistry(); PlannerContext plannerContext = new PlannerContext( ruleRegistry ); ruleRegistry.addRule( new RemoveNoOpPipeTransformer() ); RuleResult ruleResult = new RuleExec( new TraceWriter(), ruleRegistry ).executeRulePhase( PlanPhase.PreResolveAssembly, plannerContext, new RuleResult( elementGraph ) ); FlowElementGraph flowElementGraph = ruleResult.getAssemblyGraph(); flowElementGraph.writeDOT( getPlanPath() + "/node.dot" ); ExpressionSubGraphIterator iterator = new ExpressionSubGraphIterator( new PlannerContext(), new TestNoGroupTapExpressionGraph(), new TestConsecutiveTapsExpressionGraph(), false, flowElementGraph ); iterator.getContractedGraph().writeDOT( getPlanPath() + "/node-contracted.dot" ); int count = 0; while( iterator.hasNext() && count < 10 ) { ElementGraph next = iterator.next(); assertNotNull( next ); next.writeDOT( getPlanPath() + "/pipeline/" + count + "-graph.dot" ); count++; } assertEquals( "wrong number of sub-graphs", numSubGraphs, count ); }
private void handleParentPartitioning( PlannerContext plannerContext, RuleResult ruleResult, PlanPhase phase, RulePartitioner partitioner ) Map<ElementGraph, List<? extends ElementGraph>> priorResults = ruleResult.getLevelResults( phase.getLevel() ); List<ElementGraph> results = makeBoundedOn( ruleResult.getAssemblyGraph(), partitions.getAnnotatedSubGraphs() ); ruleResult.setLevelResults( phase.getLevel(), subGraphs );
public Map<ElementGraph, List<? extends ElementGraph>> getStepToNodeGraphMap() { return getLevelResults( ProcessLevel.Node ); }
FlowElementGraph finalFlowElementGraph = ruleResult.getAssemblyGraph(); Map<ElementGraph, List<? extends ElementGraph>> stepToNodes = ruleResult.getStepToNodeGraphMap(); Map<ElementGraph, List<? extends ElementGraph>> nodeToPipeline = ruleResult.getNodeToPipelineGraphMap(); traceWriter.writeTracePlanSteps( "4-final-flow-steps", flowStepGraph ); flow.setPlannerInfo( getPlannerInfo( ruleResult.getRegistry().getName() ) );
RuleResult ruleResult = new RuleExec( new TraceWriter(), ruleRegistry ).executeRulePhase( PlanPhase.PreResolveAssembly, plannerContext, new RuleResult( elementGraph ) ); FlowElementGraph flowElementGraph = ruleResult.getAssemblyGraph();