Le SDK Tablestore pour Java filtre les lignes selon la valeur d'une colonne ou renvoie une partie des colonnes d'attributs côté serveur afin de réduire le volume de données transféré vers le client.
Prérequis
Installez le SDK Tablestore pour Java et initialisez le client.
Description
Un filtre s'exécute côté serveur après la lecture de chaque ligne et ne renvoie que celles correspondant à vos critères. Comme le filtrage intervient après la lecture, il ne réduit pas le nombre de lignes analysées, mais diminue le volume de données envoyées sur le réseau.
Pour définir un filtre, appelez setFilter sur SingleRowQueryCriteria, RangeRowQueryCriteria, MultiRowQueryCriteria ou RangeIteratorParameter. Les types de filtres disponibles sont les suivants :
SingleColumnValueFilter : compare la valeur d'une colonne de propriété à une valeur cible à l'aide d'un opérateur relationnel.
SingleColumnValueRegexFilter : extrait une sous-chaîne d'une colonne de propriété de type
Stringvia une expression régulière, la convertit dans un type cible et la compare à une valeur cible.CompositeColumnValueFilter : combine plusieurs filtres à l'aide d'opérateurs logiques (
AND,ORouNOT). Un filtre composite prend en charge jusqu'à 32 sous-conditions.ColumnPaginationFilter : renvoie des colonnes d'attributs selon un décalage et une limite, sans évaluer les valeurs des colonnes.
new SingleColumnValueFilter(columnName, operator, columnValue)
new SingleColumnValueRegexFilter(columnName, regexRule, operator, columnValue)
new CompositeColumnValueFilter(logicOperator)
new ColumnPaginationFilter(limit, offset)
L'exemple suivant lit les lignes de la table filter_demo où la colonne col1 est égale à val1 en utilisant SingleColumnValueFilter.
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("filter_demo");
PrimaryKeyBuilder startBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
criteria.setInclusiveStartPrimaryKey(startBuilder.build());
PrimaryKeyBuilder endBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
criteria.setExclusiveEndPrimaryKey(endBuilder.build());
criteria.setMaxVersions(1);
// Build the filter: col1 == "val1"
SingleColumnValueFilter filter = new SingleColumnValueFilter(
"col1",
SingleColumnValueFilter.CompareOperator.EQUAL,
ColumnValue.fromString("val1"));
criteria.setFilter(filter);
GetRangeResponse response = client.getRange(new GetRangeRequest(criteria));
System.out.println("Matched rows: " + response.getRows().size());
Paramètres
Filtre de valeur de colonne unique
Le constructeur de SingleColumnValueFilter accepte les paramètres suivants.
|
Nom |
Type |
Description |
|
columnName (obligatoire) |
String |
Nom de la colonne de propriété à évaluer. |
|
operator (obligatoire) |
CompareOperator |
Opérateur relationnel. Valeurs valides :
|
|
columnValue (obligatoire) |
ColumnValue |
Valeur utilisée pour la comparaison. |
|
passIfMissing (facultatif) |
boolean |
Indique si les lignes ne contenant pas la colonne cible doivent être renvoyées. Par défaut, Définissez cette option sur |
|
latestVersionsOnly (facultatif) |
boolean |
Indique si seule la dernière version de la colonne doit être évaluée. Par défaut, Définissez cette option sur |
Filtre d'expression régulière
Le constructeur de SingleColumnValueRegexFilter accepte les paramètres suivants. Si vous spécifiez une règle d'expression régulière, la colonne d'attribut cible doit être de type String.
|
Nom |
Type |
Description |
|
columnName (obligatoire) |
String |
Nom de la colonne d'attribut à évaluer. Si |
|
regexRule (facultatif) |
RegexRule |
Règle de correspondance d'expression régulière. Si elle est spécifiée, le filtre extrait une sous-chaîne de la valeur de la colonne de type chaîne, convertit la sous-chaîne, puis l'évalue. Si elle est omise, le filtre évalue la valeur originale de la colonne. La règle contient les paramètres suivants :
|
|
operator (obligatoire) |
CompareOperator |
Opérateur d'évaluation. Valeurs valides : |
|
columnValue (facultatif) |
ColumnValue |
Valeur de comparaison. Ce paramètre est requis pour les six opérateurs relationnels et doit être omis pour |
|
latestVersionsOnly (facultatif) |
boolean |
Indique si seule la dernière version de la colonne d'attribut doit être évaluée. Valeur par défaut : |
Filtre composite
Le constructeur et la liste des sous-filtres de CompositeColumnValueFilter acceptent les paramètres suivants. Ajoutez des sous-filtres en appelant addFilter(). Un filtre composite prend en charge jusqu'à 32 sous-conditions.
|
Nom |
Type |
Description |
|
type (obligatoire) |
LogicOperator |
Opérateur logique. Valeurs valides :
|
|
filters (obligatoire) |
List<ColumnValueFilter> |
Sous-filtres combinés par l'opérateur logique. Ajoutez chaque sous-filtre avec |
Filtre de pagination des colonnes d'attributs
Le constructeur de ColumnPaginationFilter accepte les paramètres suivants. Si offset est omis, la valeur par défaut est 0.
|
Nom |
Type |
Description |
|
limit (obligatoire) |
int |
Nombre de colonnes d'attributs à renvoyer. La valeur doit être supérieure à 0. |
|
offset (facultatif) |
int |
Décalage basé sur zéro de la première colonne d'attribut à renvoyer. La valeur doit être supérieure ou égale à 0. Valeur par défaut : |
Exemples
Comparer une sous-chaîne extraite avec une expression régulière
Utilisez RegexRule pour extraire une sous-chaîne d'une valeur de colonne, puis comparez-la à une valeur cible. L'exemple suivant applique l'expression régulière 1([a-z]+)5 à col2, capture le premier groupe et le compare à la chaîne aaa.
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("filter_demo");
PrimaryKeyBuilder startBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
criteria.setInclusiveStartPrimaryKey(startBuilder.build());
PrimaryKeyBuilder endBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
criteria.setExclusiveEndPrimaryKey(endBuilder.build());
criteria.setMaxVersions(1);
// The regex "1([a-z]+)5" captures the first group; castType=VT_STRING compares the result as a string.
RegexRule regexRule = new RegexRule("1([a-z]+)5", RegexRule.CastType.VT_STRING);
SingleColumnValueRegexFilter filter = new SingleColumnValueRegexFilter(
"col2",
regexRule,
SingleColumnValueRegexFilter.CompareOperator.EQUAL,
ColumnValue.fromString("aaa"));
criteria.setFilter(filter);
GetRangeResponse response = client.getRange(new GetRangeRequest(criteria));
System.out.println("Matched rows: " + response.getRows().size());
Combiner plusieurs filtres avec des opérateurs logiques
Utilisez CompositeColumnValueFilter pour combiner plusieurs filtres à l'aide d'opérateurs logiques. Les filtres composites peuvent être imbriqués. L'exemple suivant construit la condition (col1 == "val1" OR cast<String>(reg(col2)) >= "aaa") AND col3 == "val3".
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("filter_demo");
PrimaryKeyBuilder startBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
criteria.setInclusiveStartPrimaryKey(startBuilder.build());
PrimaryKeyBuilder endBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
criteria.setExclusiveEndPrimaryKey(endBuilder.build());
criteria.setMaxVersions(1);
// Leaf 1: col1 == "val1"
SingleColumnValueFilter leaf1 = new SingleColumnValueFilter(
"col1",
SingleColumnValueFilter.CompareOperator.EQUAL,
ColumnValue.fromString("val1"));
// Leaf 2: cast<String>(reg(col2)) >= "aaa"
RegexRule regexRule = new RegexRule("1([a-z]+)5", RegexRule.CastType.VT_STRING);
SingleColumnValueRegexFilter leaf2 = new SingleColumnValueRegexFilter(
"col2",
regexRule,
SingleColumnValueRegexFilter.CompareOperator.GREATER_EQUAL,
ColumnValue.fromString("aaa"));
// OR combination: leaf1 OR leaf2
CompositeColumnValueFilter orFilter = new CompositeColumnValueFilter(
CompositeColumnValueFilter.LogicOperator.OR);
orFilter.addFilter(leaf1);
orFilter.addFilter(leaf2);
// Leaf 3: col3 == "val3"
SingleColumnValueFilter leaf3 = new SingleColumnValueFilter(
"col3",
SingleColumnValueFilter.CompareOperator.EQUAL,
ColumnValue.fromString("val3"));
// AND combination: (leaf1 OR leaf2) AND leaf3
CompositeColumnValueFilter andFilter = new CompositeColumnValueFilter(
CompositeColumnValueFilter.LogicOperator.AND);
andFilter.addFilter(orFilter);
andFilter.addFilter(leaf3);
criteria.setFilter(andFilter);
GetRangeResponse response = client.getRange(new GetRangeRequest(criteria));
System.out.println("Matched rows: " + response.getRows().size());
Contrôler l'évaluation des colonnes manquantes et des versions historiques
Utilisez setPassIfMissing pour contrôler si les lignes ne contenant pas la colonne cible sont renvoyées, et setLatestVersionsOnly pour contrôler si les versions historiques sont également évaluées.
SingleColumnValueFilter filter = new SingleColumnValueFilter(
"col1",
SingleColumnValueFilter.CompareOperator.EQUAL,
ColumnValue.fromString("val1"));
// Skip rows that do not contain col1 (default: include such rows).
filter.setPassIfMissing(false);
// Evaluate all versions; return the row if any version matches (default: evaluate only the latest version).
filter.setLatestVersionsOnly(false);
criteria.setFilter(filter);
Renvoyer une page de colonnes d'attributs
Utilisez ColumnPaginationFilter pour renvoyer un nombre spécifié de colonnes d'attributs à partir d'un décalage. L'exemple suivant ignore la première colonne d'attribut et renvoie les deux suivantes.
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
.build();
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("filter_demo", primaryKey);
criteria.setMaxVersions(1);
criteria.setFilter(new ColumnPaginationFilter(2, 1));
GetRowResponse response = client.getRow(new GetRowRequest(criteria));
for (Column column : response.getRow().getColumns()) {
System.out.println(column.getName());
}