blob: 78d5a516f9229cf6ed56e11dba7c1cf8209a1779 [file] [log] [blame]
/**
* Copyright 2011-2015 Quickstep Technologies LLC.
* Copyright 2015 Pivotal Software, Inc.
*
* 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_TESTS_OPTIMIZER_TEST_HPP_
#define QUICKSTEP_QUERY_OPTIMIZER_TESTS_OPTIMIZER_TEST_HPP_
#include <memory>
#include <string>
#include "catalog/Catalog.hpp"
#include "catalog/CatalogDatabase.hpp"
#include "catalog/CatalogRelation.hpp"
#include "query_optimizer/OptimizerContext.hpp"
#include "query_optimizer/PhysicalGenerator.hpp"
#include "query_optimizer/expressions/Alias.hpp"
#include "query_optimizer/expressions/AttributeReference.hpp"
#include "query_optimizer/expressions/BinaryExpression.hpp"
#include "query_optimizer/expressions/ComparisonExpression.hpp"
#include "query_optimizer/expressions/Expression.hpp"
#include "query_optimizer/expressions/ScalarLiteral.hpp"
#include "query_optimizer/logical/Filter.hpp"
#include "query_optimizer/logical/Project.hpp"
#include "query_optimizer/logical/TableReference.hpp"
#include "query_optimizer/physical/Selection.hpp"
#include "query_optimizer/physical/TableReference.hpp"
#include "query_optimizer/rules/Rule.hpp"
#include "utility/Macros.hpp"
#include "gtest/gtest.h"
namespace quickstep {
class Type;
namespace optimizer {
/** \addtogroup QueryRules
* @{
*/
/**
* @brief Base class for optimizer tests (rules, and logical, physical and
* execution generator).
*/
class OptimizerTest : public ::testing::Test {
protected:
/**
* @brief Constructor.
*/
OptimizerTest();
/**
* @brief Virtual destructor.
*/
~OptimizerTest() override {}
/**
* @brief Initialize common fields used in tests.
*/
void SetUp() override;
/**
* @return The optimizer context.
*/
OptimizerContext* optimizer_context() { return optimizer_context_.get(); }
/**
* @return The physical generator.
*/
PhysicalGenerator* physical_generator() { return physical_generator_.get(); }
/**
* @brief Helper method to create an Alias.
*
* @param expression The expression to be named.
* @param attribute_name The name to be given to the expression.
* @param relation_name The relation name.
* @return An Alias.
*/
expressions::AliasPtr createAlias(
const expressions::ExpressionPtr &expression,
const std::string &attribute_name,
const std::string &relation_name);
/**
* @brief Helper method to create a TableReference on <catalog_relation_0_>
*
* @param relation_name The name of the table.
*/
logical::TableReferencePtr createTableReference(const std::string &relation_name);
const Type *nullable_int_type_ = nullptr;
const Type *nonnullable_int_type_ = nullptr;
expressions::ScalarLiteralPtr literal_0_;
expressions::ScalarLiteralPtr literal_1_;
// Aliases of the previous two literals.
expressions::AliasPtr alias_0_;
expressions::AliasPtr alias_1_;
// References to the previous two aliases.
expressions::AttributeReferencePtr attribute_reference_0_;
expressions::AttributeReferencePtr attribute_reference_1_;
// AttributeReferences in catalog_relation_0_.
expressions::AttributeReferencePtr relation_attribute_reference_0_0_;
expressions::AttributeReferencePtr relation_attribute_reference_0_1_;
expressions::AttributeReferencePtr relation_attribute_reference_0_2_;
// AttributeReferences in catalog_relation_1_.
expressions::AttributeReferencePtr relation_attribute_reference_1_0_;
expressions::AttributeReferencePtr relation_attribute_reference_1_1_;
std::unique_ptr<Catalog> catalog_;
std::unique_ptr<CatalogDatabase> catalog_database_;
std::unique_ptr<CatalogRelation> catalog_relation_0_;
std::unique_ptr<CatalogRelation> catalog_relation_1_;
logical::TableReferencePtr logical_table_reference_0_;
logical::TableReferencePtr logical_table_reference_1_;
// relation_attribute_reference_0_0_ != relation_attribute_reference_0_2_
expressions::PredicatePtr filter_predicate_0_;
// relation_attribute_reference_1_0_ > literal_0_
expressions::PredicatePtr filter_predicate_1_;
// relation_attribute_reference_0_0_ = relation_attribute_reference_1_0_
expressions::PredicatePtr hash_join_predicate_0_1_;
// relation_attribute_reference_0_0_ > relation_attribute_reference_1_0_
expressions::PredicatePtr non_hash_join_predicate_0_1_;
// relation_attribute_reference_0_0_ + literal_0_
expressions::ScalarPtr add_literal_0_;
expressions::AliasPtr alias_add_literal_0_;
// Project expressions: alias_0_, alias_add_literal_0_,
// relation_attribute_reference_0_1_
logical::ProjectPtr logical_project_0_;
// Project expressions: alias_1_, relation_attribute_reference_1_0_,
// relation_attribute_reference_1_1_
logical::ProjectPtr logical_project_1_;
// Filter predicate: filter_predicate_0_
logical::FilterPtr logical_filter_0_;
// Filter predicate: filter_predicate_1_
logical::FilterPtr logical_filter_1_;
// logical_project_0_ on top of logical_filter_0_
logical::ProjectPtr logical_project_on_filter_0_;
// logical_project_1_ on top of filter_predicate_1_
logical::ProjectPtr logical_project_on_filter_1_;
physical::TableReferencePtr physical_table_reference_0_;
physical::TableReferencePtr physical_table_reference_1_;
physical::SelectionPtr physical_project_0_;
physical::SelectionPtr physical_project_1_;
physical::SelectionPtr physical_filter_0_;
physical::SelectionPtr physical_filter_1_;
physical::SelectionPtr physical_project_on_filter_0_;
physical::SelectionPtr physical_project_on_filter_1_;
private:
void setupTypes();
void setupExpressions();
void setupTables();
void setupLogical();
void setupPhysical();
void setupLogicalToPhysicalMap();
std::unique_ptr<OptimizerContext> optimizer_context_;
std::unique_ptr<PhysicalGenerator> physical_generator_;
DISALLOW_COPY_AND_ASSIGN(OptimizerTest);
};
/** @} */
} // namespace optimizer
} // namespace quickstep
#endif /* QUICKSTEP_QUERY_OPTIMIZER_TESTS_OPTIMIZER_TEST_HPP_ */