First, we didn't need to make $last_type local, and it broke explicit
grouping anyway. That's removed, and we now reset that (and a few more
like it) at calls to the top level parse() method. This introduces a
situation where a long list of booleans could cause query plan problems,
so we limit the plan depth to 40 (20 ||'d conditions).
Second, we are smarter about finding the boundary of atoms. Previous
to this commit, and curly brace could send the parser into a tailspin
from which it would not recover. Now we use alternation instead of
a character class, which is much safer with the default multi-character
float syntax specifier.
Third, as a catch-all, if we can't parse the remained of a query we
now simply say so (when in debug mode) and go away, instead of risking
an infinite loop. We do this via a final, unqualified "else" clause
in decompose().
Finally, instead of building 10+ regexp objects on each query parse,
cache them per QP subclass and reuse them.
Signed-off-by: Mike Rylander <email address hidden>
Signed-off-by: Dan Wells <email address hidden>
Re-apply the changes provided by 0802 for backport
Preserve record order of subfields for authority heading extraction
When extracting headings from authority records we currently read the
subfields of a tag in configuration order. We should, instead, read
them in record order, to preserve the desired sorting properties that
the cataloger has encoded in the record.
Signed-off-by: Mike Rylander <email address hidden>
LP#1254146 gracefully handle custom trees sans entries
Avoid references to custom tree entries when no tree entries for a
custom tree exist. Prevents:
egweb: template error: undef error - Can't call method "org_unit" on an
undefined value at
/usr/local/share/perl/5.10.1/OpenILS/WWW/EGCatLoader/Util.pm line 185.\n
Signed-off-by: Bill Erickson <email address hidden>
Signed-off-by: Ben Shum <email address hidden>
Relax MFHD subfield 'a' requirement for caption/patterns
If going by the book, every caption/pattern field would have a
subfield 'a', since the data from subfield 'i' would be moved to
'a' if 'a' was empty. Since that is arcane, and our own wizards
used to bend this rule, let's make some minor adjustments to our
expectations:
1) When calculating date progression, don't expect there to be an 'a'
subfield which needs to be "carried" into.
2) When determining whether a field is 'open-ended', check the first
availabile enum/chron subfield rather than hard-coding the check to
'a'.
These changes do not affect the display formatters, so strings
generated from 'a'-less caption/pattern combos are not exactly right,
but they suffice.