Lines 1231-1255
sub buildQuery {
Link Here
|
1231 |
$query = "ccl=$query" if $cclq; |
1231 |
$query = "ccl=$query" if $cclq; |
1232 |
} |
1232 |
} |
1233 |
|
1233 |
|
|
|
1234 |
# add limits |
1235 |
my %group_OR_limits; |
1236 |
my $availability_limit; |
1237 |
foreach my $this_limit (@limits) { |
1238 |
next unless $this_limit; |
1239 |
if ( $this_limit =~ /available/ ) { |
1240 |
# |
1241 |
## 'available' is defined as (items.onloan is NULL) and (items.itemlost = 0) |
1242 |
## In English: |
1243 |
## all records not indexed in the onloan register (zebra) and all records with a value of lost equal to 0 |
1244 |
$availability_limit .= |
1245 |
"( (allrecords,AlwaysMatches='') and (not-onloan-count,st-numeric >= 1) and (lost,st-numeric=0) )"; |
1246 |
$limit_cgi .= "&limit=available"; |
1247 |
$limit_desc .= ""; |
1248 |
} |
1249 |
|
1250 |
# group_OR_limits, prefixed by mc- |
1251 |
# OR every member of the group |
1252 |
elsif ( $this_limit =~ /mc/ ) { |
1253 |
my ($k,$v) = split(/:/, $this_limit,2); |
1254 |
if ( $k !~ /mc-i(tem)?type/ ) { |
1255 |
# in case the mc-ccode value has complicating chars like ()'s inside it we wrap in quotes |
1256 |
$this_limit =~ tr/"//d; |
1257 |
$this_limit = $k.':"'.$v.'"'; |
1258 |
} |
1259 |
|
1260 |
$group_OR_limits{$k} .= " or " if $group_OR_limits{$k}; |
1261 |
$limit_desc .= " or " if $group_OR_limits{$k}; |
1262 |
$group_OR_limits{$k} .= "$this_limit"; |
1263 |
$limit_cgi .= "&limit=" . uri_escape_utf8($this_limit); |
1264 |
$limit_desc .= " $this_limit"; |
1265 |
} |
1266 |
elsif ( $this_limit =~ '^multibranchlimit:|^branch:' ) { |
1267 |
$limit_cgi .= "&limit=" . uri_escape_utf8($this_limit); |
1268 |
$limit .= " and " if $limit || $query; |
1269 |
my $branchfield = C4::Context->preference('SearchLimitLibrary'); |
1270 |
my @branchcodes; |
1271 |
if( $this_limit =~ '^multibranchlimit:' ){ |
1272 |
my ($group_id) = ( $this_limit =~ /^multibranchlimit:(.*)$/ ); |
1273 |
my $search_group = Koha::Library::Groups->find( $group_id ); |
1274 |
@branchcodes = map { $_->branchcode } $search_group->all_libraries; |
1275 |
@branchcodes = sort { $a cmp $b } @branchcodes; |
1276 |
} else { |
1277 |
@branchcodes = ( $this_limit =~ /^branch:(.*)$/ ); |
1278 |
} |
1279 |
|
1280 |
if (@branchcodes) { |
1281 |
if ( $branchfield eq "homebranch" ) { |
1282 |
$this_limit = sprintf "(%s)", join " or ", map { 'homebranch: ' . $_ } @branchcodes; |
1283 |
} |
1284 |
elsif ( $branchfield eq "holdingbranch" ) { |
1285 |
$this_limit = sprintf "(%s)", join " or ", map { 'holdingbranch: ' . $_ } @branchcodes; |
1286 |
} |
1287 |
else { |
1288 |
$this_limit = sprintf "(%s or %s)", |
1289 |
join( " or ", map { 'homebranch: ' . $_ } @branchcodes ), |
1290 |
join( " or ", map { 'holdingbranch: ' . $_ } @branchcodes ); |
1291 |
} |
1292 |
} |
1293 |
$limit .= "$this_limit"; |
1294 |
$limit_desc .= " $this_limit"; |
1295 |
} elsif ( $this_limit =~ '^search_filter:' ) { |
1296 |
$limit_cgi .= "&limit=" . uri_escape_utf8($this_limit); |
1297 |
my ($filter_id) = ( $this_limit =~ /^search_filter:(.*)$/ ); |
1298 |
my $search_filter = Koha::SearchFilters->find( $filter_id ); |
1299 |
next unless $search_filter; |
1300 |
my $expanded = $search_filter->expand_filter; |
1301 |
my ( $error, undef, undef, undef, undef, $fixed_limit, undef, undef, undef ) = buildQuery ( undef, undef, undef, $expanded, undef, undef, $lang); |
1302 |
$limit .= " and " if $limit || $query; |
1303 |
$limit .= "$fixed_limit"; |
1304 |
$limit_desc .= " $limit"; |
1305 |
} |
1306 |
|
1307 |
# Regular old limits |
1308 |
else { |
1309 |
$limit .= " and " if $limit || $query; |
1310 |
$limit .= "$this_limit"; |
1311 |
$limit_cgi .= "&limit=" . uri_escape_utf8($this_limit); |
1312 |
$limit_desc .= " $this_limit"; |
1313 |
} |
1314 |
} |
1315 |
foreach my $k (keys (%group_OR_limits)) { |
1316 |
$limit .= " and " if ( $query || $limit ); |
1317 |
$limit .= "($group_OR_limits{$k})"; |
1318 |
} |
1319 |
if ($availability_limit) { |
1320 |
$limit .= " and " if ( $query || $limit ); |
1321 |
$limit .= "($availability_limit)"; |
1322 |
} |
1323 |
|
1234 |
# for handling ccl, cql, pqf queries in diagnostic mode, skip the rest of the steps |
1324 |
# for handling ccl, cql, pqf queries in diagnostic mode, skip the rest of the steps |
1235 |
# DIAGNOSTIC ONLY!! |
1325 |
# DIAGNOSTIC ONLY!! |
1236 |
if ( $query =~ /^ccl=/ ) { |
1326 |
if ( $query =~ /^ccl=/ ) { |
1237 |
my $q=$'; |
1327 |
my $q=$'; |
1238 |
# This is needed otherwise ccl= and &limit won't work together, and |
1328 |
# This is needed otherwise ccl= and &limit won't work together, and |
1239 |
# this happens when selecting a subject on the opac-detail page |
1329 |
# this happens when selecting a subject on the opac-detail page |
1240 |
@limits = grep {!/^$/} @limits; |
|
|
1241 |
my $original_q = $q; # without available part |
1330 |
my $original_q = $q; # without available part |
1242 |
unless ( grep { $_ eq 'available' } @limits ) { |
1331 |
$q .= $limit; |
1243 |
$q =~ s| and \( \(allrecords,AlwaysMatches=''\) and \(not-onloan-count,st-numeric >= 1\) and \(lost,st-numeric=0\) \)||; |
|
|
1244 |
$original_q = $q; |
1245 |
} |
1246 |
if ( @limits ) { |
1247 |
if ( grep { $_ eq 'available' } @limits ) { |
1248 |
$q .= q| and ( (allrecords,AlwaysMatches='') and (not-onloan-count,st-numeric >= 1) and (lost,st-numeric=0) )|; |
1249 |
@limits = grep {!/^available$/} @limits; |
1250 |
} |
1251 |
$q .= ' and '.join(' and ', @limits) if @limits; |
1252 |
} |
1253 |
return ( undef, $q, $q, "q=ccl=".uri_escape_utf8($q), $original_q, '', '', '', 'ccl' ); |
1332 |
return ( undef, $q, $q, "q=ccl=".uri_escape_utf8($q), $original_q, '', '', '', 'ccl' ); |
1254 |
} |
1333 |
} |
1255 |
if ( $query =~ /^cql=/ ) { |
1334 |
if ( $query =~ /^cql=/ ) { |
Lines 1446-1530
sub buildQuery {
Link Here
|
1446 |
} |
1525 |
} |
1447 |
Koha::Logger->get->debug("QUERY BEFORE LIMITS: >$query<"); |
1526 |
Koha::Logger->get->debug("QUERY BEFORE LIMITS: >$query<"); |
1448 |
|
1527 |
|
1449 |
# add limits |
|
|
1450 |
my %group_OR_limits; |
1451 |
my $availability_limit; |
1452 |
foreach my $this_limit (@limits) { |
1453 |
next unless $this_limit; |
1454 |
if ( $this_limit =~ /available/ ) { |
1455 |
# |
1456 |
## 'available' is defined as (items.onloan is NULL) and (items.itemlost = 0) |
1457 |
## In English: |
1458 |
## all records not indexed in the onloan register (zebra) and all records with a value of lost equal to 0 |
1459 |
$availability_limit .= |
1460 |
"( (allrecords,AlwaysMatches='') and (not-onloan-count,st-numeric >= 1) and (lost,st-numeric=0) )"; |
1461 |
$limit_cgi .= "&limit=available"; |
1462 |
$limit_desc .= ""; |
1463 |
} |
1464 |
|
1465 |
# group_OR_limits, prefixed by mc- |
1466 |
# OR every member of the group |
1467 |
elsif ( $this_limit =~ /mc/ ) { |
1468 |
my ($k,$v) = split(/:/, $this_limit,2); |
1469 |
if ( $k !~ /mc-i(tem)?type/ ) { |
1470 |
# in case the mc-ccode value has complicating chars like ()'s inside it we wrap in quotes |
1471 |
$this_limit =~ tr/"//d; |
1472 |
$this_limit = $k.':"'.$v.'"'; |
1473 |
} |
1474 |
|
1475 |
$group_OR_limits{$k} .= " or " if $group_OR_limits{$k}; |
1476 |
$limit_desc .= " or " if $group_OR_limits{$k}; |
1477 |
$group_OR_limits{$k} .= "$this_limit"; |
1478 |
$limit_cgi .= "&limit=" . uri_escape_utf8($this_limit); |
1479 |
$limit_desc .= " $this_limit"; |
1480 |
} |
1481 |
elsif ( $this_limit =~ '^multibranchlimit:|^branch:' ) { |
1482 |
$limit_cgi .= "&limit=" . uri_escape_utf8($this_limit); |
1483 |
$limit .= " and " if $limit || $query; |
1484 |
my $branchfield = C4::Context->preference('SearchLimitLibrary'); |
1485 |
my @branchcodes; |
1486 |
if( $this_limit =~ '^multibranchlimit:' ){ |
1487 |
my ($group_id) = ( $this_limit =~ /^multibranchlimit:(.*)$/ ); |
1488 |
my $search_group = Koha::Library::Groups->find( $group_id ); |
1489 |
@branchcodes = map { $_->branchcode } $search_group->all_libraries; |
1490 |
@branchcodes = sort { $a cmp $b } @branchcodes; |
1491 |
} else { |
1492 |
@branchcodes = ( $this_limit =~ /^branch:(.*)$/ ); |
1493 |
} |
1494 |
|
1495 |
if (@branchcodes) { |
1496 |
if ( $branchfield eq "homebranch" ) { |
1497 |
$this_limit = sprintf "(%s)", join " or ", map { 'homebranch: ' . $_ } @branchcodes; |
1498 |
} |
1499 |
elsif ( $branchfield eq "holdingbranch" ) { |
1500 |
$this_limit = sprintf "(%s)", join " or ", map { 'holdingbranch: ' . $_ } @branchcodes; |
1501 |
} |
1502 |
else { |
1503 |
$this_limit = sprintf "(%s or %s)", |
1504 |
join( " or ", map { 'homebranch: ' . $_ } @branchcodes ), |
1505 |
join( " or ", map { 'holdingbranch: ' . $_ } @branchcodes ); |
1506 |
} |
1507 |
} |
1508 |
$limit .= "$this_limit"; |
1509 |
$limit_desc .= " $this_limit"; |
1510 |
} |
1511 |
|
1512 |
# Regular old limits |
1513 |
else { |
1514 |
$limit .= " and " if $limit || $query; |
1515 |
$limit .= "$this_limit"; |
1516 |
$limit_cgi .= "&limit=" . uri_escape_utf8($this_limit); |
1517 |
$limit_desc .= " $this_limit"; |
1518 |
} |
1519 |
} |
1520 |
foreach my $k (keys (%group_OR_limits)) { |
1521 |
$limit .= " and " if ( $query || $limit ); |
1522 |
$limit .= "($group_OR_limits{$k})"; |
1523 |
} |
1524 |
if ($availability_limit) { |
1525 |
$limit .= " and " if ( $query || $limit ); |
1526 |
$limit .= "($availability_limit)"; |
1527 |
} |
1528 |
|
1528 |
|
1529 |
# Normalize the query and limit strings |
1529 |
# Normalize the query and limit strings |
1530 |
# This is flawed , means we can't search anything with : in it |
1530 |
# This is flawed , means we can't search anything with : in it |
1531 |
- |
|
|