susumu.yata
null+****@clear*****
Tue Jun 3 13:35:25 JST 2014
susumu.yata 2014-06-03 13:35:25 +0900 (Tue, 03 Jun 2014) New Revision: f3ce403019c340903c074d9c7c4e7ee641116e6c https://github.com/groonga/grnxx/commit/f3ce403019c340903c074d9c7c4e7ee641116e6c Message: Add ExpressionBuilder and scores. Copied files: new-interface/expression-builder.hpp (from new-interface/expression.hpp) Modified files: new-interface/expression.hpp Copied: new-interface/expression-builder.hpp (+13 -48) 50% =================================================================== --- new-interface/expression.hpp 2014-06-02 10:57:43 +0900 (b19c0be) +++ new-interface/expression-builder.hpp 2014-06-03 13:35:25 +0900 (07b095c) @@ -1,16 +1,14 @@ -#ifndef GRNXX_EXPRESSION_HPP -#define GRNXX_EXPRESSION_HPP +#ifndef GRNXX_EXPRESSION_BUILDER_HPP +#define GRNXX_EXPRESSION_BUILDER_HPP #include "grnxx/types.hpp" namespace grnxx { -class ExpressionNode; - -class Expression { +class ExpressionBuilder { public: - Expression(); - virtual ~Expression(); + ExpressionBuilder(); + virtual ~ExpressionBuilder(); // 所属するテーブルを取得する. virtual Table *table() const = 0; @@ -50,50 +48,17 @@ class Expression { ExpressionNode **args, Error *error) = 0; - // 行の一覧をフィルタにかける. - // 成功すればフィルタにかけて残った行数を返す. - // 失敗したときは *error にその内容を格納し, -1 を返す. - // - // 評価結果が真になる行のみを残し,前方に詰めて隙間をなくす. - // フィルタにかける前後で順序関係は維持される. - // - // 有効でない行 ID を渡したときの動作は未定義である. - // - // 失敗する状況としては,以下のようなものが挙げられる. - // - 評価結果の型が真偽値でない. - // - 演算において例外が発生する. - // - オーバーフローやアンダーフローが発生する. - // - ゼロによる除算が発生する. - // - NaN が発生する. - // - TODO: これらの取り扱いについては検討の余地がある. - virtual int64_t filter(int64_t num_row_ids, - RowID *row_ids, - Error *error) = 0; - - // 行の一覧に対する評価結果を取得する. - // 成功すれば true を返す. - // 失敗したときは *error にその内容を格納し, false を返す. - // - // TODO: 汎用型を配列にするのは効率が悪いため,ほかの方法が望ましい. - // 専用の型を用意することも含めて検討したい. - // - // TODO: 整列などにも使うことを考えれば,ネイティブな型を返すインタフェースが欲しい. - // 少なくとも内部インタフェースとして用意する必要がある. - // - // 有効でない行 ID を渡したときの動作は未定義である. + // 最後に作成したノードを根とする構文木に対応する式を作成する. + // 成功すれば有効なオブジェクトへのポインタを返す. + // 失敗したときは *error にその内容を格納し, nullptr を返す. // // 失敗する状況としては,以下のようなものが挙げられる. - // - 演算において例外が発生する. - // - オーバーフローやアンダーフローが発生する. - // - ゼロによる除算が発生する. - // - NaN が発生する. - // - TODO: これらの取り扱いについては検討の余地がある. - virtual bool evaluate(int64_t num_row_ids, - const RowID *row_ids, - Datum *values, - Error *error) = 0; + // - 演算子と引数が対応していない. + // - 演算子が求める引数の型・数と実際の引数の型・数が異なる. + // - リソースを確保できない. + virtual std::unique_ptr<Expression> create_expression(Error *error) const; }; } // namespace grnxx -#endif // GRNXX_EXPRESSION_HPP +#endif // GRNXX_EXPRESSION_BUILDER_HPP Modified: new-interface/expression.hpp (+24 -32) =================================================================== --- new-interface/expression.hpp 2014-06-02 10:57:43 +0900 (b19c0be) +++ new-interface/expression.hpp 2014-06-03 13:35:25 +0900 (1a8e903) @@ -17,38 +17,7 @@ class Expression { // 評価結果の型を取得する. virtual DataType data_type() const = 0; - // 定数に対応するノードを作成する. - // 成功すれば有効なオブジェクトへのポインタを返す. - // 失敗したときは *error にその内容を格納し, nullptr を返す. - // - // 失敗する状況としては,以下のようなものが挙げられる. - // - 指定された定数が異常値である. - // - リソースを確保できない. - virtual ExpressionNode *create_datum_node(const Datum &datum, - Error *error) = 0; - - // カラムに対応するノードを作成する. - // 成功すれば有効なオブジェクトへのポインタを返す. - // 失敗したときは *error にその内容を格納し, nullptr を返す. - // - // 失敗する状況としては,以下のようなものが挙げられる. - // - 指定されたカラムが存在しない. - // - リソースを確保できない. - virtual ExpressionNode *create_column_node(const char *column_name, - Error *error) = 0; - - // 演算子に対応するノードを作成する. - // 成功すれば有効なオブジェクトへのポインタを返す. - // 失敗したときは *error にその内容を格納し, nullptr を返す. - // - // 失敗する状況としては,以下のようなものが挙げられる. - // - 演算子と引数が対応していない. - // - 演算子が求める引数の型・数と実際の引数の型・数が異なる. - // - リソースを確保できない. - virtual ExpressionNode *create_operator_node(OperatorType operator_type, - int64_t num_args, - ExpressionNode **args, - Error *error) = 0; + // TODO: 行の一覧とスコアの受け渡し方を決める. // 行の一覧をフィルタにかける. // 成功すればフィルタにかけて残った行数を返す. @@ -68,8 +37,30 @@ class Expression { // - TODO: これらの取り扱いについては検討の余地がある. virtual int64_t filter(int64_t num_row_ids, RowID *row_ids, + double *scores, Error *error) = 0; + // スコアを調整する. + // 成功すれば true を返す. + // 失敗したときは *error にその内容を格納し, false を返す. + // + // 評価結果を *scores に格納する. + // 式において _score を指定することにより, scores を入力として使うこともできる. + // + // 有効でない行 ID を渡したときの動作は未定義である. + // + // 失敗する状況としては,以下のようなものが挙げられる. + // - 評価結果をスコアに変換できない. + // - 演算において例外が発生する. + // - オーバーフローやアンダーフローが発生する. + // - ゼロによる除算が発生する. + // - NaN が発生する. + // - TODO: これらの取り扱いについては検討の余地がある. + virtual bool adjust(int64_t num_row_ids, + RowID *row_ids, + double *scores, + Error *error) = 0; + // 行の一覧に対する評価結果を取得する. // 成功すれば true を返す. // 失敗したときは *error にその内容を格納し, false を返す. @@ -90,6 +81,7 @@ class Expression { // - TODO: これらの取り扱いについては検討の余地がある. virtual bool evaluate(int64_t num_row_ids, const RowID *row_ids, + const double *scores, Datum *values, Error *error) = 0; }; -------------- next part -------------- HTML����������������������������... ダウンロード