Hey Jess!

Am 14.02.2020 um 02:16 schrieb Jess Balint:
Hey Christian,

On Thu, Feb 13, 2020 at 6:30 PM Christian Beikov <[email protected]>
wrote:

Hello,

I'm trying to generate SQL for a trigger that requires a little rewrite
of a RelNode structure and I wanted to know if anyone could help me
figure out how to do a few things

   * I need to swap left and right of a LogicalJoin. Doing that messes up
     predicates and projections though. Is there a utility I could use or
     how would I do that?

You can use JoinCommuteRule, or check it's code for your needs.
Thanks for the hint. I just hope the re-projection isn't confusing for the DBMS optimizer. Would be cool if a RelNode could be rewritten from bottom up to avoid this. Or is there some kind of Rule I can apply to optimize the re-projection away?
   * I need to introduce an "alias" like "NEW" into a RelNode for which I
     want to create a RexNode "NEW.key1" for. I want to add a WHERE
     condition based on the NEW alias. Not sure how I would do that
     though. On SqlNode level only maybe?

I don't understand what you're after here. The WHERE condition will be a
filter node. Can you just add it with attaching something to the rel node?

So in a SQL trigger, there is the alias "NEW" and "OLD" available which I want to reference in a correlation predicate. I essentially want to correlate the RelNode of the changed table with the "NEW" alias and I try to do that through the primary key. Let's consider the example query "select * from table1 t". So for a trigger for "table1" I essentially want to create the query "select * from table1 t where (t.id) = (NEW.id)".

This is what I have so far, maybe you could point me to the right direction? The uniqueKeys are unfortunately null although the node is a JdbcTableScan.

private RexNodecreateNewCorrelatedJoinCondition(LogicalJoin join, RelNode node) 
{
    Set<ImmutableBitSet> uniqueKeys = node.getCluster().getMetadataQuery().getUniqueKeys(node); 
ImmutableBitSet uniqueFieldBitSet = uniqueKeys.iterator().next(); List<RelDataTypeField> 
fieldList = node.getRowType().getFieldList(); RelBuilder relBuilder = RelBuilder.create(config); 
RexNode condition = join.getCondition(); List<RexNode> conjuncts =new 
ArrayList<>(uniqueFieldBitSet.size() +1); conjuncts.add(condition); for (Integer index : 
uniqueFieldBitSet) {
        conjuncts.add(
            relBuilder.equals(
                relBuilder.field("NEW", fieldList.get(index).getName()), 
relBuilder.field(fieldList.get(index).getIndex())
            )
        ); }
    return RexUtil.composeConjunction(rexBuilder, conjuncts); }

Thanks,

Christian

Reply via email to