You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by Ravi Nallappan <ra...@gmail.com> on 2014/08/13 15:54:21 UTC

Using digest string as for pattern

Hi,

Within onMatch() for ProjectRel, is it intended to use digest string (via
toString) to lookup content of RexNode tree or its advisable to traverse
through the nodes instead for the purpose?

if (n instanceof RexCall && n.toString().compareTo("+(4, 2)") == 0) {...}

Thanks & Regards,
Ravi Nallappan

Re: Using digest string as for pattern

Posted by Julian Hyde <ju...@hydromatic.net>.
Digest is suitable for telling whether two expressions (RexNodes) are
equivalent. And it makes a good key for hash-maps.

However if I may rule was looking for a particular pattern I wouldn't match
on digest. Instead of

RexNode rex;
if (!rex.getDigest().equalTo("+($0, 1)") {
  return;
}

I would write

RexNode rex;
switch (rex.getKind()) {
default:
  return; // not a match
case PLUS:
  switch (rex.getOperands().get(0).getKind()) {
  default:
    return; // not a match
  case LITERAL:
    RexLiteral literal = (RexLiteral) rex.getOperands().get(0);
    if (!1.equals(literal.getValue()) {
      return; // not a match
    }
    // fall through; we got a match
  }
}

(I'm using RexNode.getKind() here because it works for the common node
types. You can also use 'rex instanceof ...' and '((RexCall)
rex).getOperator() == SqlStdOperatorTable.MY_OPERATOR'.)

Julian


On Wed, Aug 13, 2014 at 6:54 AM, Ravi Nallappan <ra...@gmail.com>
wrote:

> Hi,
>
> Within onMatch() for ProjectRel, is it intended to use digest string (via
> toString) to lookup content of RexNode tree or its advisable to traverse
> through the nodes instead for the purpose?
>
> if (n instanceof RexCall && n.toString().compareTo("+(4, 2)") == 0) {...}
>
> Thanks & Regards,
> Ravi Nallappan
>