play.html, disponibilizada no caminho /play de qualquer porta HTTP do ClickHouse) pode ordenar um resultado por suas colunas, filtrá-lo por seus valores e paginá-lo — tudo isso sem editar a consulta.
Nada disso ocorre no navegador. Cada alteração executa novamente a consulta com a configuração de construção de consulta correspondente, que o servidor materializa ao encapsular a consulta como uma tabela derivada com ORDER BY, WHERE e LIMIT externos. Portanto, o resultado exibido é o resultado ordenado, filtrado e paginado da consulta inteira, e não uma reorganização das linhas que a página continha.
Ordenação
aria-sort).
Em dispositivos com ponteiro que permite passar o cursor (um mouse), as setas são exibidas apenas enquanto o cursor está sobre o cabeçalho ou uma seta está em foco, para que não atrapalhem nos demais casos; em dispositivos de toque e outros dispositivos com ponteiro impreciso, que não têm hover, elas são sempre exibidas para que possam ser tocadas diretamente. Uma coluna que faz parte da ordenação mostra ambas as setas sem passar o cursor — uma para que a ordenação seja compreendida de relance, a outra porque inverter a direção é a próxima ação mais provável.
Todos os ícones em um cabeçalho de coluna são exibidos da mesma forma, independentemente do recurso que controlam: ficam sem cor enquanto esse recurso não estiver ativo na coluna e são exibidos na cor reservada para controles ativos — magenta no tema claro, amarelo no escuro — quando estiver, que é também quando permanecem visíveis sem passar o cursor. A perda de cor nunca envolve transparência; portanto, um ícone nunca parece desbotado sobre o nome de uma coluna ou sobre a codificação por cores das células.
Ordenação por várias colunas
ORDER BY: a primeira chave decide, e cada chave subsequente desempata as anteriores. Com mais de uma chave de ordenação, cada seta ativa também mostra, em sobrescrito, a posição de sua coluna nessa ordem (▼¹, ▲², …).
Usar Shift em uma coluna que já é uma chave de ordenação apenas altera seu sentido e mantém sua posição na ordem. Desativar uma coluna remove apenas essa coluna e mantém as chaves restantes no lugar.
Filtragem
A partir do cabeçalho de uma coluna
> 10 para um número, LIKE '%test%' para uma string. O campo é aberto dentro da célula do cabeçalho, que ganha uma segunda linha para acomodá-lo — a mesma linha em que o filtro é mostrado depois de definido; assim, o filtro é editado onde é exibido. O que é digitado é a parte que vem após o nome da coluna, portanto, > 10 se torna WHERE column > 10, e qualquer expressão aceita pelo servidor nesse ponto funciona — BETWEEN 1 AND 5, IN (1, 2, 3), IS NOT NULL, % 2 = 0.
Pressionar o botão de aplicar (ou Enter) aplica o filtro e executa a consulta novamente; Esc, clicar ou navegar com Tab para qualquer outro lugar cancela a edição e fecha o campo. O botão de aplicar fica inativo quando não há nada a aplicar — uma caixa vazia em uma coluna sem filtro —, mas permanece ativo quando a caixa está vazia em uma coluna que tem filtro, pois esvaziar a caixa e aplicar remove o filtro. Os filtros em várias colunas são combinados com AND.
A partir de uma célula
Ao escolher uma opção, ela é aplicada imediatamente. Uma data, hora ou enum é comparado ao texto exato com que o servidor o exibiu, que o ClickHouse analisa novamente como o tipo da própria coluna (no caso de um enum, o nome do valor).
contains se torna um padrão LIKE com os caracteres % e _ do valor escapados, portanto corresponde literalmente ao valor. Uma célula cujo valor não seja nenhum dos anteriores — um array, uma tupla, um map ou um texto longo — não oferece menu; sua coluna ainda pode ser filtrada pela entrada do cabeçalho.
O filtro em vigor
Paginação
page; em seguida, executa novamente a consulta. O servidor converte a página no OFFSET correspondente. O paginador permanece enquanto o resultado estiver paginado, mesmo quando cada página estiver exatamente cheia e, portanto, não parecer mais truncada.
O número de páginas não é exibido, pois é desconhecido — contar as linhas do resultado exigiria executar uma segunda consulta. O paginador lista as dez páginas anteriores à atual, a atual e a próxima, seguidas de …. Clicar em … o transforma em um campo para inserir qualquer número de página, que é aceito quando o campo perde o foco (pressionar Enter faz isso).
A próxima página é oferecida apenas enquanto a atual estiver cheia. Uma página que retorna menos linhas do que comporta marca o fim do resultado; portanto, não há página depois dela. (Um resultado cujo tamanho seja exatamente um múltiplo do tamanho da página ainda oferece mais uma página, que então retorna vazia: distinguir esse caso também exigiria contar as linhas.)
Por página mostra quantas linhas uma página comporta e é editado da mesma forma: clique no valor e digite outro. Ele não pode exceder o que o resultado pode exibir de uma vez — uma página maior retornaria linhas que a tabela truncaria, e a próxima página começaria depois delas; assim, continuar a paginação ignoraria silenciosamente as linhas que nunca couberam. Um número maior é considerado esse máximo, que passa a ser o valor exibido. Alterá-lo recomeça na primeira página, pois páginas com um novo tamanho contêm linhas diferentes.
Alterar a ordenação ou qualquer filtro retorna à primeira página: ambos mudam quais linhas o resultado contém ou sua ordem, portanto a página em que o usuário estava não representa mais a mesma parte do resultado.
Como é aplicado
order, filter, limit e page. Como o servidor as aplica à consulta analisada sintaticamente, e não ao seu texto, elas se combinam com o que a consulta já contém: uma UNION, uma cláusula FORMAT ao final ou seus próprios ORDER BY e LIMIT continuam funcionando, e a consulta no editor nunca é reescrita.
Os nomes das colunas são passados como identificadores entre aspas; portanto, uma coluna de resultado cujo nome é uma expressão (count()) ou contém um espaço pode ser usada como chave de ordenação ou filtro.
Quando está disponível
SELECT e UNION (incluindo consultas que começam com uma cláusula WITH ou com FROM). Ela não é oferecida para SHOW, DESCRIBE, EXISTS ou EXPLAIN: essas instruções produzem uma tabela, mas as configurações não se aplicam a elas; portanto, um controle nesse caso prometeria um resultado que as linhas não têm.
Uma forma se aplica ao resultado de uma única instrução; portanto, ela não é oferecida em uma execução de várias instruções com “Executar todas”, cujas instruções são consultas separadas com colunas distintas.
Ela também não é oferecida para um resultado de no máximo uma linha em sua primeira página: qualquer ordenação de uma única linha é a mesma ordenação, e um filtro nela só pode mantê-la ou descartá-la; portanto, os controles não poderiam fazer nada além de executar novamente a consulta para as mesmas linhas — e um resultado vazio nem sequer tem uma linha para descartar. Esse é o mesmo motivo pelo qual os controles de codificação por cores ficam ocultos nesse caso: com no máximo uma linha, não há nada para comparar.
Dois tipos de resultados com uma única linha mantêm seus controles, pois, nesses casos, os controles são a única forma de voltar atrás:
- um que já está ordenado ou filtrado, cuja ordenação deve permanecer reversível e cujo filtro deve permanecer removível — um filtro que corresponde a uma única linha é exatamente como um resultado longo se torna curto, e remover os controles junto com ele deixaria o usuário preso com ele ativado;
- um truncado no limite de exibição, que é a primeira página de um resultado mais longo: o tamanho da página é limitado pelo número de células que a tabela pode mostrar de uma vez; portanto, um resultado muito amplo pode ser truncado para uma única linha, e as linhas posteriores são precisamente aquelas que a ordenação e a paginação permitem alcançar.
ORDER BY ou uma cláusula WHERE a uma coluna que talvez não exista na nova instrução.
Ela também pertence ao contexto em que a instrução foi executada: o banco de dados selecionado, o servidor e o usuário aos quais ela foi enviada e os valores dos parâmetros da consulta. O mesmo texto nomeia colunas diferentes após qualquer uma dessas alterações — SELECT * FROM events após alternar o banco de dados ou SELECT * FROM {tbl:Identifier} após editar o parâmetro — portanto, a forma também é descartada, e a próxima execução retorna o resultado sem forma.
Baixando e copiando
Persistência
sort_columns, filters, page e page_size), no histórico do navegador e no snapshot de resultados de cada aba. Assim, ao recarregar a página, compartilhar o link ou navegar para trás e para frente, ela é mantida. Como a forma determina as linhas, e não apenas sua apresentação, um link compartilhado que executa automaticamente a consulta (run=1) a executa novamente com a mesma forma, reproduzindo o próprio resultado. Apenas uma forma ativa é armazenada — um resultado sem forma não adiciona nada à URL nem ao estado do histórico — para mantê-los compactos.
Um resultado restaurado mantém sua forma vinculada ao contexto que o produziu, conforme descrito acima: o snapshot registra o banco de dados, a conexão e os valores dos parâmetros usados para produzir suas linhas. Portanto, executar novamente a instrução após alterar qualquer um desses elementos descarta a forma, em vez de aplicá-la a um resultado diferente.
Assim como os modos de codificação por cores e as colunas fixadas, a forma é mantida por aba de consulta. Portanto, ordenar ou filtrar um resultado em uma aba não executa novamente o resultado de outra aba.
Limitações
- Uma forma que o servidor não consegue aplicar faz a consulta falhar, e o erro é exibido como em qualquer outra consulta que falha. Em seguida, a forma é descartada, pois uma execução com falha não renderiza nem os cabeçalhos nem o paginador que a limparia.
- A ordenação e a filtragem identificam uma coluna pelo nome no resultado. Um resultado pode ter o mesmo nome duas vezes (
SELECT 1 AS x, 2 AS x, uma junção de tabelas que compartilham nomes de coluna), e essas colunas não podem ser distinguidas pelo nome; por isso, não recebem controles de ordenação ou filtro. As colunas com nomes únicos no mesmo resultado mantêm seus controles. - A ordenação por várias colunas requer a tecla Shift e, portanto, não está disponível em dispositivos com tela sensível ao toque; a ordenação por uma única coluna está disponível.
- O layout vertical (transposto) de um resultado com uma única linha não tem cabeçalhos de coluna e, portanto, não oferece controles; por esse motivo, um resultado que o usuário já formatou mantém o layout horizontal.