Realtime Databases Part 3— Índices e Queries

No último post escrevi sobre security rules e sobre a sua importância na segurança e perfomance na realtime database.
Resumindo, as regras de segurança do Firebase são escritas em um ficheiro que fica guardado nos servidores do Firebase e neles podemos definir quatro tipos de regras para cada um dos nos da nossa realtime database utilizando 4 componentes nomeadamente:

“.read” — Para definir as regras para a leitura de dados

“.write” — Para definir as regras para a escrita de dados

“.validate” — Para validar o tipo de dados a serem escritos ou editados

“.indexOn” — Para definir os índices a utilizar para melhorar as operações de busca no no onde esta especificada.

Este post será sobre o componente “.indexOn” que não cobrimos no post anterior.

Ate então, aprendemos sobre os conceitos básicos de leitura de dados na realtime database que fizemos em 2 tipos de cenários, em que o primeiro consiste apenas em procurar um dado em um caminho utilizando o id e o ValueEventListener ou pegar todos os dados de um caminho específico para uma lista utilizando o ChildEventListener.
Porque o básico não é suficiente e queremos desenvolver aplicações que são necessárias fazer vários tipos de pesquisas e organizações de dados, iremos aprender neste post a definir índices a nossa realtime database e aprender como utilizar estes índices para realizar diferentes tipos de pesquisas(queries ) a realtime database.

Definição de Índices

A definição dos índices na realtime database começa com a estrutura dos nossos dados pois os índices são nada mais e nada menos valores que simbolizam uma característica única do objecto que estamos a representar que pode ser utilizado para fazer pesquisas ou ordenações.

Um exemplo clássico de uma variável que pode ser considerada como índice em uma aplicação de chat é o timestamp(Momento em que uma mensagem foi enviada) que pode ser utilizado como forma de ordenar as mensagens na ordem em que estas foram enviadas.
Seguindo este mesmo exemplo, uma variável péssima seria o conteúdo da mensagem que não é relevante nem em caso de pesquisa ou ordenação de mensagens.

Para este post, vamos utilizar um exemplo em que realizamos comentários para um determinado item como mencionei ao definir as regras de segurança no post anterior.

Começando pela estrutura, imaginemos que queremos guardar todos os comentários de um produto como mostra a estrutura da imagem abaixo.

Tendo em conta a estrutura acima, vamos assumir que o utilizador fez muito mais comentários e gostaria de poder ler os comentários e organiza-los pelo valor do rating(Seja este crescente ou decrescente) ou pelo data em que foi feito o comentário.
Olhando para estrutura acima teríamos 2 índices para facilitar este processo de busca e ordenação, as variáveis “rating” e “timestamp”. 
Após identificar as variáveis, o passo seguinte é simplesmente definir os índices no ficheiro de regras de segurança como mostra a figura abaixo.

Com os índices definidos, o próximo passo é fazer as pesquisas para que possamos testar se foram devidamente definidos.
Como mencionei no post sobre Realtime Databases — Part 1 , a API do Firebase oferece uma sublcasse da classe DatabaseReference com o nome de Query que nos permite criar queries com diferentes parâmetros que nos permitem definir a prioridade da ordenação, o tipo de ordenação, intervalos para fazer a pesquisa ou ordenação entre outros como mostra a documentação aqui.

Usando a estrutura acima, poderíamos por exemplo construir uma query para obter os comentários a partir de uma data especifica criando um objecto da classe Query onde especificamos o caminho seguido do método orderByChild(“o caminho da chave que vamos utilizar para ordenação”) e o método startAt onde definimos o valor que ira representar o limite inferior da nossa query. Caso quiséssemos especificar um intervalo, poderíamos utilizar o método endAt para passar o valor correspondente ao limite superior.

Query reviewsQuery = mDatabase.getReference().child("reviews").child(userId);
reviewsQuery.orderByChild("timestamp").startAt(timestamp,"timestamp");

Com este pequeno exemplo terminamos mais um post e por sinal o fim dos posts sobre realtime database.

No dia 2 de Setembro irei disponibilizar o código no github com mais detalhes sobre tudo que estivemos a aprender nos últimos posts sobre a realtime database e o serviço de autenticação.

Espero que tenham se divertido,
Ate a próxima.

;)