[MKDoc-commit] Patch from Sam adds a new column,
"Documents Contributed To" and
chris at mkdoc.demon.co.uk
chris at mkdoc.demon.co.uk
Mon May 16 10:01:27 BST 2005
Log Message:
-----------
Patch from Sam adds a new column, "Documents Contributed To" and improves the
performance on the UFI database.
Tags:
----
mkdoc-1-6
Modified Files:
--------------
mkd/flo/plugin/Admin:
UserCSV.pm
-------------- next part --------------
Index: UserCSV.pm
===================================================================
RCS file: /var/spool/cvs/mkd/flo/plugin/Admin/Attic/UserCSV.pm,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -Lflo/plugin/Admin/UserCSV.pm -Lflo/plugin/Admin/UserCSV.pm -u -r1.1.2.3 -r1.1.2.4
--- flo/plugin/Admin/UserCSV.pm
+++ flo/plugin/Admin/UserCSV.pm
@@ -99,6 +99,9 @@
# build CSV output
$self->build_csv();
+
+ # flush the cache
+ $self->cache_flush();
return 'TERMINATE';
}
@@ -150,6 +153,7 @@
"Monthly Newsletter",
"Editor Status",
"Documents Created",
+ "Documents Contributed To",
(map { "$_ (Group)" } @group_names),
(map { "$_ (Audience)" } @audience_names),
(map { "$_ (Language)" } @language_names) );
@@ -170,6 +174,7 @@
# output a single row of data
sub data_fields {
my ($self, $user, $group_ids, $audience_ids, $language_ids) = @_;
+ my $user_id = $user->id;
my $pref = $user->preferences;
# login, email, first name, family name
@@ -188,17 +193,35 @@
push @data, _bool($user->group eq 'editor');
# documents created
- push @data, $self->documents_created($user);
+ my $cre_map = $self->cache_get('created_map') ||
+ $self->cache_set(created_map =>
+ $self->documents_created_map());
+ push @data, $cre_map->{$user_id} || 0;
+
+ # documents contributed to
+ my $con_map = $self->cache_get('contrib_map') ||
+ $self->cache_set(contrib_map =>
+ $self->documents_contrib_map());
+ push @data, $con_map->{$user_id} || 0;
# group membership
push @data, map { _bool($self->group_member($user, $_)) } @$group_ids;
- # audicence membership
- push @data, map { $self->audience_setting($user, $_) } @$audience_ids;
+ # audicence membership (fetch from cache because the audience pref
+ # table isn't indexed)
+ my $aud_map = $self->cache_get('audience_map') ||
+ $self->cache_set(audience_map => $self->audience_map());
+ push @data,
+ map { $aud_map->{($user_id, $_)} ? "TRUE" : "" } @$audience_ids;
- # language membership
- push @data, map { $self->language_setting($user, $_) } @$language_ids;
+ # language membership (fetch from cache because the language pref
+ # table isn't indexed)
+ my $lang_map = $self->cache_get('language_map') ||
+ $self->cache_set(language_map => $self->language_map());
+ push @data,
+ map { $lang_map->{($user_id, $_)} ? "TRUE" : "" } @$language_ids;
+
return $self->add_data($user, @data);
}
@@ -229,13 +252,24 @@
return wantarray ? @res : \@res;
}
-sub documents_created {
+sub documents_created_map {
my ($self, $user) = @_;
my $dbh = lib::sql::DBH->get();
- my ($count) = $dbh->selectrow_array('SELECT COUNT(*) FROM Document
- WHERE Editor_Created_ID = ?',
- undef, $user->id);
- return $count || 0;
+
+ my $results = $dbh->selectall_arrayref('SELECT Editor_Created_ID, COUNT(*)
+ FROM Document
+ GROUP BY Editor_Created_ID');
+ return { map { ($_->[0], $_->[1]) } @$results };
+}
+
+sub documents_contrib_map {
+ my ($self, $user) = @_;
+ my $dbh = lib::sql::DBH->get();
+
+ my $results = $dbh->selectall_arrayref('SELECT Editor_ID, COUNT(*)
+ FROM Contributor
+ GROUP BY Editor_ID');
+ return { map { ($_->[0], $_->[1]) } @$results };
}
sub group_member {
@@ -250,29 +284,55 @@
return $exists;
}
-
-sub audience_setting {
+# pull all audience mapping data at once since querying the table is
+# very slow. Returns a hash mapping ($user_id, $audience_id) to 1
+# for LIKE.
+sub audience_map {
my ($self, $user, $aud_id) = @_;
my $dbh = lib::sql::DBH->get();
- my ($value) =
- $dbh->selectrow_array('SELECT Value FROM Preference_Audience
- WHERE Audience_ID = ? AND Editor_ID = ?',
- undef, $aud_id, $user->id);
- $value ||= DONT_MIND;
- return $value == LIKE ? "TRUE" : "";
+ my $result =
+ $dbh->selectall_arrayref('SELECT Editor_ID, Audience_ID, Value
+ FROM Preference_Audience');
+ my %map;
+ foreach my $row (@$result) {
+ next unless $row->[2] == LIKE;
+ $map{($row->[0], $row->[1])} = 1;
+ }
+ return \%map;
}
-sub language_setting {
+# pull all audience mapping data at once since querying the table is
+# moderately slow. Returns a hash mapping ($user_id, $language_id) to
+# 1 for LIKE.
+sub language_map {
my ($self, $user, $lang_id) = @_;
my $dbh = lib::sql::DBH->get();
-
- my ($value) =
- $dbh->selectrow_array('SELECT Value FROM Preference_Language
- WHERE Language_ID = ? AND Editor_ID = ?',
- undef, $lang_id, $user->id);
- $value ||= DONT_MIND;
- return $value == LIKE ? "TRUE" : "";
+
+ my $result =
+ $dbh->selectall_arrayref('SELECT Editor_ID, Language_ID, Value
+ FROM Preference_Language');
+ my %map;
+ foreach my $row (@$result) {
+ next unless $row->[2] == LIKE;
+ $map{($row->[0], $row->[1])} = 1;
+ }
+ return \%map;
+}
+
+# simple caching system used while generating the CSV
+sub cache_get {
+ my ($self, $key) = @_;
+ return $self->{__cache__}{$key} if exists $self->{__cache__}{$key};
+}
+
+sub cache_set {
+ my ($self, $key, $value) = @_;
+ return $self->{__cache__}{$key} = $value;
+}
+
+sub cache_flush {
+ delete $_[0]->{__cache__};
}
1;
More information about the MKDoc-commit
mailing list