>
>   As you can see, I know "myFunc" returns a list, so I want to make each
> element of that list an expression so I can continue manipulating them.
> Eventually they will be used to generate code.
>

AFAIK, it is nearly impossible know the list's length if we do not rely on
"evaluate", because it is determined in runtime.
Therefore, the (*List<Expression>*) may be difficult.
But if you want to manipulate the list element in code, I think we can also
use the functions provided in Expressions.

*    // org.apache.calcite.runtime.SqlFunctions.myFunc()*
    MethodCallExpression mce = Expressions.call(SqlFunctions.class,
"myFunc");
*    // final java.util.List res*
    ParameterExpression pe = Expressions.parameter(mce.type, "res");
*    // final java.util.List res =
org.apache.calcite.runtime.SqlFunctions.myFunc();*
    DeclarationStatement statement = Expressions.declare(Modifier.FINAL,
pe, mce);
    System.out.println(statement);

    ParameterExpression pe1 = Expressions.parameter(Object.class, "obj");
    Expression input = Expressions.convert_(pe1, Long.class);
    MethodCallExpression mce2 = Expressions.call(SqlFunctions.class,
"myFunc2", input);
    org.apache.calcite.linq4j.tree.Statement s =
Expressions.statement(mce2);



*    //for (Object obj : res) {    //
 org.apache.calcite.runtime.SqlFunctions.myFunc2((Long) obj);    //}*
    ForEachStatement forEachStatement = Expressions.forEach(pe1, pe, s);


Best,
Feng

Rui Wang <amaliu...@apache.org> 于2019年12月31日周二 下午1:42写道:

> Thanks Feng.
>
> I want to access elements before evaluation. Use your example:
>
> Define:
>  public static List<Long> myFunc() {    return Arrays.asList(1L, 2L);  }
>  public static Long myFunc2(Long i) {    return i - 1l }
>
> I want build expressions as the following:
>
> List<Expression> ret = new ArrayList();
> MethodCallExpression mce = Expressions.call(SqlFunctions.class,"myFunc");
>
> // how to make each element an expression?
> for (Expression expr : mce) {
>      ret.dd(Expressions.call(SqlFunctions.class, "myFunc2", expr));
> }
>
> return ret;
>
>
>
> As you can see, I know "myFunc" returns a list, so I want to make each
> element of that list an expression so I can continue manipulating them.
> Eventually they will be used to generate code.
>
>
>
> -Rui
>
>
>
>
>
>
> On Mon, Dec 30, 2019 at 9:29 PM Feng Zhu <wellfeng...@gmail.com> wrote:
>
> > >
> > > Basically I know the function return a list so I want to access each
> > > element of it. Ideally I can get a List<Expression> ret =
> > > Expressions.call(FindMethod("myFunc"))
> > >
> > Can you elaborate on what do you want? i.e., *List<Expression> ret*
> > If you want to get the element of a method call result, you can evaluate
> > the expression and cast it to list.
> >
> > For example, assume "myFunc" in SqlFunctions.
> >
> >
> >
> > *  public static List<Long> myFunc() {    return Arrays.asList(1L, 2L);
> }*
> >
> >
> > *    MethodCallExpression mce = Expressions.call(SqlFunctions.class,
> > "myFunc");    List<Long> ret = (List<Long>) Expressions.evaluate(mce);*
> >
> > Best,
> >
> > Rui Wang <amaliu...@apache.org> 于2019年12月31日周二 下午12:14写道:
> >
> > > Hi community,
> > >
> > > Let's say I define a function like this:
> > >
> > > List<Long> myFunc() {
> > >   // function body
> > >   // do something
> > >   // return a list of long
> > > }
> > >
> > > Then by linq4j library, I can
> > >
> > > Expression ret = Expressions.call(
> > >   FindMethod("myFunc")
> > > )
> > >
> > >
> > > my question is, how to make the returned expression of the call to be a
> > > list, or something equivalent?
> > >
> > > Basically I know the function return a list so I want to access each
> > > element of it. Ideally I can get a List<Expression> ret =
> > > Expressions.call(FindMethod("myFunc"))
> > >
> > >
> > > -Rui
> > >
> >
>

Reply via email to