Enum не хранит свои ключи, вместо этого только ссылка на ключи - PullRequest
0 голосов
/ 09 мая 2020

Согласно документации на https://code.kx.com/q/ref/enumerate/

Перечислить

Синтаксис: x$y, $[x;y]

Где

  • x и y - это списки

Я полагаю, что правильным способом создания enum было бы предоставление списков $:

q)e:`a`b`c$`b`a`c`c`a`b
'length
  [0]  e:`a`b`c$`b`a`c`c`a`b
               ^

но очевидно, что это не так. Прочитав больше примеров, я попробовал:

q)mykeys:`a`b`c
q)show e:`mykeys$`b`a`c`c`a`b
`mykeys$`b`a`c`c`a`b

И это работает. Но потом я увидел, что мой enum e содержит свои значения, а только ссылку на его ключи mykeys:

q)(key;value)@\:e
`mykeys
`b`a`c`c`a`b
q)`:e.raw set e
`:e.raw

Так что сохраняя e в файл не сохраняет ключей! В сеансе fre sh:

q)e: get `:e.raw
q)e
`mykeys!1 0 2 2 0 1
q)mykeys
'mykeys
  [0]  mykeys
       ^
q)mykeys:`a`b`c
q)e
`mykeys$`b`a`c`c`a`b

Я знаю, что можно сохранять ключи с аккуратной enum extension функциональностью:

q)`:mykeys?`b`a`c`c`a`b;
q)get `:mykeys
`b`a`c

Но почему перечисления действуют как это? - вроде бы с трудом разделились на ключи и значения . Может быть, в большой картине с таблицами, индексами, растягиванием таблиц это имеет больше смысла.

А как перечисление могло существовать сразу после загрузки из файла? Это полунормальное состояние, когда его домен ключей еще не существует?:

q)e: get `:e.raw
q)e
`mykeys!1 0 2 2 0 1

1 Ответ

1 голос
/ 11 мая 2020

Такое поведение является преднамеренным, потому что, как вы предположили, существует большая и обобщенная картина.

Перечисления в основном используются для:

  1. файла sym, в котором syms (ключи) всегда постоянно хранятся в базе данных с помощью enum-extend ?
  2. внешних ключей, согласно https://code.kx.com/q4m3/8_Tables/#852 -example-of-simple-external-key

В последнем случае не имеет смысла также храните ключи с перечислением, потому что ключи являются содержимым таблицы. Предполагается, что если вы сохраните перечисление, вы также сохраните таблицу, содержащую ключи.

Аналогичная концепция - связывание столбцов - https://code.kx.com/q/kb/linking-columns/

Наконец, причина, по которой

`a`b`c$`b`a`c`c`a`b

не сработала, заключается в том, что список вы перечисляете против должны передаваться по имени, а не по значению. Значит, это должно быть

`mykeys$`b`a`c`c`a`b
...