blob: 5dd224dc04516fd67fbe0f4a7173984df3939550 [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.
**/
#include "query_optimizer/rules/CollapseProject.hpp"
#include <memory>
#include "query_optimizer/expressions/Alias.hpp"
#include "query_optimizer/expressions/AttributeReference.hpp"
#include "query_optimizer/expressions/BinaryExpression.hpp"
#include "query_optimizer/expressions/Expression.hpp"
#include "query_optimizer/expressions/ExpressionUtil.hpp"
#include "query_optimizer/expressions/NamedExpression.hpp"
#include "query_optimizer/expressions/ScalarLiteral.hpp"
#include "query_optimizer/logical/Project.hpp"
#include "query_optimizer/logical/TableReference.hpp"
#include "query_optimizer/rules/tests/LogicalRuleTest.hpp"
#include "query_optimizer/rules/tests/RuleTest.hpp"
#include "types/operations/binary_operations/BinaryOperation.hpp"
#include "types/operations/binary_operations/BinaryOperationFactory.hpp"
#include "types/operations/binary_operations/BinaryOperationID.hpp"
#include "utility/Macros.hpp"
#include "glog/logging.h"
#include "gtest/gtest.h"
namespace quickstep {
namespace optimizer {
namespace E = ::quickstep::optimizer::expressions;
namespace L = ::quickstep::optimizer::logical;
class CollapseProjectTest : public LogicalRuleTest {
protected:
CollapseProjectTest() {}
~CollapseProjectTest() override {}
void setupRule(std::unique_ptr<Rule<L::Logical>> *rule) override {
rule->reset(new CollapseProject());
}
private:
DISALLOW_COPY_AND_ASSIGN(CollapseProjectTest);
};
TEST_F(CollapseProjectTest, Tests) {
// Merge three-level Projects into one.
const E::ExpressionPtr alias_0_add_literal_0 = E::BinaryExpression::Create(
BinaryOperationFactory::GetBinaryOperation(BinaryOperationID::kAdd),
E::ToRef(alias_0_),
literal_0_);
const E::AliasPtr alias_on_alias_0_add_literal_0 = createAlias(
alias_0_add_literal_0,
"alias_alias_0_add_literal_0" /* attribute_name */,
"select_test_relation" /* relation_name */);
const L::ProjectPtr second_level_project = L::Project::Create(
logical_project_0_ /* first level project */,
{alias_on_alias_0_add_literal_0} /* project_expressions */);
const E::AliasPtr alias_on_alias_on_alias_0_add_literal_0 = createAlias(
E::ToRef(alias_on_alias_0_add_literal_0),
"alias_on_alias_on_alias_0_add_literal_0" /* attribute_name */,
"select_test_relation" /* relation_name */);
// The top level project.
input_ = L::Project::Create(second_level_project,
{alias_on_alias_on_alias_0_add_literal_0});
const E::ExpressionPtr alias_0_add_literal_0_after_pullup =
alias_0_add_literal_0->copyWithNewChildren(
{alias_0_->expression(), literal_0_} /* new_children */);
const E::AliasPtr alias_on_alias_on_alias_0_add_literal_0_after_pullup =
std::static_pointer_cast<const E::Alias>(
alias_on_alias_on_alias_0_add_literal_0->copyWithNewChildren(
{alias_0_add_literal_0_after_pullup} /* new_children */));
expect_output_ = L::Project::Create(
logical_table_reference_0_,
{alias_on_alias_on_alias_0_add_literal_0_after_pullup} /* project_expressions */);
APPLY_RULE_AND_CHECK_OUTPUT();
}
} // namespace optimizer
} // namespace quickstep