2. try ;-) Limit user in a perl script

Hi!

I try to ask again, because on my producton system it takes a very long
time to limit users (7 Minutes !!! per user :-(( ).

I try to search for users with no connections to any ticket and no
connection to any attachments to delete them later.

I can’t use rt-shredder directly :wink:

I try this:


my $user = RT::User->new($RT::SystemUser);
my $users = RT::Users->new($RT::SystemUser);
my $tix = RT::Tickets->new($RT::SystemUser);

$users->FindAllRows ;

while (my $uid = $users->next ) {
my $tickets = RT::Tickets->new($RT::SystemUser);
$user->Load($uid);
$tickets->FromSQL(‘
Type = “ticket” AND
Watcher ="’.$user->EmailAddress.’"’);

Delete_User if ! $tickets->Count();

But it takes much time (about 7 minutes per user )
in my system for every user.

~500.000 tickets
~ 61.100 users

Is there a better method to limit the user with no tickets and no
attachments or what am I doing wrong?

Cheers,
Björn

Well, that’s normal: you are scanning the whole tickets list again and again, for every user.
You should invert the nested loops such that you scan the tickets only once.

Something like this (kind of pseudo-code):

my $tickets = RT::Tickets->new($RT::SystemUser);
my @users_with_ticket;

let’s collect all the users who relate to some ticket

while (my $t = tickets->next) {
push @users_with_ticket, $t->Requestor;
push @users_with_ticket, $t->Owner;

push all the other actors

}

now, let’s take the complement of the set users_with_ticket

my $users = RT::Users->new($RT::SystemUser)
my @users_without_ticket;
while(my $u = $users->next) {
if ($u IS NOT IN $users_with_ticket) push @users_without_ticket, $u;
}

The last loop (just a draft) may still be critical, but considering that, in your case study, the bigger number is given by the tickets, I think you’re quite safe.

Regards

AS

Da: rt-users-bounces@lists.bestpractical.com [rt-users-bounces@lists.bestpractical.com] per conto di Björn Schulz [bjoern.schulz@desy.de]
Inviato: mercoledì 19 settembre 2012 15.48
A: rt-users@lists.bestpractical.com
Oggetto: [rt-users] 2. try :wink: Limit user in a perl script

Hi!

I try to ask again, because on my producton system it takes a very long
time to limit users (7 Minutes !!! per user :-(( ).

I try to search for users with no connections to any ticket and no
connection to any attachments to delete them later.

I can’t use rt-shredder directly :wink:

I try this:


my $user = RT::User->new($RT::SystemUser);
my $users = RT::Users->new($RT::SystemUser);
my $tix = RT::Tickets->new($RT::SystemUser);

$users->FindAllRows ;

while (my $uid = $users->next ) {
my $tickets = RT::Tickets->new($RT::SystemUser);
$user->Load($uid);
$tickets->FromSQL(‘
Type = “ticket” AND
Watcher ="’.$user->EmailAddress.’"’);

Delete_User if ! $tickets->Count();

But it takes much time (about 7 minutes per user )
in my system for every user.

~500.000 tickets
~ 61.100 users

Is there a better method to limit the user with no tickets and no
attachments or what am I doing wrong?

Cheers,
Björn

Final RT training for 2012 in Atlanta, GA - October 23 & 24
http://bestpractical.com/training

We’re hiring! http://bestpractical.com/jobs

Alberto Scotto

Blue Reply
Via Cardinal Massaia, 83
10147 - Torino - ITALY
phone: +39 011 29100
al.scotto@reply.it

The information transmitted is intended for the person or entity to which it is addressed and may contain confidential and/or privileged material. Any review, retransmission, dissemination or other use of, or taking of any action in reliance upon, this information by persons or entities other than the intended recipient is prohibited. If you received this in error, please contact the sender and delete the material from any computer.

But it takes much time (about 7 minutes per user )
in my system for every user.

~500.000 tickets
~ 61.100 users

Is there a better method to limit the user with no tickets and no
attachments or what am I doing wrong?

Why are you looking to delete users with no tickets in the first place?

(Note that your search won’t count deleted tickets that the user may be
a watcher on, but those tickets still exist and shredder will need to be
told what to do with them.)

Hi Alberto,

thx, thats a good idea!
I try to build code for that.
But first I’ve to thing about Thomas’ hint. :wink:

Cheers,

BjoernOn 19.09.12 17:17, Scotto Alberto wrote:

Well, that’s normal: you are scanning the whole tickets list again and again, for every user.
You should invert the nested loops such that you scan the tickets only once.

Something like this (kind of pseudo-code):

my $tickets = RT::Tickets->new($RT::SystemUser);
my @users_with_ticket;

let’s collect all the users who relate to some ticket

while (my $t = tickets->next) {
push @users_with_ticket, $t->Requestor;
push @users_with_ticket, $t->Owner;

push all the other actors

}

now, let’s take the complement of the set users_with_ticket

my $users = RT::Users->new($RT::SystemUser)
my @users_without_ticket;
while(my $u = $users->next) {
if ($u IS NOT IN $users_with_ticket) push @users_without_ticket, $u;
}

The last loop (just a draft) may still be critical, but considering that, in your case study, the bigger number is given by the tickets, I think you’re quite safe.

Regards

AS


Da: rt-users-bounces@lists.bestpractical.com [rt-users-bounces@lists.bestpractical.com] per conto di Bj�rn Schulz [bjoern.schulz@desy.de]
Inviato: mercoled� 19 settembre 2012 15.48
A: rt-users@lists.bestpractical.com
Oggetto: [rt-users] 2. try :wink: Limit user in a perl script

Hi!

I try to ask again, because on my producton system it takes a very long
time to limit users (7 Minutes !!! per user :-(( ).

I try to search for users with no connections to any ticket and no
connection to any attachments to delete them later.

I can’t use rt-shredder directly :wink:

I try this:


my $user = RT::User->new($RT::SystemUser);
my $users = RT::Users->new($RT::SystemUser);
my $tix = RT::Tickets->new($RT::SystemUser);

$users->FindAllRows ;

while (my $uid = $users->next ) {
my $tickets = RT::Tickets->new($RT::SystemUser);
$user->Load($uid);
$tickets->FromSQL(‘
Type = “ticket” AND
Watcher ="’.$user->EmailAddress.’"’);

Delete_User if ! $tickets->Count();

But it takes much time (about 7 minutes per user )
in my system for every user.

~500.000 tickets
~ 61.100 users

Is there a better method to limit the user with no tickets and no
attachments or what am I doing wrong?

Cheers,
Bj�rn


Final RT training for 2012 in Atlanta, GA - October 23 & 24
http://bestpractical.com/training

We’re hiring! http://bestpractical.com/jobs

Alberto Scotto

Blue Reply
Via Cardinal Massaia, 83
10147 - Torino - ITALY
phone: +39 011 29100
al.scotto@reply.it
www.reply.it



The information transmitted is intended for the person or entity to which it is addressed and may contain confidential and/or privileged material. Any review, retransmission, dissemination or other use of, or taking of any action in reliance upon, this information by persons or entities other than the intended recipient is prohibited. If you received this in error, please contact the sender and delete the material from any computer.

Hi Thomas,

Why are you looking to delete users with no tickets in the first place?

Because we have much spam users and ‘typo-users’ in the system.
So I like to delete them. Why you asking?

(Note that your search won’t count deleted tickets that the user may be
a watcher on, but those tickets still exist and shredder will need to be
told what to do with them.)

Upps, that’s true. I’ll wanted check also for deletetd tickets.

Cheers,
Björn