/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 **/

#ifndef QUICKSTEP_QUERY_OPTIMIZER_LIP_FILTER_GENERATOR_HPP_
#define QUICKSTEP_QUERY_OPTIMIZER_LIP_FILTER_GENERATOR_HPP_

#include <map>
#include <unordered_map>
#include <utility>
#include <vector>

#include "query_execution/QueryContext.hpp"
#include "query_optimizer/QueryPlan.hpp"
#include "query_optimizer/expressions/ExprId.hpp"
#include "query_optimizer/physical/LIPFilterConfiguration.hpp"
#include "query_optimizer/physical/Aggregate.hpp"
#include "query_optimizer/physical/FilterJoin.hpp"
#include "query_optimizer/physical/HashJoin.hpp"
#include "query_optimizer/physical/Physical.hpp"
#include "query_optimizer/physical/Selection.hpp"
#include "utility/Macros.hpp"

#include "glog/logging.h"

namespace quickstep {

namespace serialization {

class QueryContext;
class LIPFilterDeployment;

}

class CatalogAttribute;

namespace optimizer {

/** \addtogroup QueryOptimizer
 *  @{
 */

/**
 * @brief Generates backend LIPFilter deployments from physical plan's information.
 */
class LIPFilterGenerator {
 public:
  /**
   * @brief Constructor.
   *
   * @param lip_filter_configuration The LIPFilter configuration information
   *        generated by physical optimizer.
   */
  explicit LIPFilterGenerator(
      const physical::LIPFilterConfigurationPtr &lip_filter_configuration)
      : lip_filter_configuration_(lip_filter_configuration) {
    DCHECK(lip_filter_configuration_ != nullptr);
  }

  /**
   * @brief Collect the ExprId to CatalogAttribute mapping information for the
   *        given physical node.
   *
   * @param node A physical plan node.
   * @param attribute_substitution_map A map that maps each ExprId to the
   *        backend relation's CatalogAttribute's.
   */
  void registerAttributeMap(
      const physical::PhysicalPtr &node,
      const std::unordered_map<expressions::ExprId, const CatalogAttribute *> &attribute_substitution_map);

  /**
   * @brief Add physical-to-execution mapping information for deploying LIPFilters
   *        to an aggregation.
   *
   * @param aggregate A physical Aggregate node.
   * @param aggregate_operator_index The index of the AggregationOperator that
   *        corresponds to \p aggregate in the execution plan.
   */
  void addAggregateInfo(const physical::AggregatePtr &aggregate,
                        const QueryPlan::DAGNodeIndex aggregate_operator_index) {
    prober_infos_.emplace_back(aggregate, aggregate_operator_index);
  }

  /**
   * @brief Add physical-to-execution mapping information for deploying LIPFilters
   *        to a FilterJoin node.
   *
   * @param filter_join A physical FilterJoin node.
   * @param build_filter_operator_index The index of the BuildLIPFilterOperator
   *        that corresponds to \p filter_join in the execution plan.
   */
  void addFilterJoinInfo(const physical::FilterJoinPtr &filter_join,
                         const QueryPlan::DAGNodeIndex build_filter_operator_index) {
    builder_infos_.emplace_back(filter_join, build_filter_operator_index);
    prober_infos_.emplace_back(filter_join, build_filter_operator_index);
  }

  /**
   * @brief Add physical-to-execution mapping information for deploying LIPFilters
   *        to a hash-join.
   *
   * @param hash_join A physical HashJoin node.
   * @param build_operator_index The index of the BuildHashOperator that corresponds
   *        to \p hash_join in the execution plan.
   * @param join_operator_index The index of the HashJoinOperator that corresponds
   *        to \p hash_join in the execution plan.
   */
  void addHashJoinInfo(const physical::HashJoinPtr &hash_join,
                       const QueryPlan::DAGNodeIndex build_operator_index,
                       const QueryPlan::DAGNodeIndex join_operator_index) {
    builder_infos_.emplace_back(hash_join, build_operator_index);
    prober_infos_.emplace_back(hash_join, join_operator_index);
  }

