入力に複合値を使用したリクエスト¶
Denodo Web サービスには、複合フィールドによる条件を追加する方法が 2 つあります。
以下に示すような VQL の通常の構文を使用します。
SELECT ...
FROM V
WHERE input_array_field = { ROW( 1, NULL, 2, NULL, 'a', true, NULL, NULL, NULL
, NULL, NULL, NULL, NULL ) }
以下に示す URL では、この構文を使用して、配列フィールド
input_array_field
による条件を指定しています。
http://acme:9090/denodo-restfulws/.../views/V?input_array_field={ ROW( 1, NULL, 2, NULL, 'a', true, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) }
値
{ ROW( 1, NULL, 2, NULL, 'a', true, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) }
はレジスターの配列です。ROW(...)
を囲む中括弧は、この値が配列であることを示します。中括弧がない場合はレジスターです。この構文については、『VQL ガイド』の「 複合値の管理 」を参照してください。
複合値で条件を表すもう 1 つの構文では JSON ドキュメントを使用します。以下に例を示します。
http://acme:9090/denodo-restfulws/.../views/view1?$filter=input_array_field='[{"id":1, "id2": 2, "field1": "a", "field2": true}]'
上記の 2 つの URL は等価ですが、以下の理由から 2 番目のほうが簡潔です。
レジスターでフィールドの名前を指定するので、1 番目の構文よりも条件が判読しやすくなっています。1 番目の構文では、それぞれの値に対応するフィールドがどれであるか把握できません。
フィールドが JSON ドキュメントに存在しない場合、そのフィールドの値が NULL であることを意味します。これにより、大量の NULL 値が存在する場合は、パラメータの値が大幅に短くなるという利点が得られます。
JSON では、レジスター値は中括弧で始まり、中括弧で終わります。以下に例を示します。
http://acme:9090/denodo-restfulws/.../views/view1?$filter='register_value={"f1":"value", "boolean_value": true}'
JSON では、配列値は角括弧で始まり、角括弧で終わります。配列の各レジスターはカンマで区切ります。以下に例を示します。
http://acme:9090/denodo-restfulws/.../views/view1?$filter='array_value=[{"f1":"value", "boolean_value": true}', {"f1":"value2", "boolean_value": false}']
重要
見やすさを考慮して、上記の URL はエスケープしていません。実際には、HTTP クライアントはすべてのパラメータの値をエスケープする必要があります。たとえば、以下の URL を呼び出すとします。
http://acme:9090/denodo-restfulws/.../views/view1?$filter='array_value=[{"f1":"value", "boolean_value": true}', {"f1":"value2", "boolean_value": false}']
これを、以下のようにエスケープする必要があります。
http://acme:9090/denodo-restfulws/.../views/view1?$filter=%27array_value=[{%22f1%22:%22value%22,%20%22boolean_value%22:%20true}%27,%20{%22f1%22:%22value2%22,%20%22boolean_value%22:%20false}%27]
JSON 構文の制限
JSON ドキュメントは、フィールドの値としてではなく、
$filter
パラメータで指定する必要があります。つまり、?field_name='<json document>'
は機能しません。JSON ドキュメントは必ず一重引用符で囲み、JSON ドキュメント内部で使用している一重引用符はエスケープします。一重引用符をエスケープするには、その直前に一重引用符を 1 つ付加します。