Ejemplo n.º 1
0
        bool pushdownFilter(LogicNode plan, Expr filter, bool pushJoinFilter)
        {
            // don't push down special expressions
            if (filter.VisitEachExists(x => x is MarkerExpr))
            {
                return(false);
            }

            switch (filter.TableRefCount())
            {
            case 0:
                // say ?b.b1 = ?a.a1
                return(plan.VisitEachExists(n =>
                {
                    if (n is LogicScanTable nodeGet)
                    {
                        return nodeGet.AddFilter(filter);
                    }
                    return false;
                }));

            case 1:
                return(plan.VisitEachExists(n =>
                {
                    if (n is LogicScanTable nodeGet &&
                        filter.EqualTableRef(nodeGet.tabref_))
                    {
                        return nodeGet.AddFilter(filter);
                    }
                    return false;
                }));

            default:
                if (pushJoinFilter)
                {
                    return(plan.PushJoinFilter(filter));
                }
                return(false);
            }
        }