I put the discussion under JIRA-259, which was created by Yash for the cast
functionality proposal.


On Sun, Dec 15, 2013 at 9:57 PM, Jacques Nadeau <[email protected]> wrote:

> This looks good.  Do you have a JIRA to attach this work/discussion?
>
> thx,
> j
>
>
> On Mon, Dec 9, 2013 at 10:16 PM, Jinfeng Ni <[email protected]> wrote:
>
> > Hi Yash / All,
> >
> > I gave some thoughts about how to implement implicit cast. Here is my
> > preliminary thoughts.
> >
> > 1 .  implicit cast vs explicit cast.
> >
> > Basically, implicit cast would need leverage explicit cast's
> > implementation. For instance, given an logical expression :  1 + 3.0, if
> > the function resolver finds that argument 1 should be implicitly casted
> > into float4, then, drill code should transform the logical expression
> into
> >  cast(1 as float4) + 3.0, so that "+" operator will call the add(float4,
> > float4) implementation.
> >
> > 2. Add implicit cast function call in the logical expression tree.
> >
> > Currently, drill code uses
> > FunctionImplementationRegistry.getFunction(FunctionCall)
> > to get DrillFuncHolder in EvalVisitor.
> >
> > Your FunctionResolver is used to find the best match in the call of
> > getFunction(). However, if the best match says implicit cast is required,
> > it's kind of difficult to let getFunction() do 1) insert the cast
> function
> > to the logical expression tree, and 2) get cast's DrillFuncHolder, and 3)
> > generate the code for the cast function.
> >
> > We probably should separate the process of adding implicit cast from the
> > logic of FunctionImplementationRegistry.getFunction() and code
> generation.
> >
> > To do that :
> >
> >    -      Introduce a new Visitor class ImplicitCastBuilder.
> >    -      ImplicitCastBuilder will look similar to EvalVisitor .
> >     ImplicitCastBuilder extends AbstractExprVisitor<*LogicalExpression*,
> >    CodeGenerator<?>, RuntimeException>
> >    -     ImplicitCastBuilder should build cast function call in
> *bottom-up*
> >     way.
> >    -     ImplicitCastBuilder will modify logical expression tree, and
> >    replace an argument with a cast function call, if your
> >    *FunctionResolver.getBestMatch() *shows implicit cast is required.
> >    -    CodeGenerator.addExpr will call ImplicitCastBuilder to insert the
> >    implicit cast() to logical expression tree .
> >
> >
> >   public HoldingContainer addExpr(LogicalExpression ex, boolean rotate){
> >
> > //    logger.debug("Adding next write {}", ex);
> >
> >     if(rotate) rotateBlock();
> >
> >     *ex = implicitCastBuilder.accept(ex, this);*
> >
> >     return evaluationVisitor.addExpr(ex, this);
> >
> >   }
> >
> >
> >    -    EvalVisitor will then do the match() and code generation as
> before.
> >    ( No need to call your *FunctionResolver.getBestMatch() *at this
> stage,
> >    since all the required implicit cast has been inserted into the
> logical
> >    expression tree).
> >
> >
> > For example, let's say we have logical expression tree f1 ( a1, f2( a2,
> > a3))
> >
> >                                f1()
> >                             /      \
> >                           /         \
> >                           a1       f2()
> >                                    /     \
> >                                  /        \
> >                                a2       a3
> >
> > We may end up with the following logical expression tree, after
> > ImplicitCastBuilder visit.
> >
> >                               f1()
> >                             /      \
> >                           /         \
> >                           a1     cast1()
> >                                        \
> >                                         \
> >                                           f2()
> >                                          /   \
> >                                        /      \
> >                                      a2     cast2()
> >                                                 |
> >                                                 |
> >                                                a3
> >
> > Note that cast2 would be inserted first, followed by cast1 during the
> > visite, since we need do it in bottom-up ( when we do getBestMatch() for
> f1
> > and insert cast1, we need know the output type of cast2, in order to
> > determine output type of f2(), which is argument to f1() ).
> >
> > Please let me know your thoughts. Thanks!
> >
>

Reply via email to