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