[Groonga-commit] groonga/grnxx at e4d306f [master] Add new components.

Back to archive index

susumu.yata null+****@clear*****
Thu Jun 19 10:36:26 JST 2014


susumu.yata	2014-06-19 10:36:26 +0900 (Thu, 19 Jun 2014)

  New Revision: e4d306f1ac31a589c994fc20e79e1353d4957620
  https://github.com/groonga/grnxx/commit/e4d306f1ac31a589c994fc20e79e1353d4957620

  Message:
    Add new components.

  Added files:
    new-interface/adjuster.hpp
    new-interface/filter.hpp
    new-interface/pipeline-builder.hpp
    new-interface/pipeline.hpp
  Modified files:
    new-interface/expression-builder.hpp
    new-interface/sorter-builder.hpp
    new-interface/sorter.hpp

  Added: new-interface/adjuster.hpp (+58 -0) 100644
===================================================================
--- /dev/null
+++ new-interface/adjuster.hpp    2014-06-19 10:36:26 +0900 (e10a221)
@@ -0,0 +1,58 @@
+#ifndef GRNXX_ADJUSTER_HPP
+#define GRNXX_ADJUSTER_HPP
+
+#include "grnxx/types.hpp"
+
+namespace grnxx {
+
+struct AdjusterOptions {
+  AdjusterOptions();
+};
+
+class Adjuster {
+ public:
+  Adjuster();
+  virtual ~Adjuster();
+
+  // スコアの調整器を作成する.
+  // 成功すれば有効なオブジェクトへのポインタを返す.
+  // 失敗したときは *error にその内容を格納し, nullptr を返す.
+  //
+  // 返り値は std::unique_ptr なので自動的に delete される.
+  // 自動で delete されて困るときは release() で生のポインタを取り出す必要がある.
+  //
+  // 新しいスコアは expression により求められる.
+  // 式の構築において _score を指定すれば,古いスコアを入力として使える.
+  //
+  // 失敗する状況としては,以下のようなものが挙げられる.
+  // - 指定された式の評価結果が真偽値ではない.
+  // - オプションが不正である.
+  // - リソースが確保できない.
+  static std::unique_ptr<Adjuster> create(
+      Error *error,
+      std::unique_ptr<Expression> &&expression,
+      const AdjusterOptions &options);
+
+  // レコード一覧のスコアを調整する.
+  // 成功すれば true を返す.
+  // 失敗したときは *error にその内容を格納し, false を返す.
+  //
+  // レコード一覧のスコアを新しいスコアに置き換える.
+  // 新しいスコアをレコード一覧に保存する.
+  //
+  // 有効でない行 ID を渡したときの動作は未定義である.
+  //
+  // 失敗する状況としては,以下のようなものが挙げられる.
+  // - 評価結果をスコアに変換できない.
+  // - 演算において例外が発生する.
+  //  - オーバーフローやアンダーフローが発生する.
+  //  - ゼロによる除算が発生する.
+  //  - NaN が発生する.
+  //   - TODO: これらの取り扱いについては検討の余地がある.
+  virtual bool adjust(Error *error,
+                      RecordSet *record_set) = 0;
+};
+
+}  // namespace grnxx
+
+#endif  // GRNXX_ADJUSTER_HPP

  Modified: new-interface/expression-builder.hpp (+4 -2)
===================================================================
--- new-interface/expression-builder.hpp    2014-06-17 13:19:42 +0900 (b081243)
+++ new-interface/expression-builder.hpp    2014-06-19 10:36:26 +0900 (2fa6dcf)
@@ -52,7 +52,7 @@ class ExpressionBuilder {
   virtual bool push_operator(Error *error, OperatorType operator_type) = 0;
 
   // 保持しているノードやスタックを破棄する.
-  virtual void clear();
+  virtual void clear() = 0;
 
   // 構築中の式を完成させ,その所有権を取得する.
   // 成功すれば有効なオブジェクトへのポインタを返す.
@@ -66,7 +66,9 @@ class ExpressionBuilder {
   //  - 積まれたものが使われずに残っている.
   //   - 式が完成していないことを示す.
   // - リソースを確保できない.
-  virtual std::unique_ptr<Expression> release(Error *error);
+  virtual std::unique_ptr<Expression> release(
+      Error *error,
+      const ExpressionOptions &options) = 0;
 };
 
 }  // namespace grnxx

  Added: new-interface/filter.hpp (+57 -0) 100644
