読者です 読者をやめる 読者になる 読者になる

TrimQueryの調べ

アブストラクト

TrimQueryはTrimPathプロジェクトにおけるJSONデータをSQL構文で操作可能にするライブラリである。基本SQL SyntaxはSELECT ... FROM、WHERE clauses、GROUP BY、HAVINGなど基本的なものからself joins、LIMITなど利用可能。ライセンスはGNU Public License version 2である。

API関係

TrimQueryのコール(環境により異なります)

TrimPath.makeQueryLang ( tableColumnDefinitions )

メソッドはtableColumnDefinitionsをコンパイルしselectStatementObjectを返すメソッドです。tableColumnDefinitionsは次のような例になります。(注:SQLでいう所のテーブルスキーマのようなものです。)

<script language="javascript">
    var columnDefs = {
        Invoice  : { id          : { type: "String" },
                     total       : { type: "Number" },	
                     custId      : { type: "String" } },
        Customer : { id          : { type: "String" },
                     acctBalance : { type: "Number" } }
    };
</script>
selectStatement.parseSQL ( sqlString, optionalParamsArray )

parseSQLメソッドは sqlString に指定されたSQL構文を解釈します。パースエラーの際は例外が発生します。SQL構文の中に?を利用することによってoptionalParamsArrayに指定して数字に置き換えることができます。例は以下の通り

selectStatement = queryLang.parseSQL(
  "SELECT Customer.* FROM Customer " +
                    "WHERE Customer.acctBalance > ? " +
                      "AND Customer.acctBalance < ?", [ minBalance, maxBalance ]);

WHERE Customer.acctBalance > ? が minBalanceに置き換えられ, AND Customer.acctBalance < ? が maxBalanceに置き換えられます。

selectStatementObject
  • selectStatementObject.filter( tableData )
    実際の解析したいデータ列(tableData)を解釈し実行結果を返します。tableDataはデータスキームに合わせる必要があります。
  • selectStatementObject.toString()
    デバッグ用で実行中のSQL文を返す。

サンプルコード

ソース読んだほうがはやいと思う…。

var tableColumnDefinitions =
{
   Foo : { id : {type : "String"}, foo : { type : "String"} },
   Bar : { id : {type : "String"}, bar : { type : "String"} }
};
var queryLang = TrimPath.makeQueryLang(tableColumnDefinitions);
var selectStatement = queryLang.parseSQL("SELECT Foo.* FROM Foo");
var tableData =
{
   Foo : [ { id : 1, foo : "foo1" } , { id : 2, foo : "foo2" } ],
   Bar : [ { id : 1, bar : "bar1" } , { id : 2, bar : "bar2" } ]
};
var result = selectStatement.filter(tableData);

for(var i in result)
{
    for(var j in result[i])
    	document.write(j,"->",result[i][j],'<br />');
}

// Contents of selectStatement
// alert(selectStatement.toString()); // SELECT Foo.* FROM Foo
対応SQLライクSyntax*1
  • SELECT ... FROM
  • WHERE clauses
  • ORDER BY (sorting on multiple columns, ASC and DESC)
  • AS (aliases)
  • GROUP BY, HAVING aggregation
  • SUM, COUNT, AVG aggregate functions
  • self joins
  • LIMIT and offsets
  • parameterization

ブラウザー対応状況*2

注意事項

本家の訳ではないです。

加筆訂正

*1:http://trimpath.com/project/wiki/TrimQueryより引用

*2:開発チームが知っている範囲だそうです