Support per-query cache policies for file-based analytics queries

Aberta
#549 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 3 dias

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
5/5
Tempo estimado
Mais de uma semana
Facilidade para iniciantes
45/100
Tipo de issue
Funcionalidade
Clareza
Razoavelmente clara
Status de atividade
Ativa
Stack de tecnologia
sql, typescript

Direção de pesquisa

Comece rastreando o ponto de entrada useAnalyticsQuery e a configuração do plugin de analytics; em seguida, inspecione como as consultas baseadas em arquivos são armazenadas em cache nos caminhos de execução JSON e Arrow. Defina como as políticas desabilitadas ou de TTL por consulta preservam os padrões existentes e o isolamento da execução, e verifique se as consultas desabilitadas são executadas novamente sem parâmetros nonce.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

Problem

AppKit's analytics plugin caches identical file-based SQL queries for one hour by default. Some queries are intentionally non-deterministic or calculate against current data and must execute every time the user submits them.

In AppKit 0.65.0, useAnalyticsQuery supports:

  • format
  • maxParametersSize
  • autoStart

There is no per-query cache option. Caching can be disabled globally with:

createApp({
  cache: {
    enabled: false,
  },
});

However, this disables caching for every AppKit plugin and analytics query in the application.

Example

-- config/queries/fresh_value.sql
SELECT current_timestamp() AS calculated_at
const { data } = useAnalyticsQuery('fresh_value');

After unmounting and remounting the component, the same cached timestamp is returned for up to an hour instead of executing the SQL again.

A more significant use case is a parameterized, non-deterministic table-valued function:

SELECT result_json
FROM IDENTIFIER(:functionName)(
  :input,
  :assumption
)

Submitting the same parameters again should deliberately recalculate against current source data.

Current workaround

We add a unique nonce to every submission:

-- @param queryNonce STRING
SELECT ...
WHERE length(:queryNonce) > 0
const [queryNonce] = useState(() => crypto.randomUUID());

const parameters = useMemo(
  () => ({
    input: sql.string(input),
    queryNonce: sql.string(queryNonce),
  }),
  [input, queryNonce]
);

This works because parameters are part of the cache key, but it pollutes the SQL contract and creates cache entries that can never be reused.

Requested capability

Please support a server-controlled cache policy for individual file-based queries.

For example, a query directive:

-- @cache disabled
SELECT ...

Or configurable TTL:

-- @cache ttl=60
SELECT ...

Alternatively, plugin configuration could define the policy:

analytics({
  queries: {
    fresh_value: {
      cache: false,
    },
    summary: {
      cache: { ttl: 60 },
    },
  },
});

A client-side option such as the following would also be useful, although a server-owned policy would prevent clients from bypassing caching for arbitrary expensive queries:

useAnalyticsQuery('fresh_value', parameters, {
  cache: 'no-store',
});

Expected behavior

  • Existing queries remain cached by default.
  • An individual query can disable caching or select a custom TTL.
  • The policy applies consistently to JSON and Arrow execution paths.
  • Service-principal and on-behalf-of-user execution retain their existing cache isolation.
  • Disabled queries execute against the warehouse on every request without requiring dummy parameters.
Linguagem predominante
TypeScript
Estrelas
119
Forks
36
Merge médio
4d 16h
PRs com merge (30d)
37

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de databricks/appkit

Todas as issues de databricks/appkit

Issues semelhantes

Mais issues de TypeScript

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.