Q Sprache - Attribute

Auf Listen, Wörterbücher oder Spalten einer Tabelle können Attribute angewendet werden. Attribute legen der Liste bestimmte Eigenschaften auf. Einige Attribute verschwinden möglicherweise bei Änderungen.

Arten von Attributen

Sortiert (`s #)

`s # bedeutet, dass die Liste in aufsteigender Reihenfolge sortiert ist. Wenn eine Liste explizit nach asc (oder xasc) sortiert ist, wird für die Liste automatisch das sortierte Attribut festgelegt.

q)L1: asc 40 30 20 50 9 4

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

Für eine Liste, von der bekannt ist, dass sie sortiert ist, kann das Attribut auch explizit festgelegt werden. Q prüft, ob die Liste sortiert ist, und wenn nicht, an s-fail Fehler wird ausgelöst.

q)L2:30 40 24 30 2

q)`s#L2
's-fail

Das sortierte Attribut geht bei einem unsortierten Anhängen verloren.

Getrennt (`p #)

`p # bedeutet, dass die Liste geteilt ist und identische Elemente zusammenhängend gespeichert werden.

Der Bereich ist ein int oder temporal type mit einem zugrunde liegenden int-Wert, wie z. B. Jahre, Monate, Tage usw. Sie können auch über ein Symbol partitionieren, sofern es aufgelistet ist.

Durch Anwenden des parted-Attributs wird ein Indexwörterbuch erstellt, das jeden eindeutigen Ausgabewert der Position seines ersten Auftretens zuordnet. Wenn eine Liste getrennt wird, ist die Suche viel schneller, da die lineare Suche durch die Suche nach Hashtabellen ersetzt wird.

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 −

  • Das parted-Attribut wird unter einer Operation in der Liste nicht beibehalten, selbst wenn die Operation die Partitionierung beibehält.

  • Das geteilte Attribut sollte berücksichtigt werden, wenn die Anzahl der Entitäten eine Milliarde erreicht und die meisten Partitionen eine beträchtliche Größe haben, dh es gibt signifikante Wiederholungen.

Gruppiert (`g #)

`g # bedeutet, dass die Liste gruppiert ist. Es wird ein internes Wörterbuch erstellt und verwaltet, das jedes einzelne Element jedem seiner Indizes zuordnet, was erheblichen Speicherplatz erfordert. Für eine Liste der LängeL enthält u einzigartige Gegenstände der Größe s, Das wird sein (L × 4) + (u × s) Bytes.

Die Gruppierung kann auf eine Liste angewendet werden, wenn keine anderen Annahmen über ihre Struktur getroffen werden können.

Das Attribut kann auf alle typisierten Listen angewendet werden. Es wird beim Anhängen beibehalten, geht jedoch beim Löschen verloren.

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

Einzigartig (`#u)

Das Anwenden des eindeutigen Attributs (`u #) auf eine Liste zeigt an, dass die Elemente der Liste unterschiedlich sind. Zu wissen, dass die Elemente einer Liste einzigartig sind, beschleunigt sich dramatischdistinct und erlaubt q einige Vergleiche frühzeitig durchzuführen.

Wenn eine Liste als eindeutig gekennzeichnet ist, wird für jedes Element in der Liste eine interne Hash-Zuordnung erstellt. Operationen in der Liste müssen die Eindeutigkeit bewahren, sonst geht das Attribut verloren.

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 # bleibt bei Verkettungen erhalten, die die Einzigartigkeit bewahren. Es geht bei Löschungen und nicht eindeutigen Verkettungen verloren.

  • Die Suche in U-Listen erfolgt über eine Hash-Funktion.

Attribute entfernen

Attribute können durch Anwenden von `# entfernt werden.

Attribute anwenden

Drei Formate zum Anwenden von Attributen sind:

  • L: `s# 14 2 3 3 9/ Während der Listenerstellung angeben

  • @[ `.; `L ; `s#]/ Funktional anwenden, dh auf die Variablenliste L.

    / im Standard-Namespace (dh `.) gelten

    / das # Attribut des sortierten `s

  • Update `s#time from `tab

    / Aktualisieren Sie die Tabelle (Registerkarte), um die anzuwenden

    / Attribut.

Wenden wir die obigen drei verschiedenen Formate mit Beispielen an.

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