Navigation Menu

Skip to content

Commit

Permalink
Add new components.
Browse files Browse the repository at this point in the history
  • Loading branch information
s-yata committed Jun 19, 2014
1 parent 8254a1d commit e4d306f
Show file tree
Hide file tree
Showing 7 changed files with 311 additions and 12 deletions.
58 changes: 58 additions & 0 deletions new-interface/adjuster.hpp
@@ -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
6 changes: 4 additions & 2 deletions new-interface/expression-builder.hpp
Expand Up @@ -52,7 +52,7 @@ class ExpressionBuilder {
virtual bool push_operator(Error *error, OperatorType operator_type) = 0;

// 保持しているノードやスタックを破棄する.
virtual void clear();
virtual void clear() = 0;

// 構築中の式を完成させ,その所有権を取得する.
// 成功すれば有効なオブジェクトへのポインタを返す.
Expand All @@ -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
Expand Down
57 changes: 57 additions & 0 deletions new-interface/filter.hpp
@@ -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
117 changes: 117 additions & 0 deletions new-interface/pipeline-builder.hpp
@@ -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
29 changes: 29 additions & 0 deletions new-interface/pipeline.hpp
@@ -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
9 changes: 9 additions & 0 deletions new-interface/sorter-builder.hpp
Expand Up @@ -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();
Expand Down
47 changes: 37 additions & 10 deletions new-interface/sorter.hpp
Expand Up @@ -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
Expand Down

0 comments on commit e4d306f

Please sign in to comment.