Filtrez les résultats de requête côté serveur en appliquant SingleColumnValueFilter ou CompositeColumnValueFilter dans le SDK PHP Tablestore.
Prérequis
Avant de commencer, assurez-vous d'avoir :
Fonctionnement des filtres
Les filtres s'exécutent sur le serveur après que Tablestore a lu les lignes correspondant à votre plage de clés primaires, mais avant de renvoyer les résultats à votre application. La lecture ayant lieu en premier, les filtres ne réduisent pas la consommation d'unités de capacité (CU) de lecture : votre application est facturée pour la lecture de toutes les lignes de la plage, quel que soit le nombre de lignes validées par le filtre. Utilisez les filtres pour réduire le transfert réseau et le traitement côté application, et non pour diminuer les coûts de lecture.
Si un filtre ne réduit pas significativement l'ensemble des résultats, envisagez d'utiliser une plage de clés primaires plus sélective ou un index secondaire.
Tablestore propose deux types de filtres :
SingleColumnValueFilter : évalue une seule colonne d'attribut par rapport à une condition.
CompositeColumnValueFilter : combine jusqu'à 32 conditions de filtrage à l'aide des opérateurs logiques AND, OR ou NOT.
SingleColumnValueFilter
Utilisez SingleColumnValueFilter pour filtrer les lignes en fonction de la valeur d'une colonne d'attribut.
[
'column_name' => '<string>',
'value' => <ColumnValue>,
'comparator' => <ComparatorType>,
'pass_if_missing' => true || false,
'latest_version_only' => true || false
]
Exemple
L'exemple suivant lit les lignes dont les clés primaires se situent dans la plage [row1, row3) à l'aide de getRange, puis applique un filtre pour ne renvoyer que les lignes où col1 est égal à 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.";
}
-
Pour exclure les lignes qui ne contiennent pas la colonne d'attribut spécifiée, définissez
pass_if_missingsurfalse:$request['column_filter']['pass_if_missing'] = false; -
Pour renvoyer une ligne si n'importe quelle version de la colonne d'attribut satisfait la condition (et pas seulement la dernière), définissez
latest_version_onlysurfalse:$request['column_filter']['latest_version_only'] = false;
CompositeColumnValueFilter
Utilisez CompositeColumnValueFilter pour combiner jusqu'à 32 conditions de filtrage à l'aide d'opérateurs logiques.
[
'logical_operator' => <LogicalOperator>
'sub_filters' => [
<ColumnFilter>,
<ColumnFilter>,
<ColumnFilter>,
// other conditions
]
]
Exemple
L'exemple suivant lit les lignes dont les clés primaires se situent dans la plage [row1, row3) et applique un filtre composite avec la condition (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.";
}