Langue Q - Attributs

Les listes, dictionnaires ou colonnes d'une table peuvent avoir des attributs qui leur sont appliqués. Les attributs imposent certaines propriétés à la liste. Certains attributs peuvent disparaître lors de la modification.

Types d'attributs

Trié (`s #)

`s # signifie que la liste est triée dans un ordre croissant. Si une liste est explicitement triée par asc (ou xasc), la liste aura automatiquement le jeu d'attributs triés.

q)L1: asc 40 30 20 50 9 4

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

Une liste dont on sait qu'elle est triée peut également avoir l'attribut défini explicitement. Q vérifiera si la liste est triée, et si ce n'est pas le cas, un s-fail l'erreur sera lancée.

q)L2:30 40 24 30 2

q)`s#L2
's-fail

L'attribut trié sera perdu lors d'un ajout non trié.

Séparé (`p #)

`p # signifie que la liste est séparée et que les éléments identiques sont stockés de manière contiguë.

La gamme est un int ou temporal type ayant une valeur int sous-jacente, telle que des années, des mois, des jours, etc. Vous pouvez également partitionner un symbole à condition qu'il soit énuméré.

L'application de l'attribut parted crée un dictionnaire d'index qui mappe chaque valeur de sortie unique à la position de sa première occurrence. Lorsqu'une liste est séparée, la recherche est beaucoup plus rapide, car la recherche linéaire est remplacée par une recherche de table de hachage.

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'attribut parted n'est pas conservé sous une opération sur la liste, même si l'opération préserve le partitionnement.

  • L'attribut séparé doit être considéré lorsque le nombre d'entités atteint un milliard et que la plupart des partitions sont de taille substantielle, c'est-à-dire qu'il y a une répétition significative.

Groupé (`g #)

`g # signifie que la liste est groupée. Un dictionnaire interne est construit et maintenu qui mappe chaque élément unique à chacun de ses index, nécessitant un espace de stockage considérable. Pour une liste de longueurL contenant u articles uniques de taille s, ce sera (L × 4) + (u × s) octets.

Le regroupement peut être appliqué à une liste lorsqu'aucune autre hypothèse sur sa structure ne peut être faite.

L'attribut peut être appliqué à toutes les listes saisies. Il est conservé lors des ajouts, mais perdu lors des suppressions.

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

Unique (`#u)

L'application de l'attribut unique (`u #) à une liste indique que les éléments de la liste sont distincts. Savoir que les éléments d'une liste sont uniques accélère considérablementdistinct et permet q pour effectuer des comparaisons tôt.

Lorsqu'une liste est marquée comme unique, une mappe de hachage interne est créée pour chaque élément de la liste. Les opérations de la liste doivent préserver l'unicité ou l'attribut est perdu.

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 # est préservé sur les concaténations qui préservent l'unicité. Il est perdu lors des suppressions et des concaténations non uniques.

  • Les recherches sur les listes `u # sont effectuées via une fonction de hachage.

Suppression d'attributs

Les attributs peuvent être supprimés en appliquant `#.

Appliquer des attributs

Les trois formats d'application des attributs sont -

  • L: `s# 14 2 3 3 9/ Précisez lors de la création de la liste

  • @[ `.; `L ; `s#]/ Application fonctionnelle, c'est-à-dire à la liste de variables L

    / dans l'espace de noms par défaut (c'est-à-dire `.) applique

    / l'attribut trié `s #

  • Update `s#time from `tab

    / Mettez à jour le tableau (onglet) pour appliquer

    / attribut.

Appliquons les trois formats différents ci-dessus avec des exemples.

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#).