hash. Преобразование таблицы к хешу с заданными ключами
^таблица.hash[ключ]
^таблица.hash[ключ][опции]
^таблица.hash[ключ][столбец значений]
^таблица.hash[ключ][столбец значений][опции]
^таблица.hash[ключ][таблица со столбцами значений]
^таблица.hash[ключ][таблица со столбцами значений][опции]
Ключ может быть задан, как:
· | [строка] - название столбца, значение которого считается ключом;
|
· | {код} - результат исполнения которого считается ключом;
|
· | (математическое выражение) - результат вычисления которого считается ключом.
|
С опциями по умолчанию метод преобразует таблицу к хешу вида:
$хеш[
$.значение_ключа[
$.название_столбца[значение_столбца]
…
]
…
]
Иными словами, метод создает хеш, в котором ключами являются значения, описанные параметром ключ. При этом каждому ключу ставится в соответствие хеш, в котором для всех столбцов таблицы хранятся ассоциации «название столбца - значение столбца в записи».
Если задан столбец значений, то каждому ключу будет соответствовать хеш с одной ассоциацией «название столбца - значение столбца в записи».
Кроме того, можно задать несколько столбцов значений, для этого необходимо передать дополнительным параметром таблицу, в которой перечислены все необходимые столбцы.
Опции - хеш с опциями преобразования.
$.type[hash/string/table] [3.2.2]
|
hash=значение каждого элемента - хеш (по умолчанию);
string=значение каждого элемента - строка, при этом вы должны указать один столбец значений; table=значение каждого элемента - таблица при этом вы не можете указать столбец значений или таблицa со столбцами значений. Это сделано для экономии рессурсов, т.к. в результирующем хеше создаются таблицы со ссылками на строки таблиц уже расположенных в памяти, таким образом копирования строк таблиц с их содержимым не происходит. |
$.distinct(0/1)
|
0=наличие в ключевом столбце одинаковых значений считается ошибкой (по-умолчанию);
1=выбрать из таблицы записи с уникальным ключом. |
$.distinct[tables]
|
создать хеш из таблиц, содержащих строки с ключом.
Это устаревший ключ, который равносилен одновременному заданию $.distinct(1) и $.type[table]. |
Пример
Есть список товаров, в котором каждый товар имеет наименование и уникальный код - id. Есть прайс-лист товаров, имеющихся в наличии. Вместо названия товара используется id товара из списка товаров. Все это хранится в двух таблицах. Подобные таблицы называются связанными. Нам нужно получить данные в виде «товар - цена», т.е. получить данные сразу из двух таблиц.
Реализация:
# это таблица с нашими товарами
$product_list[^table::create{id name
1 хлеб
2 колбаса
3 масло
4 водка
}]
# это таблица с ценами товаров
$price_list[^table::create{id price
1 6.50
2 70.00
3 60.85
}]
#hash таблицы с ценами по полю id
$price_list_hash[^price_list.hash[id]]
#перебираем записи таблицы с товарами
^product_list.menu{
$product_price[$price_list_hash.[$product_list.id].price]
# проверяем - есть ли цена на товар в нашем hash
^if($product_price){
# печатаем название товара и его цену
$product_list.name - $product_price<br /> }{
# а у этого товара нет цены, т.е. его нет в наличии
$product_list.name - нет в наличии<br /> }
}
В результате получим:
хлеб - 6.50
колбаса - 70.00
масло - 60.85
водка - нет в наличии