Line # Revision Author
1 234 ahitrov package blogs::SQL::RecordsTable;
2
3 use strict;
4 use base 'SQL::DocumentTable';
5
6 sub db_table
7 {
8 return 'blog_records';
9 }
10
11 sub available_filters {
12 my @available_filters = qw(
13 _class_filter
14 _status_filter
15 _in_id_filter
16 _id_filter
17 _name_filter
18 _class_excludes_filter
19 _sfilter_filter
20 _datetime_filter
21 _date_equal_filter
22 _date_filter
23 _previous_days_filter
24 _s_filter
25
26 _excludes_filter
27 _link_filter
28 _uid_filter
29 _blog_id_filter
30 _tags_filter
31 _public_records_filter
32 );
33 return \@available_filters;
34 }
35
36 # ----------------------------------------------------------------------------
37 # Свойства храним в массивах, потому что порядок важен!
38 # Это общие свойства - одинаковые для всех документов.
39 #
40 # attr - обязательный параметр, название атрибута;
41 # type - тип аттрибута, требуется для отображдения;
42 # rusname - русское название, опять же требуется для отображения;
43 # hidden - равен 1, когда
44 # readonly - инициализации при записи только без изменения в дальнейшем
45 # db_field - поле в таблице
46 # default - значение по умолчанию (поле всегда имеет это значение)
47 # ----------------------------------------------------------------------------
48 sub required_properties
49 {
50 my $self = shift;
51
52 my @parent_properties = $self->SUPER::required_properties;
53 return (
54 @parent_properties,
55 235 ahitrov {
56 'attr' => 'alias',
57 'type' => 'string',
58 'rusname' => 'Web-алиас',
59 'db_field' => 'alias',
60 'db_type' => 'varchar(64)',
61 },
62 234 ahitrov { # Пользователь...
63 'attr' => 'uid',
64 'type' => 'integer',
65 'rusname' => 'Пользователь',
66 'db_field' => 'uid',
67 'db_type' => 'integer',
68 'db_opts' => 'not null',
69 },
70 { # Блог...
71 'attr' => 'blog_id',
72 'type' => 'integer',
73 'rusname' => 'Блог',
74 'db_field' => 'blog_id',
75 'db_type' => 'integer',
76 'db_opts' => 'not null',
77 },
78 { # Количество записей...
79 'attr' => 'comments',
80 'type' => 'integer',
81 'rusname' => 'Количество комментариев',
82 'db_field' => 'comments',
83 'db_type' => 'integer',
84 'db_opts' => 'default 0',
85 },
86 {
87 'attr' => 'tags',
88 'type' => 'string',
89 'rusname' => 'Теги (через запятую)',
90 'shortname' => 'Теги',
91 'db_field' => 'tags',
92 'db_type' => 'text',
93 },
94 );
95 }
96
97 sub _uid_filter {
98 my ($self,%opts)=@_;
99 return undef unless ( exists $opts{uid} && $opts{uid} );
100 return &SQL::Common::_generic_int_filter('d.uid', $opts{uid});
101 }
102
103 sub _blog_id_filter {
104 my ($self,%opts)=@_;
105 return undef unless ( exists $opts{blog_id} );
106 return &SQL::Common::_generic_int_filter('d.blog_id', $opts{blog_id});
107 }
108
109 sub _tags_filter {
110 my ($self,%opts)=@_;
111 return undef unless ( exists $opts{tags} );
112 my (@wheres, @binds, $join);
113
114 my $link_table = blogs::SQL::TagCloudTable->db_table;
115 my $tag_table = blogs::SQL::TagsTable->db_table;
116 $join = " join $link_table as l on l.dest_id=d.id and l.dest_class=d.class";
117 push @wheres, "l.source_id in (select id from $tag_table where name ilike ?)";
118 push @binds, $opts{tags};
119 return (\@wheres, \@binds, $join);
120 }
121
122 sub _public_records_filter {
123 my ($self,%opts)=@_;
124 return undef unless ( exists $opts{public} );
125
126 my ($where, $values, $joins) = ([], [], []);
127 push @$joins, ' INNER JOIN blogs AS b ON d.blog_id=b.id ';
128 push @$where, ' b.type = ? ';
129 push @$values, $opts{public};
130
131 return ($where, $values, $joins);
132 }
133
134 sub _get_orders {
135 my ($self, %opts) = @_;
136
137 if ($opts{order_by}) {
138 return ' order by '.$opts{order_by};
139 } else {
140 return ' order by dtime desc';
141 }
142 return undef;
143 }
144
145 1;
146