Revision 296 (by ahitrov, 2013/03/26 17:59:01) Promosite (anthill) project source
package promosuite::SQL::Enquesta;

use base 'SQL::ProtoTable';

sub db_table
{
	return 'enquesta';
}

sub available_filters {
	my @available_filters = qw(	
					_class_filter
					_status_filter
					_in_id_filter
					_id_filter
					_name_filter
					_s_filter
					_class_excludes_filter

					_uid_filter
					_session_filter
					_object_id_filter
					_object_class_filter
					_excludes_filter
				);
	return \@available_filters; 
}

# ----------------------------------------------------------------------------
# Свойства храним в массивах, потому что порядок важен!
# Это общие свойства - одинаковые для всех документов.
#
#   attr - обязательный параметр, название атрибута;
#   type - тип аттрибута, требуется для отображдения;
#   rusname - русское название, опять же требуется для отображения;
#   hidden - равен 1, когда 
#   readonly - инициализации при записи только без изменения в дальнейшем
#   db_field - поле в таблице
#   default  - значение по умолчанию (поле всегда имеет это значение)
# ----------------------------------------------------------------------------
sub required_properties
{
	return (
		{							# Идентификатор документа, сквозной по всем типам...
			'attr'		=> 'id',
			'type'		=> 'integer',
			'rusname'	=> 'Идентификатор документа',
			'hidden'	=> 1,
			'auto'		=> 1,
			'readonly'	=> 1,
			'db_field'	=> 'id',
			'db_type'	=> 'integer',
			'db_opts'	=> "not null default nextval('public.documents_id_seq'::text)", 
		},
		{							# Класс документа...
			'attr'		=> 'class',
			'type'		=> 'string',
			'rusname'	=> 'Класс документа',
			'hidden'	=> 1,
			'readonly'	=> 1,
			'column'	=> 3,
			'db_field'	=> 'class',
			'db_type'	=> 'varchar(48)',
			'db_opts'	=> 'not null',
		},
		{							# Имя
			'attr'		=> 'name',
			'type'		=> 'string',
			'rusname'	=> 'Имя',
			'column'	=> 2,
			'db_field'	=> 'name',
			'db_type'       => 'text',
		},
		{							# Сессия голосовавшего
			'attr'		=> 'session_id',
			'type'		=> 'string',
			'rusname'	=> 'Сессия голосовавшего',
			'db_field'	=> 'session_id',
			'db_type'       => 'char(32)',
		},
		{							# ID голосовавшего
			'attr'		=> 'uid',
			'type'		=> 'string',
			'rusname'	=> 'ID голосовавшего',
			'db_field'	=> 'uid',
			'db_type'       => 'integer',
			'default'	=> '0',
		},
		{							# Статус
			'attr'		=> 'status',
			'type'		=> 'status',
			'rusname'       => 'Статус',
			'db_field'      => 'status',
			'db_type'       => 'smallint',
		},
		{							# Время создания документа
			'attr'		=> 'ctime',
			'type'		=> 'datetime',
			'rusname'	=> 'Дата/время создания',
			'readonly'	=> 1,
			'auto'          => 1,
			'hidden'	=> 1,
			'db_field'	=> 'ctime',
			'db_type'	=> 'timestamp',
			'db_opts'	=> 'not null default now()',
			'default'	=> 'CURRENT_TIMESTAMP',
		},
		{							# Время изменения документа
			'attr'		=> 'mtime',
			'type'		=> 'datetime',
			'rusname'	=> 'Дата/время изменения',
			'auto'          => 1,
			'hidden'	=> 1,
			'db_field'	=> 'mtime',
			'db_type'	=> 'timestamp',
			'db_opts'	=> 'not null default now()',
			'default'	=> 'CURRENT_TIMESTAMP',
		},
		{							# Время документа
			'attr'		=> 'dtime',
			'type'		=> 'datetime',
			'rusname'	=> 'Дата/время',
			'column'	=> 1,
			'db_field'	=> 'dtime',
			'db_type'	=> 'timestamp',
			'db_opts'	=> 'not null default now()',
			'default'	=> 'CURRENT_TIMESTAMP',
		},
		{							# Класс объекта
			'attr'		=> 'object_class',
			'type'		=> 'string',
			'rusname'	=> 'Класс объекта',
			'column'	=> 4,
			'db_field'	=> 'object_class',
			'db_type'       => 'text',
			'default'	=> "'promosuite::Voting'",
		},
		{							# ID объекта
			'attr'		=> 'object_id',
			'type'		=> 'string',
			'rusname'	=> 'ID объекта',
			'column'	=> 5,
			'db_field'	=> 'object_id',
			'db_type'       => 'integer',
		},
		{							# Опрос
			'attr'		=> 'voting',
			'type'		=> 'text',
			'rusname'	=> 'Оценка',
			'db_field'	=> 'voting',
			'db_type'       => 'text',
		},
		{							# Массив секций
			'attr'		=> 'sections',
			'type'		=> 'sections_list',
			'rusname'	=> 'Секции',
			'hidden'	=> 1,
			'db_field'	=> 'sections',
			'db_type'	=> 'integer[]',
                },
	);
}


########### FILTERS DESCRIPTION ####################################################################################
sub _excludes_filter {
	my ($self,%opts)=@_;
	if (exists $opts{excludes}) {
		# - исключение из отбора
		my @eids = ();
		if (ref($opts{excludes}) eq 'ARRAY') {
			@eids = @{ $opts{excludes} };
		} elsif ($opts{excludes} =~ /[^\d\,]/) {
			warn "Contenido Warning: В списке идентификаторов для исключения встречаются нечисловые элементы. Параметр excludes игнорируется (".$opts{excludes}.").\n";
		} else {
			@eids = split(',', $opts{excludes});
		}

		my $excludes = join(',', @eids);

		# Меняется логика запроса, если это join-запрос.
		# Потому что в этом случае гораздо лучше ограничить выборку по таблице links,
		#  чем производить полную склейку таблиц.
		if (@eids) {
			if (exists($opts{ldest}) || exists($opts{lsource})) {
				if (exists($opts{ldest})) {
					return " (l.source_id not in ($excludes)) ";
				} elsif (exists($opts{lsource})) {
					return " (l.dest_id   not in ($excludes)) ";
				}
			} else {
				return  " (d.id not in ($excludes)) ";
			}
		}
	}
	return undef;
}


sub _get_orders {
	my ($self, %opts) = @_;

	if ($opts{order_by}) {
		return ' order by '.$opts{order_by};
	} else {
		return ' order by dtime desc';
	}
	return undef;
}

sub _uid_filter {
	my ($self, %opts)=@_;
	return undef unless ( exists $opts{uid}  );
	return &SQL::Common::_generic_int_filter('d.uid', $opts{uid});
}

sub _object_id_filter {
	my ($self, %opts)=@_;
	return undef unless ( exists $opts{object_id}  );
	return &SQL::Common::_generic_int_filter('d.object_id', $opts{object_id});
}

sub _session_filter {
	my ($self, %opts)=@_;
	return undef unless ( exists $opts{session_id}  );
	return &SQL::Common::_generic_text_filter('d.session_id', $opts{session_id});
}

sub _object_class_filter {
	my ($self, %opts)=@_;
	return undef unless ( exists $opts{object_class}  );
	return &SQL::Common::_generic_text_filter('d.object_class', $opts{object_class});
}

1;