[Groonga-commit] groonga/grnxx at aa0c8de [master] Remove OrderSet and rename Order to SortOrder. (#18)

Back to archive index

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����������������������������...
下載 



More information about the Groonga-commit mailing list
Back to archive index