2016-09-15 8 views
0

meta функция KDB/д возвращает следующую информацию о таблице:Расширенная Metadata

  1. с - имена (символ) столбцов
  2. т - тип данных (символ)
  3. е - (символ) домен внешних ключей
  4. a - (символ) атрибуты.

Я хотел бы расширить это, чтобы включить дополнительную информацию о таблице. Конкретный случай, который я пытаюсь решить, - это включить информацию о часовом поясе о столбцах данных времени в таблице.

Например: select from Price

+-------------------------+-------------------------+--------+-------+ 
|   Time   |   SysTime   | Ticker | Price | 
+-------------------------+-------------------------+--------+-------+ 
| 2016.09.15D09:18:02.391 | 2016.09.15D08:18:02.391 | IBM | 63.46 | 
| 2016.09.15D09:18:02.491 | 2016.09.15D08:16:22.391 | MSFT | 96.72 | 
| 2016.09.15D09:18:02.591 | 2016.09.15D08:14:42.391 | AAPL | 23.06 | 
+-------------------------+-------------------------+--------+-------+ 

meta Price

+---------+---+---+---+ 
| c | t | f | a | 
+---------+---+---+---+ 
| Time | p | | | 
| SysTime | p | | | 
| Ticker | s | | | 
| Price | f | | | 
+---------+---+---+---+ 

Я хотел бы получить дополнительную информацию о столбцах временных данных (Time и SysTime) в мета.

Для примера, что-то вроде этого:

metaExtended Price

+---------+---+---+---+------------------+ 
| c | t | f | a |  z   | 
+---------+---+---+---+------------------+ 
| Time | p | | | America/New_York | 
| SysTime | p | | | America/Chicago | 
| Ticker | s | | |     | 
| Price | f | | |     | 
+---------+---+---+---+------------------+ 

Пожалуйста, обратите внимание, что у меня есть функция, которая принимает в таблице и столбце, чтобы вернуть часовой пояс. TimeZone[Price;Time]America/New_York

Мой вопрос касается только того, как включить эту информацию в метафункцию. Второй вопрос, который у меня есть, заключается в том, что если пользователь делает что-то подобное, newPriceTable:Price (создавая новую таблицу, аналогичную предыдущей таблице), то функция metaExtended должна возвращать одинаковое значение для обеих таблиц (сродни вызову функции на двух разных переменных, имеющих одну и ту же ссылку на объект)

Что-то подобное существует в sql?

ответ

1

meta является зарезервированным словом и поэтому не может быть переопределено. Но вы можете создать свою собственную реализацию и использовать его вместо meta:

TimeZone:{[Table;Col] ... }/your TimeZone function 

metaExtended:{meta[x],'([]z:TimeZone[t]each cols x)} 

metaExtended Price 

Что касается вашего второго вопроса, то я не думаю, что это можно делать то, что вы хотите в к/кв. Сразу после присвоения Price до newPriceTable последнее действительно является ссылкой, но как только вы его измените, kdb создаст копию и изменит ее вместо оригинала. Проблема в том, что нет способа определить, является ли newPriceTable ссылкой на Price или новым новым объектом.

+0

Вы всегда можете повторно определить мета в дк - просто не рекомендуется :) Или использовать что-то вдоль линий .. '.q.ometa: мета,' ' .q.meta:. {Q.ometa [x], '([] z: TimeZone [t] каждый cols x)} ' –

+1

Спасибо Igor и @Connor – user2419511

0

Вы можете использовать lj, чтобы объединить их в одну функцию metaExtended.

Функция будет проверять все время перевалы и запустить функцию TimeZone на них и присоединиться к результату с мета-результат:

 metaExtended:{[tbl] meta[tbl] lj 1!select c,z:TimeZone[tbl] each t from meta[tbl] where t in "tp"} 

     metaExtended `t 

при назначении этой таблицы для новой переменной будет назначен в качестве ссылки.

  nt:t/nt and t pointing to same object 

Yo может проверить ссылочный счетчик переменной -16! ,

  -16!t 

В этот момент функция metaExtended даст тот же результат. Но как только некоторое обновление выполняется над любой из этих переменных, указывающих на одну и ту же таблицу, kdb создаст новую копию для обновленной таблицы/переменной. С этого момента они представляют собой два разных объекта. Теперь вывод функции metaExtended зависит от схемы объекта.

 Смежные вопросы

  • Нет связанных вопросов^_^