Add a ?poster= argument which can be used in communities to pull up 
entries per-user.

        Patch from LiveJournal. Packaged for Dreamwidth by <user 
name="sophie">. 
X-Hg-Repo: dw-free
  Subject: dw-free: http://bugs.dwscoalition.org/show_bug.cgi?id=1585
  From: fu
  
  changeset b5dd5b6b8dfe in /home/hg/repos/dw-free
  details: http://hg.dwscoalition.org/dw-free?cmd=changeset;node=b5dd5b6b8dfe
  description:
    http://bugs.dwscoalition.org/show_bug.cgi?id=1585

        ?mode=all / ?mode=and (same thing) to supplement ?mode=or (default) for 
tags.

        Patch from LiveJournal, packaged for Dreamwidth by <user 
name="kareila">. 

diffs (159 lines):

diff -r 40b50d31b671 -r b5dd5b6b8dfe cgi-bin/DW/Logic/LogItems.pm
--- a/cgi-bin/DW/Logic/LogItems.pm      Tue Nov 16 18:52:05 2010 +0800
+++ b/cgi-bin/DW/Logic/LogItems.pm      Tue Nov 16 20:33:40 2010 +0800
@@ -345,6 +345,7 @@ sub watch_items
 #           -- viewall: if set, no security is used.
 #           -- dateformat: if "S2", uses S2's 'alldatepart' format.
 #           -- itemids: optional arrayref onto which itemids should be pushed
+#           -- posterid: optional, return (community) posts made by this 
poster only
 # returns: array of hashrefs containing keys:
 #          -- itemid (the jitemid)
 #          -- posterid
@@ -440,13 +441,43 @@ sub recent_items
 
     # if we need to get by tag, get an itemid list now
     my $jitemidwhere = '';
-    if (ref $args{tagids} eq 'ARRAY' && @{$args{tagids}}) {
-        # select jitemids uniquely
-        my $in = join(',', map { $_+0 } @{$args{tagids}});
-        my $jitemids = $logdb->selectcol_arrayref(qq{
-                SELECT DISTINCT jitemid FROM logtagsrecent WHERE journalid = ? 
AND kwid IN ($in)
-            }, undef, $userid);
-        die $logdb->errstr if $logdb->err;
+    if ( ref $args{tagids} eq 'ARRAY' && @{ $args{tagids} } ) {
+
+        my $jitemids;
+
+        # $args{tagmode} = $args{getargs}->{mode} eq 'and' ? 'and' : 'or';
+
+        if ( $args{tagmode} eq 'and' ) {
+
+            my $limit = $LJ::TAG_INTERSECTION;
+            my $need = scalar @{ $args{tagids} };
+            $#{ $args{tagids} } = $limit - 1 if $need > $limit;
+
+            my $in = join( ',', map { $_+0 } @{ $args{tagids} } );
+            my $sth = $logdb->prepare( "SELECT jitemid, kwid FROM 
logtagsrecent WHERE journalid = ? AND kwid IN ($in)" );
+            $sth->execute( $userid );
+            die $logdb->errstr if $logdb->err;
+
+            my %mix;
+            while ( my $row = $sth->fetchrow_arrayref ) {
+                my ( $jitemid ) = @$row;
+                $mix{$jitemid}++;
+            }
+
+            foreach my $jitemid ( keys %mix ) {
+                delete $mix{$jitemid} if $mix{$jitemid} < $need;
+            }
+
+            $jitemids = [ keys %mix ];
+
+        } else { # mode: 'or'
+            # select jitemids uniquely
+            my $in = join( ',', map { $_+0 } @{ $args{tagids} } );
+            $jitemids = $logdb->selectcol_arrayref( qq{
+                    SELECT DISTINCT jitemid FROM logtagsrecent WHERE journalid 
= ? AND kwid IN ($in)
+                }, undef, $userid );
+            die $logdb->errstr if $logdb->err;
+        }
 
         # set $jitemidwhere iff we have jitemids
         if (@$jitemids) {
@@ -506,13 +537,20 @@ sub recent_items
         $sql_select = "AND $sort_key <= $notafter";
     }
 
+    my $posterwhere;
+    if ( $args{posterid} && $args{posterid} =~ /^(\d+)$/ ) {
+        $posterwhere = " AND posterid=$1";
+    } else {
+        $posterwhere = "";
+    }
+
     $sql = qq{
         SELECT jitemid AS 'itemid', posterid, security, $extra_sql
                DATE_FORMAT(eventtime, "$dateformat") AS 'alldatepart', anum,
                DATE_FORMAT(logtime, "$dateformat") AS 'system_alldatepart',
                allowmask, eventtime, logtime
         FROM log2 USE INDEX ($sort_key)
-        WHERE journalid=$userid $sql_select $secwhere $jitemidwhere 
$securitywhere
+        WHERE journalid=$userid $sql_select $secwhere $jitemidwhere 
$securitywhere $posterwhere
         ORDER BY journalid, $sort_key
         $sql_limit
     };
diff -r 40b50d31b671 -r b5dd5b6b8dfe cgi-bin/LJ/S2/RecentPage.pm
--- a/cgi-bin/LJ/S2/RecentPage.pm       Tue Nov 16 18:52:05 2010 +0800
+++ b/cgi-bin/LJ/S2/RecentPage.pm       Tue Nov 16 20:33:40 2010 +0800
@@ -120,6 +120,11 @@ sub RecentPage
             $remote->view_priv_check( $u, $get->{viewall}, 'lastn' );
     }
 
+    my $posteru_filter;
+    if ( defined( $get->{poster} ) ) {
+        $posteru_filter = LJ::load_user( $get->{poster} );
+    }
+
     ## load the itemids
     my @itemids;
     my $err;
@@ -131,11 +136,13 @@ sub RecentPage
         itemshow      => $itemshow + 1,
         skip          => $skip,
         tagids        => $opts->{tagids},
+        tagmode       => $opts->{tagmode},
         security      => $opts->{securityfilter},
         itemids       => \...@itemids,
         dateformat    => 'S2',
         order         => ( $u->is_community || $u->is_syndicated ) ? 'logtime' 
: '',
         err           => \$err,
+        posterid      => $posteru_filter ? $posteru_filter->id : undef,
     );
 
     my $is_prev_exist = scalar @items - $itemshow > 0 ? 1 : 0;
@@ -230,7 +237,8 @@ sub RecentPage
                                   style    => $mine                           
|| "",
                                   s2id     => LJ::eurl( $get->{s2id} )        
|| "",
                                   tag      => LJ::eurl( $get->{tag} )         
|| "",
-                                  security => LJ::eurl( $get->{security} )    
|| "" } );
+                                  security => LJ::eurl( $get->{security} )    
|| "",
+                                  poster   => $posteru_filter ? 
$posteru_filter->user : "" } );
         $nav->{'forward_count'} = $itemshow;
         $p->{head_content} .= qq{<link rel="next" href="$nav->{forward_url}" 
/>\n}
     }
