Hi Val, In order to run the HepPlanner you only need to execute HepPlanner#findBestExp() to obtain the transformed plan (no need to pass it also to a program which will call the same method again). Note also that planner instances are meant to be used only once since they are stateful, so you should refrain from calling findBestExp() multiple times. Other than that you are saying that the code doesn't generate a physical plan but we cannot see all the rules that you are using. Finally, the SOE you obtained may mean that a rule is applied an infinite number of times.
Best, Stamatis Στις Τετ, 23 Ιαν 2019 στις 1:51 π.μ., ο/η Val <[email protected]> έγραψε: > Hi guys, > > I am trying to make the Prepare.optimize() method run faster: > > https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/prepare/Prepare.java > > According to this article: https://calcite.apache.org/docs/adapter.html : > "Calcite has two built-in planner engines: class VolcanoPlanner uses > dynamic programming and is good for exhaustive search, whereas class > HepPlanner fires a sequence of rules in a more fixed order." > > So, I've figured that I can use HepPlanner, because speed is important to > me, so I can use less exhaustive but faster search. > > I've added a HepPlanner: > final HepProgramBuilder programBuilder = HepProgram.builder(); > programBuilder.addMatchOrder(HepMatchOrder.ARBITRARY); > programBuilder.addRuleInstance(UnionMergeRule.INSTANCE); > HepPlanner hepPlanner = new HepPlanner(programBuilder.build()); > hepPlanner.setRoot(root.rel); > RelNode hepRoot = hepPlanner.findBestExp(); > RelRoot hepRelroot = root.withRel(hepRoot); > > Then I pass this planner into the run() call (substituted "planner" with > "hepPlanner"): > final RelNode rootRel4 = program.run( > hepPlanner, hepRelroot.rel, desiredTraits, materializationList, > latticeList); > > When running unit tests I get exception: > > java.lang.StackOverflowError > at java.security.AccessController.doPrivileged(Native > Method) > at java.io.PrintWriter.<init>(PrintWriter.java:116) > at java.io.PrintWriter.<init>(PrintWriter.java:100) > at > > org.apache.calcite.rel.AbstractRelNode.computeDigest(AbstractRelNode.java:396) > at > > org.apache.calcite.rel.AbstractRelNode.recomputeDigest(AbstractRelNode.java:356) > at > org.apache.calcite.plan.hep.HepPlanner.addRelToGraph(HepPlanner.java:817) > at > > org.apache.calcite.plan.hep.HepPlanner.applyTransformationResults(HepPlanner.java:741) > at > org.apache.calcite.plan.hep.HepPlanner.applyRule(HepPlanner.java:559) > at > org.apache.calcite.plan.hep.HepPlanner.depthFirstApply(HepPlanner.java:370) > at > org.apache.calcite.plan.hep.HepPlanner.depthFirstApply(HepPlanner.java:382) > …<many more lines like this> > at > org.apache.calcite.plan.hep.HepPlanner.depthFirstApply(HepPlanner.java:382) > > Let me know what I am doing wrong. I've tried skipping the call to run() > method, but just using the HepPlanner alone with the newly added code shown > above doesnt generate physical plan. Is there a way to use HepPlanner so > that it generates physical plan? > > Thanks, > Val >
