Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
311 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters