Управление типом возвращаемого значения в get_documents

Все это касается ключей вызова 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-поля у такого "облегченного" объекта отсутствуют, сохранение приводит к потере данных. Данная проблема ждет своего излечения!

Управление типом возвращаемого значения в get_documents