/**
 *   Copyright 2016, Quickstep Research Group, Computer Sciences Department,
 *     University of Wisconsin—Madison.
 *
 *   Licensed 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_EXPRESSIONS_IN_TABLE_QUERY_HPP_
#define QUICKSTEP_QUERY_OPTIMIZER_EXPRESSIONS_IN_TABLE_QUERY_HPP_

#include <memory>
#include <string>
#include <unordered_map>
#include <vector>

#include "query_optimizer/OptimizerTree.hpp"
#include "query_optimizer/expressions/AttributeReference.hpp"
#include "query_optimizer/expressions/ExprId.hpp"
#include "query_optimizer/expressions/Expression.hpp"
#include "query_optimizer/expressions/ExpressionType.hpp"
#include "query_optimizer/expressions/Predicate.hpp"
#include "query_optimizer/expressions/Scalar.hpp"
#include "query_optimizer/expressions/SubqueryExpression.hpp"
#include "utility/Macros.hpp"

#include "glog/logging.h"

namespace quickstep {

class CatalogAttribute;
class Predicate;

namespace optimizer {
namespace expressions {

/** \addtogroup OptimizerExpressions
 *  @{
 */

class InTableQuery;
typedef std::shared_ptr<const InTableQuery> InTableQueryPtr;

/**
 * @brief IN predicate with a subquery.
 */
class InTableQuery : public Predicate {
 public:
  ExpressionType getExpressionType() const override {
    return ExpressionType::kInTableQuery;
  }

  std::string getName() const override {
    return "InTableQuery";
  }

  bool isConstant() const override {
    return false;
  }

  /**
   * @return The expression to test with the result of the table subquery.
   */
  const ScalarPtr& test_expression() const {
    return test_expression_;
  }

  /**
   * @return The table subquery that returns a single column to search for
   *         the value of the test expression.
   */
  const SubqueryExpressionPtr& table_query() const {
    return table_query_;
  }

  ExpressionPtr copyWithNewChildren(
      const std::vector<ExpressionPtr> &new_children) const override {
    DCHECK_EQ(2u, new_children.size());
    return Create(std::static_pointer_cast<const Scalar>(new_children[0]),
                  std::static_pointer_cast<const SubqueryExpression>(new_children[1]));
  }

  std::vector<AttributeReferencePtr> getReferencedAttributes() const override {
    return {};
  }

  ::quickstep::Predicate* concretize(
      const std::unordered_map<ExprId, const CatalogAttribute*> &substitution_map) const override;

  /**
   * @brief Create an IN predicate with a subquery.
   *
   * @param test_expression The expression to test with the result of a table subquery.
   * @param table_query The table subquery that returns a single column to search for
   *        the value of the test expression.
   *
   * @return An immutable IN predicate node.
   */
  static InTableQueryPtr Create(const ScalarPtr &test_expression,
                                const SubqueryExpressionPtr &table_query) {
    return InTableQueryPtr(new InTableQuery(test_expression, table_query));
  }

 protected:
  void getFieldStringItems(
      std::vector<std::string> *inline_field_names,
      std::vector<std::string> *inline_field_values,
      std::vector<std::string> *non_container_child_field_names,
      std::vector<OptimizerTreeBaseNodePtr> *non_container_child_fields,
      std::vector<std::string> *container_child_field_names,
      std::vector<std::vector<OptimizerTreeBaseNodePtr>> *container_child_fields) const override;

 private:
  InTableQuery(const ScalarPtr &test_expression,
               const SubqueryExpressionPtr &table_query)
      : test_expression_(test_expression),
        table_query_(table_query) {
    addChild(test_expression_);
    addChild(table_query_);
  }

  ScalarPtr test_expression_;
  SubqueryExpressionPtr table_query_;

  DISALLOW_COPY_AND_ASSIGN(InTableQuery);
};

/** @} */

}  // namespace expressions
}  // namespace optimizer
}  // namespace quickstep

#endif  // QUICKSTEP_QUERY_OPTIMIZER_EXPRESSIONS_IN_TABLE_QUERY_HPP_