  /**
   * @brief Add physical-to-execution mapping information for deploying LIPFilters
   *        to a selection.
   *
   * @param selection A physical Selection node.
   * @param select_operator_index The index of the SelectOperator that corresponds
   *        to \p selection in the execution plan.
   */
  void addSelectionInfo(const physical::SelectionPtr &selection,
                        const QueryPlan::DAGNodeIndex select_operator_index) {
    prober_infos_.emplace_back(selection, select_operator_index);
  }

  /**
   * @brief Deploy the LIPFilters to the execution plan.
   *
   * @param execution_plan The execution plan.
   * @param query_context_proto QueryContext protobuf for the execution plan.
   */
  void deployLIPFilters(QueryPlan *execution_plan,
                        serialization::QueryContext *query_context_proto);

 private:
  /**
   * @brief Internal data structure for representing a LIPFilter builder.
   */
  struct BuilderInfo {
    BuilderInfo(const physical::PhysicalPtr &builder_node_in,
                const QueryPlan::DAGNodeIndex builder_operator_index_in)
        : builder_node(builder_node_in),
          builder_operator_index(builder_operator_index_in) {
    }
    const physical::PhysicalPtr builder_node;
    const QueryPlan::DAGNodeIndex builder_operator_index;
  };

  /**
   * @brief Internal data structure for representing a LIPFilter prober.
   */
  struct ProberInfo {
    ProberInfo(const physical::PhysicalPtr &prober_node_in,
               const QueryPlan::DAGNodeIndex prober_operator_index_in)
        : prober_node(prober_node_in),
          prober_operator_index(prober_operator_index_in) {
    }
    const physical::PhysicalPtr prober_node;
    const QueryPlan::DAGNodeIndex prober_operator_index;
  };

  void deployBuilderInternal(QueryPlan *execution_plan,
                             serialization::QueryContext *query_context_proto,
                             const physical::PhysicalPtr &builder_node,
                             const QueryPlan::DAGNodeIndex builder_operator_index,
                             const std::vector<physical::LIPFilterBuildInfoPtr> &build_info_vec);

  void deployProberInteral(QueryPlan *execution_plan,
                           serialization::QueryContext *query_context_proto,
                           const physical::PhysicalPtr &prober_node,
                           const QueryPlan::DAGNodeIndex prober_operator_index,
                           const std::vector<physical::LIPFilterProbeInfoPtr> &probe_info_vec);

  serialization::LIPFilterDeployment* getLIPFilterDeploymentProto(
      const QueryPlan::DAGNodeIndex op_index,
      serialization::QueryContext *query_context_proto);

  const physical::LIPFilterConfigurationPtr lip_filter_configuration_;

  std::vector<BuilderInfo> builder_infos_;
  std::vector<ProberInfo> prober_infos_;

  std::map<physical::PhysicalPtr, std::map<expressions::ExprId, const CatalogAttribute *>> attribute_map_;

  // Maps each LIPFilter's building attribute to the LIPFilter's id in QueryContext
  // as well as the LIPFilter's building relational operator's index.
  std::map<std::pair<expressions::ExprId, physical::PhysicalPtr>,
           std::pair<QueryContext::lip_filter_id, QueryPlan::DAGNodeIndex>> lip_filter_builder_map_;

  // Maps each relational operator's index to the attached LIPFilterDeployment's
  // index and proto.
  std::map<QueryPlan::DAGNodeIndex,
           std::pair<int, serialization::LIPFilterDeployment *>> lip_filter_deployment_protos_;

  DISALLOW_COPY_AND_ASSIGN(LIPFilterGenerator);
};

/** @} */

}  // namespace optimizer
}  // namespace quickstep

#endif /* QUICKSTEP_QUERY_OPTIMIZER_LIP_FILTER_GENERATOR_HPP_ */
