public ExpressionSubGraphIterator( PlannerContext plannerContext, ExpressionGraph contractionExpression, ExpressionGraph matchExpression, boolean firstOnly, ElementGraph elementGraph, Collection<FlowElement> elementExcludes ) { this.plannerContext = plannerContext; this.firstOnly = firstOnly; this.elementGraph = elementGraph; if( elementExcludes != null ) this.elementExcludes.addAll( elementExcludes ); if( contractionExpression != null ) contractedTransformer = new ContractedTransformer( contractionExpression ); else contractedGraph = elementGraph; graphFinder = new GraphFinder( matchExpression ); }
public ElementGraph getContractedGraph() { if( contractedGraph == null ) { contractedTransformed = contractedTransformer.transform( plannerContext, elementGraph ); contractedGraph = contractedTransformed.getEndGraph(); } return contractedGraph; }
@Test public void testFind2() { ElementGraph graph = new HashJoinSameSourceGraph(); graph = new ContractedTransformer( new SyncPipeExpressionGraph() ).transform( graph ).getEndGraph(); FlowElementExpression sharedTap = new FlowElementExpression( Tap.class, TypeExpression.Topo.SplitOnly ); FlowElementExpression sharedHashJoin = new FlowElementExpression( HashJoin.class ); ExpressionGraph expressionGraph = new ExpressionGraph() .arc( sharedTap, ScopeExpression.ALL, sharedHashJoin ); GraphFinder graphFinder = new GraphFinder( expressionGraph ); Match match = graphFinder.findFirstMatch( graph ); match.getMatchedGraph().writeDOT( getPlanPath() + "/match.dot" ); }
@Test public void testFind() { ElementGraph graph = new HashJoinSameSourceGraph(); graph = new ContractedTransformer( new SyncPipeExpressionGraph() ).transform( graph ).getEndGraph(); FlowElementExpression SHARED_TAP = new FlowElementExpression( Tap.class, TypeExpression.Topo.SplitOnly ); FlowElementExpression SHARED_HASHJOIN = new FlowElementExpression( HashJoin.class ); ExpressionGraph expressionGraph = new ExpressionGraph() .arcs( SHARED_TAP, SHARED_HASHJOIN ) .arcs( SHARED_TAP, SHARED_HASHJOIN ); GraphFinder graphFinder = new GraphFinder( expressionGraph ); Match match = graphFinder.findFirstMatch( graph ); match.getMatchedGraph().writeDOT( getPlanPath() + "/match.dot" ); }
@Test public void testFindAllMatched() { // ElementGraph graph = new HashJoinSameSourceGraph(); ElementGraph graph = new JoinAroundJoinRightMostGraph(); graph.writeDOT( getPlanPath() + "/full.dot" ); // graph = new ContractedTransform( new SyncPipeExpressionGraph() ).transform( graph ).getEndGraph(); graph = new ContractedTransformer( new NoGroupTapExpressionGraph() ).transform( graph ).getEndGraph(); graph.writeDOT( getPlanPath() + "/contracted.dot" ); ExpressionGraph expressionGraph = new ExpressionGraph( new FlowElementExpression( ElementCapture.Primary, Tap.class ) ); GraphFinder graphFinder = new GraphFinder( expressionGraph ); Match match = graphFinder.findAllMatches( graph ); match.getMatchedGraph().writeDOT( getPlanPath() + "/match.dot" ); } }
public RuleTransformer( LogLevel logLevel, PlanPhase phase, RuleExpression ruleExpression ) { this.logLevel = logLevel; this.phase = phase; this.ruleExpression = ruleExpression; if( ruleExpression.getContractionExpression() != null ) contractedTransformer = new ContractedTransformer( ruleExpression.getContractionExpression() ); else contractedTransformer = null; if( ruleExpression.getContractedMatchExpression() != null ) { if( contractedTransformer == null ) throw new IllegalArgumentException( "must have contracted expression if given contracted match expression" ); subGraphTransformer = new SubGraphTransformer( contractedTransformer, ruleExpression.getContractedMatchExpression() ); } else { subGraphTransformer = null; } }
@Override protected Transformed<ElementGraph> transform( PlannerContext plannerContext, ElementGraph graph ) { Transformed transformed = null; if( contractedTransformer != null ) transformed = contractedTransformer.transform( plannerContext, graph ); else if( subGraphTransformer != null ) transformed = subGraphTransformer.transform( plannerContext, graph ); return transformed; }
@Test public void testFindAllOnPrimary() { // ElementGraph graph = new HashJoinSameSourceGraph(); ElementGraph graph = new JoinAroundJoinRightMostGraph(); graph.writeDOT( getPlanPath() + "/full.dot" ); // graph = new ContractedTransform( new SyncPipeExpressionGraph() ).transform( graph ).getEndGraph(); graph = new ContractedTransformer( new NoGroupTapExpressionGraph() ).transform( graph ).getEndGraph(); graph.writeDOT( getPlanPath() + "/contracted.dot" ); ExpressionGraph expressionGraph = new ExpressionGraph() .arc( new FlowElementExpression( Tap.class ), ScopeExpression.ALL, new FlowElementExpression( ElementCapture.Primary, HashJoin.class ) ); GraphFinder graphFinder = new GraphFinder( expressionGraph ); Match match = graphFinder.findAllMatchesOnPrimary( graph ); match.getMatchedGraph().writeDOT( getPlanPath() + "/match.dot" ); }
public RuleAssert( PlanPhase phase, RuleExpression ruleExpression, String message, AssertionType assertionType ) { super( ruleExpression.getMatchExpression(), message, assertionType ); this.phase = phase; this.ruleExpression = ruleExpression; if( ruleExpression.getContractionExpression() != null ) contractedTransformer = new ContractedTransformer( ruleExpression.getContractionExpression() ); else contractedTransformer = null; if( ruleExpression.getContractedMatchExpression() != null ) { if( contractedTransformer == null ) throw new IllegalArgumentException( "must have contracted expression if given contracted match expression" ); subGraphTransformer = new SubGraphTransformer( contractedTransformer, ruleExpression.getContractedMatchExpression() ); } else { subGraphTransformer = null; } }
ContractedTransformer transformer = new ContractedTransformer( new TestNoGroupTapExpressionGraph() ); Transformed<ElementGraph> transformed = transformer.transform( plannerContext, flowElementGraph );