[Rt-commit] rt 01/03: Support HasUnreadMessages and HasNoUnreadMessages criteria for ticket search

sunnavy sunnavy at bestpractical.com
Mon Aug 9 19:18:01 UTC 2021


This is an automated email from the git hooks/post-receive script.

sunnavy pushed a commit to branch 4.4/ticket-search-unread-messages
in repository rt.

commit e095d322cec6210feae0ce68ee34640df40ddc65
Author: sunnavy <sunnavy at bestpractical.com>
AuthorDate: Wed Jul 28 01:55:47 2021 +0800

    Support HasUnreadMessages and HasNoUnreadMessages criteria for ticket search
---
 lib/RT/Tickets.pm | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 141 insertions(+)

diff --git a/lib/RT/Tickets.pm b/lib/RT/Tickets.pm
index 348f66ea9a..6c46e15f5a 100644
--- a/lib/RT/Tickets.pm
+++ b/lib/RT/Tickets.pm
@@ -167,6 +167,8 @@ our %FIELD_METADATA = (
     WatcherGroup     => [ 'MEMBERSHIPFIELD', ], #loc_left_pair
     HasAttribute     => [ 'HASATTRIBUTE', 1 ],
     HasNoAttribute     => [ 'HASATTRIBUTE', 0 ],
+    HasUnreadMessages   => [ 'HASUNREADMESSAGES', 1 ],
+    HasNoUnreadMessages => [ 'HASUNREADMESSAGES', 0 ],
 );
 
 # Lower Case version of FIELDS, for case insensitivity
@@ -197,6 +199,7 @@ our %dispatch = (
     CUSTOMFIELD     => \&_CustomFieldLimit,
     HASATTRIBUTE    => \&_HasAttributeLimit,
     LIFECYCLE       => \&_LifecycleLimit,
+    HASUNREADMESSAGES => \&_HasUnreadMessagesLimit,
 );
 
 # Default EntryAggregator per type
@@ -1432,6 +1435,144 @@ sub _HasAttributeLimit {
     );
 }
 
+sub _HasUnreadMessagesLimit {
+    my ( $orig_self, $field, $op, $value, %rest ) = @_;
+
+    my $self;
+    if ( $FIELD_METADATA{$field}->[1] ) {
+        $self = $orig_self;
+    }
+    else {
+        $self = $orig_self->Clone;
+    }
+
+    my $alias = $self->Join(
+        TYPE   => 'LEFT',
+        ALIAS1 => 'main',
+        FIELD1 => 'id',
+        TABLE2 => 'Attributes',
+        FIELD2 => 'ObjectId',
+    );
+    $self->Limit(
+        LEFTJOIN        => $alias,
+        FIELD           => 'ObjectType',
+        VALUE           => 'RT::Ticket',
+        ENTRYAGGREGATOR => 'AND',
+    );
+
+    my $db_type = RT->Config->Get('DatabaseType');
+    my $quote_value;
+    my $attr_name;
+    if ( $value =~ /\D/ ) {
+        if ( $value =~ /^(?:main\.)?Owner$/i ) {
+            if ( $db_type =~ /Oracle|SQLite/ ) {
+                $attr_name = "'User-' || main.Owner || '-SeenUpTo'";
+            }
+            else {
+                $attr_name = "CONCAT('User-', main.Owner, '-SeenUpTo')";
+            }
+            $value       = 'main.Owner';
+            $quote_value = 0;
+        }
+        else {
+            my $user = RT::User->new( $self->CurrentUser );
+            $user->Load($value);
+            $value = $user->Id || 0;
+        }
+    }
+
+    if ( $value =~ /^\d+$/ ) {
+        $attr_name   = "User-$value-SeenUpTo";
+        $quote_value = 1;
+    }
+
+    $self->Limit(
+        LEFTJOIN        => $alias,
+        FIELD           => 'Name',
+        OPERATOR        => $op,
+        VALUE           => $attr_name,
+        QUOTEVALUE      => $quote_value,
+        ENTRYAGGREGATOR => 'AND',
+    );
+
+    my $ticket_alias = $self->Join(
+        ALIAS1 => 'main',
+        FIELD1 => 'id',
+        TABLE2 => 'Tickets',
+        FIELD2 => 'EffectiveId',
+    );
+    my $txn_alias = $self->Join(
+        ALIAS1 => $ticket_alias,
+        FIELD1 => 'id',
+        TABLE2 => 'Transactions',
+        FIELD2 => 'ObjectId',
+    );
+    $self->Limit(
+        LEFTJOIN        => $txn_alias,
+        FIELD           => 'ObjectType',
+        VALUE           => 'RT::Ticket',
+        ENTRYAGGREGATOR => 'AND',
+    );
+    $self->Limit(
+        LEFTJOIN        => $txn_alias,
+        FIELD           => 'Type',
+        VALUE           => [ 'Create', 'Correspond', 'Comment' ],
+        OPERATOR        => 'IN',
+        ENTRYAGGREGATOR => 'AND',
+    );
+    $self->Limit(
+        LEFTJOIN   => $txn_alias,
+        FIELD      => 'Creator',
+        VALUE      => $value,
+        OPERATOR   => '!=',
+        QUOTEVALUE => $quote_value,
+    );
+
+    my $function;
+    if ( $db_type eq 'Pg' ) {
+        $function = "CAST($txn_alias.Created AS TEXT)";
+    }
+    elsif ( $db_type eq 'Oracle' ) {
+        $function = "TO_CHAR($txn_alias.Created, 'YYYY-MM-DD HH24:MI:SS')";
+    }
+
+    $self->_OpenParen();
+
+    # Has no SeenUpTo attribute and has contents created by other people ever
+    $self->Limit(
+        %rest,
+        ALIAS      => $alias,
+        FIELD      => 'id',
+        OPERATOR   => 'IS',
+        VALUE      => 'NULL',
+        QUOTEVALUE => 0,
+    );
+
+    # Has SeenUpTo attribute and contents created by other people after that
+    $self->Limit(
+        ALIAS           => $txn_alias,
+        FIELD           => 'Created',
+        OPERATOR        => '>',
+        VALUE           => $db_type eq 'Oracle' ? "DBMS_LOB.substr($alias.Content, 19)" : "$alias.Content",
+        QUOTEVALUE      => 0,
+        ENTRYAGGREGATOR => 'OR',
+        $function ? ( FUNCTION => $function ) : (),
+    );
+    $self->_CloseParen();
+
+    # HasNoUnreadMessages is the reverse of HasUnreadMessages
+    if ( !$FIELD_METADATA{$field}->[1] ) {
+        $self->Columns('id');
+        $orig_self->Limit(
+            %rest,
+            FIELD      => 'id',
+            OPERATOR   => 'NOT IN',
+            VALUE      => '(' . $self->BuildSelectQuery . ')',
+            QUOTEVALUE => 0,
+        );
+    }
+}
+
 
 sub _LifecycleLimit {
     my ( $self, $field, $op, $value, %rest ) = @_;

-- 
To stop receiving notification emails like this one, please contact
sysadmin at bestpractical.com.


More information about the rt-commit mailing list