[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