[Rt-commit] r18638 - rt/3.999/branches/on-tisql/lib/RT/Model

ruz at bestpractical.com ruz at bestpractical.com
Tue Mar 3 13:44:38 EST 2009


Author: ruz
Date: Tue Mar  3 13:44:38 2009
New Revision: 18638

Modified:
   rt/3.999/branches/on-tisql/lib/RT/Model/Ticket.pm

Log:
* add links/linked_to/linked_from columns with tisql expressions to the ticket model

Modified: rt/3.999/branches/on-tisql/lib/RT/Model/Ticket.pm
==============================================================================
--- rt/3.999/branches/on-tisql/lib/RT/Model/Ticket.pm	(original)
+++ rt/3.999/branches/on-tisql/lib/RT/Model/Ticket.pm	Tue Mar  3 13:44:38 2009
@@ -82,6 +82,54 @@
 
 sub table {'Tickets'}
 
+# A helper table for links mapping to make it easier
+# to build and parse links between tickets
+
+our %LINKTYPEMAP = (
+    MemberOf => {
+        type => 'MemberOf',
+        mode => 'target',
+    },
+    Parents => {
+        type => 'MemberOf',
+        mode => 'target',
+    },
+    Members => {
+        type => 'MemberOf',
+        mode => 'base',
+    },
+    Children => {
+        type => 'MemberOf',
+        mode => 'base',
+    },
+    HasMember => {
+        type => 'MemberOf',
+        mode => 'base',
+    },
+    RefersTo => {
+        type => 'RefersTo',
+        mode => 'target',
+    },
+    ReferredToBy => {
+        type => 'RefersTo',
+        mode => 'base',
+    },
+    DependsOn => {
+        type => 'DependsOn',
+        mode => 'target',
+    },
+    DependedOnBy => {
+        type => 'DependsOn',
+        mode => 'base',
+    },
+    MergedInto => {
+        type => 'MergedInto',
+        mode => 'target',
+    },
+
+);
+
+
 use Jifty::DBI::Schema;
 use Jifty::DBI::Record schema {
 
@@ -151,6 +199,47 @@
     column recursive_groups_watching =>
         references RT::Model::GroupCollection
         by tisql => 'recursive_groups_watching.id = .role_groups{%1}.cgm.member_id';
+
+    column links =>
+        references RT::Model::LinkCollection
+        by tisql => sub {
+            my %args = (
+                parser => undef,
+                tisql => undef,
+                placeholders => undef,
+                @_
+            );
+
+            my $types = $args{'placeholders'}{'type'};
+            unless ( $types ) {
+                return query => '(links.local_base = .id OR links.local_target = .id) AND links.type = %type';
+            }
+            
+            my $mode = '';
+            for my $type ( splice @$types ) {
+                die "'$type' is not correct type of a link for ticket"
+                    unless my $meta = $LINKTYPEMAP{ $type };
+
+                if ( $mode && $mode ne $meta->{'mode'} ) {
+                    die "Can not mix link types with different direction in one join";
+                }
+                $mode = $meta->{'mode'};
+                push @$types, $meta->{'type'};
+            }
+
+            if ( $mode eq 'base' ) {
+                return query => 'links.local_target = .id AND links.type = %type';
+            }
+            else {
+                return query => 'links.local_base = .id AND links.type = %type';
+            }
+        };
+    column links_to =>
+        references RT::Model::LinkCollection
+        by tisql => 'links.local_base = .id AND links.type = %type';
+    column links_from =>
+        references RT::Model::LinkCollection
+        by tisql => 'links.local_target = .id AND links.type = %type';
 };
 
 use Jifty::Plugin::ActorMetadata::Mixin::Model::ActorMetadata map => {
@@ -164,54 +253,6 @@
 # A helper table for links mapping to make it easier
 # to build and parse links between tickets
 
-our %LINKTYPEMAP = (
-    MemberOf => {
-        type => 'MemberOf',
-        mode => 'target',
-    },
-    Parents => {
-        type => 'MemberOf',
-        mode => 'target',
-    },
-    Members => {
-        type => 'MemberOf',
-        mode => 'base',
-    },
-    Children => {
-        type => 'MemberOf',
-        mode => 'base',
-    },
-    HasMember => {
-        type => 'MemberOf',
-        mode => 'base',
-    },
-    RefersTo => {
-        type => 'RefersTo',
-        mode => 'target',
-    },
-    ReferredToBy => {
-        type => 'RefersTo',
-        mode => 'base',
-    },
-    DependsOn => {
-        type => 'DependsOn',
-        mode => 'target',
-    },
-    DependedOnBy => {
-        type => 'DependsOn',
-        mode => 'base',
-    },
-    MergedInto => {
-        type => 'MergedInto',
-        mode => 'target',
-    },
-
-);
-
-
-# A helper table for links mapping to make it easier
-# to build and parse links between tickets
-
 our %LINKDIRMAP = (
     MemberOf => {
         base   => 'MemberOf',


More information about the Rt-commit mailing list