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

- English

# 7.3.31. `logical_count`

## 7.3.31.1. 概要

バージョン 5.0.0 で追加.

`logical_count` は別のテーブルに保存されているレコードであっても、マッチするレコードをカウントするためのコマンドです。テーブルの最大レコード数の 制限事項 を気にしなくてすむようになります。

この機能はまだこなれていないので、いくつか制限があります。

- 名前の末尾は "_YYYYMMDD" をつけてテーブルを作成します。これは決め打ちになっていて、日ごとにテーブルを作成しないといけない

- 自分で個々のテーブルへ適切なデータをロードしないといけない

## 7.3.31.2. 構文

このコマンドにはたくさんの引数があります。

必須引数は2つあります。 `logical_table` と `shard_key` です。

    logical_count logical_table
                  shard_key
                  [min]
                  [min_border]
                  [max]
                  [max_border]
                  [filter]

## 7.3.31.3. 使い方

`logical_count` コマンドを使うには事前に `sharding` プラグインを登録します。

`logical_count` コマンドは実験的なプラグインです。このコマンドは将来的に変更されるかもしれません。

この機能を使う簡単な例を示します。複数のテーブルに保存されている特定のログをカウントしてみましょう。

スキーマ定義とサンプルデータは以下の通りです。

実行例:

    table_create Logs_20150203 TABLE_NO_KEY
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Logs_20150203 timestamp COLUMN_SCALAR Time
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Logs_20150203 message COLUMN_SCALAR Text
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    table_create Logs_20150204 TABLE_NO_KEY
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Logs_20150204 timestamp COLUMN_SCALAR Time
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Logs_20150204 message COLUMN_SCALAR Text
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    table_create Logs_20150205 TABLE_NO_KEY
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Logs_20150205 timestamp COLUMN_SCALAR Time
    # [[0, 1337566253.89858, 0.000355720520019531], true]
    column_create Logs_20150205 message COLUMN_SCALAR Text
    # [[0, 1337566253.89858, 0.000355720520019531], true]

実行例:

    load --table Logs_20150203
    [
    {"timestamp": "2015-02-03 23:59:58", "message": "Start"},
    {"timestamp": "2015-02-03 23:59:58", "message": "Shutdown"},
    {"timestamp": "2015-02-03 23:59:59", "message": "Start"},
    {"timestamp": "2015-02-03 23:59:59", "message": "Shutdown"}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 4]
    load --table Logs_20150204
    [
    {"timestamp": "2015-02-04 00:00:00", "message": "Start"},
    {"timestamp": "2015-02-04 00:00:00", "message": "Shutdown"},
    {"timestamp": "2015-02-04 00:00:01", "message": "Start"},
    {"timestamp": "2015-02-04 00:00:01", "message": "Shutdown"},
    {"timestamp": "2015-02-04 23:59:59", "message": "Start"},
    {"timestamp": "2015-02-04 23:59:59", "message": "Shutdown"}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 6]
    load --table Logs_20150205
    [
    {"timestamp": "2015-02-05 00:00:00", "message": "Start"},
    {"timestamp": "2015-02-05 00:00:00", "message": "Shutdown"},
    {"timestamp": "2015-02-05 00:00:01", "message": "Start"},
    {"timestamp": "2015-02-05 00:00:01", "message": "Shutdown"}
    ]
    # [[0, 1337566253.89858, 0.000355720520019531], 4]

2015年の2月3日から5日までに対応したテーブルが3つあります。

- Logs_20150203
- Logs_20150204
- Logs_20150205

対応するテーブルへとデータを投入します。

`message` カラムに "Shutdown" が含まれていて、 `timestamp` カラムの値が "2015-02-04 00:00:00" 以降であるログをカウントしましょう。

上記目的を達成するためのクエリがこちらです。

実行例:

    logical_count Logs timestamp --filter 'message == "Shutdown"' --min "2015-02-04 00:00:00" --min_border "include"
    # [[0, 1337566253.89858, 0.000355720520019531], 5]

レコード数には既知の制限があります。制限はテーブルごとなので、シャーディング機能によってその制限を乗り越えることができます。

注釈

SQLの `PARTITIONING BY` のような便利なクエリはありません。つまり、 `table_create` で "_YYYYMMDD" を名前の末尾に含むテーブルをそれぞれの作らなければなりません。

## 7.3.31.4. 引数

このセクションでは `logical_count` の引数について説明します。

### 7.3.31.4.1. 必須引数

必須引数は二つあります。 `logical_table` と `shard_key` です。

#### 7.3.31.4.1.1. `logical_table`

論理テーブル名を指定します。これは "_YYYYMMDD" をテーブル名から除いたものです。実際のテーブルが "Logs_20150203" や "Logs_20150203" といったものなら、論理テーブル名は "Logs" です。

#### 7.3.31.4.1.2. `shard_key`

個々のテーブルで共通のキーとして扱うカラム名を指定します。

### 7.3.31.4.2. 省略可能引数

いくつか省略可能な引数があります。

#### 7.3.31.4.2.1. `min`

`shard_key` の最小値を指定します。

#### 7.3.31.4.2.2. `min_border`

最小値を境界値として含めるのか否かを指定します。 `include` もしくは `exclude` を指定します。

#### 7.3.31.4.2.3. `max`

`shard_key` の最大値を指定します。

#### 7.3.31.4.2.4. `max_border`

最大値を境界値として含めるのか否かを指定します。 `include` もしくは `exclude` を指定します。

#### 7.3.31.4.2.5. `filter`

## 7.3.31.5. 戻り値

TODO

    [HEADER, LOGICAL_COUNT]