Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 20D6D200C0C for ; Mon, 30 Jan 2017 19:28:26 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 1F552160B35; Mon, 30 Jan 2017 18:28:26 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 1D75C160B4D for ; Mon, 30 Jan 2017 19:28:24 +0100 (CET) Received: (qmail 9269 invoked by uid 500); 30 Jan 2017 18:28:24 -0000 Mailing-List: contact commits-help@quickstep.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@quickstep.incubator.apache.org Delivered-To: mailing list commits@quickstep.incubator.apache.org Received: (qmail 9260 invoked by uid 99); 30 Jan 2017 18:28:24 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd3-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 30 Jan 2017 18:28:24 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd3-us-west.apache.org (ASF Mail Server at spamd3-us-west.apache.org) with ESMTP id DCE34181994 for ; Mon, 30 Jan 2017 18:28:23 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd3-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -6.219 X-Spam-Level: X-Spam-Status: No, score=-6.219 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-2.999] autolearn=disabled Received: from mx1-lw-us.apache.org ([10.40.0.8]) by localhost (spamd3-us-west.apache.org [10.40.0.10]) (amavisd-new, port 10024) with ESMTP id FQzBoAwwiX-7 for ; Mon, 30 Jan 2017 18:28:21 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-lw-us.apache.org (ASF Mail Server at mx1-lw-us.apache.org) with SMTP id 4D0BF5F4A6 for ; Mon, 30 Jan 2017 18:28:21 +0000 (UTC) Received: (qmail 5686 invoked by uid 99); 30 Jan 2017 18:26:43 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 30 Jan 2017 18:26:43 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id BFD68DFE46; Mon, 30 Jan 2017 18:26:43 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: jianqiao@apache.org To: commits@quickstep.incubator.apache.org Date: Mon, 30 Jan 2017 18:26:43 -0000 Message-Id: <5a62691aa8034d75b6a5d0ff796be99e@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [1/2] incubator-quickstep git commit: Add unit test for CatalogRelationStatistics [Forced Update!] archived-at: Mon, 30 Jan 2017 18:28:26 -0000 Repository: incubator-quickstep Updated Branches: refs/heads/push-down-disjunctive-predicate f3e06b528 -> 6a184c8ad (forced update) Add unit test for CatalogRelationStatistics Project: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/commit/0f4938ca Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/0f4938ca Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/0f4938ca Branch: refs/heads/push-down-disjunctive-predicate Commit: 0f4938caa29096f18bb699c8f746a733f2262698 Parents: 0780b84 Author: Jianqiao Zhu Authored: Mon Jan 23 20:54:51 2017 -0600 Committer: Zuyu Zhang Committed: Sun Jan 29 23:13:45 2017 -0800 ---------------------------------------------------------------------- catalog/CMakeLists.txt | 27 +++ .../CatalogRelationStatistics_unittest.cpp | 219 +++++++++++++++++++ 2 files changed, 246 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/0f4938ca/catalog/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/catalog/CMakeLists.txt b/catalog/CMakeLists.txt index 7de9a67..3c64e97 100644 --- a/catalog/CMakeLists.txt +++ b/catalog/CMakeLists.txt @@ -225,6 +225,31 @@ target_link_libraries(Catalog_unittest quickstep_utility_PtrVector) add_test(Catalog_unittest Catalog_unittest) +add_executable(CatalogRelationStatistics_unittest + "${CMAKE_CURRENT_SOURCE_DIR}/tests/CatalogRelationStatistics_unittest.cpp") +target_link_libraries(CatalogRelationStatistics_unittest + gtest + gtest_main + quickstep_catalog_Catalog + quickstep_catalog_CatalogDatabase + quickstep_catalog_CatalogRelation + quickstep_catalog_CatalogRelationStatistics + quickstep_cli_CommandExecutor + quickstep_cli_DropRelation + quickstep_parser_ParseStatement + quickstep_parser_SqlParserWrapper + quickstep_queryexecution_ForemanSingleNode + quickstep_queryexecution_QueryExecutionTypedefs + quickstep_queryexecution_QueryExecutionUtil + quickstep_queryexecution_Worker + quickstep_queryexecution_WorkerDirectory + quickstep_queryoptimizer_QueryHandle + quickstep_queryoptimizer_QueryProcessor + quickstep_storage_StorageConstants + quickstep_storage_StorageManager + tmb) +add_test(CatalogRelationStatistics_unittest CatalogRelationStatistics_unittest) + if(QUICKSTEP_HAVE_LIBNUMA) add_executable(NUMAPlacementScheme_unittest "${CMAKE_CURRENT_SOURCE_DIR}/tests/NUMAPlacementScheme_unittest.cpp") @@ -253,3 +278,5 @@ target_link_libraries(PartitionScheme_unittest quickstep_types_operations_comparisons_Comparison quickstep_types_operations_comparisons_EqualComparison) add_test(PartitionScheme_unittest PartitionScheme_unittest) + +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/catalog_relation_statistics_test_data) http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/0f4938ca/catalog/tests/CatalogRelationStatistics_unittest.cpp ---------------------------------------------------------------------- diff --git a/catalog/tests/CatalogRelationStatistics_unittest.cpp b/catalog/tests/CatalogRelationStatistics_unittest.cpp new file mode 100644 index 0000000..294a6c7 --- /dev/null +++ b/catalog/tests/CatalogRelationStatistics_unittest.cpp @@ -0,0 +1,219 @@ +/** + * 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 +#include +#include +#include +#include +#include + +#include "catalog/Catalog.hpp" +#include "catalog/CatalogDatabase.hpp" +#include "catalog/CatalogRelation.hpp" +#include "catalog/CatalogRelationStatistics.hpp" +#include "cli/CommandExecutor.hpp" +#include "cli/DropRelation.hpp" +#include "parser/ParseStatement.hpp" +#include "parser/SqlParserWrapper.hpp" +#include "query_execution/ForemanSingleNode.hpp" +#include "query_execution/QueryExecutionTypedefs.hpp" +#include "query_execution/QueryExecutionUtil.hpp" +#include "query_execution/Worker.hpp" +#include "query_execution/WorkerDirectory.hpp" +#include "query_optimizer/QueryHandle.hpp" +#include "query_optimizer/QueryProcessor.hpp" +#include "storage/StorageConstants.hpp" +#include "storage/StorageManager.hpp" + +#include "glog/logging.h" +#include "gtest/gtest.h" + +#include "tmb/id_typedefs.h" + +namespace quickstep { + +namespace { + +constexpr char kStoragePath[] = "./catalog_relation_statistics_test_data/"; + +constexpr attribute_id kFirstAttributeId = 0; +constexpr attribute_id kSecondAttributeId = 1; + +} // namespace + +class CatalogRelationStatisticsTest : public ::testing::Test { + protected: + virtual void SetUp() { + // Set up the environment for running end-to-end queries. + quickstep::ClientIDMap::Instance(); + + bus_.Initialize(); + + main_thread_client_id_ = bus_.Connect(); + bus_.RegisterClientAsSender(main_thread_client_id_, kAdmitRequestMessage); + bus_.RegisterClientAsSender(main_thread_client_id_, kPoisonMessage); + bus_.RegisterClientAsReceiver(main_thread_client_id_, kWorkloadCompletionMessage); + + std::string catalog_path(kStoragePath); + catalog_path.append(kCatalogFilename); + + std::ofstream catalog_file(catalog_path.c_str()); + Catalog catalog; + catalog.addDatabase(new CatalogDatabase(nullptr, "default")); + catalog.getProto().SerializeToOstream(&catalog_file); + catalog_file.close(); + + storage_manager_.reset(new StorageManager(kStoragePath)); + query_processor_.reset(new QueryProcessor(std::move(catalog_path))); + + worker_.reset(new Worker(0, &bus_)); + worker_directory_.reset( + new WorkerDirectory(1, {worker_->getBusClientID()}, {-1})); + + foreman_.reset( + new ForemanSingleNode(main_thread_client_id_, + worker_directory_.get(), + &bus_, + query_processor_->getDefaultDatabase(), + storage_manager_.get())); + + worker_->start(); + foreman_->start(); + } + + virtual void TearDown() { + for (const auto &relation : *query_processor_->getDefaultDatabase()) { + DropRelation::Drop(relation, + query_processor_->getDefaultDatabase(), + storage_manager_.get()); + } + + QueryExecutionUtil::BroadcastPoisonMessage(main_thread_client_id_, &bus_); + worker_->join(); + foreman_->join(); + } + + void executeQuery(const std::string &query_string) { + SqlParserWrapper parser_wrapper; + parser_wrapper.feedNextBuffer(new std::string(query_string)); + + ParseResult result = parser_wrapper.getNextStatement(); + DCHECK(result.condition == ParseResult::kSuccess); + + const ParseStatement &statement = *result.parsed_statement; + std::unique_ptr query_handle = + std::make_unique(query_processor_->query_id(), + main_thread_client_id_, + statement.getPriority()); + query_processor_->generateQueryHandle(statement, query_handle.get()); + + QueryExecutionUtil::ConstructAndSendAdmitRequestMessage( + main_thread_client_id_, + foreman_->getBusClientID(), + query_handle.release(), + &bus_); + + QueryExecutionUtil::ReceiveQueryCompletionMessage(main_thread_client_id_, &bus_); + } + + void executeAnalyze(const std::string &rel_name) { + SqlParserWrapper parser_wrapper; + parser_wrapper.feedNextBuffer(new std::string("\\analyze " + rel_name)); + + ParseResult result = parser_wrapper.getNextStatement(); + DCHECK(result.condition == ParseResult::kSuccess); + + const ParseStatement &statement = *result.parsed_statement; + DCHECK(statement.getStatementType() == ParseStatement::kCommand); + quickstep::cli::executeCommand(statement, + *(query_processor_->getDefaultDatabase()), + main_thread_client_id_, + foreman_->getBusClientID(), + &bus_, + storage_manager_.get(), + query_processor_.get(), + stdout); + } + + const CatalogRelation *getRelationByName(const std::string &rel_name) const { + const CatalogRelation *relation = + query_processor_->getDefaultDatabase()->getRelationByName(rel_name); + DCHECK(relation != nullptr); + return relation; + } + + private: + MessageBusImpl bus_; + tmb::client_id main_thread_client_id_; + + std::unique_ptr storage_manager_; + std::unique_ptr query_processor_; + + std::unique_ptr worker_; + std::unique_ptr worker_directory_; + std::unique_ptr foreman_; +}; + +TEST_F(CatalogRelationStatisticsTest, AnalyzeTest) { + executeQuery("CREATE TABLE analyzetest(x INT, y DOUBLE);"); + executeQuery("INSERT INTO analyzetest VALUES(0, -0.5);"); + executeQuery("INSERT INTO analyzetest VALUES(1, 0);"); + executeQuery("INSERT INTO analyzetest VALUES(0, 0.5);"); + executeAnalyze("analyzetest"); + + const CatalogRelation *relation = getRelationByName("analyzetest"); + const CatalogRelationStatistics &stat = relation->getStatistics(); + + EXPECT_EQ(3u, stat.getNumTuples()); + + EXPECT_EQ(2u, stat.getNumDistinctValues(kFirstAttributeId)); + EXPECT_EQ(0, stat.getMinValue(kFirstAttributeId).getLiteral()); + EXPECT_EQ(1, stat.getMaxValue(kFirstAttributeId).getLiteral()); + + EXPECT_EQ(3u, stat.getNumDistinctValues(kSecondAttributeId)); + EXPECT_EQ(-0.5, stat.getMinValue(kSecondAttributeId).getLiteral()); + EXPECT_EQ(0.5, stat.getMaxValue(kSecondAttributeId).getLiteral()); +} + +TEST_F(CatalogRelationStatisticsTest, ExactnessTest) { + executeQuery("CREATE TABLE exactnesstest(x INT);"); + + const CatalogRelationStatistics &stat = + getRelationByName("exactnesstest")->getStatistics(); + + EXPECT_FALSE(stat.isExact()); + + const std::vector queries = { + "INSERT INTO exactnesstest VALUES(1);", + "INSERT INTO exactnesstest SELECT i FROM generate_series(2, 10) AS gs(i);", + "DELETE FROM exactnesstest WHERE x = 5;", + "UPDATE exactnesstest SET x = 100 WHERE x = 10;" + }; + + for (const std::string &query : queries) { + executeQuery(query); + EXPECT_FALSE(stat.isExact()); + + executeAnalyze("exactnesstest"); + EXPECT_TRUE(stat.isExact()); + } +} + +} // namespace quickstep