Tablestore PHP SDK で SingleColumnValueFilter または CompositeColumnValueFilter を適用することにより、サーバー側でクエリ結果をフィルタリングします。
前提条件
フィルターの種類
Tablestore では、以下のフィルターが提供されています。
-
SingleColumnValueFilter:単一の属性列の値を条件と照合して評価します。
-
CompositeColumnValueFilter:論理演算子を用いて複数のフィルター条件を組み合わせます。論理演算子を使用して最大 32 個のフィルター条件を組み合わせることができます。
SingleColumnValueFilter
[
'column_name' => '<string>',
'value' => <ColumnValue>,
'comparator' => <ComparatorType>,
'pass_if_missing' => true || false,
'latest_version_only' => true || false
]
例
次の例では、範囲クエリを使用して、プライマリキーが範囲 [row1, row3) 内にある行を読み取り、その後フィルターを適用して、col1 が val1 に等しい行のみを返します。
$request = array (
'table_name' => 'test_table',
// 範囲クエリの開始プライマリキーを設定します。
'inclusive_start_primary_key' => array (
array('id', 'row1')
),
// 範囲クエリの終了プライマリキーを設定します。結果にはこのキーは含まれません。
'exclusive_end_primary_key' => array (
array('id', 'row3')
),
// 順方向でデータを読み取ります。
'direction' => DirectionConst::CONST_FORWARD,
// 最新バージョンのデータを読み取ります。
'max_versions' => 1,
// col1 の値が "val1" と等しい行を返すフィルターを構築します。
'column_filter' => array (
'column_name' => 'col1',
'value' => 'val1',
'comparator' => ComparatorTypeConst::CONST_EQUAL
)
);
try {
// getRange を呼び出して行を読み取ります。
$response = $client->getRange ($request);
// 応答を処理します。
echo "* 読み取り CU コスト: " . $response['consumed']['capacity_unit']['read'] . "\n";
echo "* 書き込み CU コスト: " . $response['consumed']['capacity_unit']['write'] . "\n";
echo "* 行データ: " . "\n";
foreach ($response['rows'] as $row) {
echo json_encode($row) . "\n";
}
} catch (Exception $e){
echo "範囲クエリの実行に失敗しました。";
}
-
指定された属性列を含まない行を除外するには、以下のように設定します。
$request['column_filter']['pass_if_missing'] = false; -
属性列のすべてのバージョンを評価する(いずれかのバージョンが条件を満たせば行を返す)には、以下のように設定します。
$request['column_filter']['latest_version_only'] = false;
CompositeColumnValueFilter
論理演算子を用いて最大 32 個のフィルター条件を組み合わせます。
[
'logical_operator' => <LogicalOperator>
'sub_filters' => [
<ColumnFilter>,
<ColumnFilter>,
<ColumnFilter>,
// その他の条件
]
]
例
以下の例では、プライマリキーが [row1, row3) の範囲にある行を読み取り、(col1 = val1 OR col2 = val2) AND (col3 = val3) の条件を持つ CompositeColumnValueFilter を適用します。
$request = array (
'table_name' => 'test_table',
// 範囲クエリの開始プライマリキーを設定します。
'inclusive_start_primary_key' => array (
array('id', 'row1')
),
// 範囲クエリの終了プライマリキーを設定します。結果にはこのキーは含まれません。
'exclusive_end_primary_key' => array (
array('id', 'row3')
),
// 順方向でデータを読み取ります。
'direction' => DirectionConst::CONST_FORWARD,
// 最新バージョンのデータを読み取ります。
'max_versions' => 1
);
// 条件を組み合わせます: (col1 = val1 OR col2 = val2) AND (col3 = val3)
$request['column_filter'] = array(
'logical_operator' => LogicalOperatorConst::CONST_AND,
'sub_filters' => array(
array(
'logical_operator' => LogicalOperatorConst::CONST_OR,
'sub_filters' => array(
array(
'comparator' => ComparatorTypeConst::CONST_EQUAL,
'column_name' => 'col1',
'value' => 'val1'
),
array(
'comparator' => ComparatorTypeConst::CONST_EQUAL,
'column_name' => 'col2',
'value' => 'val2'
)
)
),
array(
'comparator' => ComparatorTypeConst::CONST_EQUAL,
'column_name' => 'col3',
'value' => 'val3'
)
)
);
try {
// getRange を呼び出して行を読み取ります。
$response = $client->getRange ($request);
// 応答を処理します。
echo "* 読み取り CU コスト: " . $response['consumed']['capacity_unit']['read'] . "\n";
echo "* 書き込み CU コスト: " . $response['consumed']['capacity_unit']['write'] . "\n";
echo "* 行データ: " . "\n";
foreach ($response['rows'] as $row) {
echo json_encode($row) . "\n";
}
} catch (Exception $e){
echo "範囲クエリの実行に失敗しました。";
}