Все это касается ключей вызова get_documents (и прочих get_*).
По умолчанию методы get_documents, get_sections, get_links и т.д. возвращают список объектов. Методы get_document_by_id, get_section_by_id и т. д. – экземпляр объекта.
Какие есть варианты?
Ссылка на список (array ref)
Поддерживается ключ return_mode => 'array_ref' для получения не array, а ссылки на него. Заметно ускоряет работу при длинных списках получаемых обьектов (20+).
my $array_ref = $keeper->get_documents(
class => 'myproject::Doc',
return_mode => 'array_ref'
);
Результат – всегда, даже для пустой выборки – ссылка на список.
Хеш, ссылка на хеш
Поддерживается ключ return_mode => 'hash' и return_mode => 'hash_ref' с дополнительным опциональным ключем вида hash_by => 'поле по которому строить хеш' (по умолчанию id) для получения хеша обьектов по указанному полю.
Сделанно для того, чтобы не писать:
@res = $keeper->get_documents...;
my %hash = map {$_->{id} => $_} @res;
и т.п. Результат – всегда – хеш или ссылка на хеш, даже для пустой выборки.
Пример:
my $hash_ref = $keeper->get_documents(
class => 'myproject::Doc',
return_mode => 'hash_ref',
hash_by => 'ext_id'
);
Список идентификаторов (id)
Поддерживается ключ ids=> (любое true значение... лучше использовать 1) для получения списка id в тех случаях, когда сами обьекты не нужны.
Вместе с return_mode => 'hash' дает хеш вида:
(obj1_id => 1, obj2_id => 1...)
Пример:
my $ids = $keeper->get_documents(
class => 'myproject::Doc',
ids => 1,
return_mode => 'array_ref'
);
my @ids = $keeper->get_documents(
class => 'myproject::Doc',
ids => 1,
);
Пары [id + name]
Поддерживается ключ names => (любое true значение... лучше использовать 1) для получения списка пар
([obj1_id, obj1_name], [obj2_id, obj2_name])
Вместе с return_mode => 'hash' дает хеш вида
(obj1_id => obj1_name, obj2_id => obj2_name...)
Выбор отдельных полей
Поддерживается ключ field => 'название поля в таблице' или field => ['поле1', 'поле2'...] для получения списка отдельных полей
(
[obj1_field1, obj1_field2, obj1_field3],
[obj2_field1, obj2_field2, obj2_field3]
)
Вместе с return_mode => 'hash' дает хеш вида
(
obj1_field1 => [obj1_field1, obj1_field2, obj2_field3],
obj2_field1 => [obj2_field1, obj2_field2, obj2_field3]
)
Параметр hash_index => (индекс поля в списке) определяет, по какому из выбранных полей производит хеширование. По умолчанию hash_index = 0, хешируется по значению первого поля.
Пример:
my @ids = $keeper->get_documents(
class => 'myproject::Doc',
field => 'id',
);
то же самое, что
my @ids = $keeper->get_documents(
class => 'myproject::Doc',
ids => 1,
);
Пример:
my @names = $keeper->get_documents(
class => 'myproject::Doc',
field => ['id', 'name'],
);
то же самое, что
my @names = $keeper->get_documents(
class => 'myproject::Doc',
names => 1,
);
Если вам где-то от обьектов нужны только id или пары id/name или список определенных полей, лучше использовать специализированные вызовы, так как они работают заметно быстрее (в 2–10 раз быстрее, чем с light=>1 и раз в 20–100 быстрее, чем при полной инициализации обьектов).
Облегченный объект, без extra-полей
Поддерживается ключ light => 1, при использовании которого возвращаются объекты с непроинициализированными extra-полями (то есть, только с теми полями, которые отдает метод required_properties).
Пример:
my $array_ref = $keeper->get_documents(
class => 'myproject::Doc',
light => 1,
return_mode => 'array_ref'
);
Очень осторожно! В настоящий момент возможен вызов у таких объектов метода store, данный вызов производит сохранение текущего объекта в базу. Поскольку extra-поля у такого "облегченного" объекта отсутствуют, сохранение приводит к потере данных. Данная проблема ждет своего излечения!