Navigation Menu

Skip to content

Commit

Permalink
Update the new interface candidate.
Browse files Browse the repository at this point in the history
  • Loading branch information
s-yata committed Jun 11, 2014
1 parent 1b60523 commit 15298c3
Show file tree
Hide file tree
Showing 9 changed files with 191 additions and 88 deletions.
21 changes: 14 additions & 7 deletions new-interface/cursor.hpp
Expand Up @@ -10,14 +10,21 @@ class Cursor {
Cursor();
virtual ~Cursor();

// カーソルの位置を進めて移動量を返す.
// 途中で終端に到達したときは,そこで移動を停止し,それまでの移動量を返す.
virtual int64_t seek(int64_t count) = 0;
// カーソルの位置を最大で count 進める.
// 成功すれば移動量を返す.
// 失敗したときは *error にその内容を格納し, -1 を返す.
//
// 途中で終端に到達したときは count より小さい値を返す.
virtual int64_t seek(Error *error, int64_t count) = 0;

// カーソルの位置を進めて移動量を返す.
// 途中で終端に到達したときは,そこで移動を停止し,それまでの移動量を返す.
// 移動中に取得した行 ID は *row_ids に格納する.
virtual int64_t read(int64_t count, RowID *row_ids) = 0;
// カーソルの位置を最大で count 進める.
// 成功すれば移動量を返す.
// 失敗したときは *error にその内容を格納し, -1 を返す.
//
// カーソルの移動中に取得した行は *row_set の末尾に追加する.
//
// 途中で終端に到達したときは count より小さい値を返す.
virtual int64_t read(Error *error, int64_t count, RowSet *row_set) = 0;
};

} // namespace grnxx
Expand Down
3 changes: 2 additions & 1 deletion new-interface/db.hpp
Expand Up @@ -113,7 +113,8 @@ class DB {
// - 指定された名前のファイルに対するアクセス権限がない.
// - 作業領域が確保できない.
// - ディスクの空き容量が足りない.
virtual bool save(Error *error, const char *path,
virtual bool save(Error *error,
const char *path,
const DBOptions &options) const = 0;
};

Expand Down
13 changes: 8 additions & 5 deletions new-interface/expression-builder.hpp
Expand Up @@ -43,10 +43,11 @@ class ExpressionBuilder {
// - 演算子と引数が対応していない.
// - 演算子が求める引数の型・数と実際の引数の型・数が異なる.
// - リソースを確保できない.
virtual ExpressionNode *create_operator_node(Error *error,
OperatorType operator_type,
int64_t num_args,
ExpressionNode **args) = 0;
virtual ExpressionNode *create_operator_node(
Error *error,
OperatorType operator_type,
int64_t num_args,
ExpressionNode * const *args) = 0;

// すべてのノードを破棄する.
virtual void clear();
Expand All @@ -57,7 +58,9 @@ class ExpressionBuilder {
//
// 失敗する状況としては,以下のようなものが挙げられる.
// - リソースを確保できない.
virtual std::unique_ptr<Expression> create_expression(Error *error) const;
virtual std::unique_ptr<Expression> create_expression(
Error *error,
const ExpressionOptions &options) const;
};

} // namespace grnxx
Expand Down
39 changes: 17 additions & 22 deletions new-interface/expression.hpp
Expand Up @@ -17,15 +17,16 @@ class Expression {
// 評価結果の型を取得する.
virtual DataType data_type() const = 0;

// TODO: 行の一覧とスコアの受け渡し方を決める.

// 行の一覧をフィルタにかける.
// 成功すればフィルタにかけて残った行数を返す.
// 失敗したときは *error にその内容を格納し, -1 を返す.
//
// 評価結果が真になる行のみを残し,前方に詰めて隙間をなくす.
// フィルタにかける前後で順序関係は維持される.
//
// 先頭の offset 件はそのままにする.
// 返り値はフィルタをかけて残った行数から offset を引いたものになる.
//
// 有効でない行 ID を渡したときの動作は未定義である.
//
// 失敗する状況としては,以下のようなものが挙げられる.
Expand All @@ -36,16 +37,18 @@ class Expression {
// - NaN が発生する.
// - TODO: これらの取り扱いについては検討の余地がある.
virtual int64_t filter(Error *error,
int64_t num_row_ids,
RowID *row_ids,
double *scores) = 0;
RowSet *row_set,
int64_t offset) = 0;

// スコアを調整する.
// 成功すれば true を返す.
// 失敗したときは *error にその内容を格納し, false を返す.
//
// 評価結果を *scores に格納する.
// 式において _score を指定することにより, scores を入力として使うこともできる.
// 評価結果を *row_set に格納する.
// 式の構築において _score を指定することにより,
// 既存のスコアを入力として使うこともできる.
//
// 先頭の offset 件はそのままにする.
//
// 有効でない行 ID を渡したときの動作は未定義である.
//
Expand All @@ -57,33 +60,25 @@ class Expression {
// - NaN が発生する.
// - TODO: これらの取り扱いについては検討の余地がある.
virtual bool adjust(Error *error,
int64_t num_row_ids,
RowID *row_ids,
double *scores) = 0;
RowSet *row_set,
int64_t offset) = 0;

// 行の一覧に対する評価結果を取得する.
// 成功すれば true を返す.
// 失敗したときは *error にその内容を格納し, false を返す.
//
// TODO: 汎用型を配列にするのは効率が悪いため,ほかの方法が望ましい.
// 専用の型を用意することも含めて検討したい.
//
// TODO: 整列などにも使うことを考えれば,ネイティブな型を返すインタフェースが欲しい.
// 少なくとも内部インタフェースとして用意する必要がある.
//
// 有効でない行 ID を渡したときの動作は未定義である.
//
// 失敗する状況としては,以下のようなものが挙げられる.
// - 演算において例外が発生する.
// - オーバーフローやアンダーフローが発生する.
// - ゼロによる除算が発生する.
// - NaN が発生する.
// - TODO: これらの取り扱いについては検討の余地がある.
// - リソースが確保できない.
virtual bool evaluate(Error *error,
int64_t num_row_ids,
const RowID *row_ids,
const double *scores,
Datum *values) = 0;
const RowSet &row_set,
int64_t offset,
int64_t limit,
Data *values) = 0;
};

} // namespace grnxx
Expand Down
48 changes: 48 additions & 0 deletions new-interface/merger.hpp
@@ -0,0 +1,48 @@
#ifndef GRNXX_MERGER_HPP
#define GRNXX_MERGER_HPP

