susumu.yata
null+****@clear*****
Thu Aug 7 16:38:30 JST 2014
susumu.yata 2014-08-07 16:38:30 +0900 (Thu, 07 Aug 2014) New Revision: aa0c8de45a919ed4cfcae70793bba7900e4fe878 https://github.com/groonga/grnxx/commit/aa0c8de45a919ed4cfcae70793bba7900e4fe878 Message: Remove OrderSet and rename Order to SortOrder. (#18) SortOrder is defined in sorter.hpp. Removed files: include/grnxx/order.hpp lib/grnxx/order.cpp Modified files: include/grnxx/Makefile.am include/grnxx/sorter.hpp lib/grnxx/Makefile.am lib/grnxx/sorter.cpp lib/grnxx/types.cpp test/test_grnxx.cpp Modified: include/grnxx/Makefile.am (+0 -1) =================================================================== --- include/grnxx/Makefile.am 2014-08-07 13:55:09 +0900 (0d46479) +++ include/grnxx/Makefile.am 2014-08-07 16:38:30 +0900 (b8591d0) @@ -8,7 +8,6 @@ pkginclude_HEADERS = \ expression.hpp \ index.hpp \ library.hpp \ - order.hpp \ record.hpp \ sorter.hpp \ table.hpp \ Deleted: include/grnxx/order.hpp (+0 -102) 100644 =================================================================== --- include/grnxx/order.hpp 2014-08-07 13:55:09 +0900 (742dceb) +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef GRNXX_ORDER_HPP -#define GRNXX_ORDER_HPP - -#include "grnxx/array.hpp" -#include "grnxx/types.hpp" - -namespace grnxx { - -// TODO: 無駄に複雑になっているので,単純化したい. - -struct Order { - unique_ptr<Expression> expression; - OrderType type; - - Order() = default; - Order(unique_ptr<Expression> &&expression, OrderType type) - : expression(std::move(expression)), - type(type) {} -}; - -class OrderSet { - public: - ~OrderSet(); - - // Return the number of sort conditions. - Int size() const { - return static_cast<Int>(orders_.size()); - } - - // Return the "i"-th sort condition. - // - // If "i" is invalid, the result is undefined. - Order &get(Int i) { - return orders_[i]; - } - - private: - Array<Order> orders_; - - OrderSet(); - - // Append a sort condition. - // - // On success, returns true. - // On failure, returns false and stores error information into "*error" if - // "error" != nullptr. - bool append(Error *error, Order &&order); - - friend OrderSetBuilder; -}; - -class OrderSetBuilder { - public: - // Create an object for building order sets. - // - // On success, returns a poitner to the builder. - // On failure, returns nullptr and stores error information into "*error" if - // "error" != nullptr. - static unique_ptr<OrderSetBuilder> create(Error *error, const Table *table); - - ~OrderSetBuilder(); - - // Return the associated table. - const Table *table() const { - return table_; - } - - // Append a sort condition. - // - // The sort condition is added as the last sort condition. - // Sort conditions must be appended in order of priority. - // "_id" is useful to perform stable sorting. - // - // On success, returns true. - // On failure, returns false and stores error information into "*error" if - // "error" != nullptr. - bool append(Error *error, - unique_ptr<Expression> &&expression, - OrderType type = REGULAR_ORDER); - - // Clear the building order set. - void clear(); - - // Complete building an order set and clear the builder. - // - // Fails if the order set is empty. - // - // On success, returns a poitner to the order set. - // On failure, returns nullptr and stores error information into "*error" if - // "error" != nullptr. - unique_ptr<OrderSet> release(Error *error); - - private: - const Table *table_; - Array<Order> orders_; - - OrderSetBuilder(); -}; - -} // namespace grnxx - -#endif // GRNXX_ORDER_HPP Modified: include/grnxx/sorter.hpp (+13 -1) =================================================================== --- include/grnxx/sorter.hpp 2014-08-07 13:55:09 +0900 (10e1d60) +++ include/grnxx/sorter.hpp 2014-08-07 16:38:30 +0900 (420d378) @@ -1,10 +1,22 @@ #ifndef GRNXX_SORTER_HPP #define GRNXX_SORTER_HPP +#include "grnxx/array.hpp" #include "grnxx/types.hpp" namespace grnxx { +struct SortOrder { + unique_ptr<Expression> expression; + OrderType type; + + SortOrder(); + explicit SortOrder(unique_ptr<Expression> &&expression, + OrderType type = REGULAR_ORDER); + SortOrder(SortOrder &&order); + ~SortOrder(); +}; + class Sorter { public: ~Sorter(); @@ -16,7 +28,7 @@ class Sorter { // "error" != nullptr. static unique_ptr<Sorter> create( Error *error, - unique_ptr<OrderSet> &&order_set, + Array<SortOrder> &&orders, const SorterOptions &options = SorterOptions()); // Set the target record set. Modified: lib/grnxx/Makefile.am (+0 -1) =================================================================== --- lib/grnxx/Makefile.am 2014-08-07 13:55:09 +0900 (6834d74) +++ lib/grnxx/Makefile.am 2014-08-07 16:38:30 +0900 (f967a52) @@ -18,7 +18,6 @@ libgrnxx_la_SOURCES = \ index.cpp \ library.cpp \ name.cpp \ - order.cpp \ record.cpp \ sorter.cpp \ table.cpp \ Deleted: lib/grnxx/order.cpp (+0 -58) 100644 =================================================================== --- lib/grnxx/order.cpp 2014-08-07 13:55:09 +0900 (db000e2) +++ /dev/null @@ -1,58 +0,0 @@ -#include "grnxx/order.hpp" - -#include "grnxx/error.hpp" -#include "grnxx/expression.hpp" - -namespace grnxx { - -OrderSet::~OrderSet() {} - -OrderSet::OrderSet() : orders_() {} - -bool OrderSet::append(Error *error, Order &&order) { - return orders_.push_back(error, std::move(order)); -} - -unique_ptr<OrderSetBuilder> OrderSetBuilder::create(Error *error, - const Table *table) { - unique_ptr<OrderSetBuilder> builder(new (nothrow) OrderSetBuilder); - if (!builder) { - GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed"); - return nullptr; - } - builder->table_ = table; - return builder; -} - -OrderSetBuilder::~OrderSetBuilder() {} - -bool OrderSetBuilder::append(Error *error, - unique_ptr<Expression> &&expression, - OrderType type) { - return orders_.push_back(error, Order(std::move(expression), type)); -} - -void OrderSetBuilder::clear() { - orders_.clear(); -} - -unique_ptr<OrderSet> OrderSetBuilder::release(Error *error) { - unique_ptr<OrderSet> order_set(new (nothrow) OrderSet); - if (!order_set) { - GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed"); - return nullptr; - } - // TODO: The current status should not be broken on failure. - for (size_t i = 0; i < orders_.size(); ++i) { - if (!order_set->append(error, std::move(orders_[i]))) { - orders_.clear(); - return nullptr; - } - } - orders_.clear(); - return order_set; -} - -OrderSetBuilder::OrderSetBuilder() : table_(nullptr), orders_() {}; - -} // namespace grnxx Modified: lib/grnxx/sorter.cpp (+42 -11) =================================================================== --- lib/grnxx/sorter.cpp 2014-08-07 13:55:09 +0900 (cfe2c30) +++ lib/grnxx/sorter.cpp 2014-08-07 16:38:30 +0900 (6b6435e) @@ -4,14 +4,25 @@ #include "grnxx/error.hpp" #include "grnxx/expression.hpp" -#include "grnxx/order.hpp" #include "grnxx/record.hpp" namespace grnxx { +SortOrder::SortOrder() : expression(), type(REGULAR_ORDER) {} + +SortOrder::SortOrder(SortOrder &&order) + : expression(std::move(order.expression)), + type(order.type) {} + +SortOrder::SortOrder(unique_ptr<Expression> &&expression, OrderType type) + : expression(std::move(expression)), + type(type) {} + +SortOrder::~SortOrder() {} + class SorterNode { public: - static unique_ptr<SorterNode> create(Error *error, Order &&order); + static unique_ptr<SorterNode> create(Error *error, SortOrder &&order); SorterNode() : next_(), error_(nullptr) {} virtual ~SorterNode() {} @@ -91,7 +102,7 @@ class Node : public SorterNode { using PriorTo = T; using Value = typename PriorTo::Value; - explicit Node(Order &&order) + explicit Node(SortOrder &&order) : SorterNode(), order_(std::move(order)), values_(), @@ -101,7 +112,7 @@ class Node : public SorterNode { bool sort(Error *error, RecordSubset records, Int begin, Int end); private: - Order order_; + SortOrder order_; Array<Value> values_; PriorTo prior_to_; @@ -347,7 +358,7 @@ class BoolNode : public SorterNode { public: using IsPrior = T; - explicit BoolNode(Order &&order) + explicit BoolNode(SortOrder &&order) : SorterNode(), order_(std::move(order)), values_(), @@ -357,7 +368,7 @@ class BoolNode : public SorterNode { bool sort(Error *error, RecordSubset records, Int begin, Int end); private: - Order order_; + SortOrder order_; Array<Bool> values_; IsPrior is_prior_; }; @@ -412,7 +423,7 @@ bool BoolNode<T>::sort(Error *error, RecordSubset records, } // namespace -unique_ptr<SorterNode> SorterNode::create(Error *error, Order &&order) { +unique_ptr<SorterNode> SorterNode::create(Error *error, SortOrder &&order) { unique_ptr<SorterNode> node; switch (order.expression->data_type()) { case BOOL_DATA: { @@ -490,8 +501,28 @@ Sorter::~Sorter() {} unique_ptr<Sorter> Sorter::create( Error *error, - unique_ptr<OrderSet> &&order_set, + Array<SortOrder> &&orders, const SorterOptions &options) { + // Sorting require at least one sort order. + // Also, expressions must be valid and associated tables must be same. + if (orders.size() == 0) { + GRNXX_ERROR_SET(error, INVALID_ARGUMENT, "Empty sort order"); + return nullptr; + } + for (Int i = 0; i < orders.size(); ++i) { + if (!orders[i].expression) { + GRNXX_ERROR_SET(error, INVALID_ARGUMENT, "Empty sort order"); + return nullptr; + } + } + const Table *table = orders[0].expression->table(); + for (Int i = 1; i < orders.size(); ++i) { + if (orders[i].expression->table() != table) { + GRNXX_ERROR_SET(error, INVALID_ARGUMENT, "Table conflict"); + return nullptr; + } + } + if ((options.offset < 0) || (options.limit < 0)) { GRNXX_ERROR_SET(error, INVALID_ARGUMENT, "Invalid argument"); return nullptr; @@ -501,16 +532,16 @@ unique_ptr<Sorter> Sorter::create( GRNXX_ERROR_SET(error, NO_MEMORY, "Memory allocation failed"); return nullptr; } - for (Int i = order_set->size() - 1; i >= 0; --i) { + for (Int i = orders.size() - 1; i >= 0; --i) { unique_ptr<SorterNode> node( - SorterNode::create(error, std::move(order_set->get(i)))); + SorterNode::create(error, std::move(orders[i]))); if (!node) { return nullptr; } node->set_next(std::move(sorter->head_)); sorter->head_ = std::move(node); } - order_set.reset(); + orders.clear(); sorter->offset_ = options.offset; sorter->limit_ = options.limit; return sorter; Modified: lib/grnxx/types.cpp (+2 -0) =================================================================== --- lib/grnxx/types.cpp 2014-08-07 13:55:09 +0900 (1e246df) +++ lib/grnxx/types.cpp 2014-08-07 16:38:30 +0900 (7ec2757) @@ -1,5 +1,7 @@ #include "grnxx/types.hpp" +#include "grnxx/expression.hpp" + namespace grnxx { void GeoPoint::fix(Int *latitude, Int *longitude) { Modified: test/test_grnxx.cpp (+21 -40) =================================================================== --- test/test_grnxx.cpp 2014-08-07 13:55:09 +0900 (60c4ce8) +++ test/test_grnxx.cpp 2014-08-07 16:38:30 +0900 (e203b44) @@ -25,7 +25,6 @@ #include "grnxx/db.hpp" #include "grnxx/error.hpp" #include "grnxx/expression.hpp" -#include "grnxx/order.hpp" #include "grnxx/record.hpp" #include "grnxx/sorter.hpp" #include "grnxx/table.hpp" @@ -873,26 +872,21 @@ void test_sorter() { assert(record_set.size() == static_cast<grnxx::Int>(int_values.size())); // BoolColumn 昇順,行 ID 昇順に整列する. - auto order_set_builder = - grnxx::OrderSetBuilder::create(&error, table); - assert(order_set_builder); - + grnxx::Array<grnxx::SortOrder> orders; + assert(orders.resize(&error, 2)); auto expression_builder = grnxx::ExpressionBuilder::create(&error, table); assert(expression_builder->push_column(&error, "BoolColumn")); auto expression = expression_builder->release(&error); assert(expression); - assert(order_set_builder->append(&error, std::move(expression))); + orders[0].expression = std::move(expression); assert(expression_builder->push_column(&error, "_id")); expression = expression_builder->release(&error); assert(expression); - assert(order_set_builder->append(&error, std::move(expression))); - - auto order_set = order_set_builder->release(&error); - assert(order_set); + orders[1].expression = std::move(expression); - auto sorter = grnxx::Sorter::create(&error, std::move(order_set)); + auto sorter = grnxx::Sorter::create(&error, std::move(orders)); assert(sorter); assert(sorter->sort(&error, &record_set)); @@ -910,26 +904,21 @@ void test_sorter() { } // BoolColumn 降順,行 ID 降順に整列する. - order_set_builder = grnxx::OrderSetBuilder::create(&error, table); - assert(order_set_builder); - + assert(orders.resize(&error, 2)); expression_builder = grnxx::ExpressionBuilder::create(&error, table); assert(expression_builder->push_column(&error, "BoolColumn")); expression = expression_builder->release(&error); assert(expression); - assert(order_set_builder->append(&error, std::move(expression), - grnxx::REVERSE_ORDER)); + orders[0].expression = std::move(expression); + orders[0].type = grnxx::REVERSE_ORDER; assert(expression_builder->push_column(&error, "_id")); expression = expression_builder->release(&error); assert(expression); - assert(order_set_builder->append(&error, std::move(expression), - grnxx::REVERSE_ORDER)); - - order_set = order_set_builder->release(&error); - assert(order_set); + orders[1].expression = std::move(expression); + orders[1].type = grnxx::REVERSE_ORDER; - sorter = grnxx::Sorter::create(&error, std::move(order_set)); + sorter = grnxx::Sorter::create(&error, std::move(orders)); assert(sorter); assert(sorter->sort(&error, &record_set)); @@ -947,24 +936,18 @@ void test_sorter() { } // IntColumn 昇順,行 ID 昇順に整列する. - order_set_builder = grnxx::OrderSetBuilder::create(&error, table); - assert(order_set_builder); - + assert(orders.resize(&error, 2)); expression_builder = grnxx::ExpressionBuilder::create(&error, table); assert(expression_builder->push_column(&error, "IntColumn")); expression = expression_builder->release(&error); - assert(expression); - assert(order_set_builder->append(&error, std::move(expression))); + orders[0].expression = std::move(expression); assert(expression_builder->push_column(&error, "_id")); expression = expression_builder->release(&error); assert(expression); - assert(order_set_builder->append(&error, std::move(expression))); + orders[1].expression = std::move(expression); - order_set = order_set_builder->release(&error); - assert(order_set); - - sorter = grnxx::Sorter::create(&error, std::move(order_set)); + sorter = grnxx::Sorter::create(&error, std::move(orders)); assert(sorter); assert(sorter->sort(&error, &record_set)); @@ -982,22 +965,20 @@ void test_sorter() { } // IntColumn 降順,行 ID 降順に整列する. + assert(orders.resize(&error, 2)); assert(expression_builder->push_column(&error, "IntColumn")); expression = expression_builder->release(&error); assert(expression); - assert(order_set_builder->append(&error, std::move(expression), - grnxx::REVERSE_ORDER)); + orders[0].expression = std::move(expression); + orders[0].type = grnxx::REVERSE_ORDER; assert(expression_builder->push_column(&error, "_id")); expression = expression_builder->release(&error); assert(expression); - assert(order_set_builder->append(&error, std::move(expression), - grnxx::REVERSE_ORDER)); - - order_set = order_set_builder->release(&error); - assert(order_set); + orders[1].expression = std::move(expression); + orders[1].type = grnxx::REVERSE_ORDER; - sorter = grnxx::Sorter::create(&error, std::move(order_set)); + sorter = grnxx::Sorter::create(&error, std::move(orders)); assert(sorter); assert(sorter->sort(&error, &record_set)); -------------- next part -------------- HTML����������������������������... 下載