@@ -251,7 +259,8 @@ sub RecentPage
                                        style    => $mine                       
    || "",
                                        s2id     => LJ::eurl( $get->{s2id} )    
    || "",
                                        tag      => LJ::eurl( $get->{tag} )     
    || "",
-                                       security => LJ::eurl( $get->{security} 
)    || "" } );
+                                       security => LJ::eurl( $get->{security} 
)    || "",
+                                       poster   => $posteru_filter ? 
$posteru_filter->user : "" } );
             $nav->{'backward_skip'} = $newskip;
         }
         $p->{head_content} .= qq{<link rel="prev" href="$nav->{backward_url}" 
/>\n};
diff -r 40b50d31b671 -r b5dd5b6b8dfe cgi-bin/LJ/User.pm
--- a/cgi-bin/LJ/User.pm        Tue Nov 16 18:52:05 2010 +0800
+++ b/cgi-bin/LJ/User.pm        Tue Nov 16 20:33:40 2010 +0800
@@ -9303,6 +9303,11 @@ sub make_journal {
                 unless $kwref{$_};
             push @{$opts->{tagids}}, $kwref{$_};
         }
+
+        my $tagmode = $opts->{getargs}->{mode} || '';
+        $opts->{tagmode} = $tagmode eq 'and' ? 'and' : 'or';
+        # also allow mode=all (equivalent to 'and')
+        $opts->{tagmode} = 'and' if $tagmode eq 'all';
     }
 
     # validate the security filter
diff -r 40b50d31b671 -r b5dd5b6b8dfe cgi-bin/ljfeed.pl
--- a/cgi-bin/ljfeed.pl Tue Nov 16 18:52:05 2010 +0800
+++ b/cgi-bin/ljfeed.pl Tue Nov 16 20:33:40 2010 +0800
@@ -117,6 +117,7 @@ sub make_feed
             itemshow => 25,
             order => 'logtime',
             tagids => $opts->{tagids},
+            tagmode => $opts->{tagmode},
             itemids => \...@itemids,
             friendsview => 1,           # this returns rlogtimes
             dateformat => 'S2',         # S2 format time format is easier
_______________________________________________
dw-changelog mailing list
[email protected]
http://lists.dwscoalition.org/mailman/listinfo/dw-changelog

Reply via email to