#include "grnxx/types.hpp"

namespace grnxx {

enum MergeStatus {
MERGE_CONTINUE,
MERGE_FINISH
};

class Merger {
public:
Merger();
virtual ~Merger();

// 所属するテーブルを取得する.
virtual Table *table() const = 0;

// 行の一覧を合成する.
// 成功すれば出力された行数を返す.
// 失敗したときは *error にその内容を格納し, -1 を返す.
//
// 入力がまだ残っているときは MERGE_CONTINUE,
// 入力がもう残っていないときは MERGE_FINISH を指定する.
//
// lhs_row_set, rhs_row_set を入力として,
// 合成した結果を result_row_set に出力する.
// 合成に使用された行は lhs_row_set, rhs_row_set から取り除かれる.
// そのため,空になった方の入力に行を補充することで合成を継続できる.
//
// 入力は行 ID 昇順もしくは降順になっているものとする.
// また,入力はそれぞれ重複を含まないものとする.
//
// 失敗する状況としては,以下のようなものが挙げられる.
// - スコアが合成によって不正な値になる.
// - リソースが確保できない.
virtual int64_t merge(Error *error,
RowSet *lhs_row_set,
RowSet *rhs_row_set,
RowSet *result_row_set,
MergeStatus status) const = 0;
};

} // namespace grnxx

#endif // GRNXX_MERGER_HPP
50 changes: 50 additions & 0 deletions new-interface/row-set.hpp
@@ -0,0 +1,50 @@
#ifndef GRNXX_ROW_SET_HPP
#define GRNXX_ROW_SET_HPP

#include "grnxx/types.hpp"

namespace grnxx {

class RowSet {
public:
RowSet();
~RowSet();

// 所属するテーブルを取得する.
Table *table() const;

// 行 ID を取得する.
RowID get_row_id(Int64 i) const;
// スコアを取得する.
double get_score(Int64 i) const;

// スコアを正規化する.
// 成功すれば true を返す.
// 失敗したときは *error にその内容を格納し, false を返す.
//
// TODO: 具体的な正規化方法を決める.
// 最大値ですべてのスコアを除算するというのが簡単そうである.
// 正規化後の最大値を指定できると便利かもしれない.
// ほかにも何か必要な正規化があるかどうか.
//
// 失敗する状況としては,以下のようなものが挙げられる.
// - 最大値が 0.0, negative, infinity である.
bool normalize(Error *error, const NormalizeOptions &options);

// TODO: Sorter を使うより RowSet::sort() の方が良い?

// 整列する.
// 成功すれば true を返す.
// 失敗したときは *error にその内容を格納し, false を返す.
//
// TODO: 整列条件の指定方法を決める.
//
// 失敗する状況としては,以下のようなものが挙げられる.
// - リソースが足りない.
// - 演算において例外が発生する.
bool sort(Error *error, const SortConditions &conditions);
};

} // namespace grnxx

#endif // GRNXX_ROW_SET_HPP
8 changes: 5 additions & 3 deletions new-interface/sorter-builder.hpp
Expand Up @@ -29,7 +29,7 @@ class Sorter {
// - 式の評価結果が大小関係を持たない型になる.
// - リソースを確保できない.
virtual bool add_precondition(Error *error,
const Expression *expression,
const Expression &expression,
SortOrder order) const = 0;

// 整列条件を追加する.
Expand All @@ -43,7 +43,7 @@ class Sorter {
// - 式の評価結果が大小関係を持たない型になる.
// - リソースを確保できない.
virtual bool add_condition(Error *error,
const Expression *expression,
const Expression &expression,
SortOrder order) const = 0;

// すべての条件を破棄する.
Expand All @@ -55,7 +55,9 @@ class Sorter {
//
// 失敗する状況としては,以下のようなものが挙げられる.
// - リソースを確保できない.
virtual std::unique_ptr<Sorter> create_sorter(Error *error) const;
virtual std::unique_ptr<Sorter> create_sorter(
Error *error,
const SorterOptions &options) const;
};

} // namespace grnxx
Expand Down
5 changes: 3 additions & 2 deletions new-interface/sorter.hpp
Expand Up @@ -24,8 +24,9 @@ class Sorter {
// - 演算において例外が発生する.
// - リソースを確保できない.
virtual bool sort(Error *error,
int64_t num_row_ids, RowID *row_ids,
int64_t offset, int64_t limit);
RowSet *row_set,
int64_t offset,
int64_t limit);
};

} // namespace grnxx
Expand Down

0 comments on commit 15298c3

Please sign in to comment.