# groonga - オープンソースのカラムストア機能付き全文検索エンジン

- English page

# 7.18.9. grn_expr

`grn_expr`は:c:type:`grn_obj`を式として表現したものです。以下はどのような表現があるかのリストです。

> - 式は:c:func:`grn_expr_exec`によって登録されたものが適用される。

> - 検索条件を式として表現することができます。:c:func:`grn_table_select`は検索条件文にマッチしたレコードの選択ができます。

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

> - クエリー構文
> - スクリプト構文

:c:func:`grn_expr_parse`は式の記述された文字列をパースし、その結果を別の式に追加します。

## 7.18.9.1. 実行例:

TODO...

## 7.18.9.2. リファレンス

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

GRN_API grn_rc `grn_expr_close`(grn_ctx *ctx, grn_obj *expr)

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

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

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

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

GRN_API 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_API grn_obj *`grn_expr_append_const_int`(grn_ctx *ctx, grn_obj *expr, int i, grn_operator op, int nargs)

GRN_API 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``と:doc:/reference/grn_expr/query_syntax`で説明されています。 escape_character -- エスケープ用の文字として``target_characters``に指定するもの。たとえば、`\\` が``escaped_character``として:doc:`/reference/grn_expr/query_syntax`に説明されています。 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_API grn_rc `grn_expr_compile`(grn_ctx *ctx, grn_obj *expr)

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

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