blob: 4a0491b392290a6c5836a2156fe9ff8ffe4e8ea7 [file] [log] [blame]
/**
* 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_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_ */