Pular para o conteúdo

Os verbos do pipeline

Seis palavras contextuais que fazem um quadro fluir pelo operador >> — com as colunas escritas nuas.

O operador >> já existia, com sift, morph e distill. Para dado tabular faltava o vocabulário: seis verbos que operam sobre o quadro inteiro, e não sobre um item por vez.

dataforge
resumo := vendas
    >> onde valor bigger 50
    >> agrupar produto
    >> resumir {"valor": "soma"}
    >> ordenar valor desc

out resumo.texto()
saída
produto  valor
-------  -----
cafe     210
cha      60

Os seis#

VerboFazDevolve
onde <expressão>filtra, com as colunas escritas nuasquadro
pegar a, bescolhe colunas, nessa ordemquadro
sem adescarta colunasquadro
ordenar col [desc]ordenaquadro
agrupar col[, col2]agrupaagrupamento
resumir {…}agregaquadro

agrupar é o único que não devolve quadro: um agrupamento não tem forma retangular até alguém dizer "média de quê". Depois dele vem resumir — e qualquer outro verbo ali diz isso.

A coluna se escreve nua#

É o que faz o verbo valer a pena. onde valor bigger 50 lê como se lê, sem lambda l: l["valor"]:

dataforge
out (vendas >> onde qtd bigger 3).altura()

Nem todo cabeçalho de CSV é um identificador válido — Valor Total e preco/kg são nomes comuns de coluna. Por isso as duas formas convivem:

dataforge
q := Q.de_vaults([{"Valor Total": 10}, {"Valor Total": 30}])
out (q >> pegar "Valor Total").colunas()

Duas regras de escopo, e elas são previsíveis#

Dentro de um ondeVale
um nome que é colunaa coluna vence, sempre
um nome que não é colunao escopo de fora, como em qualquer expressão
dataforge
limite := 100.0
out (vendas >> onde valor bigger limite).altura()    // 1  'limite' vem de fora

A primeira regra é o contrato do verbo: dentro de um onde, um nome nu é uma coluna. Sem ela, o mesmo código leria de dois jeitos conforme o que houvesse no escopo.

A ausência não passa no filtro#

Comparar com o desconhecido não dá nem sim nem não, e a linha não passa. É a lógica de três valores do SQL, e a de toda ferramenta de dados que existe:

dataforge
out (vendas >> onde valor bigger 0).altura()     // 4  a linha sem valor fica fora
out (vendas >> onde valor is void).altura()      // 1  e quem quer a ausência pergunta

Os verbos convivem com `sift` e `morph`#

A conversão é preguiçosa: cada estágio pede a forma de que precisa, na hora em que precisa.

dataforge
out vendas >> onde regiao is "sul" >> morph l: l["produto"]

E a fonte pode ser um cluster de vaults, que é o que sai de IO.read_csv(caminho, yes) e de Database.query — obrigar a converter na mão faria o verbo valer menos justamente onde o dado entra.

dataforge
linhas := [{"a": 1}, {"a": 5}]
out (linhas >> onde a bigger 2).altura()

Por que contextuais, e não reservadas#

As seis palavras não entram em KEYWORDS. Elas valem só logo depois de um >>, e continuam livres como nome em todo o resto:

dataforge
onde := 1
pegar := 2
agrupar := 3
out onde + pegar + agrupar

É o mesmo tratamento das onze palavras do Kiln. agrupar, ordenar e pegar são nomes bons demais para tirar de quem escreve — e este repositório já removeu sete palavras reservadas por serem caras sem entregar nada.

O que o analisador confere, e o que ele não pode#

A expressão de um onde não é inferida no escopo de fora: os nomes dela são colunas, e o analisador não sabe quais colunas um quadro tem em tempo de análise. Inferir ali acusaria onde valor bigger 50 com "'valor' is not defined" — um falso alarme no caminho mais comum do verbo, que é exatamente o que ensina a desligar a verificação inteira.

O que ele confere é o que consegue provar: que o verbo existe, que agrupar é seguido de resumir, e o tipo que o pipeline produz.

Por onde seguir#