Filtre resultados de consultas no servidor ao aplicar SingleColumnValueFilter ou CompositeColumnValueFilter no Tablestore PHP SDK.
Pré-requisitos
Antes de começar, verifique se você:
Como os filtros funcionam
O servidor executa os filtros após o Tablestore ler as linhas correspondentes ao intervalo de chave primária, mas antes de retornar os resultados à aplicação. Como a leitura ocorre primeiro, os filtros não reduzem o consumo de unidades de capacidade de leitura (CU). A cobrança abrange a leitura de todas as linhas no intervalo, independentemente de quantas linhas o filtro aprovar. Use filtros para reduzir a transferência de rede e o processamento na aplicação, não para diminuir custos de leitura.
Se um filtro não reduzir significativamente o conjunto de resultados, considere usar um intervalo de chave primária mais seletivo ou um índice secundário.
O Tablestore oferece dois tipos de filtro:
SingleColumnValueFilter: Avalia uma única coluna de atributo com base em uma condição.
CompositeColumnValueFilter: Combina até 32 condições de filtro com os operadores lógicos AND, OR ou NOT.
SingleColumnValueFilter
Use SingleColumnValueFilter para filtrar linhas com base no valor de uma coluna de atributo.
[
'column_name' => '<string>',
'value' => <ColumnValue>,
'comparator' => <ComparatorType>,
'pass_if_missing' => true || false,
'latest_version_only' => true || false
]
Exemplo
O exemplo a seguir lê linhas com chaves primárias no intervalo [row1, row3) por meio de getRange e aplica um filtro para retornar apenas as linhas em que col1 seja igual a val1.
$request = array (
'table_name' => 'test_table',
// Set the start primary key for the range query.
'inclusive_start_primary_key' => array (
array('id', 'row1')
),
// Set the end primary key for the range query. The result does not include this key.
'exclusive_end_primary_key' => array (
array('id', 'row3')
),
// Read data in forward order.
'direction' => DirectionConst::CONST_FORWARD,
// Read the latest version of data.
'max_versions' => 1,
// Return only rows where col1 equals "val1".
'column_filter' => array (
'column_name' => 'col1',
'value' => 'val1',
'comparator' => ComparatorTypeConst::CONST_EQUAL
)
);
try {
// Call getRange to read rows.
$response = $client->getRange ($request);
// Process the response.
echo "* Read CU Cost: " . $response['consumed']['capacity_unit']['read'] . "\n";
echo "* Write CU Cost: " . $response['consumed']['capacity_unit']['write'] . "\n";
echo "* Row Data: " . "\n";
foreach ($response['rows'] as $row) {
echo json_encode($row) . "\n";
}
} catch (Exception $e){
echo "Get Range failed.";
}
-
Para excluir linhas sem a coluna de atributo especificada, defina
pass_if_missingcomofalse:$request['column_filter']['pass_if_missing'] = false; -
Para retornar uma linha se qualquer versão da coluna de atributo atender à condição (não apenas a mais recente), defina
latest_version_onlycomofalse:$request['column_filter']['latest_version_only'] = false;
CompositeColumnValueFilter
Use CompositeColumnValueFilter para combinar até 32 condições de filtro com operadores lógicos.
[
'logical_operator' => <LogicalOperator>
'sub_filters' => [
<ColumnFilter>,
<ColumnFilter>,
<ColumnFilter>,
// other conditions
]
]
Exemplo
Este exemplo lê linhas com chaves primárias no intervalo [row1, row3) e aplica um filtro composto com a condição (col1 = val1 OR col2 = val2) AND (col3 = val3).
$request = array (
'table_name' => 'test_table',
// Set the start primary key for the range query.
'inclusive_start_primary_key' => array (
array('id', 'row1')
),
// Set the end primary key for the range query. The result does not include this key.
'exclusive_end_primary_key' => array (
array('id', 'row3')
),
// Read data in forward order.
'direction' => DirectionConst::CONST_FORWARD,
// Read the latest version of data.
'max_versions' => 1
);
// Combine conditions: (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 {
// Call getRange to read rows.
$response = $client->getRange ($request);
// Process the response.
echo "* Read CU Cost: " . $response['consumed']['capacity_unit']['read'] . "\n";
echo "* Write CU Cost: " . $response['consumed']['capacity_unit']['write'] . "\n";
echo "* Row Data: " . "\n";
foreach ($response['rows'] as $row) {
echo json_encode($row) . "\n";
}
} catch (Exception $e){
echo "Get Range failed.";
}