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 0870A200C0B for ; Sun, 29 Jan 2017 18:40:32 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 06FAA160B4F; Sun, 29 Jan 2017 17:40:32 +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 062FF160B47 for ; Sun, 29 Jan 2017 18:40:30 +0100 (CET) Received: (qmail 62123 invoked by uid 500); 29 Jan 2017 17:40:30 -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 62114 invoked by uid 99); 29 Jan 2017 17:40:30 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 29 Jan 2017 17:40:30 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id C967AC0497 for ; Sun, 29 Jan 2017 17:40:29 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-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-eu.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id CGE4xd_a4mEu for ; Sun, 29 Jan 2017 17:40:28 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with SMTP id 4ACCE5F253 for ; Sun, 29 Jan 2017 17:40:27 +0000 (UTC) Received: (qmail 62104 invoked by uid 99); 29 Jan 2017 17:40:26 -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; Sun, 29 Jan 2017 17:40:26 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 674F7DFCC2; Sun, 29 Jan 2017 17:40:26 +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 Message-Id: <6e1c95542c7b42ebaedc8d5bd9a9c6bc@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: incubator-quickstep git commit: Add unit test for CatalogRelationStatistics Date: Sun, 29 Jan 2017 17:40:26 +0000 (UTC) archived-at: Sun, 29 Jan 2017 17:40:32 -0000 Repository: incubator-quickstep Updated Branches: refs/heads/exact-stat-unittest [created] 7390eb374 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/7390eb37 Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/7390eb37 Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/7390eb37 Branch: refs/heads/exact-stat-unittest Commit: 7390eb374b5087d1ad45205c9ad624839e8b5f73 Parents: 7bce0b8 Author: Jianqiao Zhu Authored: Mon Jan 23 20:54:51 2017 -0600 Committer: Jianqiao Zhu Committed: Mon Jan 23 21:08:21 2017 -0600 ---------------------------------------------------------------------- catalog/CMakeLists.txt | 27 +++ .../CatalogRelationStatistics_unittest.cpp | 214 +++++++++++++++++++ 2 files changed, 241 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/7390eb37/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/7390eb37/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..fb51a89 --- /dev/null +++ b/catalog/tests/CatalogRelationStatistics_unittest.cpp @@ -0,0 +1,214 @@ +/** + * 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 { +const std::string kStoragePath = "./catalog_relation_statistics_test_data/"; +}; + +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(stat.getNumTuples(), 3u); + + EXPECT_EQ(stat.getNumDistinctValues(0), 2u); + EXPECT_EQ(stat.getMinValue(0).getLiteral(), 0); + EXPECT_EQ(stat.getMaxValue(0).getLiteral(), 1); + + EXPECT_EQ(stat.getNumDistinctValues(1), 3u); + EXPECT_EQ(stat.getMinValue(1).getLiteral(), -0.5); + EXPECT_EQ(stat.getMaxValue(1).getLiteral(), 0.5); +} + +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