http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/cell.cc ---------------------------------------------------------------------- diff --git a/hbase-native-client/core/cell.cc b/hbase-native-client/core/cell.cc deleted file mode 100644 index e475d49..0000000 --- a/hbase-native-client/core/cell.cc +++ /dev/null @@ -1,123 +0,0 @@ -/* - * 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 "core/cell.h" -#include <climits> -#include <limits> -#include <stdexcept> - -#include "folly/Conv.h" -#include "utils/bytes-util.h" - -namespace hbase { - -Cell::Cell(const std::string &row, const std::string &family, const std::string &qualifier, - const int64_t timestamp, const std::string &value, const hbase::CellType &cell_type) - : row_(row), - family_(family), - qualifier_(qualifier), - timestamp_(timestamp), - cell_type_(cell_type), - value_(value), - sequence_id_(0) { - if (0 == row.size()) throw std::runtime_error("Row size should be greater than 0"); - - if (0 >= timestamp) throw std::runtime_error("Timestamp should be greater than 0"); -} - -Cell::Cell(const Cell &cell) - : row_(cell.row_), - family_(cell.family_), - qualifier_(cell.qualifier_), - timestamp_(cell.timestamp_), - cell_type_(cell.cell_type_), - value_(cell.value_), - sequence_id_(cell.sequence_id_) {} - -Cell &Cell::operator=(const Cell &cell) { - row_ = cell.row_; - family_ = cell.family_; - qualifier_ = cell.qualifier_; - timestamp_ = cell.timestamp_; - cell_type_ = cell.cell_type_; - value_ = cell.value_; - sequence_id_ = cell.sequence_id_; - - return *this; -} - -Cell::~Cell() {} - -const std::string &Cell::Row() const { return row_; } - -const std::string &Cell::Family() const { return family_; } - -const std::string &Cell::Qualifier() const { return qualifier_; } - -int64_t Cell::Timestamp() const { return timestamp_; } - -const std::string &Cell::Value() const { return value_; } - -hbase::CellType Cell::Type() const { return cell_type_; } - -int64_t Cell::SequenceId() const { return sequence_id_; } - -std::string Cell::DebugString() const { - std::string timestamp_str; - if (timestamp_ == std::numeric_limits<int64_t>::max()) { - timestamp_str = "LATEST_TIMESTAMP"; - } else { - timestamp_str = folly::to<std::string>(timestamp_); - } - - return BytesUtil::ToStringBinary(row_) + "/" + BytesUtil::ToStringBinary(family_) + - (family_.empty() ? "" : ":") + BytesUtil::ToStringBinary(qualifier_) + "/" + - timestamp_str + "/" + TypeToString(cell_type_) + "/vlen=" + - folly::to<std::string>(value_.size()) + "/seqid=" + folly::to<std::string>(sequence_id_); -} - -const char *Cell::TypeToString(CellType type) { - switch (type) { - case CellType::MINIMUM: - return "MINIMUM"; - case CellType::PUT: - return "PUT"; - case CellType::DELETE: - return "DELETE"; - case CellType::DELETE_COLUMN: - return "DELETE_COLUMN"; - case CellType::DELETE_FAMILY: - return "DELETE_FAMILY"; - case CellType::MAXIMUM: - return "MAXIMUM"; - default: - return "UNKNOWN"; - } -} - -size_t Cell::EstimatedSize() const { - size_t s = sizeof(Cell); - s += row_.capacity(); - s += family_.capacity(); - s += qualifier_.capacity(); - s += value_.capacity(); - return s; -} - -} /* namespace hbase */
http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/cell.h ---------------------------------------------------------------------- diff --git a/hbase-native-client/core/cell.h b/hbase-native-client/core/cell.h deleted file mode 100644 index 7a62a9b..0000000 --- a/hbase-native-client/core/cell.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * 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. - * - */ - -#pragma once - -#include <cstdint> -#include <string> - -namespace hbase { - -enum class CellType { - MINIMUM = 0, - PUT = 4, - DELETE = 8, - DELETE_FAMILY_VERSION = 10, - DELETE_COLUMN = 12, - DELETE_FAMILY = 14, - MAXIMUM = 255 -}; - -class Cell { - public: - Cell(const std::string &row, const std::string &family, const std::string &qualifier, - const int64_t timestamp, const std::string &value, const hbase::CellType &cell_type); - Cell(const Cell &cell); - Cell &operator=(const Cell &cell); - virtual ~Cell(); - const std::string &Row() const; - const std::string &Family() const; - const std::string &Qualifier() const; - int64_t Timestamp() const; - const std::string &Value() const; - CellType Type() const; - int64_t SequenceId() const; - std::string DebugString() const; - /** Returns estimated size of the Cell object including deep heap space usage - * of its data. Notice that this is a very rough estimate. */ - size_t EstimatedSize() const; - - private: - std::string row_; - std::string family_; - std::string qualifier_; - // Since java does not have unsigned, we are also using signed numerics here - // so that we won't have surprises when large uint64's are treated as - // negative values in the java server side - int64_t timestamp_; - hbase::CellType cell_type_; - std::string value_; - int64_t sequence_id_; - - private: - static const char *TypeToString(CellType type); -}; - -} // namespace hbase http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/client-test.cc ---------------------------------------------------------------------- diff --git a/hbase-native-client/core/client-test.cc b/hbase-native-client/core/client-test.cc deleted file mode 100644 index 3f72880..0000000 --- a/hbase-native-client/core/client-test.cc +++ /dev/null @@ -1,697 +0,0 @@ -/* - * 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 <gtest/gtest.h> - -#include "core/append.h" -#include "core/cell.h" -#include "core/client.h" -#include "core/configuration.h" -#include "core/delete.h" -#include "core/get.h" -#include "core/hbase-configuration-loader.h" -#include "core/increment.h" -#include "core/put.h" -#include "core/result.h" -#include "core/table.h" -#include "exceptions/exception.h" -#include "serde/table-name.h" -#include "test-util/test-util.h" -#include "utils/bytes-util.h" - -using hbase::Cell; -using hbase::Configuration; -using hbase::Get; -using hbase::RetriesExhaustedException; -using hbase::Put; -using hbase::Table; -using hbase::TestUtil; -using std::experimental::nullopt; - -class ClientTest : public ::testing::Test { - public: - static const constexpr char *kDefHBaseConfPath = "./build/test-data/client-test/conf/"; - static const constexpr char *kHBaseDefaultXml = "hbase-default.xml"; - static const constexpr char *kHBaseSiteXml = "hbase-site.xml"; - static const constexpr char *kHBaseXmlData = - "<?xml version=\"1.0\"?>\n<?xml-stylesheet type=\"text/xsl\" " - "href=\"configuration.xsl\"?>\n<!--\n/**\n *\n * Licensed to the Apache " - "Software Foundation (ASF) under one\n * or more contributor license " - "agreements. See the NOTICE file\n * distributed with this work for " - "additional information\n * regarding copyright ownership. The ASF " - "licenses this file\n * to you under the Apache License, Version 2.0 " - "(the\n * \"License\"); you may not use this file except in compliance\n * " - "with the License. You may obtain a copy of the License at\n *\n * " - "http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by " - "applicable law or agreed to in writing, software\n * distributed under " - "the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES " - "OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License " - "for the specific language governing permissions and\n * limitations under " - "the License.\n " - "*/\n-->\n<configuration>\n\n</configuration>"; - - static void WriteDataToFile(const std::string &file, const std::string &xml_data) { - std::ofstream hbase_conf; - hbase_conf.open(file.c_str()); - hbase_conf << xml_data; - hbase_conf.close(); - } - - static void CreateHBaseConf(const std::string &dir, const std::string &file, - const std::string xml_data) { - // Remove temp file always - boost::filesystem::remove((dir + file).c_str()); - boost::filesystem::create_directories(dir.c_str()); - WriteDataToFile((dir + file), xml_data); - } - - static void CreateHBaseConfWithEnv() { - // Creating Empty Config Files so that we dont get a Configuration exception @Client - CreateHBaseConf(kDefHBaseConfPath, kHBaseDefaultXml, kHBaseXmlData); - // the hbase-site.xml would be persisted by MiniCluster - setenv("HBASE_CONF", kDefHBaseConfPath, 1); - } - static std::unique_ptr<hbase::TestUtil> test_util; - - static void SetUpTestCase() { - google::InstallFailureSignalHandler(); - test_util = std::make_unique<hbase::TestUtil>(); - test_util->StartMiniCluster(2); - } -}; -std::unique_ptr<hbase::TestUtil> ClientTest::test_util = nullptr; - -TEST_F(ClientTest, EmptyConfigurationPassedToClient) { ASSERT_ANY_THROW(hbase::Client client); } - -TEST_F(ClientTest, ConfigurationPassedToClient) { - // Remove already configured env if present. - unsetenv("HBASE_CONF"); - ClientTest::CreateHBaseConfWithEnv(); - - // Create Configuration - hbase::HBaseConfigurationLoader loader; - auto conf = loader.LoadDefaultResources(); - // Create a client - hbase::Client client(conf.value()); - client.Close(); -} - -TEST_F(ClientTest, DefaultConfiguration) { - // Remove already configured env if present. - unsetenv("HBASE_CONF"); - ClientTest::CreateHBaseConfWithEnv(); - - // Create Configuration - hbase::Client client; - client.Close(); -} - -TEST_F(ClientTest, Append) { - // Using TestUtil to populate test data - ClientTest::test_util->CreateTable("t", "d"); - - // Create TableName and Row to be fetched from HBase - auto tn = folly::to<hbase::pb::TableName>("t"); - auto row = "test1"; - - // Create a client - hbase::Client client(*ClientTest::test_util->conf()); - - // Get connection to HBase Table - auto table = client.Table(tn); - ASSERT_TRUE(table != nullptr) << "Unable to get connection to Table."; - std::string val1 = "a"; - auto result = table->Append(hbase::Append{row}.Add("d", "1", val1)); - - ASSERT_TRUE(!result->IsEmpty()) << "Result shouldn't be empty."; - EXPECT_EQ(row, result->Row()); - EXPECT_EQ(val1, *(result->Value("d", "1"))); - - std::string val2 = "b"; - result = table->Append(hbase::Append{row}.Add("d", "1", val2)); - - ASSERT_TRUE(!result->IsEmpty()) << "Result shouldn't be empty."; - EXPECT_EQ(row, result->Row()); - EXPECT_EQ("ab", *(result->Value("d", "1"))); -} - -TEST_F(ClientTest, PutGetDelete) { - // Using TestUtil to populate test data - std::string tableName = "t1"; - ClientTest::test_util->CreateTable(tableName, "d"); - - // Create TableName and Row to be fetched from HBase - auto tn = folly::to<hbase::pb::TableName>(tableName); - auto row = "test1"; - - // Create a client - hbase::Client client(*ClientTest::test_util->conf()); - - // Get connection to HBase Table - auto table = client.Table(tn); - ASSERT_TRUE(table != nullptr) << "Unable to get connection to Table."; - - // Perform Puts - std::string valExtra = "value for extra"; - std::string valExt = "value for ext"; - table->Put(Put{row}.AddColumn("d", "1", "value1")); - // Put two values for column "extra" - table->Put(Put{row}.AddColumn("d", "extra", "1st val extra")); - usleep(1000); - table->Put(Put{row}.AddColumn("d", "extra", valExtra)); - table->Put(Put{row}.AddColumn("d", "ext", valExt)); - - // Perform the Get - hbase::Get get(row); - auto result = table->Get(get); - - // Test the values, should be same as in put executed on hbase shell - ASSERT_TRUE(!result->IsEmpty()) << "Result shouldn't be empty."; - EXPECT_EQ("test1", result->Row()); - EXPECT_EQ("value1", *(result->Value("d", "1"))); - EXPECT_EQ(valExtra, *(result->Value("d", "extra"))); - auto cell = *(result->ColumnCells("d", "extra"))[0]; - auto tsExtra = cell.Timestamp(); - auto tsExt = (*(result->ColumnCells("d", "ext"))[0]).Timestamp(); - - // delete column "1" - table->Delete(hbase::Delete{row}.AddColumn("d", "1")); - result = table->Get(get); - ASSERT_TRUE(!result->IsEmpty()) << "Result shouldn't be empty."; - ASSERT_FALSE(result->Value("d", "1")) << "Column 1 should be gone"; - EXPECT_EQ(valExtra, *(result->Value("d", "extra"))); - - // delete cell from column "extra" with timestamp tsExtra - table->Delete(hbase::Delete{row}.AddColumn("d", "extra", tsExtra)); - result = table->Get(get); - ASSERT_TRUE(!result->IsEmpty()) << "Result shouldn't be empty."; - ASSERT_FALSE(result->Value("d", "1")) << "Column 1 should be gone"; - ASSERT_TRUE(result->Value("d", "extra") != nullopt) << "Column extra should have value"; - EXPECT_EQ(valExt, *(result->Value("d", "ext"))) << "Column ext should have value"; - - // delete all cells from "extra" column - table->Delete(hbase::Delete{row}.AddColumns("d", "extra")); - result = table->Get(get); - ASSERT_TRUE(!result->IsEmpty()) << "Result shouldn't be empty."; - ASSERT_FALSE(result->Value("d", "1")) << "Column 1 should be gone"; - ASSERT_FALSE(result->Value("d", "extra")) << "Column extra should be gone"; - EXPECT_EQ(valExt, *(result->Value("d", "ext"))) << "Column ext should have value"; - - // Delete the row and verify that subsequent Get returns nothing - table->Delete(hbase::Delete{row}.AddFamily("d")); - result = table->Get(get); - ASSERT_TRUE(result->IsEmpty()) << "Result should be empty."; - - table->Close(); - client.Close(); -} - -TEST_F(ClientTest, Increment) { - // Using TestUtil to populate test data - ClientTest::test_util->CreateTable("t1", "d"); - - // Create TableName and Row to be fetched from HBase - auto tn = folly::to<hbase::pb::TableName>("t1"); - auto row = "test1"; - - // Create a client - hbase::Client client(*ClientTest::test_util->conf()); - - // Get connection to HBase Table - auto table = client.Table(tn); - ASSERT_TRUE(table != nullptr) << "Unable to get connection to Table."; - int64_t incr1 = 1235; - auto result = table->Increment(hbase::Increment{row}.AddColumn("d", "1", incr1)); - EXPECT_EQ(row, result->Row()); - - long l = hbase::BytesUtil::ToInt64(*(result->Value("d", "1"))); - EXPECT_EQ(incr1, l); - - int64_t incr2 = -2; - result = table->Increment(hbase::Increment{row}.AddColumn("d", "1", incr2)); - - EXPECT_EQ(row, result->Row()); - EXPECT_EQ(incr1 + incr2, hbase::BytesUtil::ToInt64(*(result->Value("d", "1")))); -} - -TEST_F(ClientTest, CheckAndPut) { - // Using TestUtil to populate test data - ClientTest::test_util->CreateTable("check", "d"); - - // Create TableName and Row to be fetched from HBase - auto tn = folly::to<hbase::pb::TableName>("check"); - auto row = "test1"; - - // Create a client - hbase::Client client(*ClientTest::test_util->conf()); - - // Get connection to HBase Table - auto table = client.Table(tn); - ASSERT_TRUE(table != nullptr) << "Unable to get connection to Table."; - - // Perform Puts - table->Put(Put{row}.AddColumn("d", "1", "value1")); - auto result = table->CheckAndPut(row, "d", "1", "value1", Put{row}.AddColumn("d", "1", "value2")); - ASSERT_TRUE(result) << "CheckAndPut didn't replace value"; - - result = table->CheckAndPut(row, "d", "1", "value1", Put{row}.AddColumn("d", "1", "value3")); - - // Perform the Get - hbase::Get get(row); - auto result1 = table->Get(get); - EXPECT_EQ("value2", *(result1->Value("d", "1"))); - ASSERT_FALSE(result) << "CheckAndPut shouldn't replace value"; -} - -TEST_F(ClientTest, CheckAndDelete) { - // Using TestUtil to populate test data - ClientTest::test_util->CreateTable("checkDel", "d"); - - // Create TableName and Row to be fetched from HBase - auto tn = folly::to<hbase::pb::TableName>("checkDel"); - auto row = "test1"; - - // Create a client - hbase::Client client(*ClientTest::test_util->conf()); - - // Get connection to HBase Table - auto table = client.Table(tn); - ASSERT_TRUE(table != nullptr) << "Unable to get connection to Table."; - - auto val1 = "value1"; - - // Perform Puts - table->Put(Put{row}.AddColumn("d", "1", val1)); - table->Put(Put{row}.AddColumn("d", "2", "value2")); - auto result = table->CheckAndDelete(row, "d", "1", val1, hbase::Delete{row}.AddColumn("d", "2")); - ASSERT_TRUE(result) << "CheckAndDelete didn't replace value"; - - // Perform the Get - hbase::Get get(row); - auto result1 = table->Get(get); - EXPECT_EQ(val1, *(result1->Value("d", "1"))); - ASSERT_FALSE(result1->Value("d", "2")) << "Column 2 should be gone"; -} - -TEST_F(ClientTest, PutGet) { - // Using TestUtil to populate test data - ClientTest::test_util->CreateTable("t", "d"); - - // Create TableName and Row to be fetched from HBase - auto tn = folly::to<hbase::pb::TableName>("t"); - auto row = "test1"; - - // Create a client - hbase::Client client(*ClientTest::test_util->conf()); - - // Get connection to HBase Table - auto table = client.Table(tn); - ASSERT_TRUE(table != nullptr) << "Unable to get connection to Table."; - - // Perform Puts - table->Put(Put{"test1"}.AddColumn("d", "1", "value1")); - table->Put(Put{"test1"}.AddColumn("d", "extra", "value for extra")); - - // Perform the Get - hbase::Get get(row); - auto result = table->Get(get); - - // Test the values, should be same as in put executed on hbase shell - ASSERT_TRUE(!result->IsEmpty()) << "Result shouldn't be empty."; - EXPECT_EQ("test1", result->Row()); - EXPECT_EQ("value1", *(result->Value("d", "1"))); - EXPECT_EQ("value for extra", *(result->Value("d", "extra"))); - - table->Close(); - client.Close(); -} - -TEST_F(ClientTest, GetForNonExistentTable) { - // Create TableName and Row to be fetched from HBase - auto tn = folly::to<hbase::pb::TableName>("t_not_exists"); - auto row = "test1"; - - // Get to be performed on above HBase Table - hbase::Get get(row); - - ClientTest::test_util->conf()->SetInt("hbase.client.retries.number", 5); - // Create a client - hbase::Client client(*ClientTest::test_util->conf()); - - // Get connection to HBase Table - auto table = client.Table(tn); - ASSERT_TRUE(table != nullptr) << "Unable to get connection to Table."; - - // Perform the Get - try { - table->Get(get); - FAIL() << "Should have thrown RetriesExhaustedException"; - } catch (const RetriesExhaustedException &ex) { - ASSERT_EQ(0, ex.num_retries()); - } catch (...) { - FAIL() << "Should have thrown RetriesExhaustedException"; - } - - table->Close(); - client.Close(); -} - -TEST_F(ClientTest, GetForNonExistentRow) { - // Using TestUtil to populate test data - ClientTest::test_util->CreateTable("t_exists", "d"); - - // Create TableName and Row to be fetched from HBase - auto tn = folly::to<hbase::pb::TableName>("t_exists"); - auto row = "row_not_exists"; - - // Get to be performed on above HBase Table - hbase::Get get(row); - - // Create a client - hbase::Client client(*ClientTest::test_util->conf()); - - // Get connection to HBase Table - auto table = client.Table(tn); - ASSERT_TRUE(table != nullptr) << "Unable to get connection to Table."; - - // Perform the Get - auto result = table->Get(get); - ASSERT_TRUE(result->IsEmpty()) << "Result should be empty."; - - table->Close(); - client.Close(); -} - -TEST_F(ClientTest, PutsWithTimestamp) { - // Using TestUtil to populate test data - ClientTest::test_util->CreateTable("t_puts_with_timestamp", "d"); - - // Create TableName and Row to be fetched from HBase - auto tn = folly::to<hbase::pb::TableName>("t_puts_with_timestamp"); - auto row = "test1"; - - // Create a client - hbase::Client client(*ClientTest::test_util->conf()); - - // Get connection to HBase Table - auto table = client.Table(tn); - ASSERT_TRUE(table != nullptr) << "Unable to get connection to Table."; - - int64_t ts = 42; - // Perform Puts - table->Put(Put{"test1"}.AddColumn("d", "1", ts, "value1")); - auto cell = - std::make_unique<Cell>("test1", "d", "extra", ts, "value for extra", hbase::CellType::PUT); - table->Put(Put{"test1"}.Add(std::move(cell))); - - // Perform the Get - hbase::Get get(row); - auto result = table->Get(get); - - // Test the values, should be same as in put executed on hbase shell - ASSERT_TRUE(!result->IsEmpty()) << "Result shouldn't be empty."; - EXPECT_EQ("test1", result->Row()); - EXPECT_EQ("value1", *(result->Value("d", "1"))); - EXPECT_EQ("value for extra", *(result->Value("d", "extra"))); - EXPECT_EQ(ts, result->ColumnLatestCell("d", "1")->Timestamp()); - EXPECT_EQ(ts, result->ColumnLatestCell("d", "extra")->Timestamp()); - - table->Close(); - client.Close(); -} - -void SetClientParams() { - ClientTest::test_util->conf()->SetInt("hbase.client.cpu.thread.pool.size", 6); - ClientTest::test_util->conf()->SetInt("hbase.client.operation.timeout", 600000); - ClientTest::test_util->conf()->SetInt("hbase.client.retries.number", 7); - ClientTest::test_util->conf()->SetInt("hbase.client.start.log.errors.counter", 1); -} - -void PerformPuts(uint64_t num_rows, std::shared_ptr<hbase::Client> client, - const std::string &table_name) { - auto tn = folly::to<hbase::pb::TableName>(table_name); - auto table = client->Table(tn); - ASSERT_TRUE(table != nullptr) << "Unable to get connection to Table."; - // Perform Puts - for (uint64_t i = 0; i < num_rows; i++) { - table->Put(Put{"test" + std::to_string(i)}.AddColumn("d", std::to_string(i), - "value" + std::to_string(i))); - } -} - -void MakeGets(uint64_t num_rows, const std::string &row_prefix, std::vector<hbase::Get> &gets) { - // Perform the Gets - for (uint64_t i = 0; i < num_rows; ++i) { - auto row = "test" + std::to_string(i); - hbase::Get get(row); - gets.push_back(get); - } - gets.push_back(hbase::Get("test2")); - gets.push_back(hbase::Get("testextra")); -} - -void TestMultiResults(uint64_t num_rows, const std::vector<std::shared_ptr<hbase::Result>> &results, - const std::vector<hbase::Get> &gets) { - // Test the values, should be same as in put executed on hbase shell - ASSERT_TRUE(!results.empty()) << "Result vector shouldn't be empty."; - - uint32_t i = 0; - for (; i < num_rows; ++i) { - ASSERT_TRUE(!results[i]->IsEmpty()) << "Result for Get " << gets[i].row() - << " must not be empty"; - EXPECT_EQ("test" + std::to_string(i), results[i]->Row()); - EXPECT_EQ("value" + std::to_string(i), results[i]->Value("d", std::to_string(i)).value()); - } - // We are inserting test2 twice so the below test should pass - ASSERT_TRUE(!results[i]->IsEmpty()) << "Result for Get " << gets[i].row() << " must not be empty"; - - ++i; - ASSERT_TRUE(results[i]->IsEmpty()) << "Result for Get " << gets[i].row() << " must be empty"; -} - -TEST_F(ClientTest, MultiGets) { - std::string table_name = "t"; - // Using TestUtil to populate test data - ClientTest::test_util->CreateTable(table_name, "d"); - - // Create TableName and Row to be fetched from HBase - auto tn = folly::to<hbase::pb::TableName>(table_name); - - SetClientParams(); - // Create a client - hbase::Client client(*ClientTest::test_util->conf()); - - uint64_t num_rows = 50000; - PerformPuts(num_rows, std::make_shared<hbase::Client>(client), table_name); - - // Get connection to HBase Table - auto table = client.Table(tn); - ASSERT_TRUE(table != nullptr) << "Unable to get connection to Table."; - - std::vector<hbase::Get> gets; - MakeGets(num_rows, "test", gets); - - auto results = table->Get(gets); - - TestMultiResults(num_rows, results, gets); - - table->Close(); - client.Close(); -} - -TEST_F(ClientTest, MultiGetsWithRegionSplits) { - // Using TestUtil to populate test data - std::vector<std::string> keys{"test0", "test100", "test200", "test300", "test400", - "test500", "test600", "test700", "test800", "test900"}; - std::string table_name = "t"; - ClientTest::test_util->CreateTable(table_name, "d", keys); - - // Create TableName and Row to be fetched from HBase - auto tn = folly::to<hbase::pb::TableName>(table_name); - - SetClientParams(); - - // Create a client - hbase::Client client(*ClientTest::test_util->conf()); - - uint64_t num_rows = 50000; - PerformPuts(num_rows, std::make_shared<hbase::Client>(client), table_name); - - // Get connection to HBase Table - auto table = client.Table(tn); - ASSERT_TRUE(table != nullptr) << "Unable to get connection to Table."; - - std::vector<hbase::Get> gets; - MakeGets(num_rows, "test", gets); - - auto results = table->Get(gets); - - TestMultiResults(num_rows, results, gets); - - table->Close(); - client.Close(); -} - -void PerformMultiPuts(uint64_t num_rows, std::shared_ptr<hbase::Client> client, - const std::string &table_name) { - auto tn = folly::to<hbase::pb::TableName>(table_name); - auto table = client->Table(tn); - ASSERT_TRUE(table) << "Unable to get connection to Table."; - std::vector<hbase::Put> puts; - // Perform Puts - for (uint64_t i = 0; i < num_rows; i++) { - puts.push_back(Put{"test" + std::to_string(i)}.AddColumn("d", std::to_string(i), - "value" + std::to_string(i))); - } - table->Put(puts); -} - -void PerformMultiPuts(std::vector<hbase::Put> &puts, std::shared_ptr<Table> table) { - table->Put(puts); -} - -TEST_F(ClientTest, MultiGetsWithMultiPuts) { - std::string table_name = "t"; - // Using TestUtil to populate test data - ClientTest::test_util->CreateTable(table_name, "d"); - - // Create TableName and Row to be fetched from HBase - auto tn = folly::to<hbase::pb::TableName>(table_name); - - SetClientParams(); - // Create a client - hbase::Client client(*ClientTest::test_util->conf()); - - uint64_t num_rows = 50000; - PerformMultiPuts(num_rows, std::make_shared<hbase::Client>(client), table_name); - - // Get connection to HBase Table - auto table = client.Table(tn); - ASSERT_TRUE(table) << "Unable to get connection to Table."; - - std::vector<hbase::Get> gets; - MakeGets(num_rows, "test", gets); - - auto results = table->Get(gets); - - TestMultiResults(num_rows, results, gets); - - table->Close(); - client.Close(); -} - -TEST_F(ClientTest, MultiGetsWithMultiPutsAndSplitRegions) { - // Using TestUtil to populate test data - std::vector<std::string> keys{"test0", "test100", "test200", "test300", "test400", - "test500", "test600", "test700", "test800", "test900"}; - std::string table_name = "t"; - ClientTest::test_util->CreateTable(table_name, "d", keys); - - // Create TableName and Row to be fetched from HBase - auto tn = folly::to<hbase::pb::TableName>(table_name); - - SetClientParams(); - - // Create a client - hbase::Client client(*ClientTest::test_util->conf()); - - uint64_t num_rows = 50000; - PerformMultiPuts(num_rows, std::make_shared<hbase::Client>(client), table_name); - - // Get connection to HBase Table - auto table = client.Table(tn); - ASSERT_TRUE(table) << "Unable to get connection to Table."; - - std::vector<hbase::Get> gets; - MakeGets(num_rows, "test", gets); - - auto results = table->Get(gets); - - TestMultiResults(num_rows, results, gets); - - table->Close(); - client.Close(); -} - -TEST_F(ClientTest, MultiPuts) { - std::string table_name = "t"; - // Using TestUtil to populate test data - ClientTest::test_util->CreateTable(table_name, "d"); - - // Create TableName and Row to be fetched from HBase - auto tn = folly::to<hbase::pb::TableName>(table_name); - - SetClientParams(); - // Create a client - hbase::Client client(*ClientTest::test_util->conf()); - std::shared_ptr<Table> table = client.Table(tn); - ASSERT_TRUE(table) << "Unable to get connection to Table."; - - uint64_t num_rows = 80000; - uint64_t batch_num_rows = 10000; - std::vector<hbase::Put> puts; - for (uint64_t i = 0; i < num_rows;) { - puts.clear(); - // accumulate batch_num_rows at a time - for (uint64_t j = 0; j < batch_num_rows && i < num_rows; ++j) { - hbase::Put put("test" + std::to_string(i)); - put.AddColumn("d", std::to_string(i), "value" + std::to_string(i)); - puts.push_back(put); - i++; - } - PerformMultiPuts(puts, table); - } - table->Close(); - client.Close(); -} - -TEST_F(ClientTest, MultiPutsWithRegionSplits) { - // Using TestUtil to populate test data - std::vector<std::string> keys{"test0", "test100", "test200", "test300", "test400", - "test500", "test600", "test700", "test800", "test900"}; - std::string table_name = "t"; - ClientTest::test_util->CreateTable(table_name, "d", keys); - - // Create TableName and Row to be fetched from HBase - auto tn = folly::to<hbase::pb::TableName>(table_name); - - SetClientParams(); - - // Create a client - hbase::Client client(*ClientTest::test_util->conf()); - std::shared_ptr<Table> table = client.Table(tn); - ASSERT_TRUE(table) << "Unable to get connection to Table."; - - uint64_t num_rows = 80000; - uint64_t batch_num_rows = 10000; - std::vector<hbase::Put> puts; - for (uint64_t i = 0; i < num_rows;) { - puts.clear(); - // accumulate batch_num_rows at a time - for (uint64_t j = 0; j < batch_num_rows && i < num_rows; ++j) { - hbase::Put put("test" + std::to_string(i)); - put.AddColumn("d", std::to_string(i), "value" + std::to_string(i)); - puts.push_back(put); - i++; - } - PerformMultiPuts(puts, table); - } - table->Close(); - client.Close(); -} http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/client.cc ---------------------------------------------------------------------- diff --git a/hbase-native-client/core/client.cc b/hbase-native-client/core/client.cc deleted file mode 100644 index e23aeae..0000000 --- a/hbase-native-client/core/client.cc +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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 "core/client.h" - -#include <glog/logging.h> -#include <chrono> -#include <exception> -#include <memory> -#include <utility> - -using hbase::pb::TableName; - -namespace hbase { - -Client::Client() { - HBaseConfigurationLoader loader; - auto conf = loader.LoadDefaultResources(); - if (!conf) { - LOG(ERROR) << "Unable to create default Configuration object. Either hbase-default.xml or " - "hbase-site.xml is absent in the search path or problems in XML parsing"; - throw std::runtime_error("Configuration object not present."); - } - Init(conf.value()); -} - -Client::Client(const Configuration &conf) { Init(conf); } - -void Client::Init(const Configuration &conf) { - auto conf_ = std::make_shared<Configuration>(conf); - async_connection_ = AsyncConnectionImpl::Create(conf_); -} - -std::unique_ptr<Table> Client::Table(const TableName &table_name) { - return std::make_unique<hbase::Table>(table_name, async_connection_); -} - -void Client::Close() { async_connection_->Close(); } -} // namespace hbase http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/client.h ---------------------------------------------------------------------- diff --git a/hbase-native-client/core/client.h b/hbase-native-client/core/client.h deleted file mode 100644 index 5563a15..0000000 --- a/hbase-native-client/core/client.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * 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. - * - */ - -#pragma once - -#include <memory> -#include <string> - -#include "connection/rpc-client.h" -#include "core/async-connection.h" -#include "core/configuration.h" - -#include "core/table.h" -#include "serde/table-name.h" - -namespace hbase { - -class Table; -/** - * Client. - * - * This is the class that provides access to an HBase cluster. - * It is thread safe and does connection pooling. Current recommendations are to - * have only one Client per cluster around. - */ -class Client { - public: - /** - * @brief Create a new client. - * @param quorum_spec Where to connect to get Zookeeper bootstrap information. - */ - Client(); - explicit Client(const Configuration& conf); - ~Client() = default; - - /** - * @brief Retrieve a Table implementation for accessing a table. - * @param - table_name - */ - std::unique_ptr<::hbase::Table> Table(const pb::TableName& table_name); - - /** - * @brief Close the Client connection. - */ - void Close(); - - /** - * @brief Internal. DO NOT USE. - */ - std::shared_ptr<AsyncConnectionImpl> async_connection() { return async_connection_; } - - private: - /** Data */ - std::shared_ptr<AsyncConnectionImpl> async_connection_; - - private: - /** Methods */ - void Init(const Configuration& conf); -}; - -} // namespace hbase http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/configuration-test.cc ---------------------------------------------------------------------- diff --git a/hbase-native-client/core/configuration-test.cc b/hbase-native-client/core/configuration-test.cc deleted file mode 100644 index abdf0c7..0000000 --- a/hbase-native-client/core/configuration-test.cc +++ /dev/null @@ -1,119 +0,0 @@ -/* - * 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 "core/configuration.h" -#include <gtest/gtest.h> - -using hbase::Configuration; - -TEST(Configuration, SetGetBool) { - Configuration conf; - - /* test true/false */ - conf.SetBool("bool_key1", true); - EXPECT_EQ(true, conf.GetBool("bool_key1", false)); - conf.SetBool("bool_key2", false); - EXPECT_EQ(false, conf.GetBool("bool_key2", true)); - - /* test 1/0 */ - conf.SetBool("bool_key3", 1); - EXPECT_EQ(true, conf.GetBool("bool_key3", false)); - conf.SetBool("bool_key4", 0); - EXPECT_EQ(false, conf.GetBool("bool_key4", true)); - - /* test non zero integer */ - conf.SetBool("bool_key5", 5); - EXPECT_EQ(true, conf.GetBool("bool_key5", false)); - conf.SetBool("bool_key6", -1); - EXPECT_EQ(true, conf.GetBool("bool_key5", false)); - - /* test non zero float */ - conf.SetBool("bool_key7", 5.1); - EXPECT_EQ(true, conf.GetBool("bool_key7", false)); - conf.SetBool("bool_key8", -1.2); - EXPECT_EQ(true, conf.GetBool("bool_key8", false)); -} - -TEST(Configuration, SetGetForBool) { - Configuration conf; - - /* test true/false */ - conf.Set("bool_key1", "true"); - EXPECT_EQ(true, conf.GetBool("bool_key1", false)); - conf.Set("bool_key2", "false"); - EXPECT_EQ(false, conf.GetBool("bool_key2", true)); - - /* test 1/0 */ - conf.Set("bool_key3", "1"); - EXPECT_EQ(true, conf.GetBool("bool_key3", false)); - conf.Set("bool_key4", "0"); - EXPECT_EQ(false, conf.GetBool("bool_key4", true)); - - /* test non zero integer */ - conf.Set("bool_key5", "5"); - EXPECT_THROW(conf.GetBool("bool_key5", false), std::runtime_error); - conf.Set("bool_key6", "-1"); - EXPECT_THROW(conf.GetBool("bool_key6", false), std::runtime_error); - - /* test non zero float */ - conf.Set("bool_key7", "5.1"); - EXPECT_THROW(conf.GetBool("bool_key7", false), std::runtime_error); - conf.Set("bool_key8", "-1.2"); - EXPECT_THROW(conf.GetBool("bool_key8", false), std::runtime_error); -} - -TEST(Configuration, SetGet) { - Configuration conf; - - EXPECT_EQ(conf.Get("foo", "default"), "default"); - conf.Set("foo", "bar"); - EXPECT_EQ(conf.Get("foo", "default"), "bar"); -} - -TEST(Configuration, SetGetInt) { - Configuration conf; - - EXPECT_EQ(conf.GetInt("foo", 0), 0); - conf.SetInt("foo", 42); - EXPECT_EQ(conf.GetInt("foo", 0), 42); -} - -TEST(Configuration, SetGetLong) { - Configuration conf; - - EXPECT_EQ(conf.GetLong("foo", 0), 0); - conf.SetLong("foo", 42); - EXPECT_EQ(conf.GetLong("foo", 0), 42); -} - -TEST(Configuration, SetGetDouble) { - Configuration conf; - - EXPECT_EQ(conf.GetDouble("foo", 0), 0); - conf.SetDouble("foo", 42.0); - EXPECT_EQ(conf.GetDouble("foo", 0), 42.0); -} - -TEST(Configuration, SetGetBoolBasic) { - Configuration conf; - - EXPECT_EQ(conf.GetBool("foo", false), false); - conf.SetInt("foo", true); - EXPECT_EQ(conf.GetInt("foo", false), true); -} http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/configuration.cc ---------------------------------------------------------------------- diff --git a/hbase-native-client/core/configuration.cc b/hbase-native-client/core/configuration.cc deleted file mode 100644 index 1fd2851..0000000 --- a/hbase-native-client/core/configuration.cc +++ /dev/null @@ -1,244 +0,0 @@ -/* - * 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 "core/configuration.h" - -#include <memory> -#include <stdexcept> -#include <utility> - -#include <glog/logging.h> -#include <boost/format.hpp> -#include <boost/lexical_cast.hpp> - -namespace hbase { - -Configuration::Configuration() : hb_property_() {} - -Configuration::Configuration(ConfigMap &config_map) : hb_property_(std::move(config_map)) {} - -Configuration::~Configuration() {} - -size_t Configuration::IsSubVariable(const std::string &expr, std::string &sub_variable) const { - size_t start_pos = expr.find("${"); - if (std::string::npos != start_pos) { - size_t pos_next = expr.find("}", start_pos + 1); - if (std::string::npos != pos_next) { - sub_variable = expr.substr(start_pos + 2, pos_next - (start_pos + 2)); - } - } - return start_pos; -} - -std::string Configuration::SubstituteVars(const std::string &expr) const { - if (0 == expr.size()) return expr; - - std::string eval(expr); - std::string value_to_be_replaced(""); - std::string var(""); - for (int i = 0; i < kMaxSubsts; i++) { - var = ""; - size_t start_pos = IsSubVariable(eval, var); - if (start_pos != std::string::npos) { - // We are blindly checking for environment property at first. - // If we don't get any value from GetEnv, check in hbase-site.xml. - value_to_be_replaced = GetEnv(var).value_or(GetProperty(var).value_or("")); - - // we haven't found any value yet so we are returning eval - if (0 == value_to_be_replaced.size()) { - return eval; - } - - // return original expression if there is a loop - if (value_to_be_replaced == expr) { - return expr; - } - - eval.replace(start_pos, var.size() + 3, value_to_be_replaced); - - } else { - // No further expansion required. - return eval; - } - } - // We reached here if the loop is exhausted - // If MAX_SUBSTS is exhausted, check if more variable substitution is reqd. - // If any-more substitutions are reqd, throw an error. - var = ""; - if (IsSubVariable(eval, var) != std::string::npos) { - throw std::runtime_error("Variable substitution depth too large: " + - std::to_string(kMaxSubsts) + " " + expr); - } else { - return eval; - } -} - -optional<std::string> Configuration::GetEnv(const std::string &key) const { - char buf[2048]; - - if ("user.name" == key) { -#ifdef HAVE_GETLOGIN - return std::experimental::make_optional(getlogin()); -#else - DLOG(WARNING) << "Client user.name not implemented"; - return optional<std::string>(); -#endif - } - - if ("user.dir" == key) { -#ifdef HAVE_GETCWD - if (getcwd(buf, sizeof(buf))) { - return std::experimental::make_optional(buf); - } else { - return optional<std::string>(); - } -#else - DLOG(WARNING) << "Client user.dir not implemented"; - return optional<std::string>(); -#endif - } - - if ("user.home" == key) { -#if defined(HAVE_GETUID) && defined(HAVE_GETPWUID_R) - uid = getuid(); - if (!getpwuid_r(uid, &pw, buf, sizeof(buf), &pwp)) { - return std::experimental::make_optional(buf); - } else { - return optional<std::string>(); - } -#else - DLOG(WARNING) << "Client user.home not implemented"; - return optional<std::string>(); -#endif - } - return optional<std::string>(); -} - -optional<std::string> Configuration::GetProperty(const std::string &key) const { - auto found = hb_property_.find(key); - if (found != hb_property_.end()) { - return std::experimental::make_optional(found->second.value); - } else { - return optional<std::string>(); - } -} - -optional<std::string> Configuration::Get(const std::string &key) const { - optional<std::string> raw = GetProperty(key); - if (raw) { - return std::experimental::make_optional(SubstituteVars(*raw)); - } else { - return optional<std::string>(); - } -} - -std::string Configuration::Get(const std::string &key, const std::string &default_value) const { - return Get(key).value_or(default_value); -} - -optional<int32_t> Configuration::GetInt(const std::string &key) const { - optional<std::string> raw = Get(key); - if (raw) { - try { - return std::experimental::make_optional(boost::lexical_cast<int32_t>(*raw)); - } catch (const boost::bad_lexical_cast &blex) { - throw std::runtime_error(blex.what()); - } - } - return optional<int32_t>(); -} - -int32_t Configuration::GetInt(const std::string &key, int32_t default_value) const { - return GetInt(key).value_or(default_value); -} - -optional<int64_t> Configuration::GetLong(const std::string &key) const { - optional<std::string> raw = Get(key); - if (raw) { - try { - return std::experimental::make_optional(boost::lexical_cast<int64_t>(*raw)); - } catch (const boost::bad_lexical_cast &blex) { - throw std::runtime_error(blex.what()); - } - } - return optional<int64_t>(); -} - -int64_t Configuration::GetLong(const std::string &key, int64_t default_value) const { - return GetLong(key).value_or(default_value); -} - -optional<double> Configuration::GetDouble(const std::string &key) const { - optional<std::string> raw = Get(key); - if (raw) { - try { - return std::experimental::make_optional(boost::lexical_cast<double>(*raw)); - } catch (const boost::bad_lexical_cast &blex) { - throw std::runtime_error(blex.what()); - } - } - return optional<double>(); -} - -double Configuration::GetDouble(const std::string &key, double default_value) const { - return GetDouble(key).value_or(default_value); -} - -optional<bool> Configuration::GetBool(const std::string &key) const { - optional<std::string> raw = Get(key); - if (raw) { - if (!strcasecmp((*raw).c_str(), "true") || !strcasecmp((*raw).c_str(), "1")) { - return std::experimental::make_optional(true); - } else if (!strcasecmp((*raw).c_str(), "false") || !strcasecmp((*raw).c_str(), "0")) { - return std::experimental::make_optional(false); - } else { - boost::format what("Unexpected value \"%s\" found being converted to bool for key \"%s\""); - what % (*raw); - what % key; - throw std::runtime_error(what.str()); - } - } - return optional<bool>(); -} - -bool Configuration::GetBool(const std::string &key, bool default_value) const { - return GetBool(key).value_or(default_value); -} - -void Configuration::Set(const std::string &key, const std::string &value) { - hb_property_[key] = value; -} - -void Configuration::SetInt(const std::string &key, int32_t value) { - Set(key, boost::lexical_cast<std::string>(value)); -} - -void Configuration::SetLong(const std::string &key, int64_t value) { - Set(key, boost::lexical_cast<std::string>(value)); -} - -void Configuration::SetDouble(const std::string &key, double value) { - Set(key, boost::lexical_cast<std::string>(value)); -} - -void Configuration::SetBool(const std::string &key, bool value) { - Set(key, boost::lexical_cast<std::string>(value)); -} - -} /* namespace hbase */ http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/configuration.h ---------------------------------------------------------------------- diff --git a/hbase-native-client/core/configuration.h b/hbase-native-client/core/configuration.h deleted file mode 100644 index d70941c..0000000 --- a/hbase-native-client/core/configuration.h +++ /dev/null @@ -1,232 +0,0 @@ -/* - * 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. - * - */ - -/* Some pieces of code have been added from HDFS-8707 */ -#pragma once - -#include <map> -#include <string> -#include <vector> - -#include <experimental/optional> - -namespace hbase { - -template <class T> -using optional = std::experimental::optional<T>; - -class Configuration { - public: - /** - * @brief Create Configuration object using an empty map. This - * object WILL NOT be initialized from reading XML configuration (hbase-site.xml, etc). - * Use HBaseConfigurationLoader to initialize the configuration from - * hbase-default.xml and hbase-site.xml files. - */ - Configuration(); - - ~Configuration(); - - /** - * @brief Returns value identified by key in ConfigMap else default value if - * property is absent. - * @param key Property whose value is to be fetched. SubstituteVars will be - * called for any variable expansion. - */ - std::string Get(const std::string &key, const std::string &default_value) const; - - /** - * @brief Returns int32_t identified by key in ConfigMap else default value if - * property is absent. - * @param key Property whose value is to be fetched. Internally Get(key) will - * be called. - * @throws std::runtime_error if conversion to int32_t fails - */ - int32_t GetInt(const std::string &key, int32_t default_value) const; - - /** - * @brief Returns int64_t identified by key in ConfigMap else default value if - * property is absent. - * @param key Property whose value is to be fetched. Internally Get(key) will - * be called and - * @throws std::runtime_error if conversion to int64_t fails - */ - int64_t GetLong(const std::string &key, int64_t default_value) const; - - /** - * @brief Returns double identified by key in ConfigMap else default value if - * property is absent. - * @param key Property whose value is to be fetched. Internally Get(key) will - * be called. - * @throws std::runtime_error if conversion to double fails - */ - double GetDouble(const std::string &key, double default_value) const; - - /** - * @brief Returns bool identified by key in ConfigMap else default value if - * property is absent. - * @param key Property whose value is to be fetched. Internally Get(key) will - * be called. - * @throws std::runtime_error if conversion to bool fails - */ - bool GetBool(const std::string &key, bool default_value) const; - - /** - * @brief This method sets the given key to the value. - * @param key property name - * @param value property value - */ - void Set(const std::string &key, const std::string &value); - - /** - * @brief This method sets the given key to the value. - * @param key property name - * @param value property value - */ - void SetInt(const std::string &key, int32_t value); - - /** - * @brief This method sets the given key to the value. - * @param key property name - * @param value property value - */ - void SetLong(const std::string &key, int64_t value); - - /** - * @brief This method sets the given key to the value. - * @param key property name - * @param value property value - */ - void SetDouble(const std::string &key, double value); - - /** - * @brief This method sets the given key to the value. - * @param key property name - * @param value property value - */ - void SetBool(const std::string &key, bool value); - - private: - friend class HBaseConfigurationLoader; - - /* Transparent data holder for property values */ - /* Same as Jira HDFS-8707 */ - struct ConfigData { - std::string value; - bool final; - ConfigData() : final(false) {} - explicit ConfigData(const std::string &value) : value(value), final(false) {} - void operator=(const std::string &new_value) { - value = new_value; - final = false; - } - }; - - /** - * @brief Map which hold configuration properties. - */ - using ConfigMap = std::map<std::string, ConfigData>; - - /** - * @brief Create Configuration object using config_map; - * @param config_map - Map consisting of properties. - */ - explicit Configuration(ConfigMap &config_map); - - // Property map filled all the properties loaded by ConfigurationLoader - ConfigMap hb_property_; - - // Variable expansion depth - const int kMaxSubsts = 20; - - /** - * @brief returns value for a property identified by key in ConfigMap. - * SubstituteVars will be called for any variable expansion. - * @param key Key whose value is to be fetched. - */ - optional<std::string> Get(const std::string &key) const; - - /** - * @brief returns optional int32_t value identified by the key in ConfigMap. - * Get(key) is called to get the string value which is then converted to - * int32_t using boost::lexical_cast. - * @param key Key whose value is to be fetched. - * @throws std::runtime_error if conversion to int32_t fails - */ - optional<int32_t> GetInt(const std::string &key) const; - - /** - * @brief returns optional int64_t value identified by the key in ConfigMap. - * Get(key) is called internally to get the string value which is then - * converted to int64_t using boost::lexical_cast. - * @param key Key whose value is to be fetched. - * @throws std::runtime_error if conversion to int64_t fails - */ - optional<int64_t> GetLong(const std::string &key) const; - - /** - * @brief returns optional double value identified by the key in ConfigMap. - * Get(key) is called to get the string value which is then converted to - * double using boost::lexical_cast. - * @param key Key whose value is to be fetched. - * @throws std::runtime_error if conversion to double fails - */ - optional<double> GetDouble(const std::string &key) const; - - /** - * @brief returns optional bool for a property identified by key in ConfigMap. - * Get(key) is called to get the string value which is then converted to bool - * by checking the validity. - * @param key Key whose value is to be fetched. Get(key) is called to get the - * string value which is then converted to bool. - * @throws std::runtime_error if conversion to bool fails - */ - optional<bool> GetBool(const std::string &key) const; - - /** - * @brief This method will perform any variable expansion if present. - * @param expression expression string to perform substitutions on. - * @throws std::runtime_error if MAX_SUBSTS is exhausted and any more - * substitutions are reqd to be performed. - */ - std::string SubstituteVars(const std::string &expr) const; - - /** - * @brief This method will check if variable expansion has to be performed or - * not. Expression will be checked for presence of "${" and "}" to perform - * variable expansion. - * @param expr Expression on which will be checked for validity. - * @param sub_variable Extracted variable from expr which will be checked - * against environment value or ConfigMap values. - */ - size_t IsSubVariable(const std::string &expr, std::string &sub_variable) const; - - /** - * @brief This method will fetch value for key from environment if present. - * @param key key to be fetched from environment. - */ - optional<std::string> GetEnv(const std::string &key) const; - - /** - * @brief This method will fetch value for key from ConfigMap if present. - * @param key key to be fetched from environment. - */ - optional<std::string> GetProperty(const std::string &key) const; -}; -} /* namespace hbase */ http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/connection-configuration.h ---------------------------------------------------------------------- diff --git a/hbase-native-client/core/connection-configuration.h b/hbase-native-client/core/connection-configuration.h deleted file mode 100644 index 995798e..0000000 --- a/hbase-native-client/core/connection-configuration.h +++ /dev/null @@ -1,207 +0,0 @@ -/* - * 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. - * - */ - -#pragma once - -#include <chrono> -#include <climits> -#include <string> - -#include "core/configuration.h" - -namespace hbase { - -/** - * Timeout configs. - */ -class ConnectionConfiguration { - public: - explicit ConnectionConfiguration(const Configuration& conf) { - connect_timeout_ = - ToNanos(conf.GetInt(kClientSocketConnectTimeout, kDefaultClientSocketConnectTimeout)); - meta_operation_timeout_ = - ToNanos(conf.GetLong(kClientMetaOperationTimeout, kDefaultClientOperationTimeout)); - operation_timeout_ = - ToNanos(conf.GetLong(kClientOperationTimeout, kDefaultClientOperationTimeout)); - rpc_timeout_ = ToNanos(conf.GetLong(kRpcTimeout, kDefaultRpcTimeout)); - read_rpc_timeout_ = ToNanos(conf.GetLong(kRpcReadTimeout, ToMillis(rpc_timeout_))); - write_rpc_timeout_ = ToNanos(conf.GetLong(kRpcWriteTimeout, ToMillis(rpc_timeout_))); - pause_ = ToNanos(conf.GetLong(kClientPause, kDefaultClientPause)); - max_retries_ = conf.GetInt(kClientRetriesNumber, kDefaultClientRetriesNumber); - start_log_errors_count_ = - conf.GetInt(kStartLogErrorsAfterCount, kDefaultStartLogErrorsAfterCount); - scan_timeout_ = - ToNanos(conf.GetLong(kClientScannerTimeoutPeriod, kDefaultClientScannerTimeoutPeriod)); - scanner_caching_ = conf.GetInt(kClientScannerCaching, kDefaultClientScannerCaching); - scanner_max_result_size_ = - conf.GetLong(kClientScannerMaxResultsSize, kDefaultClientScannerMaxResultsSize); - } - - // Used by tests - ConnectionConfiguration(std::chrono::nanoseconds connect_timeout, - std::chrono::nanoseconds operation_timeout, - std::chrono::nanoseconds rpc_timeout, std::chrono::nanoseconds pause, - uint32_t max_retries, uint32_t start_log_errors_count) - : connect_timeout_(connect_timeout), - operation_timeout_(operation_timeout), - meta_operation_timeout_(operation_timeout), - rpc_timeout_(rpc_timeout), - read_rpc_timeout_(rpc_timeout), - write_rpc_timeout_(rpc_timeout), - pause_(pause), - max_retries_(max_retries), - start_log_errors_count_(start_log_errors_count) {} - - std::chrono::nanoseconds connect_timeout() const { return connect_timeout_; } - - std::chrono::nanoseconds meta_operation_timeout() const { return meta_operation_timeout_; } - - // timeout for a whole operation such as get, put or delete. Notice that scan will not be effected - // by this value, see scanTimeoutNs. - std::chrono::nanoseconds operation_timeout() const { return operation_timeout_; } - - // timeout for each rpc request. Can be overridden by a more specific config, such as - // readRpcTimeout or writeRpcTimeout. - std::chrono::nanoseconds rpc_timeout() const { return rpc_timeout_; } - - // timeout for each read rpc request - std::chrono::nanoseconds read_rpc_timeout() const { return read_rpc_timeout_; } - - // timeout for each write rpc request - std::chrono::nanoseconds write_rpc_timeout() const { return write_rpc_timeout_; } - - std::chrono::nanoseconds pause() const { return pause_; } - - uint32_t max_retries() const { return max_retries_; } - - /** How many retries are allowed before we start to log */ - uint32_t start_log_errors_count() const { return start_log_errors_count_; } - - // The scan timeout is used as operation timeout for every - // operations in a scan, such as openScanner or next. - std::chrono::nanoseconds scan_timeout() const { return scan_timeout_; } - - uint32_t scanner_caching() const { return scanner_caching_; } - - uint64_t scanner_max_result_size() const { return scanner_max_result_size_; } - - private: - /** Parameter name for HBase client CPU thread pool size. Defaults to (2 * num cpus) */ - static constexpr const char* kClientSocketConnectTimeout = - "hbase.ipc.client.socket.timeout.connect"; - /** Parameter name for HBase client CPU thread pool size. Defaults to (2 * num cpus) */ - static constexpr const uint32_t kDefaultClientSocketConnectTimeout = 10000; // 10 secs - - /** Parameter name for HBase client operation timeout. */ - static constexpr const char* kClientOperationTimeout = "hbase.client.operation.timeout"; - - /** Parameter name for HBase client meta operation timeout. */ - static constexpr const char* kClientMetaOperationTimeout = "hbase.client.meta.operation.timeout"; - - /** Default HBase client operation timeout, which is tantamount to a blocking call */ - static constexpr const uint32_t kDefaultClientOperationTimeout = 1200000; - - /** timeout for each RPC */ - static constexpr const char* kRpcTimeout = "hbase.rpc.timeout"; - - /** timeout for each read RPC */ - static constexpr const char* kRpcReadTimeout = "hbase.rpc.read.timeout"; - - /** timeout for each write RPC */ - static constexpr const char* kRpcWriteTimeout = "hbase.rpc.write.timeout"; - - static constexpr const uint32_t kDefaultRpcTimeout = 60000; - - /** - * Parameter name for client pause value, used mostly as value to wait - * before running a retry of a failed get, region lookup, etc. - */ - static constexpr const char* kClientPause = "hbase.client.pause"; - - static constexpr const uint64_t kDefaultClientPause = 100; - - /** - * Parameter name for maximum retries, used as maximum for all retryable - * operations such as fetching of the root region from root region server, - * getting a cell's value, starting a row update, etc. - */ - static constexpr const char* kClientRetriesNumber = "hbase.client.retries.number"; - - static constexpr const uint32_t kDefaultClientRetriesNumber = 35; - - /** - * Configure the number of failures after which the client will start logging. A few failures - * is fine: region moved, then is not opened, then is overloaded. We try to have an acceptable - * heuristic for the number of errors we don't log. 9 was chosen because we wait for 1s at - * this stage. - */ - static constexpr const char* kStartLogErrorsAfterCount = "hbase.client.start.log.errors.counter"; - static constexpr const uint32_t kDefaultStartLogErrorsAfterCount = 9; - - /** The client scanner timeout period in milliseconds. */ - static constexpr const char* kClientScannerTimeoutPeriod = "hbase.client.scanner.timeout.period"; - - static constexpr const uint32_t kDefaultClientScannerTimeoutPeriod = 60000; - - /** - * Parameter name to set the default scanner caching for all clients. - */ - static constexpr const char* kClientScannerCaching = "hbase.client.scanner.caching"; - - static constexpr const uint32_t kDefaultClientScannerCaching = INT_MAX; - - /** - * Parameter name for maximum number of bytes returned when calling a scanner's next method. - * Controlled by the client. - */ - static constexpr const char* kClientScannerMaxResultsSize = - "hbase.client.scanner.max.result.size"; - - /** - * Maximum number of bytes returned when calling a scanner's next method. - * Note that when a single row is larger than this limit the row is still - * returned completely. - * - * The default value is 2MB. - */ - static constexpr const uint64_t kDefaultClientScannerMaxResultsSize = 2 * 1024 * 1024; - - std::chrono::nanoseconds connect_timeout_; - std::chrono::nanoseconds meta_operation_timeout_; - std::chrono::nanoseconds operation_timeout_; - std::chrono::nanoseconds rpc_timeout_; - std::chrono::nanoseconds read_rpc_timeout_; - std::chrono::nanoseconds write_rpc_timeout_; - std::chrono::nanoseconds pause_; - uint32_t max_retries_; - uint32_t start_log_errors_count_; - std::chrono::nanoseconds scan_timeout_; - uint32_t scanner_caching_; - uint64_t scanner_max_result_size_; - - static std::chrono::nanoseconds ToNanos(const uint64_t& millis) { - return std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::milliseconds(millis)); - } - - static uint64_t ToMillis(const std::chrono::nanoseconds& nanos) { - return std::chrono::duration_cast<std::chrono::milliseconds>(nanos).count(); - } -}; - -} // namespace hbase http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/delete-test.cc ---------------------------------------------------------------------- diff --git a/hbase-native-client/core/delete-test.cc b/hbase-native-client/core/delete-test.cc deleted file mode 100644 index ec1e3a9..0000000 --- a/hbase-native-client/core/delete-test.cc +++ /dev/null @@ -1,124 +0,0 @@ -/* - * 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 <glog/logging.h> -#include <gtest/gtest.h> - -#include "core/delete.h" -#include "core/mutation.h" -#include "utils/time-util.h" - -using hbase::Delete; -using hbase::Cell; -using hbase::CellType; -using hbase::Mutation; -using hbase::TimeUtil; - -const constexpr int64_t Mutation::kLatestTimestamp; - -TEST(Delete, Row) { - Delete del{"foo"}; - EXPECT_EQ("foo", del.row()); -} - -TEST(Delete, Timestamp) { - Delete del{"row"}; - - // test default timestamp - EXPECT_EQ(Mutation::kLatestTimestamp, del.TimeStamp()); - - // set custom timestamp - auto ts = TimeUtil::ToMillis(TimeUtil::GetNowNanos()); - del.SetTimeStamp(ts); - EXPECT_EQ(ts, del.TimeStamp()); - - // Add a column with custom timestamp - del.AddColumn("f", "q"); - auto &cell = del.FamilyMap().at("f")[0]; - EXPECT_EQ(ts, cell->Timestamp()); -} - -TEST(Delete, HasFamilies) { - Delete del{"row"}; - - EXPECT_EQ(false, del.HasFamilies()); - - del.AddColumn("f", "q"); - EXPECT_EQ(true, del.HasFamilies()); -} - -TEST(Delete, Add) { - CellType cell_type = CellType::DELETE; - std::string row = "row"; - std::string family = "family"; - std::string column = "column"; - int64_t timestamp = std::numeric_limits<int64_t>::max(); - auto cell = std::make_unique<Cell>(row, family, column, timestamp, "", cell_type); - - // add first cell - Delete del{"row"}; - del.Add(std::move(cell)); - EXPECT_EQ(1, del.FamilyMap().size()); - EXPECT_EQ(1, del.FamilyMap().at(family).size()); - - // add a non-matching row - auto cell2 = std::make_unique<Cell>(row, family, column, timestamp, "", cell_type); - Delete del2{"foo"}; - ASSERT_THROW(del2.Add(std::move(cell2)), std::runtime_error); // rows don't match - - // add a second cell with same family - auto cell3 = std::make_unique<Cell>(row, family, "column-2", timestamp, "", cell_type); - del.Add(std::move(cell3)); - EXPECT_EQ(1, del.FamilyMap().size()); - EXPECT_EQ(2, del.FamilyMap().at(family).size()); - - // add a cell to a different family - auto cell4 = std::make_unique<Cell>(row, "family-2", "column-2", timestamp, "", cell_type); - del.Add(std::move(cell4)); - EXPECT_EQ(2, del.FamilyMap().size()); - EXPECT_EQ(1, del.FamilyMap().at("family-2").size()); -} - -TEST(Delete, AddColumn) { - std::string row = "row"; - std::string family = "family"; - std::string column = "column"; - - Delete del{"row"}; - del.AddColumn(family, column); - EXPECT_EQ(1, del.FamilyMap().size()); - EXPECT_EQ(1, del.FamilyMap().at(family).size()); - - // add a second cell with same family - del.AddColumn(family, "column-2"); - EXPECT_EQ(1, del.FamilyMap().size()); - EXPECT_EQ(2, del.FamilyMap().at(family).size()); - - // add a cell to a different family - del.AddColumn("family-2", column); - EXPECT_EQ(2, del.FamilyMap().size()); - EXPECT_EQ(1, del.FamilyMap().at("family-2").size()); - - // use the AddColumn overload - auto ts = TimeUtil::ToMillis(TimeUtil::GetNowNanos()); - del.AddColumn(family, column, ts); - EXPECT_EQ(2, del.FamilyMap().size()); - EXPECT_EQ(3, del.FamilyMap().at(family).size()); - auto &cell = del.FamilyMap().at(family)[2]; - EXPECT_EQ(ts, cell->Timestamp()); -} http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/delete.cc ---------------------------------------------------------------------- diff --git a/hbase-native-client/core/delete.cc b/hbase-native-client/core/delete.cc deleted file mode 100644 index 5f48782..0000000 --- a/hbase-native-client/core/delete.cc +++ /dev/null @@ -1,131 +0,0 @@ - - -/* - * 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 "core/delete.h" -#include <folly/Conv.h> -#include <algorithm> -#include <limits> -#include <stdexcept> -#include <utility> - -namespace hbase { - -/** - * @brief Add the specified column to this Delete operation. - * This is an expensive call in that on the server-side, it first does a - * get to find the latest versions timestamp. Then it adds a delete using - * the fetched cells timestamp. - * @param family family name - * @param qualifier column qualifier - */ -Delete& Delete::AddColumn(const std::string& family, const std::string& qualifier) { - return AddColumn(family, qualifier, timestamp_); -} - -/** - * @brief Add the specified column to this Delete operation. - * @param family family name - * @param qualifier column qualifier - * @param timestamp version timestamp - */ -Delete& Delete::AddColumn(const std::string& family, const std::string& qualifier, - int64_t timestamp) { - if (timestamp < 0) { - throw std::runtime_error("Timestamp cannot be negative. ts=" + - folly::to<std::string>(timestamp)); - } - - return Add( - std::make_unique<Cell>(row_, family, qualifier, timestamp, "", hbase::CellType::DELETE)); -} -/** - * Delete all versions of the specified column. - * @param family family name - * @param qualifier column qualifier - */ -Delete& Delete::AddColumns(const std::string& family, const std::string& qualifier) { - return AddColumns(family, qualifier, timestamp_); -} -/** - * Delete all versions of the specified column with a timestamp less than - * or equal to the specified timestamp. - * @param family family name - * @param qualifier column qualifier - * @param timestamp maximum version timestamp - */ -Delete& Delete::AddColumns(const std::string& family, const std::string& qualifier, - int64_t timestamp) { - if (timestamp < 0) { - throw std::runtime_error("Timestamp cannot be negative. ts=" + - folly::to<std::string>(timestamp)); - } - - return Add(std::make_unique<Cell>(row_, family, qualifier, timestamp, "", - hbase::CellType::DELETE_COLUMN)); -} -/** - * Delete all versions of all columns of the specified family. - * <p> - * Overrides previous calls to deleteColumn and deleteColumns for the - * specified family. - * @param family family name - */ -Delete& Delete::AddFamily(const std::string& family) { return AddFamily(family, timestamp_); } - -/** - * Delete all columns of the specified family with a timestamp less than - * or equal to the specified timestamp. - * <p> - * Overrides previous calls to deleteColumn and deleteColumns for the - * specified family. - * @param family family name - * @param timestamp maximum version timestamp - */ -Delete& Delete::AddFamily(const std::string& family, int64_t timestamp) { - const auto& it = family_map_.find(family); - if (family_map_.end() != it) { - it->second.clear(); - } else { - family_map_[family]; - } - return Add( - std::make_unique<Cell>(row_, family, "", timestamp, "", hbase::CellType::DELETE_FAMILY)); -} -/** - * Delete all columns of the specified family with a timestamp equal to - * the specified timestamp. - * @param family family name - * @param timestamp version timestamp - */ -Delete& Delete::AddFamilyVersion(const std::string& family, int64_t timestamp) { - return Add(std::make_unique<Cell>(row_, family, "", timestamp, "", - hbase::CellType::DELETE_FAMILY_VERSION)); -} -Delete& Delete::Add(std::unique_ptr<Cell> cell) { - if (cell->Row() != row_) { - throw std::runtime_error("The row in " + cell->DebugString() + - " doesn't match the original one " + row_); - } - - family_map_[cell->Family()].push_back(std::move(cell)); - return *this; -} -} // namespace hbase http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/delete.h ---------------------------------------------------------------------- diff --git a/hbase-native-client/core/delete.h b/hbase-native-client/core/delete.h deleted file mode 100644 index 9ebb5a6..0000000 --- a/hbase-native-client/core/delete.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - * 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. - * - */ - -#pragma once - -#include <cstdint> -#include <map> -#include <memory> -#include <string> -#include <vector> -#include "core/cell.h" -#include "core/mutation.h" - -namespace hbase { - -class Delete : public Mutation { - public: - /** - * Constructors - */ - /* - * If no further operations are done, this will delete everything - * associated with the specified row (all versions of all columns in all - * families), with timestamp from current point in time to the past. - * Cells defining timestamp for a future point in time - * (timestamp > current time) will not be deleted. - */ - explicit Delete(const std::string& row) : Mutation(row) {} - - Delete(const std::string& row, int64_t timestamp) : Mutation(row, timestamp) {} - Delete(const Delete& cdelete) : Mutation(cdelete) {} - Delete& operator=(const Delete& cdelete) { - Mutation::operator=(cdelete); - return *this; - } - - ~Delete() = default; - - /** - * @brief Add the specified column to this Delete operation. - * @param family family name - * @param qualifier column qualifier - */ - Delete& AddColumn(const std::string& family, const std::string& qualifier); - - /** - * @brief Add the specified column to this Delete operation. - * @param family family name - * @param qualifier column qualifier - * @param timestamp version timestamp - */ - Delete& AddColumn(const std::string& family, const std::string& qualifier, int64_t timestamp); - - /** - * @brief Deletes all versions of the specified column - * @param family family name - * @param qualifier column qualifier - */ - Delete& AddColumns(const std::string& family, const std::string& qualifier); - /** - * @brief Deletes all versions of the specified column with a timestamp less than - * or equal to the specified timestamp - * @param family family name - * @param qualifier column qualifier - * @param timestamp version timestamp - */ - Delete& AddColumns(const std::string& family, const std::string& qualifier, int64_t timestamp); - /** - * @brief Add the specified family to this Delete operation. - * @param family family name - */ - Delete& AddFamily(const std::string& family); - - /** - * @brief Deletes all columns of the specified family with a timestamp less than - * or equal to the specified timestamp - * @param family family name - * @param timestamp version timestamp - */ - Delete& AddFamily(const std::string& family, int64_t timestamp); - /** - * @brief Deletes all columns of the specified family with a timestamp - * equal to the specified timestamp - * @param family family name - * @param timestamp version timestamp - */ - Delete& AddFamilyVersion(const std::string& family, int64_t timestamp); - /** - * Advanced use only. - * Add an existing delete marker to this Delete object. - */ - Delete& Add(std::unique_ptr<Cell> cell); -}; - -} // namespace hbase http://git-wip-us.apache.org/repos/asf/hbase/blob/128fc306/hbase-native-client/core/filter-test.cc ---------------------------------------------------------------------- diff --git a/hbase-native-client/core/filter-test.cc b/hbase-native-client/core/filter-test.cc deleted file mode 100644 index 7276dfb..0000000 --- a/hbase-native-client/core/filter-test.cc +++ /dev/null @@ -1,141 +0,0 @@ -/* - * 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 <gtest/gtest.h> -#include "core/client.h" -#include "core/configuration.h" -#include "core/get.h" -#include "core/put.h" -#include "core/result.h" -#include "core/table.h" -#include "if/Comparator.pb.h" -#include "if/HBase.pb.h" -#include "serde/table-name.h" -#include "test-util/test-util.h" - -using hbase::Configuration; -using hbase::Get; -using hbase::Put; -using hbase::FilterFactory; -using hbase::Table; -using hbase::TestUtil; -using hbase::pb::CompareType; -using hbase::ComparatorFactory; -using hbase::Comparator; - -class FilterTest : public ::testing::Test { - protected: - static void SetUpTestCase() { - test_util_ = std::make_unique<TestUtil>(); - test_util_->StartMiniCluster(2); - } - - static void TearDownTestCase() { test_util_.release(); } - - virtual void SetUp() {} - virtual void TearDown() {} - - static std::unique_ptr<TestUtil> test_util_; -}; - -std::unique_ptr<TestUtil> FilterTest::test_util_ = nullptr; - -TEST_F(FilterTest, GetWithColumnPrefixFilter) { - // write row1 with 3 columns (column_1, column_2, and foo_column) - FilterTest::test_util_->CreateTable("t", "d"); - - // Create TableName and Row to be fetched from HBase - auto tn = folly::to<hbase::pb::TableName>("t"); - auto row = "row1"; - - // Gets to be performed on above HBase Table - Get get_all(row); // expected to return all 3 columns - Get get_one(row); // expected to return 1 column - Get get_two(row); // expected to return 2 column - - get_one.SetFilter(FilterFactory::ColumnPrefixFilter("foo_")); - get_two.SetFilter(FilterFactory::ColumnPrefixFilter("column_")); - - // Create a client - hbase::Client client(*(FilterTest::test_util_->conf())); - auto table = client.Table(tn); - - table->Put(Put{"row1"}.AddColumn("d", "column_1", "value1")); - table->Put(Put{"row1"}.AddColumn("d", "column_2", "value2")); - table->Put(Put{"row1"}.AddColumn("d", "foo_column", "value3")); - - // Perform the Get - auto result_all = table->Get(get_all); - auto result_one = table->Get(get_one); - auto result_two = table->Get(get_two); - - table->Close(); - client.Close(); - - // Test the values - ASSERT_TRUE(!result_one->IsEmpty()) << "Result shouldn't be empty."; - ASSERT_TRUE(!result_two->IsEmpty()) << "Result shouldn't be empty."; - ASSERT_TRUE(!result_all->IsEmpty()) << "Result shouldn't be empty."; - EXPECT_EQ(row, result_one->Row()); - EXPECT_EQ(row, result_two->Row()); - EXPECT_EQ(row, result_all->Row()); - EXPECT_EQ(1, result_one->Size()); - EXPECT_EQ(2, result_two->Size()); - EXPECT_EQ(3, result_all->Size()); - EXPECT_EQ("value3", *(result_one->Value("d", "foo_column"))); - EXPECT_EQ("value1", *(result_two->Value("d", "column_1"))); - EXPECT_EQ("value2", *(result_two->Value("d", "column_2"))); -} - -TEST_F(FilterTest, GetWithQualifierFilter) { - // write row1 with 3 columns (a,b,c) - FilterTest::test_util_->CreateTable("t1", "d"); - - // Create TableName and Row to be fetched from HBase - auto tn = folly::to<hbase::pb::TableName>("t1"); - auto row = "row1"; - - // Gets to be performed on above HBase Table - Get get(row); - get.SetFilter(FilterFactory::QualifierFilter(CompareType::GREATER_OR_EQUAL, - *ComparatorFactory::BinaryComparator("b"))); - - // Create a client - hbase::Client client(*(FilterTest::test_util_->conf())); - - // Get connection to HBase Table - auto table = client.Table(tn); - - table->Put(Put{"row1"}.AddColumn("d", "a", "value1")); - table->Put(Put{"row1"}.AddColumn("d", "b", "value2")); - table->Put(Put{"row1"}.AddColumn("d", "c", "value3")); - - // Perform the Get - auto result = table->Get(get); - - table->Close(); - client.Close(); - - // Test the values - ASSERT_TRUE(!result->IsEmpty()) << "Result shouldn't be empty."; - EXPECT_EQ(row, result->Row()); - EXPECT_EQ(2, result->Size()); - EXPECT_EQ("value2", *(result->Value("d", "b"))); - EXPECT_EQ("value3", *(result->Value("d", "c"))); -}