[ic] Custom SearchOP
Tom Tucker
tom at ttucker.com
Mon Sep 10 02:16:55 EDT 2007
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=RADIO/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
More information about the interchange-users
mailing list