bulk insert tablename from 'C:\test.csv' with (rowterminator = '\n',fieldterminator = ',',KEEPIDENTITY)
Недавно я столкнулся с этим, и после того, как я спросил на канале #moose
, мне сказали чтобы справиться с этим следующим образом:
Отметьте cache_allowed_values
как lazy_build
, сделайте _build_cache_allowed_values
ссылку на текущие разрешенные_значения записи] и
-trigger on allowed_values
, который очищает cache_allowed_values
.
Таким образом, независимо от того, в каком порядке значения запрашиваются или сохраняются, они всегда будут правильными с наименьшим объемом работы .
has cache_allowed_values => (is => 'ro', lazy_build => 1);
sub _build_cache_allowed_values {
return { map { $_ => 1 } @{shift->allowed_values} };
}
has allowed_values => (
is => 'rw',
trigger => sub { shift->clear_cache_allowed_values },
default => ...,
);
Я думаю, вы действительно хотите, чтобы allowed_values
была отдельной структурой данных с желаемыми свойствами эффективности и упорядочения. Поскольку не похоже, что вы заботитесь об упорядочивании, почему бы и нет:
has 'allowed_values' => (
traits => ['Hash'],
isa => HashRef[Bool],
default => sub { +{} },
handles => {
_add_allowed_value => 'set',
remove_allowed_value => 'delete',
value_is_allowed => 'exists',
allowed_values => 'keys',
},
);
method add_allowed_value(Str $value){
$self->_add_allowed_value( $value, 1 );
}
В общем, все, что не относится к реализуемому классу, вероятно, должно быть реализовано в другом месте. Ускорение поиска в массивах - это не задача того класса, который вы пишете, поэтому его следует реализовать в другом месте, и этот класс должен использовать этот класс. (В простом случае, как в случае с хешем выше, возможно, можно игнорировать это правило. Но если бы это было более сложным, вы бы определенно захотели исключить его.)
Изменить:
Если вы хотите, чтобы пользователь Чтобы подумать, что это список, как насчет:
use MooseX::Types::Moose qw(Bool ArrayRef HashRef);
use MooseX::Types -declare => ['ListHash'];
subtype ListHash, as HashRef[Bool];
coerce ListHash, from ArrayRef, via { +{ map { $_ => 1 } @$_ } };
has 'allowed_values' => (
# <same as above>
isa => ListHash,
writer => 'set_allowed_values',
coerce => 1,
);
Теперь вы можете установить allowed_values
как:
my $instance = Class->new( allowed_values => [qw/foo bar/] );
$instance->set_allowed_values([qw/foo bar baz/]);
И получить к ним доступ, например: