trdsql v0.9.0

Posted on:

trdsql v0.9.0をリリースしました。

リリースのページから各バイナリがダウンロードできます。

JSONに対してjq式でフィルタを掛けられるようになりました。

JSONに対してtrdsqlでは最初のオブジェクトや配列をテーブルとみなして処理します。 JSONは階層構造に出来るため、その中のオブジェクトをテーブルとしたい場合にはSQLのJSON関数を使うか、jqを使用してフィルタリングしてパイプで受け取る等の処置が必要でした。

これが面倒だったため、JSONファイルに対してjq式を書けるようにしました。

この実装にはgojqを利用しています。

例えば以下のようなJSONファイルがあった場合に、通常のtrdsqlでは menuカラムしかありませんでした。

{
	"menu": {
		"id": "file",
		"value": "File",
		"popup": {
			"menuitem": [
				{
					"value": "New",
					"onclick": "CreateDoc()"
				},
				{
					"value": "Open",
					"onclick": "OpenDoc()"
				},
				{
					"value": "Save",
					"onclick": "SaveDoc()"
				}
			]
		}
	}
}

ファイル名に追加してjq式を書くことで以下のようにmenuitemに対してSQLを書けるようになります。

trdsql -oat "SELECT * FROM menu.json::.menu.popup.menuitem"
+-------+-------------+
| value |   onclick   |
+-------+-------------+
| New   | CreateDoc() |
| Open  | OpenDoc()   |
| Save  | SaveDoc()   |
+-------+-------------+

これによりjqコマンドは必要なくなり、複数のファイル又は一つのJSONファイルの中の複数のテーブルを使用できるようになります。

jq式は非常に強烈でSQL相当のこともjq式で出来てしまいます。SQLでやるかjq式でやるかはお好みですが、適正を考えるのが良いと思います。 またjq式を書く場合はjq式をダブルクオートでくくる必要があるかもしれません。 "SELECT * FROM menu.json::\".menu.popup.menuitem\"" のようにエスケープと組み合わせます。

trdsqlのjson出力は中身がjsonであればjsonとして扱うようになっているため、以下のように-ojson "SELECT * FROM jsonファイル名::(jq式)とするとjqの代わりにもなります。

trdsql -ojson "SELECT * FROM menu.json::.menu"
[
  {
    "id": "file",
    "popup": {
      "menuitem": [
        {
          "onclick": "CreateDoc()",
          "value": "New"
        },
        {
          "onclick": "OpenDoc()",
          "value": "Open"
        },
        {
          "onclick": "SaveDoc()",
          "value": "Save"
        }
      ]
    },
    "value": "File"
  }
]

JSONの数値をfloat64にマッピングされていたのを修正

以下のような大きな数値が入ったJSONが、goのjson の実装としてfloat64にマッピングされていました。そのためJSONを介すと指数表記になったりして、嬉しくないことがありました。

{
    "float": 1000000000
}
trdsql "SELECT * FROM float.json"
1e+09

https://golang.org/pkg/encoding/json/#Decoder.UseNumber を有効にして Number として扱われるようにしました。

TSV,PSVを拡張子として認識するように追加

tsvやpsvという拡張子のファイルだった場合は、tsvはTAB区切りのCSV、psvはパイプ(|)区切りのCSVとして扱うようにしました。区切り文字のオプションを付けなくてもよくなります。