From d6696f8a7e1e39996b828bf20a38871828a0cafc Mon Sep 17 00:00:00 2001 From: Stephen Opal Date: Wed, 13 May 2009 20:40:36 +0000 Subject: [PATCH] Admin Panel asset search extension: allow searching by assetId with the inclusion of a helper keyword: assetid: assetId search is performed using a logical OR so multiple helper:key pairs can be applied and normal keywords can also be used in the same query --- lib/WebGUI/Content/AssetManager.pm | 14 +++++++++++++- lib/WebGUI/Search.pm | 31 +++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/lib/WebGUI/Content/AssetManager.pm b/lib/WebGUI/Content/AssetManager.pm index 6a635402c..df2d424ec 100644 --- a/lib/WebGUI/Content/AssetManager.pm +++ b/lib/WebGUI/Content/AssetManager.pm @@ -131,6 +131,7 @@ sub getSearchPaginator { my $s = WebGUI::Search->new( $session, 0 ); $s->search( { + assetIds => $query->{ assetIds }, keywords => $query->{ keywords }, classes => $query->{ classes }, } ); @@ -611,7 +612,18 @@ sub www_search { my $keywords = $session->form->get( 'keywords' ); my @classes = $session->form->get( 'class' ); - my $p = getSearchPaginator( $session, { + # Detect a helper word key + my @assetIds = ($keywords =~ /assetid:\s*([^\s]+)/gi); + + # purge helper word keys + if (@assetIds) { + $keywords =~ s/\bassetid:\s*[^\s]+//gi; + } + $keywords =~ s/^\s+//g; + $keywords =~ s/\s+$//g; + + my $p = getSearchPaginator( $session, { + assetIds => \@assetIds, keywords => $keywords, classes => \@classes, orderByColumn => $session->form->get( 'orderByColumn' ), diff --git a/lib/WebGUI/Search.pm b/lib/WebGUI/Search.pm index cb442fa1f..745ca56fb 100644 --- a/lib/WebGUI/Search.pm +++ b/lib/WebGUI/Search.pm @@ -360,9 +360,11 @@ sub search { croak "'lineage' rule must be array reference" if ( $rules->{lineage} && ref $rules->{lineage} ne "ARRAY" ); - my @params = (); + my @params; + my @orParams; my $query = ""; - my @clauses = (); + my @clauses; + my @orClauses; if ($rules->{keywords}) { my $keywords = $rules->{keywords}; unless ($keywords =~ m/"|\*/) { # do wildcards for people, like they'd expect @@ -402,6 +404,15 @@ sub search { } push(@clauses, join(" or ", @phrases)) if (scalar(@phrases)); } + if ($rules->{assetIds}) { + my @phrases = (); + foreach my $assetId (@{$rules->{assetIds}}) { + next unless $assetId; + push(@orParams, $assetId); + push(@phrases, "assetId like ?"); + } + push(@orClauses, join(" or ", @phrases)) if (scalar(@phrases)); + } if ($rules->{classes}) { my @phrases = (); foreach my $class (@{$rules->{classes}}) { @@ -457,9 +468,19 @@ sub search { unless (ref $rules->{columns} eq "ARRAY"); $self->{_columns} = $rules->{columns}; } - - $self->{_params} = \@params; - $self->{_where} = "(".join(") and (", @clauses).")"; + + push @{$self->{_params}}, @params; + push @{$self->{_params}}, @orParams; + + if (@clauses) { + $self->{_where} .= "(".join(") and (", @clauses).")"; + } + if (@orClauses) { + if (length( $self->{_where} )) { + $self->{_where} .= ' or '; + } + $self->{_where} .= "(".join(") or (", @orClauses).")"; + } return $self; }