[Rt-commit] rt branch, 4.4/columns-as-values-in-ticket-search, updated. rt-4.4.4-24-ge6f26b4610

? sunnavy sunnavy at bestpractical.com
Mon Mar 15 15:40:12 EDT 2021


The branch, 4.4/columns-as-values-in-ticket-search has been updated
       via  e6f26b46100b539827f2c5e43ad0b427de413750 (commit)
       via  a8956daba22b7e09b8823e0479928fcdd0bfe79c (commit)
       via  b419da95308f1c09e0739b7800431b96a160d4ec (commit)
      from  771ee67205471a8d68717684e5e87a16913271c8 (commit)

Summary of changes:
 lib/RT/SQL.pm     |  7 +++++++
 lib/RT/Tickets.pm |  3 +++
 t/api/tickets.t   | 10 ++++++++++
 3 files changed, 20 insertions(+)

- Log -----------------------------------------------------------------
commit b419da95308f1c09e0739b7800431b96a160d4ec
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Tue Mar 16 02:02:08 2021 +0800

    Support quoted custom fields as values
    
    As custom fields with spaces need to be quoted at the field side, e.g.
    
        'CF.{Last Detected}' > Due
    
    It's natural to support quotes at the value side too, i.e.
    
        Due < 'CF.{Last Detected}'
    
    It's quite rare that people want to search raw strings like "CF.{Last
    Detected}", so this change should be safe enough.

diff --git a/lib/RT/SQL.pm b/lib/RT/SQL.pm
index 3d81047dc9..9599375a06 100644
--- a/lib/RT/SQL.pm
+++ b/lib/RT/SQL.pm
@@ -180,6 +180,13 @@ sub Parse {
             my $quote_value;
             if ( $match =~ /$re_delim/o ) {
                 $quote_value = 1;
+
+                # It's really rare to search strings like "CF.foo", to DWIM,
+                # automatically convert to columns
+                if ( $value =~ /^CF\.(?:\{(.*)\}|(.*?))(?:\.(Content|LargeContent))?$/i ) {
+                    RT->Logger->debug("Unquote value($match) to search custom field instead");
+                    $quote_value = 0;
+                }
             }
             elsif ( $match =~ /^[a-z]/i ) {
                 # Value is a column

commit a8956daba22b7e09b8823e0479928fcdd0bfe79c
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Tue Mar 16 02:26:23 2021 +0800

    Test quoted custom fields as values

diff --git a/t/api/tickets.t b/t/api/tickets.t
index 2955bf2875..6ca845d222 100644
--- a/t/api/tickets.t
+++ b/t/api/tickets.t
@@ -199,6 +199,11 @@ ok( $unlimittickets->Count > 0, "UnLimited tickets object should return tickets"
     $count = $tickets->Count();
     is( $count, 1, 'Found 1 ticket' );
 
+    ( $ret, $msg ) = $tickets->FromSQL('CF.foo = "CF.{bar}"');
+    ok( $ret, 'Ran query with CF.foo = "CF.bar"' );
+    $count = $tickets->Count();
+    is( $count, 1, 'Found 1 ticket' );
+
     ( $ret, $msg ) = $tickets->FromSQL('CF.foo = Owner');
     ok( $ret, 'Ran query with CF.foo = Owner' );
     $count = $tickets->Count();
@@ -258,6 +263,11 @@ ok( $unlimittickets->Count > 0, "UnLimited tickets object should return tickets"
     $count = $tickets->Count();
     is( $count, 1, 'Found 1 ticket' );
 
+    ( $ret, $msg ) = $tickets->FromSQL('CF.{IPRange 1}.Content = "CF.{IPRange 2}.Content"');
+    ok( $ret, 'Ran query with CF.{IPRange 1}.Content = "CF.{IPRange 2}.Content"' );
+    $count = $tickets->Count();
+    is( $count, 1, 'Found 1 ticket' );
+
     ( $ret, $msg ) = $tickets->FromSQL('CF.{IPRange 1} = CF.{IPRange 2}');
     ok( $ret, 'Ran query with CF.{IPRange 1} = CF.{IPRange 2}' );
     $count = $tickets->Count();

commit e6f26b46100b539827f2c5e43ad0b427de413750
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Tue Mar 16 02:39:50 2021 +0800

    Prefix "main." to main columns to avoid "ambiguous column name" error
    
    This is to fix TicketSQL like:
    
        CF.{Beta Date} < LastUpdated
    
    As there are multiple tables that have LastUpdated column involved,
    above SQL could cause errors like "ambiguous column name"

diff --git a/lib/RT/Tickets.pm b/lib/RT/Tickets.pm
index 4532c02b58..7bf0f2414a 100644
--- a/lib/RT/Tickets.pm
+++ b/lib/RT/Tickets.pm
@@ -3223,6 +3223,9 @@ sub _parser {
 
                 die $self->loc( "Wrong query, no such column '[_1]' in '[_2]'", $value, $string ) unless $valid;
 
+                # In case the column(e.g. LastUpdated) is defined in multiple tables
+                $value = "main.$value" if $class eq 'RT::Tickets' && $value =~ /^\w+$/;
+
                 if ( $class eq 'RT::ObjectCustomFieldValues' ) {
                     if ( RT->Config->Get('DatabaseType') eq 'Pg' ) {
                         my $cast_to;

-----------------------------------------------------------------------


More information about the rt-commit mailing list