[ic] Custom SearchOP

Paul Jordan jordan at gishnetwork.com
Mon Sep 10 12:04:36 EDT 2007


interchange-users-bounces at icdevgroup.org wrote:
> Kevin Walsh wrote:
>> Tom Tucker <tom at ttucker.com> wrote:
>> 
>>> Mac OS X 10.4.10
>>> Interchange 5.4.0 (Tried with both Low and High Traffic settings)
>>> Perl 5.8.6 threaded (PERL_SIGNALS="unsafe" set in the ENV)
>>> MySQL 5.0.27-standard
>>> 
>>> Never had a problem starting daemon and no other odd behavior that
>>> I have seen. 
>>> 
>>> I have implemented the following Custom SearchOp according to the
>>> instructions in the list and docs (I think ):
>>> 
>>> I need to be able to search on three fields, prod_group, model and
>>> category. 
>>> 
>>> When I use a search of the form:
>>> 
> http://www.mydomain.com/scan/co=yes/fi=products/sf=prod_group/
> se=Mustang/op=eq/sf=model/se=68/op=modelyr/sf=category/se=RADI
O/op=eq/tf=category,description
>>> 
>>> I get some products returned, but not the list I would expect. I
>>> added the ::logDebug statement but don't get any output in the
>>> debug.log file. In fact when I deliberately put in an error in
>>> SearchOp perl routine, I don't even get an error message on catalog
>>> restart. 
>>> 
>>> ## Custom search op for model years. Takes a comma
>>> ## separated list of individual 2 digit model years
>>> ## or a range, ex: 55,63,65-68,70-73 and will
>>> ##  determine if the search expression matches
>>> ##  specifically or falls within the range.
>>> CodeDef modelyr  SearchOp
>>> CodeDef modelyr  Routine <<EOR
>>> sub modelyr {
>>>   my ($self, $i, $pat) = @_;
>>>>> logDebug("modelyr: testing $self against $pat");
>>> 
>>>   return sub {
>>>     my $this = shift;
>>>     my @pat = split(/,/, $pat);
>>>     #print "  subtesting $this ";
>>>     foreach my $that ( @pat ) {
>>>       # Check to see if matches in a range of model years       if
>>>         ( $that =~ /-/) { my ($strt, $end) = split(/-/, $that);
>>>         #print "against $strt thru $end\n";
>>>         return 1 if ($this >= $strt && $this <= $end);       }
>>>       # Check to see if matches a single model year
>>>       #print "against $that\n";
>>>       return $this == $that;
>>>     }
>>>   };
>>> }
>>> EOR
>>> 
>>> Any assistance greatly appreciated.
>>> 
>>> 
>> The only thing I can see from my quick glance at your code is the
>> line that looks like this: 
>> 
>>     return $this == $that;
>> 
>> That would appear to be returning true or false, for the first
>> non-range value, and thereby ignoring the rest of the list.
>> 
>> You could try changing the end of your code to look a little more
>> like this: 
>> 
>>           # Check to see if matches a single model year
>>           return 1 if $this == $that;
>>         }
>>         return 0;
>>       };
>>     }
>>     EOR
>> 
>> You shouldn't really use $this as a variable name. Although the name
>> isn't reserved, it is confusing when used outside of its usual
>> context. 
>> 
>> I'm trying my best not to make any anti-Mac or anti-BSD comments. :-)
>> 
>> 
> Thanks for the response.
> 
> I appreciate your restraint almost as much as I appreciate your
> knowledge. I have been using Interchange in production since
> 4.8.3 and
> your posts along with Ed's, Racke's and of course Mike's are
> gospel and
> have answered many, many questions. I genuflect before the
> Four Horsemen
> of eCommerce.
> 
> I made the changes as described (including the replacement of my
> favorite interim variable names) but to no effect. The SearchOp perl
> code works as expected outside of Interchange. A little more detail:
> 
> I am using "Mike Heins' modified foundation demo" from 2003. Added a
> column for model to the products table (VARCHAR 64). The abridged
> dataset I am searching through looks like this:
> 
> sku        model  prod_group  Category
> ---------  -----  ----------  --------
> MRD_CD5    65-73  Mustang     RADIO
> MRD_CD6    65-73  Mustang     RADIO
> M_5482A    65-66  Mustang     RADIO
> MRD_103    65-66  Mustang     RADIO
> MRD_105CD  65-66  Mustang     RADIO
> MRD_1601   65-66  Mustang     RADIO
> MRD_1501   65-66  Mustang     RADIO
> MRD_12000  65-66  Mustang     RADIO
> MRD_105    65-66  Mustang     RADIO
> MRD_106    65-66  Mustang     RADIO
> MRD_106CD  65-66  Mustang     RADIO
> MRD_S06    65-73  Mustang     RADIO
> MRD_101    65-66  Mustang     RADIO
> MRD_107    65-66  Mustang     RADIO
> MRD_107CD  65-66  Mustang     RADIO
> MRD_108    65-66  Mustang     RADIO
> M_5482C    65-73  Mustang     RADIO
> MRD_S11    65-68  Mustang     RADIO
> MRD_S12    65-73  Mustang     RADIO
> M_5486A    65-67  Mustang     RADIO
> MRD_CD     65-73  Mustang     RADIO
> 
> But the scan only returns the following skus:
> MRD_101
> MRD_103
> MRD_105
> MRD_105CD
> MRD_106
> MRD_106CD
> MRD_107
> MRD_107CD
> MRD_108
> MRD_12000
> MRD_1501
> MRD_1601
> M_5482A
> 
> When I look at the mysql log, I see that an "active != 1" is added to
> the query (select * from products  WHERE inactive != 1 AND prod_group
> = 'Mustang' AND category = 'RADIO') and then 15 iterative
> selects over the
> 13 skus returned getting the additional product, pricing and
> inventory data. 
> 
> Noting in the VENDROOT error.log nor debug.log and nothing in the
> CATROOT error.log. Curious that a ::logDebug in the SearchOp shows
> nothing in the VENDROOT debug.log.
> 
> Sorry to be so verbose, but the function of the SearchOp is critical
> path the to the autoparts catalog I am building. And the scan is only
> for testing the search form using the custom SearchOp that I
> need which
> returns exactly the same results.
> 
> As always, the assistance is greatly appreciated.
> 
> Tom

Shouldn't this 

my @pat = split(/,/, $pat);

Be:

my @pat = split(/\,/, $pat);

You know, you can achieve this with a Mysql query and the IN operator. Just
expand your ranges first (like with the loop tag)


Paul 



More information about the interchange-users mailing list