Q Language - Attributi

A elenchi, dizionari o colonne di una tabella possono essere applicati attributi. Gli attributi impongono determinate proprietà nell'elenco. Alcuni attributi potrebbero scomparire durante la modifica.

Tipi di attributi

Ordinati (`s #)

`s # significa che l'elenco è ordinato in ordine crescente. Se un elenco è ordinato esplicitamente per asc (o xasc), l'elenco avrà automaticamente impostato l'attributo ordinato.

q)L1: asc 40 30 20 50 9 4

q)L1
`s#4 9 20 30 40 50

Un elenco noto per essere ordinato può anche avere l'attributo impostato esplicitamente. Q controllerà se l'elenco è ordinato e, in caso contrario, un file s-fail verrà generato un errore.

q)L2:30 40 24 30 2

q)`s#L2
's-fail

L'attributo ordinato andrà perso in caso di aggiunta non ordinata.

Parted (`p #)

`p # significa che l'elenco è diviso e gli elementi identici vengono memorizzati in modo contiguo.

La gamma è un int o temporal type con un valore int sottostante, come anni, mesi, giorni, ecc. È anche possibile partizionare un simbolo a condizione che sia enumerato.

L'applicazione dell'attributo parted crea un dizionario indice che mappa ogni valore di output univoco alla posizione della sua prima occorrenza. Quando una lista è divisa, la ricerca è molto più veloce, poiché la ricerca lineare è sostituita dalla ricerca con tabella hash.

q)L:`p# 99 88 77 1 2 3

q)L
`p#99 88 77 1 2 3

q)L,:3

q)L
99 88 77 1 2 3 3

Note −

  • L'attributo parted non viene conservato in un'operazione nell'elenco, anche se l'operazione conserva il partizionamento.

  • L'attributo parted dovrebbe essere considerato quando il numero di entità raggiunge un miliardo e la maggior parte delle partizioni sono di dimensioni sostanziali, cioè, c'è una ripetizione significativa.

Raggruppato (`g #)

`g # significa che l'elenco è raggruppato. Viene creato e mantenuto un dizionario interno che associa ogni elemento univoco a ciascuno dei suoi indici, richiedendo uno spazio di archiviazione considerevole. Per un elenco di lunghezzaL contenente u capi unici di taglia s, questo sarà (L × 4) + (u × s) byte.

Il raggruppamento può essere applicato a un elenco quando non è possibile fare altre ipotesi sulla sua struttura.

L'attributo può essere applicato a qualsiasi elenco digitato. Viene mantenuto nelle aggiunte, ma perso durante le eliminazioni.

q)L: `g# 1 2 3 4 5 4 2 3 1 4 5 6

q)L
`g#1 2 3 4 5 4 2 3 1 4 5 6

q)L,:9

q)L
`g#1 2 3 4 5 4 2 3 1 4 5 6 9

q)L _:2

q)L
1 2 4 5 4 2 3 1 4 5 6 9

Unico (`#u)

L'applicazione dell'attributo univoco (`u #) a un elenco indica che gli elementi dell'elenco sono distinti. Sapere che gli elementi di un elenco sono unici accelera notevolmentedistinct e permette q per eseguire alcuni confronti in anticipo.

Quando un elenco viene contrassegnato come unico, viene creata una mappa hash interna per ogni elemento nell'elenco. Le operazioni nell'elenco devono preservare l'unicità o l'attributo viene perso.

q)LU:`u#`MSFT`SAMSUNG`APPLE

q)LU
`u#`MSFT`SAMSUNG`APPLE

q)LU,:`IBM                        /Uniqueness preserved

q)LU
`u#`MSFT`SAMSUNG`APPLE`IBM

q)LU,:`SAMSUNG                    / Attribute lost

q)LU
`MSFT`SAMSUNG`APPLE`IBM`SAMSUNG

Note −

  • `u # è conservato su concatenazioni che preservano l'unicità. Viene perso in caso di eliminazioni e concatenazioni non univoche.

  • Le ricerche sugli elenchi `u # vengono eseguite tramite una funzione hash.

Rimozione di attributi

Gli attributi possono essere rimossi applicando `#.

Applicazione di attributi

Tre formati per applicare gli attributi sono:

  • L: `s# 14 2 3 3 9/ Specificare durante la creazione dell'elenco

  • @[ `.; `L ; `s#]/ Funzionale si applica, cioè alla lista di variabili L

    / nello spazio dei nomi predefinito (cioè `.) si applicano

    / l'attributo `s # ordinato

  • Update `s#time from `tab

    / Aggiorna la tabella (tab) per applicare il

    / attributo.

Applichiamo i tre diversi formati di cui sopra con esempi.

q)/ set the attribute during creation

q)L:`s# 3 4 9 10 23 84 90

q)/apply the attribute to existing list data

q)L1: 9 18 27 36 42 54

q)@[`.;`L1;`s#]
`.

q)L1                 / check
`s#9 18 27 36 42 54

q)@[`.;`L1;`#]       / clear attribute
`.

q)L1
9 18 27 36 42 54

q)/update a table to apply the attribute

q)t: ([] sym:`ibm`msft`samsung; mcap:9000 18000 27000)

q)t:([]time:09:00 09:30 10:00t;sym:`ibm`msft`samsung; mcap:9000 18000 27000)

q)t

    time         sym    mcap
---------------------------------
  09:00:00.000   ibm    9000
  09:30:00.000   msft   18000
  10:00:00.000  samsung 27000

q)update `s#time from `t
`t

q)meta t               / check it was applied

    c  | t f a
------ | -----
  time | t s
  sym  | s
  mcap | j
  
Above we can see that the attribute column in meta table results shows the time column is sorted (`s#).