# 7.25.11. grn_expr

grn_expr は「式」を表現した `grn_obj` です。以下は式が何をできるかのリストです。

> - 式は `grn_expr_exec()` を使うと1つのレコードに複数の操作を適用できます。

> - 式は検索条件を表現できます。 `grn_table_select()` を使うと、式で表現した検索条件にマッチしたレコードだけを選択できます。

文字列を式で表現する手段は2種類あります。

> - クエリー構文

> - スクリプト構文

`grn_expr_parse()` は式の文字列表現をパースし、パースした式を別の式に追加します。

## 7.25.11.1. 例

TODO...

## 7.25.11.2. リファレンス

grn_obj *grn_expr_create(grn_ctx *ctx, const char *name, unsigned int name_size)

grn_rc grn_expr_close(grn_ctx *ctx, grn_obj *expr)

grn_obj *grn_expr_add_var(grn_ctx *ctx, grn_obj *expr, const char *name, unsigned int name_size)

grn_obj *grn_expr_get_var_by_offset(grn_ctx *ctx, grn_obj *expr, unsigned int offset)

grn_obj *grn_expr_append_obj(grn_ctx *ctx, grn_obj *expr, grn_obj *obj, grn_operator op, int nargs)

grn_obj *grn_expr_append_const(grn_ctx *ctx, grn_obj *expr, grn_obj *obj, grn_operator op, int nargs)

grn_obj *grn_expr_append_const_str(grn_ctx *ctx, grn_obj *expr, const char *str, unsigned int str_size, grn_operator op, int nargs)

grn_obj *grn_expr_append_const_int(grn_ctx *ctx, grn_obj *expr, int i, grn_operator op, int nargs)

grn_rc grn_expr_append_op(grn_ctx *ctx, grn_obj *expr, grn_operator op, int nargs)

grn_rc grn_expr_get_keywords(grn_ctx *ctx, grn_obj *expr, grn_obj *keywords)

  Extracts keywords from `expr` and stores to `keywords`. Keywords in `keywords` are owned by `expr`. Don't unlink them. Each keyword is `GRN_BULK` and its domain is `GRN_DB_TEXT`.

  `keywords` must be `GRN_PVECTOR`.

  以下はスキーマの例です。

      grn_obj keywords;
      GRN_PTR_INIT(&keywords, GRN_OBJ_VECTOR, GRN_ID_NIL);
      grn_expr_get_keywords(ctx, expr, &keywords);
      {
        int i, n_keywords;
        n_keywords = GRN_BULK_VSIZE(&keywords) / sizeof(grn_obj *);
        for (i = 0; i < n_keywords; i++) {
          grn_obj *keyword = GRN_PTR_VALUE_AT(&keywords, i);
          const char *keyword_content;
          int keyword_size;
          keyword_content = GRN_TEXT_VALUE(keyword);
          keyword_size = GRN_TEXT_LEN(keyword);
          /*
            Use keyword_content and keyword_size.
            You don't need to unlink keyword.
            keyword is owned by expr.
          */
        }
      }
      GRN_OBJ_FIN(ctx, &keywords);

  パラメータ:

    - ctx -- The context that creates the `expr`.

    - expr -- The expression to be extracted.

    - keywords --

      The container to store extracted keywords. It must be `GRN_PVECTOR`.

      Each extracted keyword is `GRN_BULK` and its domain is `GRN_DB_TEXT`.

      Extracted keywords are owned by `expr`. Don't unlink them.

  戻り値:

    成功時は `GRN_SUCCESS` 、エラー時は `GRN_SUCCESS` 以外。

grn_rc grn_expr_syntax_escape(grn_ctx *ctx, const char *string, int string_size, const char *target_characters, char escape_character, grn_obj *escaped_string)

  `string` 中の `target_characters` を `escape_character` でエスケープします。

  パラメータ:

    - ctx -- エンコーディングは `string` と同じでなければいけません。 `escaped_string` 用のバッファを確保するために使います。

    - string -- 文字列式表現

    - string_size -- `string` のバイトサイズです。 `-1` を指定した場合は `string` がNULL終端文字列であるという意味になります。

    - target_characters -- NULL終端されたエスケープ対象文字。たとえば、 クエリー構文 用の `target_characters` は `"+-><~*()\"\\:"` になります。

    - escape_character -- `target_characters` の文字をエスケープする文字です。たとえば、 クエリー構文 用の `escaped_character` は `\\` （バックスラッシュ）になります。

    - escaped_string -- エスケープされた `string` の出力先です。テキスト型のbulkでなければいけません。

  戻り値:

    成功時は `GRN_SUCCESS` 、エラー時は `GRN_SUCCESS` 以外。

grn_rc grn_expr_syntax_escape_query(grn_ctx *ctx, const char *query, int query_size, grn_obj *escaped_query)

  クエリー構文 にある特別な文字をエスケープします。

  パラメータ:

    - ctx -- このエンコーディングは `query` のエンコーディングと同じでなければなりません。 `escaped_query` 用のバッファを確保するために使います。

    - query -- クエリー構文 にある文字列式の表現。

    - query_size -- `query` のバイトサイズです。 `-1` を指定した場合は `query` がNULL終端文字列であるという意味になります。

    - escaped_query -- エスケープされた `query` の出力。テキスト型用のbulkを返す。

  戻り値:

    成功時は `GRN_SUCCESS` 、エラー時は `GRN_SUCCESS` 以外。

grn_rc grn_expr_compile(grn_ctx *ctx, grn_obj *expr)

grn_obj *grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs)

grn_obj *grn_expr_alloc(grn_ctx *ctx, grn_obj *expr, grn_id domain, grn_obj_flags flags)