Hi Ashutosh,

I have also added a few tests. I didn't add queries with all the
> patterns you mentioned above. I tested a few by hand and all of them
> worked as expected. Can you please check?
>


I tested all the patterns and they all work correctly. No crashes,
correct results.

One thing I noticed while reviewing the rewriter changes: the Assert
at generate_queries_for_path_pattern() that checks alternating
implicit/explicit elements doesn't actually work:

    #ifdef USE_ASSERT_CHECKING
        GraphElementPattern *prev_gep = NULL;
    #endif
        ...
        Assert(!prev_gep || prev_gep->implicit != gep->implicit);

prev_gep is never updated in the loop -- it stays NULL throughout,
so the Assert is always trivially true. It needs a
"prev_gep = gep;" at the end of the loop body to actually perform
the intended check.


> Yes. That's a grammar issue. gram.y doesn't support it. Peter, do you
> remember or know the reason why we don't support full edge left or
> right? In fact, I am wondering what's the difference between full edge
> left or right and full edge any direction?
>


I looked into this. The lexer tokenizes "]->` as "]" + RIGHT_ARROW,
so gram.y needs two alternatives -- just like the existing full edge
right rule already does. The full edge left or right was simply
missing both forms. Adding them fixes it:

    | '<' '-' '[' ... ']' '-' '>'
    | '<' '-' '[' ... ']' RIGHT_ARROW

Per the standard, <-[]-> matches left or right direction while -[]-
matches any direction. For simple directed graphs the results are
the same, so EDGE_PATTERN_ANY seems like a reasonable mapping.

Regards,
Henson

Reply via email to