Revision 235 (by ahitrov, 2012/08/29 15:03:50) aliases
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'		=> 'alias',
			'type'		=> 'string',
			'rusname'	=> 'Web-алиас',
			'db_field'	=> 'alias',
			'db_type'	=> 'varchar(64)',
		},
		{							# Пользователь...
			'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;