/** * Do the actual search and return results * * @param Query $search search object * @param int $start [optional] starting record number * @param int $max [optional] max records * @param string $sort [optional] sort order * @param bool $facets [optional] whether to include facets * * @return Results */ protected function doSearch(Search\Query $search, $start = 1, $max = 10, $sort = "", $facets = true) { $results = new Search\ResultSet($this->config); $query = $search->toQuery(); $this->url = $this->server . "/search?q=" . urlencode($query); if ($this->config->getConfig('client')) { $this->url .= '&client=' . urlencode($this->config->getConfig('client')); } if ($this->config->getConfig('site')) { $this->url .= '&site=' . urlencode($this->config->getConfig('site')); } $this->url .= '&output=xml'; // google results are 0-based if ($start != null) { $start = $start - 1; $this->url .= '&start=' . $start; } // echo $this->url; exit; $client = Factory::getHttpClient(); $google_results = $client->getUrl($this->url, 3); $xml = simplexml_load_string($google_results); // header("Content-type: text/xml"); echo $xml->saveXML(); exit; $x = 0; // exact matches foreach ($xml->GM as $gm) { $record = new Record(); $record->loadXML($gm); $results->addRecord($record); } // regular results $results_array = $xml->xpath("//RES"); if (count($results_array) > 0 && $results_array !== false) { $results_xml = $results_array[0]; $results->total = (int) $results_xml->M; foreach ($results_xml->R as $result_xml) { if ($x >= $max) { break; } $record = new Record(); $record->loadXML($result_xml); $results->addRecord($record); $x++; } } return $results; }
/** * Do the actual search * * @param Query $search search object * @param int $start [optional] starting record number * @param int $max [optional] max records * @param string $sort [optional] sort order * * @return Results */ protected function doSearch(Search\Query $search, $start = 1, $max = 10, $sort = "") { // convert query $query = $search->toQuery(); // get results from Worldcat $xml = $this->worldcat_client->searchRetrieve($query, $start, $max, $sort); return $this->parseResponse($xml); }
/** * Do the actual search * * @param Query $search search object * @param int $start [optional] starting record number * @param int $max [optional] max records * @param string $sort [optional] sort order * * @return Results */ protected function doSearch(Search\Query $search, $start = 1, $max = 10, $sort = "") { // limit to local users? if ($search->getUser()->isAuthorized()) { $this->summon_client->setToAuthenticated(); } // prepare the query $query = $search->toQuery(); // facets to include in the response foreach ($this->config->getFacets() as $facet_config) { if ($facet_config['type'] == 'date') { $this->summon_client->setDateRangesToInclude((string) $facet_config["ranges"]); } else { $this->summon_client->includeFacet((string) $facet_config["internal"] . ",or,1," . (string) $facet_config["max"]); } } // limit to local holdings unless told otherwise if ($this->config->getConfig('LIMIT_TO_HOLDINGS', false)) { $this->summon_client->limitToHoldings(); } // limits foreach ($search->getLimits(true) as $limit) { if ($limit->field == 'newspapers') { continue; // we'll handle you later } // holdings only if ($limit->field == 'holdings') { if ($limit->value == 'false') { // this is actually an expander to search everything $this->summon_client->limitToHoldings(false); } else { $this->summon_client->limitToHoldings(); } } elseif ($this->config->getFacetType($limit->field) == 'date') { // @todo: make this not 'display' if ($limit->value == 'start' && $limit->display != '') { $this->summon_client->setStartDate($limit->display); } elseif ($limit->value == 'end' && $limit->display != '') { $this->summon_client->setEndDate($limit->display); } } else { $value = ''; $boolean = 'false'; if ($limit->boolean == "NOT") { $boolean = 'true'; } // multi-select filter if (is_array($limit->value)) { // exclude if ($boolean == 'true') { foreach ($limit->value as $limited) { $value = str_replace(',', '\\,', $limited); $this->summon_client->addFilter($limit->field . ",{$value},{$boolean}"); } } else { foreach ($limit->value as $limited) { $value .= ',' . str_replace(',', '\\,', $limited); } $this->summon_client->addComplexFilter($limit->field . ',' . $boolean . $value); } } else { $value = str_replace(',', '\\,', $limit->value); $this->summon_client->addFilter($limit->field . ",{$value},{$boolean}"); } } } // format filters // newspapers are a special case, i.e., they can be optional if ($this->config->getConfig('NEWSPAPERS_OPTIONAL', false)) { $news_limit = $search->getLimit('facet.newspapers'); if ($news_limit->value != 'true') { $this->formats_exclude[] = 'Newspaper Article'; } } // always exclude these foreach ($this->formats_exclude as $format) { $this->summon_client->addFilter("ContentType,{$format},true"); } // summon deals in pages, not start record number if ($max > 0) { $page = ceil($start / $max); } else { $page = 1; } // get the results $summon_results = $this->summon_client->query($query, $page, $max, $sort); return $this->parseResponse($summon_results); }
/** * Do the actual search and return results * * @param Query $search search object * @param int $start [optional] starting record number * @param int $max [optional] max records * @param string $sort [optional] sort order * @param bool $facets [optional] whether to include facets * * @return Results */ protected function doSearch(Search\Query $search, $start = 1, $max = 10, $sort = "", $facets = true) { // can't search on this field, so return 0 if ($this->query->hasUnsupportedField()) { $results = new Search\ResultSet($this->getConfig()); $results->total = 0; return $results; } // convert query $query = $search->toQuery(); // get results from Worldcat $xml = $this->worldcat_client->searchRetrieve($query, $start, $max, $sort); return $this->parseResponse($xml); }
/** * Do the actual search * * @param Query $search search object * @param int $start [optional] starting record number * @param int $max [optional] max records * @param string $sort [optional] sort order * * @return Results */ protected function doSearch(Search\Query $search, $start = 1, $max = 10, $sort = "") { // prepare the query $query = $search->toQuery(); // facets to include in the response $facets_to_include = array(); foreach ($this->config->getFacets() as $facet_config) { $facets_to_include[(string) $facet_config["internal"]] = (string) $facet_config["internal"] . ",or,1," . (string) $facet_config["max"]; } // limits $facets = array(); foreach ($search->getLimits(true) as $limit) { // remove chosen facet from response // @todo: make multi-value facets selectable $facets_to_include = Parser::removeFromArray($facets_to_include, $limit->field); array_push($facets, $limit->field . "," . str_replace(',', '\\,', $limit->value) . ",false"); } // set actual response facets $this->summon_client->setFacetsToInclude($facets_to_include); // filter out formats foreach ($this->formats_exclude as $format) { array_push($facets, "ContentType,{$format},true"); } // holdings only if ($search->isHoldingsOnly()) { $this->summon_client->limitToHoldings(); } // summon deals in pages, not start record number if ($max > 0) { $page = ceil($start / $max); } else { $page = 1; } // get the results $summon_results = $this->summon_client->query($query, $facets, $page, $max, $sort); return $this->parseResponse($summon_results); }