BloGroonga

2013-02-28

今月は29日がないので28日リリースです。

groonga 3.0.1リリース

groonga 3.0.1 をリリースしました!

今月2/9に肉の日記念でメジャーバージョンアップデートしたばかりなので、直接ユーザさんに影響するような大きな変更は入っていませんが、3.0.0には間に合わなかった不具合修正などが入っています。

それぞれの環境毎のインストール方法: インストール

はじめに、利用事例の記事を書いてくれる人募集のお知らせです。(再度)

これまでも、groonga.orgにて 利用事例 を紹介してきましたが、それとは別に、 gihyo.jp にてgroonga関連の記事を書くという企画が進行しています。

まだgroongaを知らない人にもWeb記事を通じて知ってもらいたいというのが動機です。

詳細は groonga普及のための協力のお願い を参照してください。実際に使っているユーザーのみなさんに書いてもらえたらいいなぁと思っています!

すでに何人かの方に応募いただいていますが、まだまだ募集中です。

loadコマンドによりBoolであっても参照カラムに設定可能

これまで、loadコマンドでテーブルにレコードを追加する場合に参照カラムがBool型のキーのテーブルを参照していると、値を正しく設定することができませんでした。

例えば以下のようなスキーマとデータを投入してみます。

  table_create Bools TABLE_HASH_KEY Bool

  table_create  Entries           TABLE_HASH_KEY ShortText
  column_create Entries published COLUMN_SCALAR  Bools

  load --table Entries
  [
  {"_key": "Special news!",  "published": true},
  {"_key": "Supprise news!", "published": false}
  ]

投入した結果確認するためにselect Entriesを実行すると以下のようになります。

  [
    [
      [2],
      [
        ["_id","UInt32"],
        ["_key","ShortText"],
        ["published","Bools"]
      ],
      [1,"Special news!",false],
      [2,"Supprise news!",false]
    ]
  ]

loadしたはずの値が設定されていないことがわかります。

Boolsテーブルの内容を確認すると実際に値が設定されていないことがわかります。

  [
    [
      [0],
      [
        ["_id","UInt32"],
        ["_key","Bool"]
      ]
    ]
  ]

これが、今回のリリースで修正され、loadコマンドでBool型のキーのテーブルを参照している参照カラムに対しても正しく機能するようになりました。

select Entriesを実行すると以下の結果が返ってきます。

  [
    [
      [2],
      [
        ["_id","UInt32"],
        ["_key","ShortText"],
        ["published","Bools"]
      ],
      [1,"Special news!",true],
      [2,"Supprise news!",false]
    ]
  ]

select Boolsを実行すると参照カラムで指定した値が設定されていることがわかります。

  [
    [
      [0],
      [
        ["_id","UInt32"],
        ["_key","Bool"]
      ],
      [1,true],
      [2,false]
    ]
  ]

ネストしたインデックスに対してもAND検索可能に

今回のリリースでは、ネストしたインデックスに対してもAND検索が可能になりました。

どんな風になったかをサンプルで示します。

以下は例で使うスキーマとデータです。

  table_create Users TABLE_PAT_KEY ShortText
  column_create Users birthday COLUMN_SCALAR Time

  table_create Files TABLE_PAT_KEY ShortText
  column_create Files owner COLUMN_SCALAR Users

  column_create Users files_owner_index COLUMN_INDEX Files owner

  table_create Birthdays TABLE_PAT_KEY Time
  column_create Birthdays users_birthday COLUMN_INDEX Users birthday

  load --table Users
  [
  {"_key": "Alice",  "birthday": "1992-02-09 00:00:00"},
  {"_key": "Bob",    "birthday": "1988-01-04 00:00:00"},
  {"_key": "Carlos", "birthday": "1982-12-29 00:00:00"}
  ]

  load --table Files
  [
  {"_key": "/home/alice/.zshrc",                  "owner": "Alice"},
  {"_key": "/home/bob/.bashrc",                   "owner": "Bob"},
  {"_key": "/home/calros/public_html/index.html", "owner": "Carlos"}
  ]

ファイルの所有者の誕生日に応じて特定のファイルを絞り込む場合を考えてみます。

カラムインデックスを張ってあるので、FilesテーブルとUsersテーブルはネストしたインデックスとして関連付けられています。

以下のようなクエリで絞り込むことができると思うかも知れません。3.0.0で実行すると以下の結果になります。

  select Files 
  --filter 'owner.birthday >= "1988-01-04 00:00:00" && owner.birthday < "1992-02-09 00:00:00"' 
  --output_columns '_key, owner, owner.birthday'

  [
    [
      [2],
      [
        ["_key","ShortText"],
        ["owner","Users"],
        ["owner.birthday","Time"]
      ],
      ["/home/bob/.bashrc","Bob",568220400.0],
      ["/home/alice/.zshrc","Alice",697561200.0]
    ]
  ]

この結果をみると、最初の条件のみで検索していて、&&以降の条件はまったく無視されているように見えます。(Bobがヒットしているのは正しいが、Aliceは対象外になっていないといけない)

これは従来AND検索はできず、最初の条件のみ評価されてしまっていたのが原因です。

今回のリリースではAND検索が可能になったので、きちんと絞り込むことができるようになりました。

  [
    [
      [1],
      [
        ["_key","ShortText"],
        ["owner","Users"],
        ["owner.birthday","Time"]
      ],
      ["/home/bob/.bashrc","Bob",568220400.0]
    ]
  ]

&& owner.birthday < "1992-02-09 00:00:00" 部分もきちんと適用して結果を絞り込んでいることがわかります。

さいごに

3.0.0からの詳細な変更点は 3.0.1リリース 2013/02/28 を確認してください。

それでは、groongaでガンガン検索してください!