[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [ic] Custom SearchOP


Kevin Walsh wrote:
Tom Tucker <suppressed> 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

_______________________________________________
interchange-users mailing list
suppressed
http://www.icdevgroup.org/mailman/listinfo/interchange-users


Mail converted by mhonarc 2.6.15
This archive provided courtesy of JSW4.NET, Internet Hosting Services for Small Business.