===================================================================
--- /dev/null
+++ new-interface/filter.hpp    2014-06-19 10:36:26 +0900 (9c88919)
@@ -0,0 +1,57 @@
+#ifndef GRNXX_FILTER_HPP
+#define GRNXX_FILTER_HPP
+
+#include "grnxx/types.hpp"
+
+namespace grnxx {
+
+struct FilterOptions {
+  int64_t offset;
+  int64_t limit;
+
+  FilterOptions();
+};
+
+class Filter {
+ public:
+  Filter();
+  virtual ~Filter();
+
+  // フィルタを作成する.
+  // 成功すれば有効なオブジェクトへのポインタを返す.
+  // 失敗したときは *error にその内容を格納し, nullptr を返す.
+  //
+  // 返り値は std::unique_ptr なので自動的に delete される.
+  // 自動で delete されて困るときは release() で生のポインタを取り出す必要がある.
+  //
+  // 失敗する状況としては,以下のようなものが挙げられる.
+  // - 指定された式の評価結果が真偽値ではない.
+  // - オプションが不正である.
+  // - リソースが確保できない.
+  static std::unique_ptr<Filter> create(
+      Error *error,
+      std::unique_ptr<Expression> &&expression,
+      const FilterOptions &options);
+
+  // レコードの一覧をフィルタにかける.
+  // 成功すればフィルタにかけて残ったレコード数を返す.
+  // 失敗したときは *error にその内容を格納し, -1 を返す.
+  //
+  // 評価結果が真になるレコードのみを残し,前方に詰めて隙間をなくす.
+  // フィルタにかける前後で順序関係は維持される.
+  //
+  // 有効でない行 ID を渡したときの動作は未定義である.
+  //
+  // 失敗する状況としては,以下のようなものが挙げられる.
+  // - 演算において例外が発生する.
+  //  - オーバーフローやアンダーフローが発生する.
+  //  - ゼロによる除算が発生する.
+  //  - NaN が発生する.
+  //   - TODO: これらの取り扱いについては検討の余地がある.
+  virtual int64_t filter(Error *error,
+                         RecordSet *record_set) = 0;
+};
+
+}  // namespace grnxx
+
+#endif  // GRNXX_FILTER_HPP

  Added: new-interface/pipeline-builder.hpp (+117 -0) 100644
