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

sunnavy sunnavy at bestpractical.com
Tue Jul 27 21:47:47 UTC 2021


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

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

commit 69bc5a1ae5bfb5f6c3bbf3d3f5b17042faa9a85f
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 | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 178 insertions(+)

diff --git a/lib/RT/Tickets.pm b/lib/RT/Tickets.pm
index 348f66ea9a..680ada227c 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,181 @@ sub _HasAttributeLimit {
     );
 }
 
+sub _HasUnreadMessagesLimit {
+    my ( $self, $field, $op, $value, %rest ) = @_;
+
+    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 @txn_aliases;
+    # We need 2 LEFT JOIN txn aliases for HasNoUnreadMessages
+    for ( 1 .. ( $FIELD_METADATA{$field}->[1] ? 1 : 2 ) ) {
+        my $txn_alias = $self->Join(
+            $FIELD_METADATA{$field}->[1] ? () : ( TYPE => 'LEFT' ),
+            ALIAS1 => 'main',
+            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,
+        );
+        push @txn_aliases, $txn_alias;
+    }
+
+    my $function;
+    if ( $db_type eq 'Pg' ) {
+        $function = "CAST($txn_aliases[0].Created AS TEXT)";
+    }
+    elsif ( $db_type eq 'Oracle' ) {
+        $function = "TO_CHAR($txn_aliases[0].Created, 'YYYY-MM-DD HH24:MI:SS')";
+    }
+
+    if ( $FIELD_METADATA{$field}->[1] ) {
+        $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_aliases[0],
+            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();
+    }
+    else {
+        $self->_OpenParen();
+
+        $self->_OpenParen();
+
+        # Has SeenUpTo attribute and no contents created by other people after that
+        $self->Limit(
+            LEFTJOIN   => $txn_aliases[0],
+            FIELD      => 'Created',
+            VALUE      => $db_type eq 'Oracle' ? "DBMS_LOB.substr($alias.Content, 19)" : "$alias.Content",
+            OPERATOR   => '>',
+            QUOTEVALUE => 0,
+            $function ? ( FUNCTION => $function ) : (),
+        );
+        $self->Limit(
+            %rest,
+            ALIAS           => $alias,
+            FIELD           => 'id',
+            OPERATOR        => 'IS NOT',
+            VALUE           => 'NULL',
+            QUOTEVALUE      => 0,
+        );
+        $self->Limit(
+            ALIAS           => $txn_aliases[0],
+            FIELD           => 'id',
+            OPERATOR        => 'IS',
+            VALUE           => 'NULL',
+            QUOTEVALUE      => 0,
+            ENTRYAGGREGATOR => 'AND',
+        );
+        $self->_CloseParen();
+
+        $self->_OpenParen();
+
+        # Has no SeenUpTo attribute and no contents created by other people ever
+        $self->Limit(
+            ALIAS           => $alias,
+            FIELD           => 'id',
+            OPERATOR        => 'IS',
+            VALUE           => 'NULL',
+            QUOTEVALUE      => 0,
+            ENTRYAGGREGATOR => 'OR',
+        );
+        $self->Limit(
+            ALIAS           => $txn_aliases[1],
+            FIELD           => 'id',
+            OPERATOR        => 'IS',
+            VALUE           => 'NULL',
+            QUOTEVALUE      => 0,
+            ENTRYAGGREGATOR => 'AND',
+        );
+        $self->_CloseParen();
+
+        $self->_CloseParen();
+    }
+}
+
 
 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