package blogs::SQL::RecordsTable;
use strict;
use base 'SQL::DocumentTable';
sub db_table
{
return 'blog_records';
}
sub available_filters {
my @available_filters = qw(
_class_filter
_status_filter
_in_id_filter
_id_filter
_name_filter
_class_excludes_filter
_sfilter_filter
_datetime_filter
_date_equal_filter
_date_filter
_previous_days_filter
_s_filter
_excludes_filter
_link_filter
_uid_filter
_blog_id_filter
_tags_filter
_public_records_filter
);
return \@available_filters;
}
# ----------------------------------------------------------------------------
# Свойства храним в массивах, потому что порядок важен!
# Это общие свойства - одинаковые для всех документов.
#
# attr - обязательный параметр, название атрибута;
# type - тип аттрибута, требуется для отображдения;
# rusname - русское название, опять же требуется для отображения;
# hidden - равен 1, когда
# readonly - инициализации при записи только без изменения в дальнейшем
# db_field - поле в таблице
# default - значение по умолчанию (поле всегда имеет это значение)
# ----------------------------------------------------------------------------
sub required_properties
{
my $self = shift;
my @parent_properties = $self->SUPER::required_properties;
return (
@parent_properties,
{ # Пользователь...
'attr' => 'uid',
'type' => 'integer',
'rusname' => 'Пользователь',
'db_field' => 'uid',
'db_type' => 'integer',
'db_opts' => 'not null',
},
{ # Блог...
'attr' => 'blog_id',
'type' => 'integer',
'rusname' => 'Блог',
'db_field' => 'blog_id',
'db_type' => 'integer',
'db_opts' => 'not null',
},
{ # Количество записей...
'attr' => 'comments',
'type' => 'integer',
'rusname' => 'Количество комментариев',
'db_field' => 'comments',
'db_type' => 'integer',
'db_opts' => 'default 0',
},
{
'attr' => 'tags',
'type' => 'string',
'rusname' => 'Теги (через запятую)',
'shortname' => 'Теги',
'db_field' => 'tags',
'db_type' => 'text',
},
);
}
sub _uid_filter {
my ($self,%opts)=@_;
return undef unless ( exists $opts{uid} && $opts{uid} );
return &SQL::Common::_generic_int_filter('d.uid', $opts{uid});
}
sub _blog_id_filter {
my ($self,%opts)=@_;
return undef unless ( exists $opts{blog_id} );
return &SQL::Common::_generic_int_filter('d.blog_id', $opts{blog_id});
}
sub _tags_filter {
my ($self,%opts)=@_;
return undef unless ( exists $opts{tags} );
my (@wheres, @binds, $join);
my $link_table = blogs::SQL::TagCloudTable->db_table;
my $tag_table = blogs::SQL::TagsTable->db_table;
$join = " join $link_table as l on l.dest_id=d.id and l.dest_class=d.class";
push @wheres, "l.source_id in (select id from $tag_table where name ilike ?)";
push @binds, $opts{tags};
return (\@wheres, \@binds, $join);
}
sub _public_records_filter {
my ($self,%opts)=@_;
return undef unless ( exists $opts{public} );
my ($where, $values, $joins) = ([], [], []);
push @$joins, ' INNER JOIN blogs AS b ON d.blog_id=b.id ';
push @$where, ' b.type = ? ';
push @$values, $opts{public};
return ($where, $values, $joins);
}
sub _get_orders {
my ($self, %opts) = @_;
if ($opts{order_by}) {
return ' order by '.$opts{order_by};
} else {
return ' order by dtime desc';
}
return undef;
}
1;