===================================================================
--- /dev/null
+++ new-interface/pipeline-builder.hpp    2014-06-19 10:36:26 +0900 (914d355)
@@ -0,0 +1,117 @@
+#ifndef GRNXX_PIPELINE_BUILDER_HPP
+#define GRNXX_PIPELINE_BUILDER_HPP
+
+#include "grnxx/types.hpp"
+
+namespace grnxx {
+
+// 後置記法(逆ポーランド記法)に基づいてパイプラインを構築する.
+class PipelineBuilder {
+ public:
+  PipelineBuilder();
+  virtual ~PipelineBuilder();
+
+  // 所属するテーブルを取得する.
+  virtual Table *table() const = 0;
+
+  // カーソルをスタックに積む.
+  // 成功すれば true を返す.
+  // 失敗したときは *error にその内容を格納し, false を返す.
+  //
+  // 失敗する状況としては,以下のようなものが挙げられる.
+  // - 指定されたカーソルが不正である.
+  // - リソースを確保できない.
+  virtual bool push_cursor(Error *error,
+                           std::unique_ptr<Cursor> &&cursor) = 0;
+
+  // 入力をスタックから降ろし,代わりにフィルタを積む.
+  // 成功すれば true を返す.
+  // 失敗したときは *error にその内容を格納し, false を返す.
+  //
+  // 入力はあらかじめスタックに積んでおく必要がある.
+  //
+  // 失敗する状況としては,以下のようなものが挙げられる.
+  // - 指定されたフィルタが不正である.
+  // - 入力が存在しない.
+  // - リソースを確保できない.
+  virtual bool push_filter(Error *error,
+                           std::unique_ptr<Filter> &&filter) = 0;
+
+  // 入力をスタックから降ろし,代わりにスコアの Adjuster を積む.
+  // 成功すれば true を返す.
+  // 失敗したときは *error にその内容を格納し, false を返す.
+  //
+  // 入力はあらかじめスタックに積んでおく必要がある.
+  //
+  // 失敗する状況としては,以下のようなものが挙げられる.
+  // - 指定された Adjuster が不正である.
+  // - 入力が存在しない.
+  // - リソースを確保できない.
+  virtual bool push_adjuster(Error *error,
+                             std::unique_ptr<Adjuster> &&adjuster) = 0;
+
+  // TODO: 将来的な検討案.
+  //
+  // 入力をスタックから降ろし,代わりにスコアの Normalizer を積む.
+  // 成功すれば true を返す.
+  // 失敗したときは *error にその内容を格納し, false を返す.
+  //
+  // 入力はあらかじめスタックに積んでおく必要がある.
+  //
+  // 失敗する状況としては,以下のようなものが挙げられる.
+  // - 指定された Normalizer が不正である.
+  // - 入力が存在しない.
+  // - リソースを確保できない.
+//  virtual bool push_normalizer(Error *error,
+//                               std::unique_ptr<Normalizer> &&normalizer) = 0;
+
+  // 入力をスタックから降ろし,代わりに整列器を積む.
+  // 成功すれば true を返す.
+  // 失敗したときは *error にその内容を格納し, false を返す.
+  //
+  // 入力はあらかじめスタックに積んでおく必要がある.
+  //
+  // 失敗する状況としては,以下のようなものが挙げられる.
+  // - 指定された整列器が不正である.
+  // - 入力が存在しない.
+  // - リソースを確保できない.
+  //
+  // TODO: 将来的な検討案.
+  //       スタックに積まれている入力から preconditions を生成する.
+  virtual bool push_sorter(Error *error,
+                           std::unique_ptr<Sorter> &&sorter) = 0;
+
+  // 二つの入力をスタックから降ろし,代わりに合成器を積む.
+  // 成功すれば true を返す.
+  // 失敗したときは *error にその内容を格納し, false を返す.
+  //
+  // 入力はあらかじめスタックに積んでおく必要がある.
+  //
+  // 失敗する状況としては,以下のようなものが挙げられる.
+  // - 指定された合成器が不正である.
+  // - 入力が存在しない.
+  // - リソースを確保できない.
+  virtual bool push_merger(Error *error,
+                           std::unique_ptr<Merger> &&sorter) = 0;
+
+  // 保持しているノードやスタックを破棄する.
+  virtual void clear() = 0;
+
+  // 構築中のパイプラインを完成させ,その所有権を取得する.
+  // 成功すれば有効なオブジェクトへのポインタを返す.
+  // 失敗したときは *error にその内容を格納し, nullptr を返す.
+  //
+  // 所有権を返すため,保持しているカーソルなどは破棄する.
+  //
+  // 失敗する状況としては,以下のようなものが挙げられる.
+  // - スタックの要素数が一つでない.
+  //  - 何も積まれていない.
+  //  - 積まれたものが使われずに残っている.
+  //   - パイプラインが完成していないことを示す.
+  // - リソースを確保できない.
+  virtual std::unique_ptr<Pipeline> release(Error *error) = 0;
+};
+
+}  // namespace grnxx
+
+#endif  // GRNXX_PIPELINE_BUILDER_HPP

  Added: new-interface/pipeline.hpp (+29 -0) 100644
