[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