O Tablestore oferece filtragem de dados no servidor com base em condições específicas durante consultas. Use filtros no SDK do Python para retornar apenas as linhas correspondentes aos critérios definidos.
Pré-requisitos
Antes de começar, verifique se você:
Funcionamento dos filtros
O servidor avalia os filtros após o Tablestore verificar as linhas correspondentes ao intervalo de chave primária definido. O sistema consome unidades de capacidade de leitura (RCU) para cada linha verificada, independentemente de ela atender ao filtro. Para reduzir o consumo desnecessário de RCU, defina um intervalo de chave primária preciso antes de aplicar qualquer filtro.
O Tablestore disponibiliza dois tipos de filtro:
SingleColumnCondition— filtra linhas com base no valor de uma única coluna de atributo. Use este filtro para comparar uma coluna específica com um valor fixo.CompositeColumnCondition— combina várias condições usando operadores lógicos (AND, OR, NOT). Use este filtro quando a lógica envolver múltiplas colunas ou exigir expressões compostas. Aceita até 32 condições.
SingleColumnCondition
Filtra linhas conforme uma única coluna de atributo atenda a uma condição de comparação.
class SingleColumnCondition(ColumnCondition)
Exemplo de código
O exemplo abaixo executa uma consulta por intervalo para linhas com chave primária entre [row1, row3) e retorna apenas aquelas em que a coluna de atributo col1 seja igual a val1.
try:
# Set the start primary key for the query.
inclusive_start_primary_key = [('id', 'row1')]
# Set the end primary key for the query. The end key is exclusive.
exclusive_end_primary_key = [('id', 'row3')]
# Create a filter with the condition col1 == "val1".
singleColumnCondition = SingleColumnCondition('col1', 'val1', ComparatorType.EQUAL)
# Call the get_range method to query data.
consumed, next_start_primary_key, row_list, next_token = client.get_range('test_table', Direction.FORWARD,
inclusive_start_primary_key,
exclusive_end_primary_key,
column_filter=singleColumnCondition)
# Process the results.
print('* Read CU Cost: %s' % consumed.read)
print('* Write CU Cost: %s' % consumed.write)
print('* Rows Data:')
for row in row_list:
print(row.primary_key, row.attribute_columns)
except Exception as e:
print("Range get failed with error: %s" % e)
-
Para excluir linhas sem a coluna de atributo especificada:
singleColumnCondition.pass_if_missing = False -
Para avaliar todas as versões dos dados e retornar a linha caso qualquer versão atenda à condição:
singleColumnCondition.latest_version_only = False
CompositeColumnCondition
Combina múltiplas condições de filtro por meio de operadores lógicos. Aceita até 32 condições e permite aninhar objetos CompositeColumnCondition para criar expressões complexas.
class CompositeColumnCondition(ColumnCondition)
Exemplo de código
O exemplo a seguir executa uma consulta por intervalo para linhas com chave primária no intervalo [row1, row3) e aplica um filtro composto:
(col1 == "val1" OR col2 == "val2") AND col3 == "val3"
try:
# Set the start primary key for the query.
inclusive_start_primary_key = [('id', 'row1')]
# Set the end primary key for the query. The end key is exclusive.
exclusive_end_primary_key = [('id', 'row3')]
# Create the first single-column condition: col1 == "val1".
singleColumnCondition1 = SingleColumnCondition('col1', 'val1', ComparatorType.EQUAL)
# Create the second single-column condition: col2 == "val2".
singleColumnCondition2 = SingleColumnCondition('col2', 'val2', ComparatorType.EQUAL)
# Create the first composite condition: col1 == "val1" OR col2 == "val2".
compositeColumnCondition1 = CompositeColumnCondition(LogicalOperator.OR)
compositeColumnCondition1.add_sub_condition(singleColumnCondition1)
compositeColumnCondition1.add_sub_condition(singleColumnCondition2)
# Create the third single-column condition: col3 == "val3".
singleColumnCondition3 = SingleColumnCondition('col3', 'val3', ComparatorType.EQUAL)
# Create the final composite condition: (col1 == "val1" OR col2 == "val2") AND col3 == "val3".
compositeColumnCondition2 = CompositeColumnCondition(LogicalOperator.AND)
compositeColumnCondition2.add_sub_condition(compositeColumnCondition1)
compositeColumnCondition2.add_sub_condition(singleColumnCondition3)
# Call the get_range method to query data.
consumed, next_start_primary_key, row_list, next_token = client.get_range('test_table', Direction.FORWARD,
inclusive_start_primary_key,
exclusive_end_primary_key,
column_filter=compositeColumnCondition2)
# Process the results.
print('* Read CU Cost: %s' % consumed.read)
print('* Write CU Cost: %s' % consumed.write)
print('* Rows Data:')
for row in row_list:
print(row.primary_key, row.attribute_columns)
except Exception as e:
print("Range get failed with error: %s" % e)