===================================================================
--- /dev/null
+++ new-interface/pipeline.hpp    2014-06-19 10:36:26 +0900 (fb91218)
@@ -0,0 +1,29 @@
+#ifndef GRNXX_PIPELINE_HPP
+#define GRNXX_PIPELINE_HPP
+
+#include "grnxx/types.hpp"
+
+namespace grnxx {
+
+class Pipeline {
+ public:
+  Pipeline();
+  virtual ~Pipeline();
+
+  // 所属するテーブルを取得する.
+  virtual Table *table() const = 0;
+
+  // パイプラインを通してレコードの一覧を取得する.
+  // 成功すれば true を返す.
+  // 失敗したときは *error にその内容を格納し, false を返す.
+  //
+  // 失敗する状況としては,以下のようなものが挙げられる.
+  // - 演算において例外が発生する.
+  // - リソースを確保できない.
+  virtual bool run(Error *error,
+                   RecordSet *record_set);
+};
+
+}  // namespace grnxx
+
+#endif  // GRNXX_PIPELINE_HPP

  Modified: new-interface/sorter-builder.hpp (+9 -0)
===================================================================
--- new-interface/sorter-builder.hpp    2014-06-17 13:19:42 +0900 (d9e1f1d)
+++ new-interface/sorter-builder.hpp    2014-06-19 10:36:26 +0900 (370a462)
@@ -10,6 +10,15 @@ enum SortOrder {
   DESCENDING_ORDER
 };
 
+struct SorterOptions {
+  // 整列の結果が保証されるのは [offset, offset + limit) の範囲である.
+  // なお,行 ID を整列条件に加えれば安定な整列になる.
+  int64_t offset;
+  int64_t limit;
+
+  SorterOptions();
+};
+
 class Sorter {
  public:
   Sorter();

  Modified: new-interface/sorter.hpp (+37 -10)
===================================================================
--- new-interface/sorter.hpp    2014-06-17 13:19:42 +0900 (d499555)
+++ new-interface/sorter.hpp    2014-06-19 10:36:26 +0900 (00b7a3d)
@@ -5,28 +5,55 @@
 
 namespace grnxx {
 
+enum SortStatus {
+  SORT_CONTINUE,
+  SORT_FINISH
+};
+
 class Sorter {
  public:
   Sorter();
   virtual ~Sorter();
 
-  // 所属するテーブルを取得する.
-  virtual Table *table() const = 0;
+  // 整列の対象となるレコードの一覧を設定する.
+  // 成功すれば true を返す.
+  // 失敗したときは *error にその内容を格納し, false を返す.
+  //
+  // 整列の途中で呼び出したときは,途中経過を破棄して新たな整列を開始する.
+  //
+  // 失敗する状況としては,以下のようなものが挙げられる.
+  // - 不正なレコードの一覧が指定された.
+  virtual bool reset(Error *error, RecordSet *record_set) = 0;
+
+  // 整列を進める.
+  // 成功すれば true を返す.
+  // 失敗したときは *error にその内容を格納し, false を返す.
+  //
+  // offset, limit の指定がないなど,入力がすべて揃ってからでなければ
+  // 整列に取り掛かれないときは何もせずに成功する.
+  //
+  // 整列済みの範囲以外を新たな入力として整列を進める.
+  //
+  // 失敗する状況としては,以下のようなものが挙げられる.
+  // - 対象が設定されていない.
+  // - 整列が既に完了している.
+  // - 演算で例外が発生する.
+  // - 不正なレコードの一覧が指定された.
+  virtual bool progress(Error *error) = 0;
 
-  // 行の一覧を整列する.
+  // 整列の仕上げをおこなう.
   // 成功すれば true を返す.
   // 失敗したときは *error にその内容を格納し, false を返す.
   //
-  // 整列の結果が保証されるのは [offset, offset + limit) の範囲である.
-  // なお,行 ID を整列条件に加えれば安定な整列になる.
+  // 入力がすべて揃ったものとして整列の仕上げをおこなう.
+  // offset, limit の指定があるときは,有効な範囲だけが残る.
   //
   // 失敗する状況としては,以下のようなものが挙げられる.
-  // - 演算において例外が発生する.
+  // - 対象が設定されていない.
+  // - 整列が既に完了している.
+  // - 演算で例外が発生する.
   // - リソースを確保できない.
-  virtual bool sort(Error *error,
-                    RecordSet *record_set,
-                    int64_t offset,
-                    int64_t limit);
+  virtual bool finish(Error *error) = 0;
 };
 
 }  // namespace grnxx
-------------- next part --------------
HTML����������������������������...
Download 



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