lbug 0.20.0

An in-process property graph database management system built for query speed and scalability
#pragma once

#include "logical_operator_visitor.h"
#include "planner/operator/logical_plan.h"

namespace lbug {
namespace optimizer {

// This optimizer enables the Accumulated hash join algorithm as introduced in paper "Lbug Graph
// Database Management System".
class HashJoinSIPOptimizer final : public LogicalOperatorVisitor {
public:
    void rewrite(const planner::LogicalPlan* plan);

private:
    void visitOperator(planner::LogicalOperator* op);

    void visitHashJoin(planner::LogicalOperator* op) override;

    void visitIntersect(planner::LogicalOperator* op) override;

    void visitPathPropertyProbe(planner::LogicalOperator* op) override;

    // Query-final literal LIMIT that can be pushed into the probe side of
    // probeLimitTarget, or nullptr when no such push is result-preserving. Both fields
    // are recomputed (and reset) at the start of every rewrite().
    std::shared_ptr<binder::Expression> probeLimit;
    planner::LogicalOperator* probeLimitTarget = nullptr;
};

} // namespace optimizer
} // namespace lbug