I think there's a reset method IIRC that can be used to reset the state of the planner.
> On Sep 14, 2016, at 7:59 PM, bluejoe <[email protected]> wrote: > > By the way, I took an insight into the PlanerImpl.validate(): > > public SqlNode validate(SqlNode sqlNode) throws ValidationException { > ensure(State.STATE_3_PARSED); > this.validator = > new CalciteSqlValidator( > operatorTable, createCatalogReader(), typeFactory); > this.validator.setIdentifierExpansion(true); > try { > validatedSqlNode = validator.validate(sqlNode); > } catch (RuntimeException e) { > throw new ValidationException(e); > } > state = State.STATE_4_VALIDATED; > return validatedSqlNode; > } > > > I noticed the state is often changed in such steps, so, if this cause a > PlanerImpl instance is always bound to one SqlNode and cannot be reused to > parse/validate another SqlNodes? > > ——————————————— > Zhihong SHEN, Ph. D., Senior Engineer > Big Data Application Service Technology Laboratory, > Computer Network Information Center, Chinese Academy of Sciences > office phone:+86-10-58812516 > mobile:+86-13671116520 > > > > > > > > >> On 9/15/16, 1:07 AM, "[email protected]" >> <[email protected] on behalf of >> [email protected]> wrote: >> >> You have to run planner.validate after parse, otherwise the state in >> PlannerImpl will be incorrect. You can also go into the PlannerImpl and >> steal some code if you need to circumvent those states, but I agree this is >> probably the easiest way to go about it. The alternative is just creating a >> parser and SqlToRelConverter to do the parsing and conversion yourself. >> PlannerImpl takes care of a lot of other things as well like flattening >> nested types, view expansion, etc IIRC. >> >>> On Sep 14, 2016, at 2:29 AM, bluejoe <[email protected]> wrote: >>> >>> Hi, Hyde >>> >>> I wrote code like this: >>> >>> FrameworkConfig config = Frameworks.newConfigBuilder().build(); >>> Planner planner = Frameworks.getPlanner(config); >>> SqlNode node = planner.parse(sql); >>> RelRoot relRoot = planner.rel(node); >>> RelNode project = relRoot.project(); >>> RexNode condition = ((Filter) ((Project) >>> project).getInput()).getCondition(); >>> >>> >>> However, an exception was thrown while running 'RelRoot relRoot = >>> planner.rel(node);’: >>> >>> java.lang.IllegalArgumentException: cannot move from STATE_3_PARSED to >>> STATE_4_VALIDATED >>> at org.apache.calcite.prepare.PlannerImpl$State.from(PlannerImpl.java:318) >>> at org.apache.calcite.prepare.PlannerImpl.ensure(PlannerImpl.java:108) >>> at org.apache.calcite.prepare.PlannerImpl.rel(PlannerImpl.java:200) >>> >>> How to avoid the error? >>> >>> thanks~ >>> >>> >>> ——————————————— >>> Zhihong SHEN, Ph. D., Senior Engineer >>> Big Data Application Service Technology Laboratory, >>> Computer Network Information Center, Chinese Academy of Sciences >>> office phone:+86-10-58812516 >>> mobile:+86-13671116520 >>> >>> >>> >>> >>> >>> >>> >>> >>> 在 16/9/10 上午1:25,“Julian >>> Hyde”<[email protected] 代表 >>> [email protected]> 写入: >>> >>>> If you can parse & convert to get a RelNode, then the RelNode will >>>> probably be a Project with a Filter underneath. So you can write >>>> >>>> RelNode r; >>>> RexNode condition = ((Filter) ((Project) r).getInput()).getCondition; >>>> >>>> Now, how to parse a SQL statement to a RelNode? I think I’d use >>>> >>>> String sql = …; >>>> FrameworkConfig config = ...; >>>> Planner planner = Frameworks.getPlanner(config); >>>> SqlNode node = planner.parse(sql); >>>> RelRoot relRoot = planner.rel(node); >>>> RelNode r = relRoot.project(); >>>> >>>> but I’d like to hear what others consider to be the most painless way to >>>> use Calcite’s parser. >>>> >>>> Julian >>>> >>>>> On Sep 9, 2016, at 2:21 AM, 沈志宏 <[email protected]> wrote: >>>>> >>>>> hi, dear all >>>>> >>>>> is there any tool class to generate RexNodes from a SQL command? >>>>> for example, >>>>> >>>>> List<RexNode> RexNodeUtils.parse(schema, "select * from persons where >>>>> name like 'm%' and age>10") >>>>> >>>>> i am writing a solr adapter and i really really need it to help write >>>>> java tests for my query translator. >>>>> >>>>> best regards > >
